会报这个错误:2009-11-17 11:57:54 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:610)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
at org.apache.jsp.makeCertPic_jsp._jspService(makeCertPic_jsp.java:83)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jb.common.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:27)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
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:191)
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:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
有一个Javabean:package org.jb.common.biz;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
/**
 * @author dzy
 * 生成验证码图片
 */
public class MakeCertPic {
 //验证码图片中可以出现的字符集,可根据需要修改
    private char mapTable[]={
      'a','b','c','d','e','f',
      'g','h','i','j','k','l',
      'm','n','o','p','q','r',
      's','t','u','v','w','x',
      'y','z','0','1','2','3',
      '4','5','6','7','8','9'};
    /**
    * 功能:生成彩色验证码图片
    * 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流
    */
   public String getCertPic(int width, int height, OutputStream os) {
  if(width<=0)width=60;
  if(height<=0)height=20; 
  BufferedImage image = new BufferedImage(width, height, 
     BufferedImage.TYPE_INT_RGB); 
  // 获取图形上下文 
  Graphics g = image.getGraphics(); 
  // 设定背景色 
  g.setColor(new Color(0xDCDCDC)); 
  g.fillRect(0, 0, width, height); 
  //画边框 
  g.setColor(Color.black); 
  g.drawRect(0,0,width-1,height-1); 
  // 取随机产生的认证码
  String strEnsure = "";
  // 4代表4位验证码,如果要生成更多位的认证码,则加大数值
  for(int i=0; i<4; ++i) {
 strEnsure+=mapTable[(int)(mapTable.length*Math.random())];
  }  
  //   将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
  g.setColor(Color.black); 
  g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); 
  String str = strEnsure.substring(0,1); 
  g.drawString(str,8,17);  
  str = strEnsure.substring(1,2); 
  g.drawString(str,20,15); 
  str = strEnsure.substring(2,3); 
  g.drawString(str,35,18);   
  str = strEnsure.substring(3,4); 
  g.drawString(str,45,15); 
  // 随机产生10个干扰点
  Random rand = new Random();
  for (int i=0;i<10;i++) { 
   int x = rand.nextInt(width); 
   int y = rand.nextInt(height); 
   g.drawOval(x,y,1,1); 
  } 
  // 释放图形上下文
  g.dispose();   
  try {
   // 输出图像到页面 
   ImageIO.write(image, "JPEG", os);
  } catch (IOException e) {
   return "";
  }  
  return strEnsure;
   }
  /* 在getCertPic()方法中,首先创建了一个内存图像的实例对象,再得到此内存图像的图形上下文对象,接着再用这个上下文对象画背景、边框。接下来,随机生成4个在mapTable[]数组中的字符,组成字符串作为验证字符串,并输出在内存中,为了造成一定的干扰,随机画了10个干扰点,如果要加大干扰效果,可再多画一些点。
   makeCertPic.jsp页面用于调用生成验证码图片的JavaBean,并在客户端显示*/
}一个jsp调用页面:<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="image" scope="page" class="org.jb.common.biz.MakeCertPic" />
  <%String str=image.getCertPic(0,0,response.getOutputStream());session.setAttribute("certCode", str);%>
</body>
</html>还有一个就是测试的jsp了<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<img src="makeCertPic.jsp">
</body>
</html>是可以出来了,可是控制台报那个错。怎么改,大伙。

解决方案 »

  1.   

    getOutputStream() has already been called for this response 重复调用的问题?应该是你下面代码的问题吧
    <jsp:useBean id="image" scope="page" class="org.jb.common.biz.MakeCertPic" /> 
       <%String str=image.getCertPic(0,0,response.getOutputStream());session.setAttribute("certCode", str);%> 我手上刚有一个 jsp调用验证码的例子  需要的话给我邮件 [email protected]
      

  2.   

    应该是系统不兼容吧!可以完全用Java来画的,不用那么麻烦!
      

  3.   

    response只能被调用一次向客户端返回数据,重复调用了类似于先调用response.getWriter().write("suc");再调用
    response.sendRedirect("/fdafd.html");
    就会出现这种错误,你仔细检查下,在你贴出的代码中没发现。
    或者干脆直接换个实现方式,网上一搜一大最
      

  4.   

    流转化问题      在  ImageIO.write(image,          "JPEG ",         response.getOutputStream());  后面加上      out.clear();  out   =   pageContext.push();                 %>            最后加这两句试下