`
燕子~~
  • 浏览: 107076 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

IllegalStateException: getOutputStream() 异常的解决方案

阅读更多
在写JSP程序的时候,如果程序中调用了response.getOutputStream()去向客户端输出文件等数据流,容器就会抛出这样的异常:
Java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:530)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:127)
 
OR
java.lang.IllegalStateException: getOutputStream()はこのレスポンスに対して既に呼び出されています
org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:599)
org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseFacade.java:163)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:122)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:190)

产生这样的异常原因是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的response.getOutputStream()产生冲突,
下面是web容器生成的部分servlet代码:
      out = pageContext.getOut();
      _jspx_out = out;
      out.write("\r\n");
      out.write("\r\n");
解决的方法有两步:1、如果JSP中有
<%@ page import ... %>
<%@ page import ... %>
这样的代码,则改为:
<%@ page import ... %><%
%><%@ page import ... %><%
%><%
// ...getOutputStream()...
%>
改完后生成的servlet代码:
      out = pageContext.getOut();
      _jspx_out = out;
      //out.write("\r\n");这个将被去掉
      //out.write("\r\n");这个将被去掉
2、如果第一步改完还是有异常,则在程序的最后添加:
out.clear();
out = pageContext.pushBody();
就可以解决了。
 
--------------
PS:注意"回车"问题.
jsp中是可以用getOutputStream的,
条件就是jsp代码文件里〈%%〉之外不能够有回车 否则jsp被编译成servlet的时候会生成 out.write("\r\n");这样的语句就会导致这个异常了。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics