Servlet_输出流jsp注意事项

261 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Servlet输出流两种方法以及注意事项

HTTP 响应码 以及 各自对应解释 关于 Web API 技术标准的开发文档网站(developer.mozilla.org)

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

两种方法

  • HttpServletResponse:

注明:

  1. HttpServletResponse实例对象获得输出流有 两种方式: ①PrintWriter out=response.getWriter(); out对象用于输出字符流数据
  2. ②ServletOutputStream os= response.getOutputStream(); os用于输出字符流数据或者二进制的字节流数据都可以 首先我们来看一下浏览器和服务器端是如何来关闭我们的response获得的输出流的

注意事项

java中用response.getOutputStream()实现文件下载,但报错(抛出异常)

getOutputStream() has already been called for this response

在查找解决方案的时候发现一个值得参考的答案:

在你下载的jsp末尾写

response.reset(); out.clear(); out=pageContext.pushBody();

若这时又包错

java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310) at org.apache.jsp.jsp.util.temp_jsp._jspService(temp_jsp.java:95)………

则只加后两句即可:

out.clear(); out=pageContext.pushBody();

注意事项讲解二

 out.clear();
 out = pageContext.pushBody(); 
  • out = pageContext.pushBody(); 是什么意思?为什么不加入了就报异常: java.lang.IllegalStateException: getOutputStream() has already been called for this response
  • 首先你要知道pushBody()的作用是保存当前的out对象,并更新PageContext中Page范围内Out对象。
  • 至于为什么要加上这句话,是因为JSP容器在处理完成请求后会调用releasePageConter方法释放所有的PageContestObject
  • 并且同时调用getWriter方法。
  • 由于getWriter方法与在JSP页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,
  • 解决方法就是,只需要在JSP页面的最后加上这两条语句。
    • out.clear();
    • out = pageContext.pushBody();

注意事项讲解三

  • 由于jsp container在处理完成请求后会调用releasePageContet方法
  • 会释放所用的PageContext object
  • 并且同时调用getWriter方法
  • 由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突
  • 所以会造成这种异常,解决办法是
  • 只需要在jsp页面的最后加上两条语句:
    • out.clear();
    • out=pageContext.pushBody();
    • 即可(其中out,pageContext均为jsp内置对象!)