全国咨询热线:400-618-4000

Java培训之HttpServletResponse的输出问题

更新时间:2019年03月21日18时01分 来源:传智播客Java篇培训学院

1 response的输出流
response对象有getWriter()和getOutputStream()两个方法,它们都是用来向客户端响应用的流对象,不过一个是字符流,另一个是字节流。
  • PrintWriter getWriter():获取响应字符流,用来向客户端响应二进制数据,例如图片;
  • ServletOutputStream getOutputStream():获取响应字节流,用来向客户端响应文本数据,例如HTML代码。
这两者之前只能使用其中一个,也就是说,要么使用字符流,要么使用字节流,不能两者兼得。如果在获取其中一个流对象后,再去获取另一个流,那么就会出现异常。
2 刷新输出流
response内部的输出流有8KB的缓冲区,如果缓冲区满了的话,那么response会自动去提交,即把缓冲区内容输出给客户端。这时调用response的isCommited()方法返回的就是true,表示response已经提交过至少一次了。
也可以在缓冲区没有装满时调用response.flushBuffer()方法刷新输出流,把缓冲区中的数据发送到客户端去。同样,这也会导致response的isCommited()方法返回的就是true,表示response已经提交过至少一次了。
其实也可以调用response.getWirter().flush()方法达到与调用response.flushBuffer()相同的效果。这两种方式基本相同!
一旦response的isCommited()方法返回true,这说明服务器已经至少把状态码、响应头等数据发送给客户端了,也就是说已经开始向客户响应了。
但是,这里你要注意一下,不是说服务器向客户端发送了数据,就表示数据一定会显示在浏览器上。因为客户端的浏览器也许会有自己的缓存,在浏览器的缓存没有满之前,浏览器是不会去显示的。例如IE8和Google浏览器就是这样,但FireFox会马上显示数据!
测试得到IE8的缓存为16KB,只要响应数据大于16KB就会在IE8上显示出来。、

本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/Android