打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java.lang.IllegalStateException异常:简单分析和简单解决方案
今天写java验证码程序,完成后使用一切正常,但是总抛出java.lang.IllegalStateException异常,虽然并不影响正常使用,但看了总让人觉得很不舒服,检查代码并没有错,最后上网查了不少资料,终于发现原因之所在。
我们在做文件上传或者下载,或者过滤等操作时,可能要用到页面的输出流.
例如在JSP使用:
    response.reset();
    response.setContentType(”application/vnd.ms-excel”);
    OutputStream os = response.getOutputStream();  
抛出异常:
ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
从网上找了下资料,综合一下原因分析:
这是web容器生成的servlet代码中有out.write(””),这个和JSP中调用的response.getOutputStream()产生冲突.
即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException,因为在jsp中,out变量是通过response.getWriter得到的,在程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。
解决方案:
1.在程序中添加:
out.clear();
out = pageContext.pushBody();
就可以了;
2,不要在%][%之间写内容包括空格和换行符
3,在页面写入图片的时候,需要flush()
 OutputStream output=response.getOutputStream();
 output.flush();
4,在页面确定写入<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312”>
孙卫琴说可能是tomcat的bug,我给她回了封信:
:我看了看这里,http://www.javathinker.org/main.jsp?bc=showessay.jsp+filename=tomcat/tomcat_question_chapter13.htm这里是你回复别人的一个帖子,里面的观点基本上和我理解的一样,但是你最后写到可能是tomcat的bug,我想解释一下:在jsp中,out是内嵌对象,即已经设置了PrintWriter out=response.getWriter();这样在再次getOutputStream()得到输出流时(比如转发过滤、下载文件时)就出错了(写排斥锁),我不止一次看到有人的文件下载页面在后台不断打印这个异常。而在servlet中没有默认out内置对象,所以没有出错.你可以在servlet中添加out对象试试,应该会报异常的.所以正确的处理方式就应该是:在servlet中做控制层,在业务处理以前不要获得out对象,当业务操作失败或出现异常时再生成out对象回显操作结果。
可以这样:
try...{...}catch (Exception e) ...{

  PrintWriter out = response.getWriter();

  out.println(”[script type=”text/javascript”]alert(’您的附件不能正常下载,请检查操作或联系管理员’);window.close();[/script]”);

}
愚人愚见,多多指教
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already been called for this response
利用iText在JSP中生成PDF报表
javaee(4)
java.lang.IllegalStateException:Cannot forward after response has been committed
response详解
getOutputStream() has already been called for this response的解决方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服