`
sctom123
  • 浏览: 110051 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

getOutputStream() has already been called for this response

阅读更多
在JEEE开发文件下载中。有时候看到:
java 代码
 
  1. 严重: Servlet.service() for servlet jsp threw exception  
  2. java.lang.IllegalStateException: getOutputStream() has already been called for this response  
  3.     at org.apache.catalina.connector.Response.getWriter(Response.java:604)  
  4.     at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)  
  5.     at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)  
  6.     at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)  
  7.     at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)  
这样的错误,常常让人摸不清问题的所在。一个偶然的操作,我把servelt中业务逻辑的代码,用try,catch包起来。如下所示:
java 代码
 
  1. try {  
  2.   ............
  3. catch (RuntimeException e) {  
  4.     e.printStackTrace();  
  5. }  
发现以上异常消失。一个RuntimeException 错误的堆栈被打印出来。这个RuntimeException 错误被处理之后,一切正常。于是联想到以后如何处理服务器的这一怪异行为。
       到网上搜索后。
java 代码
  1. 在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后  
  2. 有一段这样的代码  
  3. finally {  
  4.       if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);  
  5.     }  
  6. 这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和  
  7. response.getOutputStream()相冲突的!所以会出现以上这个异常。  
  8.   
  9. 然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--  
  10. 将jsp内的所有空格和回车符号所有都删除掉),  
然后又看了一下我先前的错误堆栈:
java 代码
  1. java.lang.IllegalStateException: getOutputStream() has already been called for this response  
  2.     at org.apache.catalina.connector.Response.getWriter(Response.java:604)  
  3.     at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)  
  4.     at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)  
  5.     at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)  
  6.     at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)  
  7.     at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)  
  8.     at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)  
  9.     at org.apache.jsp.unhandledException_jsp._jspService(unhandledException_jsp.java:120)  
  10.     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)  
  11.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)  
呵呵。
org.apache.jasper.runtime.PageContextImpl.release
由上面的堆栈可以看出。在 javax.servlet.http.HttpServlet.service中出错。会执行org.apache.jasper.runtime.JspFactoryImpl.releasePageContext,然后会调用org.apache.catalina.connector.Response.getWriter(Response.java:604),由于
getWriter,和您下载文件时用的response.getOutputStream()冲突。见以下doc
java 代码
 
  1. getOutputStream  
  2.   
  3. public ServletOutputStream getOutputStream()  
  4.                                     throws java.io.IOException  
  5.   
  6.     Returns a ServletOutputStream suitable for writing binary data in the response. The servlet container does not encode the binary data.  
  7.   
  8.     Calling flush() on the ServletOutputStream commits the response.
  9.  Either this method or getWriter() may be called to write the body, not both.  
  10.   
  11.     Returns:  
  12.         a ServletOutputStream for writing binary data  
  13.     Throws:  
  14.         IllegalStateException - if the getWriter method has been called on this response  
  15.         java.io.IOException - if an input or output exception occurred  
  16.     See Also:  
  17.         getWriter()  
至此。一切都明白了。想到经常在做服务器开发的时候,经常出现莫名其妙的服务器错误。在重新启动服务器后又消失掉了。有可能是再您的程序中,出现了unchecked的异常。而服务器在处理异常是有一些预订的行为。有可能在处理异常时又出现新的错误。从而把您的视线移到服务器出现的那个错误上。而我们往往对这些错误没什么办法。在这个时候,您不妨跟踪到您代码出错的那一行。把异常捕获。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics