Servlet_输出流jsp注意事项

Posted 辉常努腻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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内置对象!)

以上是关于Servlet_输出流jsp注意事项的主要内容,如果未能解决你的问题,请参考以下文章

9.JSP进阶

Java.web笔记一览

Servlet基础

Java Web基础:JSP工作原理和基础概念

servlet 跳转页面后response.getWriter().println输出的汉字乱码

JavaEE实战——jsp入门El表达式JSTL标签库