一、绪言
本文章对HttpServletResponse类中的getWriter()方法、getOutStream()方法进行了记录和浅层次的探究,以备后查
二、响应获取输出流的两种方式
在Servlet3.1 API中显示,对于响应(HttpServletResponse)获取输出流,我们可以使用以下两种方法:
ServletOutputStream getOutStreawm() throws java.io.IOException
public java.io.PrintWriter getWriter() throws java.io.IOException
浏览器和服务器端获取响应输出流图示:
图片来源:https://blog.csdn.net/qq_42750329/article/details/89552805
注意:
getOutputStram()和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能调用另外一个
三、getOutputStream()
ServletOutputStream类提供了一个将二进制数据写入响应的流,它是一个抽象类。
ServletOutputStream getOutStreawm() throws java.io.IOException
return 用于编写二进制数据的ServletOutputSteam
Throws lllegalStateException:如果已对此响应调用getWriter方法
Throws java.io.IOException:如果发生输入或输出异常
ServletOutputStream sos = response.getOutputStram();
在ServletOutputStream类中提供了一个方法getOutputStream(),调用可以返回一个ServletOutputStream()实例对象,这个实例对象用于输出字符流数据或者二进制的字节流数据。
注意:
响应调用该方法,输出的二进制流数据只适用于ISO 8859-1编码,所以在输出中文的时候会报500错误。
此处参考了java.io.CharConversionException: Not an ISO 8859-1 character:
ServletOutputStream抽象类可重载print()、println()方法。
ServletOutputStream outputStream = response.getOutputStream();
outputStream.print("Hello");
outputStream.println("World");
四、getWriter()
响应调用getWriter()方法会获取一个PrintWriter()实例对象,该实例对象用于处理字符流数据
public void setContentType(String type)
return 一个可以将字符数据返回到客户端的PrintWriter对象
Throws IOException
PrintWriter writer = response.getWriter();
writer.write("登录页");
响应调用getWriter()会获取一个PrintWriter对象,该对象可以将字符以文本的形式发送到客户端。
注意:
此处参考了Stackoverflow上的回答:response.getWriter() returns a PrintWriter object that can send character text to the client.
五、正确获取响应中文输出流
响应调用SetContentType(String type)回获取到Web服务器输出的响应流,即Web Servlet响应浏览器的输出数据。可以重复调用此方法以更改内容类型和字符编码。
public void setContentType(String type)
type 指定内容的MIME类型的String
在响应输出之前添加
response.setContentType("text/html;charset=utf-8");
可以在客户端中正确显示中文
调用此方法的几种时机:
如果在调用getWriter之前调用此方法,则仅从给定的内容类型设置响应的字符编码。
如果在提交响应后调用此方法,则该方法无效。
如果在调用getWriter之后或在提交响应之后调用该响应,则不会设置响应的字符编码
注意:
setCharacterEncoding(MIME字符集)是web服务器输入的请求流,包含了web Servlet响应浏览器的请求数据。如果字符编码已经由setContentType(java.lang.String)或setLocale(java.util.Locale)设置,则此方法将覆盖它。
六、参考文献
2.博客:response.getWriter().writer和response.getWriter().print()区别
3.博客:HttpServletResponse的getWriter()和getOutputStream()详解
4.JavaTpoing:ServletOutputStream class
5.Stackoverflow:what is printwriter out response getwriter in servlet