博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
getOutputStream() has already been called for this response解释以及解决方法
阅读量:7141 次
发布时间:2019-06-29

本文共 2347 字,大约阅读时间需要 7 分钟。

异常:getOutputStream() has already been called for this response 的解决方法

  今天在第一次接触使用“验证码”功能时,在执行时出现了异常信息:

  严重: Servlet.service() for servlet jsp threw exception

  java.lang.IllegalStateException: getOutputStream() has already been called for this response

  。。。。

  在网上搜索之后的解决方法是:

  在生成验证码的jsp文件末尾添加两句话

  out.clear();

out = pageContext.pushBody();

  ===========================================================================

  查找的原文如下:

  ()

  tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

  在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),

没有妥善处理好的原因。
具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
   if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
  }
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

  采用方法很简单.在使用OutputStream输出流完成后,调用下面2个方法即可解决该问题:

out.clear();
out = pageContext.pushBody();

  示例代码:

  OutputStream os=response.getOutputStream();

os.write(new String("true  "+"nowNum=" + nowNum+"===").getBytes());
os.flush();
os.close();

  out.clear();

out = pageContext.pushBody();

  ----------------------------------------------------------

  在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception

  原因一:

JSP默认的输出流为PrintWriter ,即<% %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%$amp;>amp;$lt;%中的任何东西(包括HTML标签,空格,回车等东西)应该就可以。
对于这样的情况应该这样来解决,删除%$amp;>amp;$lt;%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句response.reset()。
原因二:
   
在J2EE的API参考里有这么个:

  ServletResponse的getWriter()方法里会抛出这个异常,

  IllegalStateException - if the getOutputStream method has already been called 

for this response object

  而它的getOutputStream()方法里会抛出这个异常.

  IllegalStateException - if the getOutputStream method has already been called for this response object

  并且两者的函数申明里都有这么样的一句

Either this method or getOutputStream() may be called to write the body, not both.
Either this method or getWriter() may be called to write the body, not both.
以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式
OutputStream output=response.getOutputStream();
while((len=in.read(b)) >0) 
  {
  output.write(b,0,len); 
  }
output.flush();
而不是把response.getOutputStream().write()放到循环体内

转载地址:http://aogrl.baihongyu.com/

你可能感兴趣的文章
使用dockerfile创建镜像
查看>>
带你一分钟理解闭包--js面向对象编程
查看>>
MySql基本使用方法
查看>>
[转]TCP 状态机
查看>>
mysql 原理 ~ innodb恢复机制
查看>>
水题 Codeforces Round #296 (Div. 2) A. Playing with Paper
查看>>
爬取我主良缘,获取个人图片及其信息
查看>>
字符型设备驱动程序-first-printf以及点亮LED灯(四)
查看>>
KAFKA 监控管理界面 KAFKA EAGLE 安装
查看>>
sublime3 前端个人常用插件及快捷键
查看>>
加密传输SSL协议4_综合方案
查看>>
Git教程--Git安装和版本库的创建
查看>>
(转)volatile的使用
查看>>
Java编程一些经验
查看>>
Android 程序调试
查看>>
cas系列-cas REST协议(三)
查看>>
LAME的“命令行”
查看>>
技术人员的眼高手低
查看>>
PAT 天梯杯 L2-020 功夫传人
查看>>
AIX lsof 命令
查看>>