getOutputStream()异常的原因和解决方法
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
在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
- <%@pageimport="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
- <%@pageimport="java.io.OutputStream"%>
- <%!
- 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);
- }
- %>
- <%
- try{
- response.setHeader("Pragma","No-cache");
- response.setHeader("Cache-Control","no-cache");
- response.setDateHeader("Expires",0);
- intwidth=60,height=20;
- BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- OutputStreamos=response.getOutputStream();
- 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(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);
- }
- StringsRand="";
- for(inti=0;i<4;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.setAttribute("rand",sRand);
- g.dispose();
- ImageIO.write(image,"JPEG",os);
- os.flush();
- os.close();
- os=null;
- response.flushBuffer();
- out.clear();
- out=pageContext.pushBody();
- }
- catch(IllegalStateExceptione)
- {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }%>
来自:http://jessdy.javaeye.com/blog/187448
- 原始代码:
- <%@pagecontentType="text/html;charset=GBK"%>
- <%@pageautoFlush="false"%>
- <%@pageimport="java.sql.*"%>
- <%@pageimport="java.io.*"%>
- <%@pageimport="java.util.*"%>
- <%@pageimport="java.awt.*"%>
- <%@pageimport="java.awt.image.*"%>
- <%@pageimport="com.sun.image.codec.jpeg.*"%>
- <%@pageimport="com.sun.image.codec.jpeg.*"%>
- <%@pageimport="com.csland.common.util.*"%>
- <%!
- publicvoidnoImg(ServletOutputStreamoutStream){
- try{
- intwidth=80,height=50;
- BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- Graphicsg=image.getGraphics();
- //以下填充背景颜色
- g.setColor(Color.WHITE);
- g.fillRect(0,0,width,height);
- g.setColor(Color.ORANGE);
- g.drawRect(0,0,width-1,height-1);
- Stringrandom="random";
- //以下设置前景色
- g.setColor(Color.BLACK);
- g.drawString("没有签名图",0,25);
- g.dispose();
- //
- JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
- encoder.encode(image);
- outStream.flush();
- //outStream.close();
- }catch(Exceptione){
- Log.fetal("atnoImginsig2.jsp:/n"+e);
- }
- }
- publicvoidnoImg(HttpServletResponseresponse){
- try{
- ServletOutputStreamoutStream=response.getOutputStream();
- noImg(outStream);
- }catch(Exceptione){
- Log.fetal("atnoImginsig2.jsp:/n"+e);
- }
- }
- %>
- <%
- out.clear();
- response.setContentType("image/jpeg");
- response.addHeader("pragma","NO-cache");
- response.addHeader("Cache-Control","no-cache");
- response.addDateHeader("Expries",0);
- intid=StrUtil.StrToInt(request.getParameter("id"));
- if(id<=0)
- {
- noImg(response);
- }
- else
- {
- java.sql.Connectionconn=null;
- java.sql.Statementstmt=null;
- java.sql.ResultSetlobDetails=null;
- try{
- conn=DBUtil.getConn();
- stmt=conn.createStatement();
- lobDetails=stmt.executeQuery(
- "SELECTSignatureFROMOZ_Member"+
- "WHEREMemberID="+id+"");
- if(lobDetails.next()){
- BlobmapBlob=lobDetails.getBlob(1);
- if(mapBlob!=null){
- InputStreamblobStream=mapBlob.getBinaryStream();
- Log.debug("blobStream:"+blobStream);
- ServletOutputStreamoutStream=response.getOutputStream();
- byte[]buffer=newbyte[10*1024];
- intnbytes=0;
- intallBytes=0;
- while((nbytes=blobStream.read(buffer))!=-1){
- outStream.write(buffer,0,nbytes);
- allBytes+=nbytes;
- }
- Log.debug("allBytes:"+allBytes);
- if(allBytes<1){
- Log.debug("allBytes2:"+allBytes);
- noImg(outStream);
- }else{
- outStream.flush();
- //outStream.close();
- }
- blobStream.close();
- }else{
- noImg(response);
- }
- }else{
- noImg(response);
- }
- }
- catch(Exceptione){
- Log.fetal(e);
- }
- finally{
- try{lobDetails.close();}catch(Exceptione){}
- try{stmt.close();}catch(Exceptione){}
- try{conn.close();}catch(Exceptione){}
- }
- }
- %>
- 修改后的代码===============byyanleigis
- <%@pagecontentType="text/html;charset=GBK"%>
- <%@pageautoFlush="false"%>
- <%@pageimport="java.sql.*"%>
- <%@pageimport="java.io.*"%>
- <%@pageimport="java.util.*"%>
- <%@pageimport="java.awt.*"%>
- <%@pageimport="java.awt.image.*"%>
- <%@pageimport="com.sun.image.codec.jpeg.*"%>
- <%@pageimport="com.sun.image.codec.jpeg.*"%>
- <%@pageimport="com.csland.common.util.*"%>
- <%!
- publicvoidnoImg(ServletOutputStreamoutStream){
- try{
- intwidth=80,height=50;
- BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
- Graphicsg=image.getGraphics();
- //以下填充背景颜色
- g.setColor(Color.WHITE);
- g.fillRect(0,0,width,height);
- g.setColor(Color.ORANGE);
- g.drawRect(0,0,width-1,height-1);
- Stringrandom="random";
- //以下设置前景色
- g.setColor(Color.BLACK);
- g.drawString("没有签名图",0,25);
- g.dispose();
- //
- JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
- encoder.encode(image);
- outStream.flush();
- outStream.close();
- }catch(Exceptione){
- Log.fetal("atnoImginsig2.jsp:/n"+e);
- }
- }
- publicvoidnoImg(HttpServletResponseresponse){
- try{
- ServletOutputStreamoutStream=response.getOutputStream();
- noImg(outStream);
- }catch(Exceptione){
- Log.fetal("atnoImginsig2.jsp:/n"+e);
- }
- }
- %>
- <%
- out.clear();
- out=pageContext.pushBody();
- response.setContentType("image/jpeg");
- response.addHeader("pragma","NO-cache");
- response.addHeader("Cache-Control","no-cache");
- response.addDateHeader("Expries",0);
- intid=StrUtil.StrToInt(request.getParameter("id"));
- if(id<=0)
- {
- noImg(response);
- }
- else
- {
- java.sql.Connectionconn=null;
- java.sql.Statementstmt=null;
- java.sql.ResultSetlobDetails=null;
- try{
- conn=DBUtil.getConn();
- stmt=conn.createStatement();
- lobDetails=stmt.executeQuery(
- "SELECTSignatureFROMOZ_Member"+
- "WHEREMemberID="+id+"");
- if(lobDetails.next()){
- BlobmapBlob=lobDetails.getBlob(1);
- if(mapBlob!=null){
- InputStreamblobStream=mapBlob.getBinaryStream();
- Log.debug("blobStream:"+blobStream);
- ServletOutputStreamoutStream=response.getOutputStream();
- byte[]buffer=newbyte[10*1024];
- intnbytes=0;
- intallBytes=0;
- while((nbytes=blobStream.read(buffer))!=-1){
- outStream.write(buffer,0,nbytes);
- allBytes+=nbytes;
- }
- Log.debug("allBytes:"+allBytes);
- if(allBytes<1){
- Log.debug("allBytes2:"+allBytes);
- noImg(outStream);
- }else{
- outStream.flush();
- //outStream.close();
- }
- blobStream.close();
- }else{
- noImg(response);
- }
- }else{
- noImg(response);
- }
- response.flushBuffer();
- out.clear();
- out=pageContext.pushBody();
- }
- catch(Exceptione){
- Log.fetal(e);
- }
- finally{
- try{lobDetails.close();}catch(Exceptione){}
- try{stmt.close();}catch(Exceptione){}
- try{conn.close();}catch(Exceptione){}
- }
- }
- %>