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
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pageimport="java.awt.*"%>
<%@pageimport="java.awt.image.*"%>
<%@pageimport="java.util.*"%>
<%@pageimport="javax.imageio.*"%>
<%!
ColorgetRandColor(intfc,intbc)...{//给定范围获得随机颜色
Randomrandom=newRandom();
if(fc>255)fc=255;
if(bc>255)bc=255;
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);
}
%>
<%
//在内存中创建图象
intwidth=80,height=20;
BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphicsg=image.getGraphics();
//生成随机类
Randomrandom=newRandom();
//设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);
//设定字体
g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));
//画边框
//g.setColor(newColor());
//g.drawRect(0,0,width-1,height-1);
//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(inti=0;i<155;i++)
...{
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
//取随机产生的认证码(5位数字)
StringsRand="";
for(inti=0;i<5;i++)...{
Stringrand=String.valueOf(random.nextInt(10));
sRand+=rand;
//将认证码显示到图象中
g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
//将认证码存入SESSION
session.setAttribute("CertiCode",sRand);
//图象生效
g.dispose();
//设置页面不缓存
response.reset();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
//输出图象到页面
ServletOutputStreamos=response.getOutputStream();
ImageIO.write(image,"JPEG",os);
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out=pageContext.pushBody();
%>
分享到:
相关推荐
在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...
1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有...
验证码出现getOutputStream() has already been called for this response错误解决
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
通过仔细审查代码、优化逻辑和正确处理异常,可以有效地解决"Cannot forward after response has been committed"的问题。 关于提供的"filterTest"文件,可能是用于测试过滤器功能的示例代码。分析和理解这段代码...
解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。
`response.getOutputStream()` 方法是Servlet API的一部分,它用于获取与HTTP响应关联的输出流对象。这个方法在服务器端处理请求时非常常见,尤其在构建动态网页时。 当我们处理一个HTTP请求时,服务器会创建一个`...
JSP内置对象request和response详解 JSP内置对象request和response是JSP开发中两个非常重要的对象,它们分别用于处理客户端请求和响应信息。在本文档中,我们将详细介绍request和response对象的功能和使用方法。 ...
3. **重复调用getOutputStream()**:某些API可能会在内部缓存OutputStream,如果你多次调用获取OutputStream的方法,第二次及以后的调用可能会抛出此异常。 4. **框架或库的特定行为**:某些框架或库在处理...
在Java Web开发中,`response.jsp`通常是指服务器端的响应页面,主要涉及Servlet和JSP(JavaServer Pages)技术。`response`对象是Servlet API中的一个关键组件,全称为`HttpServletResponse`,它用于构建并发送回...
标题:JSP文件下载的解决方法 描述:本文将探讨并提供多种方法来解决JSP文件下载的问题,重点介绍源代码级别的实现方案。 在Web开发中,文件下载是常见的需求之一,尤其在企业级应用中,用户可能需要下载报告、...
* 在使用Request和Response对象时,需要注意方法的调用顺序,防止出现异常。 ServletRequest和ServletResponse是Servlet编程中两个最重要的接口,它们提供了对HTTP请求和响应的控制和处理。正确地使用...
2. 转发:`RequestDispatcher`的`forward(ServletRequest request, ServletResponse response)`方法可以在服务器端将请求转发到另一个资源。这不会改变客户端的URL。 ```java RequestDispatcher dispatcher = ...
它的类型是`javax.servlet.jsp.JspWriter`,提供了`print()`和`println()`等方法用于输出数据,以及管理缓冲区的方法如`close()`、`clearBuffer()`、`clear()`、`getRemaining()`和`flush()`等,便于控制输出流和...
本实例主要探讨Servlet中的两个关键对象:HttpServletRequest(Request)和HttpServletResponse(Response),它们是Servlet API的核心组成部分,用于处理HTTP请求和构建响应。 Request对象是用于获取客户端发送的...
为了保证程序的健壮性,需要对可能出现的异常进行捕获和处理,例如文件大小超出限制、文件上传失败等。 综上所述,`FileUpload` JSP上传下载组件提供了处理文件上传和下载的强大工具,通过合理的集成和使用,可以...
本篇我们将深入探讨如何使用`filter`来修改JSP(JavaServer Pages)和servlet生成的`response`内容。 首先,让我们理解`filter`的基本概念。根据Java Servlet规范,`Filter`接口定义了一系列方法,如`doFilter()`,...
### jsp生成静态页面的方法 在Web开发领域中,动态页面...总之,利用JSP和Servlet技术实现动态页面到静态页面的转换是一种实用且高效的解决方案。它不仅有助于提升网站性能,还能增强搜索引擎对网站内容的抓取效果。
### JSP内置对象request、response、out的应用 在Java Server Pages (JSP)技术中,内置对象是开发者经常使用的工具之一。这些内置对象为开发者提供了处理客户端请求、响应和服务端输出的强大能力。本文将深入探讨三...