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

转载 2007年09月23日 14:39:00

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>
{
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>
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();
}%>

 

opencv 初学者常见问题

① imshow 显示图像为灰色图片或者视频显示不出来 【解决方案】 一定要加 waitKey() ② 环境变量配置之后需要重启电脑,VS中项目:包含目录、库目录(lib库) 配置; 库目录的配...
  • Jane_yuhui
  • Jane_yuhui
  • 2016年04月04日 16:12
  • 3511

Spark源码分析之五:Task调度(一)

在前四篇博文中,我们分析了Job提交运行总流程的第一阶段Stage划分与提交,它又被细化为三个分阶段:         1、Job的调度模型与运行反馈;         2、Stage划分;     ...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016年02月19日 14:00
  • 3644

ARouter源码分析初始化以及跳转

ARouter源码分析初始化以及跳转
  • kangdi437
  • kangdi437
  • 2017年05月12日 17:35
  • 2107

quartz集群调度机制调研及源码分析

出处:http://blog.csdn.net/gklifg/article/details/27090179有人总结了三种quratz集群方案:http://www.iteye.com/topic/...
  • xiejx618
  • xiejx618
  • 2016年05月23日 11:15
  • 1042

JDBC学习笔记

JDBC技术 JDBC概述 JDBC和数据库驱动的关系 JDBC开发基本步骤 JDBC API详解 javasqlDriverManager javasqlConnection接口 javasqlSt...
  • SIMBA1949
  • SIMBA1949
  • 2018年01月14日 20:25
  • 32

Android C++层的内存收回机制

1关于C++ Layer的内存回收机制 Android C++层的内存收回主要是通过三个类来实现,分别是RefBase,sp,wp; SP和WP是两个智能指针模板类,sp是strong p...
  • yeming1108
  • yeming1108
  • 2016年03月07日 15:15
  • 189

react native 一次内存泄漏分析

在项目中添加react native 支持后,leakcanary 检测到有内存泄漏的,如下图 可以分析出,内存泄漏是由ReactRootview 持有activity引用,在activ...
  • shix_foot
  • shix_foot
  • 2017年02月03日 12:17
  • 2033

spring4mvc 实现文件下载功能reponse.getOutputStream()重复调用问题解决

本来是准备做一个类似网络硬盘的功能,判断目标是文件的时候,点击就启动下载。 谁想遇到了不少...
  • xchgx
  • xchgx
  • 2014年08月11日 08:26
  • 1309

IAP 计费被拒绝解决方案

In-App purchasing in iOS 6 2013年5月之后,由于苹果需求一次性道具要求添加按钮问题解决方案: Reject message: We found that while ...
  • Kaitiren
  • Kaitiren
  • 2013年08月13日 12:47
  • 5761

自动寻路NavMeshAgent的使用

NavMeshAgent的使用,如何烘培(bake)
  • hjj0212
  • hjj0212
  • 2015年08月27日 20:37
  • 1672
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: tomcat5下jsp出现getOutputStream() has already been called for ......
举报原因:
原因补充:

(最多只允许输入30个字)