response.setContentType response.setCharacterEncoding respon

前几天有个人问我这几个到底什么区别,表示自己也不是很懂,找了很多资料,说的模棱两可的,还是自己动手实践吧。

1.setContentLength(int len):设置响应消息的实体内容的大小,单位为字节,对应于Http协议中的Content-Length响应头字段。 一般我们写的servlet不用设置Content-Length的头字段,因为服务器在向客户端输出的时候会自己设置该头字段的值,或者选择chunked传输编码方式。 如:

(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException{response.setContentType( “text/html;charset=gb2312”);PrintWriter out = response.getWriter();out.println( “<a href=’www.baidu.com’>百度</a>” );}

在firefox中接收到响应:

在servlet中并没有设置Content-Length的值,但是在响应消息头中出现了Content-Length,说明tomcat服务器自动帮我们设置了该值。<a href=’www.baidu.com’>百度</a>这段文本总共有34个字节(gb2312/gbk格式的中文字符每个字占两个字节,所以值为34)

现在我们手动将Content-Type的值设为35,代码改为:

(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException{response.setContentType( “text/html;charset=gb2312”);response.setContentLength(35);PrintWriter out = response.getWriter();out.println( “<a href=’www.baidu.com’>百度</a>” );}

接收到响应消息为:

但是,返回的实体内容长度为34,我们手动设置为错误的数字35,浏览器会有什么反应呢:

经过多个浏览器测试,当Content-Length设置错误的时候,浏览器会一直处于“正在连接”状态,这个状态一般持续7、8秒钟,然后将正确显示出返回内容。也就是说,如果返回的是纯文本内容,浏览器会试图解析该文本内容,是会显示出正确结果的,只是反应时间很慢。但是如果你的网页需要输出图片等二进制流(比如后台生成验证码图片),这个时候如果Content-Length设置错误的话,将导致显示错误。 所以我们最好将设置Content-Length值的工作交给服务器来完成吧。

2.setContentType:对应于Http协议中的Content-Type头字段 (1)设置MIME类型 servlet代码如下:

(HttpServletRequest req, HttpServletResponse response) throwsServletException, IOException{response.setContentType( “text/plain” );PrintWriter out = response.getWriter();out.println( “<a href=’www.baidu.com’>test</a>” );}

网页显示内容:

我们看到浏览器只是将响应内容当成文本来处理,现在将代码改为:

response.setContentType( “text/html” );

这个时候浏览器将返回内容当成html来解析了。 简单来说,该方法告诉浏览器我要返回的内容的MIME类型,可以这样理解。如果是文本,就直接显示,如果是html文本,就解析再显示,如果是图片,就调用浏览器的图片控件解析图片,视频就调用浏览器的视频控件解析。如果你不告诉浏览器你传过来的东西是什么,那么浏览器就不知道怎么解析,这个字段我们一定要加上。 (2)设置字符编码 我们将servlet代码改为:

(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException{response.setContentType( “text/html”);PrintWriter out = response.getWriter();out.println( “<a href=’www.baidu.com’>百度</a>” );}

浏览器显示结果为:

为什么会这样呢?原来如果你不在Content-Type中设置字符集编码,那么tomcat默认使用ISO8859-1,这个字符集中是没有中文的,所以会出现问号,表示找不到该字符。

将代码改为:

response.setContentType( “text/html;charset=utf-8”);

浏览器将显示出正确的结果,我们在IE中右键–编码(如果没有IE8,可以下载360急速浏览器,然后右键–切换到IE8模式),我们会发现浏览器自动将该网页的编码设置为utf-8,这个时候我们将编码设置为ISO,网页出现乱码,再次刷新网页发现显示正常,查看编码我们会发现,IE又把编码从ISO自动设置为utf-8。这说明什么?说明浏览器会根据Content-Type中的字符集来自动改变网页的编码。

将代码改为:

response.setContentType( “text/html;charset=gbk”);

浏览器将显示出正确的结果,在IE中右键–编码,我们会发现浏览器自动将该网页的编码设置为gb2312,那么问题来了,为什么浏览器没有将编码自动设置为gbk?我们在网页上右键–编码–更多,会发现在更多列表里面没有gbk这个编码,也就是说IE不支持gbk编码,这个时候IE会选择默认的编码来处理,也就是gb2312,而gb2312和gbk是兼容的,所以也能显示出正确的结果。对于浏览器默认的字符集编码,我们是可以自己设定的,但是在中文操作系统下,浏览器的默认设置是gb2312

通过上面的实验内容,我们知道setContentType这个方法,如果不设置字符集编码,tomcat会采用自身默认的编码,,往往是不支持中文的。如果设置了字符集编码,且浏览器支持该编码,那么浏览器就会自动根据该值设置网页编码,如果浏览器不支持的话,那么就会选择浏览器默认编码。

为了支持中文,我们的最佳实践是将字符集编码设置为gb2312 gbk或者utf-8,这三个都支持中文,浏览器也都支持,当然个人推荐utf-8好一点。

最后一点,该方法要在response.getWriter()之前调用,这样对输出才有效。

总结:setContentType设置响应信息的MIME类型和字符集编码,该值能够控制浏览器的行为。

摘抄美文4、承诺是一件美好的事情,但美好的东西往往不会变为现实。

response.setContentType response.setCharacterEncoding respon

相关文章:

你感兴趣的文章:

标签云: