jsp中调用getOutputStream()产生冲突

再用jsp进行图片的生成的时候,例如一些验证码,比例图的时候,在对图片进行输出调用 getOutputStream() 的时候会报该方法已经被调用的冲突。

    例如如下的程序:

           <%@ page contentType="image/jpeg" language="java"%>
<%@ page import="java.awt.image.*,javax.imageio.*,java.io.*,java.awt.*" %>
<%
 BufferedImage image=new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB);
 Graphics g=image.getGraphics();
 g.fillRect(0, 0, 400, 400);
 g.setColor(new Color(255,0,0));
 g.fillArc(20, 20, 100, 100, 30, 120);
 g.setColor(new Color(0,255,0));
 g.fillArc(20, 20, 100, 100, 150, 120);
 g.setColor(new Color(0,0,255));
 g.fillArc(20, 20, 100, 100, 270, 120);
 g.setColor(new Color(0,0,0));
 g.setFont(new Font("Arial Black",Font.PLAIN,16));
 g.drawString("red:climb", 200, 60);
 g.drawString("green:swim", 200, 100);
 g.drawString("blue:jump", 200, 140);
 g.dispose();
 ImageIO.write(image, "jpg", response.getOutputStream());
%>

运行以后的结果是:

十二月 02, 2014 9:58:53 上午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
十二月 02, 2014 9:58:53 上午 org.apache.catalina.startup.Catalina start
INFO: Server startup in 581 ms
十二月 02, 2014 9:59:00 上午 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/testt1] threw exception [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:638)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
    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:190)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
    at org.apache.jsp.img_jsp._jspService(img_jsp.java:95)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

 

      出现这种情况的原因是因为在产生web容器的时候servlet代码中已经调用了out.write()的方法,所以我们在jsp页面上进行调用的时候系统会提示已经调用过了的重复请求的冲突。

解决的方法有以下的几个:

第一种直接在调用getOutputStream()之前对out方法进行清空,即调用out.clear()方法。

同时注意不要在%><%之间写内容包括空格和换行符

第二种是对于outputstream方法进行刷新即outputStream output=response.getOutputStream();
output.flush();

 

posted on 2014-12-02 10:12  夜不孤城  阅读(1280)  评论(0)    收藏  举报