0
点赞
收藏
分享

微信扫一扫

Servlet_输出流jsp注意事项


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

HTTP 响应码 以及 各自对应解释 关于 Web API 技术标准的开发文档网站(https://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内置对象​​!)


举报

相关推荐

0 条评论