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


1.問題描述:

  在日常練習的時候遇見的錯誤,雖然頁面可以順利顯示,但后台報錯:(雖然不影響導出效果,但看到后台的異常,內心還是不舒服的)

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

從字義上分析:getOutputStream()已經調用了這個響應,就是重復被調用引起的異常。

2.問題分析:

  在tomcat下jsp出現該錯誤一般都是在使用了輸出流(如輸出圖片驗證碼,文件下載等)。

  產生這樣的異常原因:是web容器生成的servlet代碼中有out.write(""),這個和JSP中調用的response.getOutputStream()產生沖突。即Servlet規范說明,不能既調用response.getOutputStream(),又調用response.getWriter(),無論先調用哪一個,在調用第二個時候應會拋出IllegalStateException,因為在jsp中,out變量實際上是通過response.getWriter得到的,你的程序中既用了response.getOutputStream,又用了out變量,故出現以上錯誤。

3.解決方案:

  在調用 response.getOutputStream()之前,清空緩存的內容,並返回一個新的BodyContext,更新PageContext的out屬性的內容。

 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.擴展

  上面代碼,根本沒有用到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:異常對象(有代碼存在就會有異常存在)。

 

原文地址:https://www.cnblogs.com/zs-notes/p/9456234.html

感謝大佬的文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM