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

  • Post author:
  • Post category:其他


在写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”);这样的语句就会导致这个异常了。