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();
浙公网安备 33010602011771号