广告
返回顶部
首页 > 资讯 > 精选 >使用HttpServletResponse时出现乱码如何解决
  • 141
分享到

使用HttpServletResponse时出现乱码如何解决

httpservletresponse 2023-05-31 09:05:33 141人浏览 薄情痞子
摘要

本篇文章为大家展示了使用httpservletResponse时出现乱码如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个完整的Http响应包括响应行,若干响应头和响应数据主体三部分构成。如

本篇文章为大家展示了使用httpservletResponse时出现乱码如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一个完整的Http响应包括响应行,若干响应头和响应数据主体三部分构成。如果我们能用响应对象来进行这三部分的处理,就能向客户发送特定的响应数据包。

先从HttpServletResponse对象的方法中可以看到有如下方法(部分):

使用HttpServletResponse时出现乱码如何解决

这只是一部分,但是我们却可以看出,通过响应对象的方法,我们就能设置响应客户端数据的一些信息。比如setStatus(int sc)方法,我们从HttpServletResponse的api中的字段定义可找到已经设置好的响应码(部分):

使用HttpServletResponse时出现乱码如何解决

我们通过setHeader或者addHeader就能对一些数据进行跟客户端的告知,比如我想让某个页面的数据在客户端保存一天,也就是如果客户端再向我请求的话,则它应该去缓存中获取,直到一天之后才能重新向我请求,那么我就必须使用到了“Expires”响应头,将这个响应头的值设为一天后的时间告诉给客户端:

在MyEclipse中的【myservlet】WEB工程下,创建名为ServletDemo1的Servlet,代码如下:

public class ServletDemo extends HttpServlet {   public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {      long expiresTime = System.currentTimeMillis()+1*24*60*60*1000; //将缓存截止时间设置为一天后     response.setDateHeader("expires", expiresTime);        } } 

这时候用浏览器来访问这个Servlet(访问之前最好现将浏览器中的缓冲清除干净),访问之后我们再来看看这个缓存的页面文件:

使用HttpServletResponse时出现乱码如何解决

右键查看其属性:

使用HttpServletResponse时出现乱码如何解决

可以看到我们是在9月28日访问的这个文件,而服务器已经将这个文件的缓冲时间设置为了29日。

注意:对于”Expires”响应头的设置必须使用setDateHeader方法,使用setHeader方法无效。

使用响应对象可以向客户端写入数据,我们采用获取响应对象的输出流,将数据用write方法写,这些数据是写入到响应对象中,而服务器再将这些响应对象回传给客户端进行解析。而这些数据在响应对象中正是处于HTTP协议的响应数据实体中。

通过HttpServletResponse对象的父类ServletResponse对象的getOutputStream方法和getWriter方法可以获取向响应对象的数据实体中写入数据。这里如果传送的是英文数据一般都没有什么问题,而中文编码则是会令人头疼的。

首先我们来看响应对象的getOutputStream方法,我们在一个Servlet程序中代码如下:

   String data = "银魂";   OutputStream out = response.getOutputStream();   out.write(data.getBytes());

而在浏览器中访问这个Servlet,看到的是:

使用HttpServletResponse时出现乱码如何解决

是的,没有出现乱码的问题,这主要有两点原因:

一个是浏览器本身的解码方式是根据平台语言环境来设置的,我的操作系统windows的中文版本,因此浏览器的解码采用的编码表为“GB2312”:

使用HttpServletResponse时出现乱码如何解决

另一个原因是因为,在将字符串转为字节数组时,采用了getBytes()方法,这个方法在String类的API文档中明确说明了采用平台默认的字符集,根据我的系统这个方法也采用了“GB2312”编码表。

因此服务器编码和客户端解码都采用同一编码表这就不会出现中文乱码问题。

如果我在getBytes方法中采用UTF-8编码,那么结果自然会出错:

   String data = "银魂";   OutputStream out = response.getOutputStream();   out.write(data.getBytes("UTF-8"));

使用HttpServletResponse时出现乱码如何解决

除非你也在浏览器中更改编码方式,改成UTF-8就可以重新看到正确的中文数据了:

使用HttpServletResponse时出现乱码如何解决

使用HttpServletResponse时出现乱码如何解决

当然这肯定不适合给用户这么操作,毕竟不是谁都懂浏览器的编码。

如果我们一定要将中文数据采用“UTF-8”的方式(UTF-8有利于国际化),有这么两种解决采用UTF-8编码方式的中文乱码问题:

第一种解决方式:使用HttpServletResponse响应对象的setHeader的方法,将“Content-type”这个响应头中设置编码方式。同时,sun公司也提供了更便捷的代码语句setContentType给编程人员使用。

在Servlet中的代码:

   response.setHeader("content-type", "text/html;charset=UTF-8");   //response.setContentType("text/html;charset=UTF-8");  //这句功能同上一句   String data = "银魂";   OutputStream out = response.getOutputStream();   out.write(data.getBytes("UTF-8"));

这样在浏览器中可以看到正确的中文数据,并且浏览器自动将编码方式采用UTF-8:

使用HttpServletResponse时出现乱码如何解决

附带从HttpWatch中观察到的数据包:

使用HttpServletResponse时出现乱码如何解决

注意:如果response.setHeader("content-type", "text/html;charset=UTF-8");中将"text/html;charset=UTF-8"中的分号“;”写成了逗号“,”就会变成下载该Servlet文件。

所以书写要注意。

第二种解决方式:我们不直接在响应对象中设置“Content-type”这个响应头,而是通过HTML的<meta>标签,该标签的作用就是模拟一个响应头,这样在回传的响应对象中,某些响应头就不会被设置,但是还是有这个响应头的功能,例如我们在HTML页面中经常能见到的<meta http-equiv="content-type" content="text/html;charset=utf-8">这个标签,是不是和第一种方式很像。相关代码为:

   String data = "银魂";   OutputStream out = response.getOutputStream();   out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());   out.write(data.getBytes("UTF-8"));

这时候在浏览器中同样能观察到正确的中文数据,同时可以看到浏览器已经自动采用“UTF-8”编码方式:

使用HttpServletResponse时出现乱码如何解决

同时,在浏览器浏览源代码和观察HttpWatch窗口:

使用HttpServletResponse时出现乱码如何解决

从上面可以看出,服务器发回的响应中没有“Content-type”这个响应头,但是在响应数据实体中有<meta>标签,浏览器能解析这个HTML语言,得到这个标签中设置的“Content-type”模拟响应头,因此能根据这个模拟响应头中的编码方式来设置浏览器应该采用的码表。

如果我们用输出流直接输出数字的话,会是输出这个数字在编码表中代表的字符,如代码为:

 public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {         response.getOutputStream().write(97);   }

在浏览器中得到:a。

说完了从响应对象中得到OutputSteam对象,接着我们来讨论从响应对象中得到Writer对象,众所周知,字符流是由字节流加编码表组成,那么在响应对象中的字符流采用什么编码表方式呢?我们来看看HttpServletResponse对象的getWriter()方法的API手册说明:

使用HttpServletResponse时出现乱码如何解决

从这里面看出如果没有为这个getWriter()方法设置编码表,那么则默认采用 “ISO-8859-1”编码表。或者采用响应对象的getCharacterEncoding()方法查看也可以。

那么在服务器端如果要改变对封装数据的编码格式可以有两种方式:

第一种:使用响应对象的setCharacterEncoding()方法来设置服务器采用的编码表,接着使用setContendType或者setHeader告知客户端服务器采用的编码表,后者在上面已经说过。

示例代码:

 public class ServletResponse extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {          response.setCharacterEncoding("UTF-8");     response.setContentType("text/html;charset=UTF-8");     PrintWriter writer = response.getWriter();     String data = "银魂";     writer.write(data);     } }

注意,光只有setCharacterEncoding()方法只能改变服务器端采用的编码表,而没能通知客户端,所以需要setContentType设置“Content-type”响应头,或者如之前所说的写入<meta>标签来模拟“Content-type”响应头。

第二种:直接使用setContentType方法,通过这种方法,可以在服务器和客户端同时设置编码表,也就是第一种方式中两个方法的结合,因此上述示例的代码如下:

 public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {     response.setContentType("text/html;charset=UTF-8");          PrintWriter writer = response.getWriter();     String data = "银魂";     writer.write(data);   } }

上述内容就是使用HttpServletResponse时出现乱码如何解决,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 使用HttpServletResponse时出现乱码如何解决

本文链接: https://www.lsjlt.com/news/224651.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用HttpServletResponse时出现乱码如何解决
    本篇文章为大家展示了使用HttpServletResponse时出现乱码如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个完整的http响应包括响应行,若干响应头和响应数据主体三部分构成。如...
    99+
    2023-05-31
    httpservletresponse
  • php执行时出现乱码如何解决
    这篇文章主要介绍“php执行时出现乱码如何解决”,在日常操作中,相信很多人在php执行时出现乱码如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php执行时出现乱码如何解决”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • PHP中使用mail()函数时出现乱码如何解决
    PHP中使用mail()函数时出现乱码如何解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。PHP函数mail()出现乱码的解决方法:先用函数base64_encode() &...
    99+
    2023-06-17
  • 使用php分割字符串时出现乱码如何解决
    今天就跟大家聊聊有关使用php分割字符串时出现乱码如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。php分割字符串乱码的解决办法:1、通过使用mbstring扩展库的“mb_s...
    99+
    2023-06-14
  • 在php中使用fread时出现中文乱码如何解决
    这篇文章将为大家详细讲解有关在php中使用fread时出现中文乱码如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。php fread中文乱码的解决办法:首先创建一个PHP示例文件;然后...
    99+
    2023-06-14
  • 在PHP中使用json_encode时出现中文乱码如何解决
    这期内容当中小编将会给大家带来有关在PHP中使用json_encode时出现中文乱码如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言...
    99+
    2023-06-14
  • html页面运行时出现乱码如何解决
    这篇文章主要介绍“html页面运行时出现乱码如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“html页面运行时出现乱码如何解决”文章能帮助大家解决问题。 h...
    99+
    2022-10-19
  • 使用JAVA编程出现乱码如何解决
    在Java编程中出现乱码的问题通常是因为编码不一致导致的。下面是一些常见的解决方法:1. 明确设置编码:在程序中使用`setChar...
    99+
    2023-08-25
    JAVA
  • PHP中使用Ajax出现乱码如何解决
    这篇文章将为大家详细讲解有关PHP中使用Ajax出现乱码如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。由于XMLHTTP采用的是Unicode编码上传数据,而一般页面采用的是gb23...
    99+
    2023-06-17
  • 使用vb输出html乱码如何解决
    本篇文章为大家展示了使用vb输出html乱码如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。把gb2312和utf-8,unicode等试试有没有正常显示的。更直接的方法是,在网页里加一句:&...
    99+
    2023-06-15
  • 解决python2.7 查询mysql时出现中文乱码
    问题: python2.7 查询或者插入中文数据在mysql中的时候出现中文乱码 --- 可能情况: 1.mysql数据库各项没有设置编码,默认为'latin' 2.使用MySQL.connect的时...
    99+
    2022-06-04
    乱码 中文 mysql
  • 如何解决使用Kettle抽取数据时出现中文乱码问题
    这篇文章主要介绍如何解决使用Kettle抽取数据时出现中文乱码问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 数据从oracle抽取到mysql,数...
    99+
    2022-10-18
  • html网页出现乱码如何解决
    本篇文章为大家展示了html网页出现乱码如何解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端开发者...
    99+
    2023-06-14
  • html 中出现form乱码如何解决
    这篇文章给大家介绍html 中出现form乱码如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html中form表单提交中文乱码问题基本解决办法办法很简单,只需在form表单中加入下面的话:<html>...
    99+
    2023-06-15
  • java运行出现乱码如何解决
    Java运行出现乱码通常是因为编码问题导致的。下面列出几种常见的解决方法:1. 检查源代码中的字符串编码。确保源代码中的字符串编码与...
    99+
    2023-08-31
    java
  • java导出excel时出现文件名乱码解决方法
    java解决导出Excel时文件名乱码的方法示例:(推荐:java视频教程)String agent = request.getHeader("USER-AGENT").toLowerCase(); response.setConte...
    99+
    2021-11-16
    java
  • java在cmd运行时出现乱码解决方法
    cmd中执行java文件出现乱码如下:(推荐:java视频教程)原因:由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也...
    99+
    2020-10-30
    java
  • eclipse导入包出现乱码如何解决
    要解决eclipse导入包出现乱码的问题,可以尝试以下几个步骤: 确定乱码的具体表现形式,是在包名中、类名中、还是在注释、字符串...
    99+
    2023-10-26
    eclipse
  • postgresql中出现中文乱码如何解决
    postgresql中出现中文乱码的解决方法:1.启动postgresql服务;2.登录postgresql数据库;3.使用数据库;4.使用show命令查看数据库编码;5.使用set命令将数据库编码修改为GBK;具体步骤如下:首先,在命令行...
    99+
    2022-10-22
  • Python中出现中文乱码如何解决
    今天就跟大家聊聊有关Python中出现中文乱码如何解决,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在Python 中文乱码中提到unicode,一般指的是unicode对象,例如&...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作