Servlet输出流两种方法以及注意事项
HTTP 响应码 以及 各自对应解释 关于 Web API 技术标准的开发文档网站(https://developer.mozilla.org)
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status • 1
两种方法
- HttpServletResponse:
注明:
- HttpServletResponse实例对象获得输出流有
两种方式:①PrintWriter out=response.getWriter(); - out对象用于输出字符流数据
②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内置对象!)