`
huibin
  • 浏览: 741120 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

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

    博客分类:
  • JSP
阅读更多

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

    严重: Servlet.service() for servlet jsp threw exception
    java.lang.IllegalStateException: getOutputStream() has already been called for this response

    。。。。

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

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

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

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

查找的原文如下:

http://hi.baidu.com/sihillver/blog/item/d384621e5612cdf01bd57630.html

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方法),要嘛删除除%><%中的任何东西(包括HTML标签,空格,回车等东西)应该就可以。
对于这样的情况应该这样来解决,删除%><%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句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()放到循环体内


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huiwolf007/archive/2008/03/15/2186172.aspx

分享到:
评论

相关推荐

    getOutputStream() has already been called for this response 错误解决

    NULL 博文链接:https://javal.iteye.com/blog/1993903

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

    1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法  在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有...

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    验证码出现getOutputStream()问题解决

    验证码出现getOutputStream() has already been called for this response错误解决

    JSP彩色验证码

    解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    NULL 博文链接:https://nethub2.iteye.com/blog/2023937

    response设置的实例源码

    servlet的response可以对返回的内容和格式进行一些设置。

    servlet2.4doc

    Returns a boolean indicating whether the named response header has already been set. contextDestroyed(ServletContextEvent) - Method in interface javax.servlet.ServletContextListener Notification ...

    验证码(网页中用到的)

    * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server ...

    前台用extjs后台用java.如何导出excel报表

    heads是excel表头,datalist是数据public void createExcelStream(HttpServletResponse response,String filename,String[] heads,List[]&gt; datalist){ try{ OutputStream os = response.getOutputStream();...

    实现视频在线播放.zip

    IOUtils.copy(inputStream, response.getOutputStream()); response.flushBuffer(); System.out.println("输出成功!"); } HTML前端接response收流: &lt;source src="http://localhost:8081/file/output...

    socket编程集萃

     上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作,而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出,那么现在有了基本的模型和基本的操作工具...

    随机验证码源代码详解

    随机获取验证码 public class CheckNumberServlet extends HttpServlet { ... ServletOutputStream sos = response.getOutputStream();…………………………………………………………………………………………

    anmo_mybatis_generator.zip

    public void code(HttpServletRequest request, HttpServletResponse response) throws IOException{ String[] tableNames = new String[]{};... IOUtils.write(data, response.getOutputStream()); }

    批量打包下载

    OutputStream outs = response.getOutputStream();// 获取文件输出IO流 BufferedOutputStream bouts = new BufferedOutputStream(outs); response.setContentType("application/x-download");// 设置response...

    轻量级java web MVC框架

    ServletOutputStream responseOutputStream = response.getOutputStream(); ImageIO.write(bufferImage, "JPEG", responseOutputStream); responseOutputStream.flush(); responseOutputStream.close(); } } ...

    J2ME入门教程.10(j2me与Servlet相互通讯)编写和配置Servlet服务端

    import java.io.*; import java.util.*; import javax.servlet.*; ... public class MyServlet ... OutputStream out_Stream = response.getOutputStream(); out_Stream.write( data ); out_Stream.close(); } }

    JSF文件下载实现

    ServletOutputStream servletOutputStream = response.getOutputStream(); byte[] b = new byte[1024]; int i = 0; FileInputStream fis = new java.io.FileInputStream(realName); while ((i = fis.read(b)) &gt; 0)...

    java 实现的数字验证

    用与java web 开发,java 实现的数字验证码的生成 class Image{} *" %&gt; &lt;jsp:useBean id="image" scope="session" class="myclass.test....ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream()); %&gt;

Global site tag (gtag.js) - Google Analytics