java.lang.IllegalStateException: OutputStream already obtain

这个问题终于解决了。
java.lang.IllegalStateException: OutputStream をすでに取得しました
或者
java.lang.IllegalStateException: OutputStream already obtain

这个问题本身存在于文件下载的页面中,一般的JSP以字节的方式输出(JspWriter),下载的页面需要以数据流的方式输出(OutputStream)。这两者只能选其一,不能同时使用,否则会出IllegalStateException。
问题将会很隐蔽的出现。原因在于当页面中有不必要的字符的时候,比如"空格"、"换行符",JSP则默认以字节的方式输出这时候就会出IllegalStateException。所以在下载的页面不应该有多余的字符:
<%
....
....

%><%
....
....

%>

本次问题的直接原因并不在于页面是下载页面,相反的页面是上传画面,只是在确认文件是否存在的时候调用了下载的共通方法,该方法中取得了response.getOutputStream()。但是,不知道为什么JRun下没有该问题,Websphere下却出现,奇怪。


解决了, jsp里面默认就有out对象
在Java脚本范围外(即 <% ...%> 之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。因为它影响了返回给浏览器的数据流,导致解析出错。


检查应用服务器日志有“OutputStream already obtained”或者“已获取输出流”的错误信息。
此问题很隐蔽,解决问题的办法倒是很简单,将原来生成报表的JSP代码中的第二行的“<%”加到第一行,同时确认JSP代码的最后一定是以“%>”结束,“%>”后面跟空格和回车换行都会出错。


原因是由于Servlet 规范不同造成的.
Servlet1.2规范规定了OutputStream只能获得一次,在jsp中实际上已经通过内置对象out获得过一次,所以在程序里输出excel等文件时需要再getOutoutStream时就会报:OutputStream already obtained, WAS6里面遇上这种情况就直接报错并且不会正确执行输出,而WAS5。0只是报错但是还是允许输出。WAS6实际上对规范的实现更加严格了。

解决方法:将进行输出的jsp改用servlet实现。因为servlet里面没有内置的out对象,所以程序执行etOutoutStream就不会出错
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值