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的异常。而服务器在处理异常是有一些预订的行为。有可能在处理异常时又出现新的错误。从而把您的视线移到服务器出现的那个错误上。而我们往往对这些错误没什么办法。在这个时候,您不妨跟踪到您代码出错的那一行。把异常捕获。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值