获取HttpServletResponse输出流的两种方法



一、绪言

本文章对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)设置,则此方法将覆盖它。



六、参考文献

1.官方文档:Servlet 3.1 API

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



  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 中,HttpServletResponse 对象的响应体是通过输出OutputStream)或输出写入器(Writer)进行写入的,所以获取 HttpServletResponse 的 body 可以通过以下步骤实现: 1. 创建一个 ByteArrayOutputStream 对象,用于存储响应的字节。 2. 获取 HttpServletResponse 对象的输出输出写入器。 3. 将输出输出写入器中的内容写入 ByteArrayOutputStream 对象中。 4. 将 ByteArrayOutputStream 对象中的字节转换为字符串即可获取 HttpServletResponse 的 body。 以下是示例代码: ```java // 创建一个 ByteArrayOutputStream 对象 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 获取 HttpServletResponse 对象的输出输出写入器 ServletOutputStream outputStream = response.getOutputStream(); PrintWriter writer = response.getWriter(); // 将输出输出写入器中的内容写入 ByteArrayOutputStream 对象中 if (outputStream != null) { outputStream.write(baos.toByteArray()); } else if (writer != null) { writer.write(new String(baos.toByteArray())); } // 将 ByteArrayOutputStream 对象中的字节转换为字符串 String body = baos.toString("UTF-8"); ``` 以上代码将会将 HttpServletResponse 的响应体转换为字符串,并存储在 body 变量中。需要注意的是,如果使用了输出输出写入器两种方式中的任意一种,就要判断输出输出写入器是否为 null,只有不为 null 才能将其内容写入 ByteArrayOutputStream 对象中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值