getOutputStream() has already been called for this response

[size=medium]转自:[url]http://sctom123.iteye.com/blog/139278[/url]

在JEEE开发文件下载中。有时候看到:




java.lang.IllegalStateException: getOutputStream() has already been called [b]for[/b] [b]this[/b] response

at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)

at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)


这样的错误,常常让人摸不清问题的所在。一个偶然的操作,我把servelt中业务逻辑的代码,用try,catch包起来。如下所示:




............

e.printStackTrace();


发现以上异常消失。一个RuntimeException 错误的堆栈被打印出来。这个RuntimeException 错误被处理之后,一切正常。于是联想到以后如何处理服务器的这一怪异行为。
到网上搜索后。

呵呵。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







[b]throws[/b] java.io.IOException

Returns a ServletOutputStream suitable [b]for[/b] writing binary data in the response. The servlet container does not encode the binary data.

[b][size=x-small;]Calling flush() on the ServletOutputStream commits the response.[/size][/b]

[b][size=x-small;] [/size][/b]

a ServletOutputStream [b]for[/b] writing binary data

IllegalStateException - [b]if[/b] the getWriter method has been called on [b]this[/b] response

See Also:



至此。一切都明白了。想到经常在做服务器开发的时候,经常出现莫名其妙的服务器错误。在重新启动服务器后又消失掉了。有可能是再您的程序中,出现了unchecked的异常。而服务器在处理异常是有一些预订的行为。有可能在处理异常时又出现新的错误。从而把您的视线移到服务器出现的那个错误上。而我们往往对这些错误没什么办法。在这个时候,您不妨跟踪到您代码出错的那一行。把异常捕获。

java 代码

有一段这样的代码

[b]finally[/b] {

}

这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和



将jsp内的所有空格和回车符号所有都删除掉),
然后又看了一下我先前的错误堆栈:




at org.apache.catalina.connector.Response.getWriter(Response.java:604)

at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)

at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:186)

at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值