getresponsee.getOutputStream用完必须关吗

紧急求助:如何解决response.getoutputstream和 response.getwriter的冲突-CSDN论坛
紧急求助:如何解决response.getoutputstream和 response.getwriter的冲突
使用的是spring3&mvc,正在做的一个功能中,需要把一个字节数组动态生成为word供下载,并且,因为使用了ajax(extjs)需要返回一个json对象给前台,做一些处理,但是遇到了严重问题,因为输出word,需要的是输出流response.getoutputstream,而json对象需要response.getwriter输出,结果总是报错,google之后,知道是因为这两个方法冲突,请高手们指点迷津,又没有什么办法来处理我的这个需求,部分代码如下
@RequestMapping(params&=&"method=runTemplate")
public&void&runTemplate(HttpServletResponse&response,HttpServletRequest&request)throws&Exception
&&byte[]&b=ParseWordTemplate.parseTemplate(in,map);&&
&&response.setContentType("application/msword");
&&response.setHeader("Content-disposition","filename=Example.doc");
&&response.setContentLength(b.length);
&&ServletOutputStream&sos&=&response.getOutputStream();
&&sos.write(b,&0,&b.length);
&&sos.flush();
&&sos.close();
&&PrintWriter&out&=&response.getWriter();
&&out.print("{success:true,msg:'保存成功'}");
&&out.flush();
&&out.close();
无法解决。
一个请求不可能有两个响应体。
拆成两个Action,用一个页面包含一个链接的方式给出word下载。前面那个页面中可以返回json给浏览器。
何谓下载?如果你打算给客户“另存链接为”那样单独保存这个文件到磁盘上的话,那这个响应页面就只需要就给出一个&URL,当用户点击了那个&URL&之后才真正的生成&&word&并写出内容,也就是说关键在于,两件事你在一步想做完它,所以出错了。
回复用户名:tianya23
文章数:863
评论数:64
访问量:2088498
注册日期:
阅读量:1297
阅读量:3317
阅读量:583620
阅读量:468728
51CTO推荐博文
From:http://yulimeander./.html
ava.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/ 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对象回显操作结果。
***********************************************************
response.getOutputStream() 和 requonse.getWriter() 区别
(1)使用tomcat5容器调用response.getOutputStream()方法即可实现,但调用requonse.getWriter()方法时,输出二进制数据时(图片等内容无法显示)则出现&getWriter() has already been called for this response&异常。
(2)使用tomcat6容器调用response.getOutputStream()方法时有中文字符会发生&java.io.CharConversionException:Not an ISO 8859-1 character:&异常,调用requonse.getWriter()方法时可实现文本字符串数据输出,调用response.getOutputStream()方法可现实字节流数据的输出。
&&& 就上述出现的问题进行分析研究,阅读了tomcat6的源代码发现,在调用response.getOutputStream()方法时会判断是否已调用了requonse.getWriter()方法;相反在调用requonse.getWriter()方法时会判断是否已调用了response.getOutputStream()方法。
&&& 在tomcat5时并没有出现这个问题,使用response.getOutputStream()方法可现实两种数据输出,只是在使用requonse.getWriter()时发生异常,而在tomcat6下则必须针对不同的数据类型选择相应输出流,这时为什么呢?仔细阅读tomcat6源代码没有发现问题的根源,给出的参考时:在一次客户端请求的响应动作中,只能调用一种响应输出方法,要么是getWriter()要么是getOutputStream(),且如果使用getOutputStream()方法输出字符串格式的数据时,中文无法正常通过将发生&java.io.CharConversionException:Not an ISO 8859-1 character:&异常,在tomcat5下没有对getOutputStream()方法进行严格控制,中文字符串可正常通过。可见tomcat6的安全机制比tomcat5要严格,对于字符串格式的数据要求使用getWriter()方法输出响应,如果使用了getOutputStream()方法输出响应,则对输出的字符串数据进验证,要求高字节必须为0,显然中文是无法通过的。
了这篇文章
类别:┆阅读(0)┆评论(0)2015年2月 Java大版内专家分月排行榜第二2014年3月 Java大版内专家分月排行榜第二
2014年9月 Java大版内专家分月排行榜第三2014年6月 Java大版内专家分月排行榜第三2014年2月 Java大版内专家分月排行榜第三2013年11月 Java大版内专家分月排行榜第三2013年10月 Java大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。博客分类:
下载文件的时候报错!!!
response这个对象是Servlet自己管理的,之所以出现上面的错误:
1.网上都说跟Output之类其他的输出流相互排斥了。
2.也可能是多次调用那个Struts里面定义的方法。
3.最后查出原因:Struts方法之间调用引起的。
因为:每个方法都返回的是一个ActionForward对象,而response是ActionForward对象参数,所以就会使response冲突!
例如:
public AcitionForward AAA(HttpServletResponse response){
return mapping.findForward(".....");
//下载操作
public ActionForward BBB(HttpServletResponse response){
return mapping.findward("....");//返回一个ActionForward对象
上面写会报错,这么写就不会了!
public AcitionForward AAA(HttpServletResponse response){
if(null == BBB()){//加一个判断
//下载操作(凡是用到response的操作)
public ActionForward BBB(HttpServletResponse response){
//必须返回一个NULL
突破点:response这个封装的对象里面有个useingOutputStream标志,boolean型 所以就是根据这个来查getOutputStream()是否重复调用的&
那怎么解决啊楼主都写了呀,只要在用到response的方法里return null就行了
and4walker
浏览: 445276 次
来自: 北京
另外,你的解压方法的方法名的定义改下吧,叫unzipFile( ...
快乐向日葵 写道cherryzhu 写道你好,我使用这个方法的 ...
cherryzhu 写道你好,我使用这个方法的时候发现了一个错 ...
代码你省略了呀,,,title后面的都给省了。不过也很感谢啦
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 response.getentity 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信