getOutputStream() has already been called for this response解释以及解决方法

异常: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()放到循环体内

时间: 2024-11-03 17:21:32

getOutputStream() has already been called for this response解释以及解决方法的相关文章

Response乱码的解决方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //告诉servlet用UTF-8转码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //浏览器用utf8来解析返回的数

在Struts2中使用poi进行excel操作下载的时候报getOutputStream() has already been called for this response 错误 [转]

在项目中用到了poi这个开源的操作excel文件的jar. 项目中用到struts2容器管理servlet.不是单纯的直接用servlet.         workbook.write(os);           os.flush();            os.close();           return "SUCCESS";  在我的action中用是这样处理最后的传出.但是报出了: java.lang.IllegalStateException: getOutputS

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

在使用tomcat6开发的过程中,由于要输出数据统计图,在后台每次生成图形到前台显示时,总是抛出异常,内容显示有: getOutputStream() has already been called for this response 在百度一搜一大把,可见很多人都遇到过类似的问题,解决办法也差不多,在前台使用完输出流以后调用以下两行代码即可: out.clear(); out = pageContext.pushBody(); 但是我们的工程是在后台使用getOutputStream(),因此

JSP文件下载及出现getOutputStream() has already been called for this response的解决方法

http://iamin.blogdriver.com/iamin/1072546.html 一.采用RequestDispatcher的方式进行 1.web.xml文件中增加  <mime-mapping>    <extension>doc</extension>    <mime-type>application/vnd.ms-word</mime-type>  </mime-mapping> 2.程序如下: <%@pag

getOutputStream() has already been called for this response

ang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:564) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:212) at javax.

Java Web报错:getOutputStream() has already been called for this response解决方案

今天做了个导出excel表的功能.大概代码如下: ouputStream = response.getOutputStream(); wb.write(ouputStream); ouputStream.flush(); ouputStream.close(); 1234发现报错 java.lang.IllegalStateException: getOutputStream() has already been called for this response1报错原因getOutputStr

getOutputStream() has already been called for this response 从了解到解决

一.背景说明        在tomcat的localhost.log日志中时长见到 getOutputStream() has already been called for this response 异常的身影,一直不知由于哪里原因导致异常的产生,此异常并不会影响前端客户正常使用. 二.认识异常        异常详情如下所示(部分代码): org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for

jsp页面has already been called for this response错误解决方法。

创建验证码的jsp页面提示错误:has already been called for this response <%@ page contentType="image/jpeg" %><%@ page import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%><%!Color getRandColor(int fc,int bc){ //在确定的范围中获得随机

vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法(转载)

vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法 笔者用的Linux发行版本为centos当用FTP客户端连接时,出现如下错误提示: Response: 500 OOPS: cannot change directory:/home/bhtest 输入命令查看 [[email protected]]# sestatus -b| grep ftpallow_ftpd_anon_write offallow_ftpd_full_acc