`
anminer
  • 浏览: 11314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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就不会出错


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics