`
guoyiqi
  • 浏览: 1048749 次
社区版块
存档分类
最新评论

tomcat5下jsp出现getOutputStream() has already been called for t

    博客分类:
  • jsp
阅读更多

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()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:
out.clear();
out = pageContext.pushBody();

最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)
imag.jsp

<%@ page  import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%@ page import="java.io.OutputStream" %>
<%!
Color getRandColor(int fc,int bc){
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
try{
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
OutputStream os=response.getOutputStream();
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}
session.setAttribute("rand",sRand);
g.dispose();

ImageIO.write(image, "JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
}
catch(IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}%>

分享到:
评论
18 楼 bingo6001 2011-08-08  
非常感谢,
顺便记录一下~
17 楼 crystalsunkai 2010-09-09  
太棒了!只是验证码的实例 在浏览器中是乱码!  只有在MyEclipse中的浏览器看的香菜正常 是怎么回事??[size=large][/size][color=red][/color]
16 楼 halatate 2010-08-14  
多谢指点,你真厉害!好人啊
15 楼 LD_21 2010-06-11  
14 楼 shijian0306 2009-12-16  
哎,你的厉害的干活
13 楼 potahai 2009-12-04  
回个贴都这么难,顶下
12 楼 gouven 2009-10-24  
谢谢~~~
11 楼 muqingren 2009-09-15  
绝对的非常的感谢
10 楼 facingSun 2009-09-13  
太感谢了,我的问题一直没解决导致服务器都蹦了,非常感谢~~
9 楼 twq 2009-08-18  
太谢谢了,我的是下载代码出现问题,以前是tomcat6,虽然程序在后台报错,但功能还可以实现,而现在程序发布到tamcat5,就直接报错到页面了。用了你的两行就搞定了!呵呵
8 楼 mida 2009-08-13  
太谢谢了,我的是下载代码出现问题,以前是tomcat6,虽然程序在后台报错,但功能还可以实现,而现在程序发布到tamcat5,就直接报错到页面了。用了你的两行就搞定了!呵呵
7 楼 yezi1305 2009-03-18  
多谢多谢!
6 楼 ddd0401 2008-12-13  
问题是解决了,但是出现问题的原因还是没很明白response.getWriter()为什么和response.getOutputStream()相冲突的?
5 楼 zhangbingname 2008-11-03  
thanks ,解决了我的一个问题
4 楼 yingjinsheng 2008-08-09  
不错,出现这样的错误只要加上
out.clear();
out = pageContext.pushBody();
两句话就行了
3 楼 danielli007 2007-10-09  
补充一下:我是在MyEclipse6.0下运行出错的。
2 楼 danielli007 2007-10-09  
这个问题解决了,但又出现:
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:737)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
at org.apache.coyote.http11.InternalOutputBuffer.flush(InternalOutputBuffer.java:299)
at org.apache.coyote.http11.Http11Processor.action(Http11Processor.java:963)
at org.apache.coyote.Response.action(Response.java:183)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:314)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:98)
at javax.imageio.stream.FileCacheImageOutputStream.close(FileCacheImageOutputStream.java:213)
at javax.imageio.ImageIO.write(ImageIO.java:1567)
at org.apache.jsp.yzm_jsp._jspService(yzm_jsp.java:135)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
这样的错误!我没连数据库,请问是什么原因?
1 楼 daochuan 2007-05-21  
ok
太棒了!!

相关推荐

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

    在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...

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

    在使用Tomcat 6服务器部署和运行Java Server Pages (JSP) 时,可能会遇到一个特定的异常:“getOutputStream() has already been called for this response”。该异常发生在尝试向响应对象中写入数据时,已经调用了...

    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页面中分离出来,单独写了一个类 便于重用。

    Cannot forward after response has been committed

    "Cannot forward after response has been committed" 是一个在Java Web开发中常见的错误,通常与Servlet、Filter或控制器逻辑有关。这个错误表明服务器已经完成了对HTTP响应的处理,并将其发送到客户端,然后试图...

    tomcat 下的支持中文格式的下载

    本篇文章将详细探讨如何在Tomcat环境下,使用JSP技术来实现支持中文格式的文件下载功能。 首先,我们要明白在HTTP协议中,文件名的编码是一个关键问题。由于历史原因,HTTP协议默认使用ASCII编码,这可能会导致中文...

    5.Tomcat服务器运行原理.doc

    【5.Tomcat服务器运行原理】 Tomcat服务器作为Apache软件基金会的Jakarta项目中的核心组件,是基于Java Servlet和JavaServer Pages(JSP)技术的Web应用服务器,它扮演着接收HTTP请求并处理这些请求的角色,然后将...

    tomcat文件上传下载、删除

    本文将详细讲解如何在Tomcat环境中进行这些操作,以及解决可能出现的问题。 首先,我们要理解Tomcat在文件操作中的角色。Tomcat本身并不直接提供文件上传、下载和删除的功能,但它可以通过部署在其中的Web应用来...

    tomcat6下连接池的配置与使用-原创

    ### Tomcat6下连接池的配置与使用 #### 前言 在现代Web开发中,数据库连接管理是一项至关重要的任务。为了提高性能并确保资源的有效利用,使用连接池是常见的做法。对于运行在Tomcat服务器上的Java应用程序,正确...

    tomcat上传下载文件

    在IT行业中,Tomcat是一个广泛使用的轻量级应用服务器,主要用来部署Java Servlet和JavaServer Pages(JSP)应用程序。Struts2是一个基于MVC设计模式的Java Web框架,用于构建可维护、可扩展和高度模块化的Web应用...

    Tomcat中一种半通用回显方法 - 先知社区1

    【标题】:“Tomcat中一种半通用回显方法 - 先知社区1”涉及的知识点主要围绕Java Web服务器Tomcat的内部工作原理以及利用反射技术进行回显操作。以下是详细解释: 1. **Tomcat与HTTP响应**: Tomcat是Apache软件...

    jfreechart 在tomcat下的应用

    **JFreeChart在Tomcat下的应用** JFreeChart是一个强大的Java图表库,它提供了一种简单的方法来创建各种复杂的图表,如饼图、线图、柱状图、散点图等,广泛应用于数据分析和报告展示。在Java Web应用程序中,尤其是...

    JSP基础札记笔记

    例如,在`E:\JSPTEST`目录下,应该包含`WEB-INF`目录以及`web.xml`文件。 - `web.xml`是部署描述符文件,包含了应用程序的所有配置信息。 - **修改server.xml**:接着,需要修改Tomcat的`server.xml`文件,添加...

    servlet与jsp中文乱码处理

    在Java Web开发中,Servlet和JSP是两个重要的技术组件,它们经常被用来构建动态网页。然而,在处理中文字符时,由于编码不一致或者处理不当,可能会出现中文乱码问题。这个问题困扰了很多开发者,但通过了解编码原理...

    tomcat源码解析

    ### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用的开发与部署环境中。它不仅支持Servlet API,还支持JSP规范,使得开发者能够轻松地构建动态网页。本文旨在深入...

    JSP的一些简单习题

    - Servlet和JSP必须基于Web容器(如Tomcat、Jetty等)才能提供服务。Web容器负责管理Servlet的生命周期,并将HTTP请求分发给相应的Servlet或JSP页面。 3. 实现HTTP Servlet: - 实现HTTP请求的Servlet类通常需要...

    使用jsp下载excel文件

    - Apache Tomcat 或其他支持 JSP 的 Web 服务器 - 开发工具:如 Eclipse、IntelliJ IDEA 等 2. **技术栈**: - **JSP (Java Server Pages)**:一种结合了HTML与Java的网页技术,用于动态生成Web页面。 - **...

    JSP内建对象、使用JavaBean

    Web应用通常基于Servlet容器运行,如Tomcat、Jetty等,它们解析并执行JSP文件。 **JSP语法基础** JSP页面由两部分组成:静态内容(HTML、CSS、JavaScript)和动态内容(Java代码)。动态内容主要通过以下方式插入...

Global site tag (gtag.js) - Google Analytics