getOutputStream() has already been called for this response异常的缘由和解决方法

1.tomcat5下jsp出现getOutputStream() has already been called for this response异常的缘由和解决方法在tomcat5下jsp中出现此错误通常都是在jsp中使用了输出流(如输出图片验证码,文件下载等),
没有妥善处理好的缘由。 java

具体的缘由就是
在tomcat中jsp编译成servlet以后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码 apache

finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
 这里是在释放在jsp中使用的对象,会调用response.getWriter(),由于这个方法是和

response.getOutputStream()相冲突的!因此会出现以上这个异常。 tomcat

而后固然是要提出解决的办法,其实挺简单的(并非和某些朋友说的那样--
将jsp内的全部空格和回车符号全部都删除掉), jsp

在使用完输出流之后调用如下两行代码便可:
函数

out.clear();
out = pageContext.pushBody();
 

2 this

getOutputStream() has already been called for this response问题的解决
在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception spa

缘由一:
JSP默认的输出流为PrintWriter ,即<% %>之外的东西所默认的输出方式,若是你尝试在JSP中使用ServletOutputStream就会引发错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%><%中的任何东西
(包括HTML标签,空格,回车等东西)应该就能够。
对于这样的状况应该这样来解决,删除%><%之间的全部内容包括空格和换行符,最后也要消除空格和换行符,
最好再加上一句response.reset()。
缘由二:
     
在J2EE的API参考里有这么个: code

ServletResponse的getWriter()方法里会抛出这个异常, 对象

IllegalStateException - if the getOutputStream method has already been called 
for this response object
图片

而它的getOutputStream()方法里会抛出这个异常.

IllegalStateException - if the getOutputStream method has already been called for this response object

而且二者的函数申明里都有这么样的一句
Either this method or getOutputStream() may be called to write the body, not both.
Either this method or getWriter() may be called to write the body, not both.


以上说明也解释了为何在往页面中写入图片的时候要使用以下循环格式

OutputStream output=response.getOutputStream();
while((len=in.read(b)) >0) 
{
output.write(b,0,len); 

}
output.flush();
  而不是把response.getOutputStream().write()放到循环体内 在页面中直接写: <body bgcolor="#ffffff"> <h1> <% response.getOutputStream(); %> </h1> </body> 将会出现错误消息以下: java.lang.IllegalStateException: getOutputStream() has already been called for this response org.apache.catalina.connector.Response.getWriter(Response.java:604) org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
相关文章
相关标签/搜索