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
感謝大佬的文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/14747.html
標籤:HTML5
上一篇:前端技識訓礎(一):瀏覽器相關
下一篇:移動端rem.js
