Drink Drank Drunk

有人说他千杯不醉,我想是因为他没遇到心爱的人;在我家乡的那片麦田上,他不算一个会喝酒的人。

原创 简单理解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]”);

}


愚人愚见,多多指教。 
 

发表于 @ 2007年05月28日 18:12:00|评论(loading...)

新一篇: tomcat使用小记(简单总结) | 旧一篇:  双排序:从算法的选择到问题求解

用户操作
[即时聊天] [发私信] [加为好友]
patriotlml
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
patriotlml的公告
M.Liang Liu,笔名午夜高楼,爱好读书、足球、编程和音乐。有些东西喜欢一个人静静地欣赏:近期计划在43things上,图片在flickr上,音乐在webjay上,收藏在del.icio.us上,读书和电影在douban上,且梦且行在donews上。也和你一样怀着梦想默默地行走在路上。
文章分类
收藏
    BlogRolls
    baggio785
    CSDN Blog开发小组(RSS)
    javathinker
    lucky
    M.Liang Liu's blog(RSS)
    ytfei@JAVA
    孟岩视点
    战斗在代码行间
    昆明小虫
    星☆空
    雪峰的Blog
    Links
    CSDN软件研发频道
    dancefire
    javaworld
    Matrix:与Java共舞
    sourcefourge
    struts@CSCN
    struts-doc-1.2.9
    满江红·开源
    存档
    软件项目交易
    Csdn Blog version 3.1a
    Copyright © patriotlml