您的位置:首页 > Web前端 > JavaScript

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

2007-09-06 14:38 1331 查看
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 contentType="text/html;charset=gb2312" %>


<%@ page import="java.awt.*" %>


<%@ page import="java.awt.image.*" %>


<%@ page import="java.util.*" %>


<%@ page import="javax.imageio.*" %>


<%!




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);




}


%>


<%


// 在内存中创建图象


int width=80, height=20;


BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);




// 获取图形上下文


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(new Color());


//g.drawRect(0,0,width-1,height-1);




// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到


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);


}




// 取随机产生的认证码(5位数字)


String sRand="";




for (int i=0;i<5;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


session.setAttribute("CertiCode",sRand);




// 图象生效


g.dispose();




//设置页面不缓存


response.reset();


response.setHeader("Pragma","No-cache");


response.setHeader("Cache-Control","no-cache");


response.setDateHeader("Expires", 0);


// 输出图象到页面


ServletOutputStream os=response.getOutputStream();


ImageIO.write(image, "JPEG",os);


os.flush();


os.close();


os=null;


response.flushBuffer();


out.clear();


out = pageContext.pushBody();


%>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐