java.lang.IllegalStateException: getOutputStream() has already been called for this response

1.问题描述:html

  在平常练习的时候碰见的错误,虽然页面能够顺利显示,但后台报错:(虽然不影响导出效果,但看到后台的异常,心里仍是不舒服的)java

java.lang.IllegalStateException: getOutputStream() has already been called for this responseweb

从字义上分析:getOutputStream()已经调用了这个响应,就是重复被调用引发的异常。缓存

2.问题分析:tomcat

  在tomcat下jsp出现该错误通常都是在使用了输出流(如输出图片验证码,文件下载等)。session

  产生这样的异常缘由:是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的response.getOutputStream()产生冲突。即Servlet规范说明,不能既调用response.getOutputStream(),又调用response.getWriter(),不管先调用哪个,在调用第二个时候应会抛出IllegalStateException,由于在jsp中,out变量其实是经过response.getWriter获得的,你的程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。app

3.解决方案:jsp

  在调用 response.getOutputStream()以前,清空缓存的内容,并返回一个新的BodyContext,更新PageContext的out属性的内容。this

 1 <body>
 2 <%
 3     BufferedImage imageBI=new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB);
 4     Graphics g=imageBI.getGraphics();
 5      g.fillRect(0, 0, 400, 400);
 6      g.setColor(new Color(255,0,0));
 7      g.fillArc(20, 20, 100, 100, 30, 120);
 8      g.setColor(new Color(0,255,0));
 9      g.fillArc(20, 20, 100, 100, 150, 120);
10      g.setColor(new Color(0,0,255));
11      g.fillArc(20, 20, 100, 100, 270, 120);
12      g.setColor(new Color(0,0,0));
13      g.setFont(new Font("Arial Black",Font.PLAIN,16));
14      
15      g.drawString("red:climb",200,60);
16      g.drawString("green:swim", 200, 100);
17      g.drawString("blue:jump",200,140);
18      g.dispose();
19      out.clear();      //清空缓存的内容
20      out=pageContext.pushBody();  //更新PageContext的out属性的内容
21      ImageIO.write(imageBI, "jpg", response.getOutputStream());
22 %>
23 </body>

 

 

4.扩展spa

  上面代码,根本没有用到out,为何能够调用out.clear和pageContext ? 由于这都是JSP的内置对象,能够随时使用。

  JSP九大内置对象(在JSP页面上可直接使用,html页面不能用):

  4.1 page:一个jsp就是一个servlet类,就是一个java类,java类的this对象,对应JSP的page对象;

  4.2 pageContext :当前页对象

  4.3 application:上下文对象

  4.4 config :servlet生命周期 1.初始化

  4.5 request:请求。servlet生命周期 2.service方法:请求,响应

  4.6 response:响应

  4.7 session:请求对应session,有了request就能够获得session,session=request.getSession();

  4.8 out:response对应out对象--》这个就是这个异常根本所在;

  4.9 exception:异常对象(有代码存在就会有异常存在)。

 

原文地址:http://www.javashuo.com/article/p-bamryuqi-ge.html

感谢大佬的文章

相关文章
相关标签/搜索