茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1670370 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00149.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]簡單理解java.lang.IllegalStateException異常:簡單分析和簡單解決方案

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]簡單理解java.lang.IllegalStateException異常:簡單分析和簡單解決方案

簡單理解java.lang.IllegalStateException異常:簡單分析和簡單解決方案

我們在做文件上傳或者下載,或者過濾等操作時,可能要用到頁面的輸出流.
例如在JSP使用:
    response.reset();
    response.setContentType(”application/vnd.ms-excel”);
    OutputStream os = response.getOutputStream();  
拋出異常:
ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
從網上找了下資料,綜合一下原因分析:
這是web容器生成的servlet代碼中有out.write(””),這個和JSP中調用的response.getOutputStream()產生衝突.
即Servlet規範說明,不能既調用 response.getOutputStream(),又調用response.getWriter(),無論先調用哪一個,在調用第二個時候應會拋出 IllegalStateException,因為在jsp中,out變量是通過response.getWriter得到的,在程序中既用了response.getOutputStream,又用了out變量,故出現以上錯誤。
解決方案:
1.在程序中添加:
out.clear();
out = pageContext.pushBody();
就可以了;

2,不要在%〕〔%之間寫內容包括空格和換行符

3,在頁面寫入圖片的時候,需要flush()
 OutputStream output=response.getOutputStream();
 output.flush();
4,在頁面確定寫入<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312”>
孫衛琴說可能是tomcat的bug,我給她回了封信:

: 我看了看這裡,
http://www.javathinker.org/main.jsp?bc=showessay.jsp+filename=tomcat/tomcat_question_chapter13.htm
這裡是你回復別人的一個帖子,裡面的觀點基本上和我理解的一樣,但是你最後寫到可能是tomcat的bug,我想解釋一下:
在jsp中,out是內嵌對象,即已經設置了PrintWriter out=response.getWriter();這樣在再次getOutputStream()得到輸出流時(比如轉發過濾、下載文件時)就出錯了(寫排斥鎖),我不止一次看到有人的文件下載頁面在後台不斷打印這個異常。
而在servlet中沒有默認out內置對象,所以沒有出錯.
你可以在servlet中添加out對像試試,應該會報異常的.
所以正確的處理方式就應該是:在servlet中做控制層,在業務處理以前不要獲得out對象,當業務操作失敗或出現異常時再生成out對像回顯操作結果。
可以這樣:
... {...}
catch (Exception e)  ... {



  PrintWriter out = response.getWriter();



  out.println(”〔script type=”text/javascript”〕alert(’您的附件不能正常下載,請檢查操作或聯繫管理員’);window.close();〔/script〕”);


}

愚人愚見,多多指教。 
原文出處: 簡單理解java.lang.IllegalStateException異常:簡單分析和簡單解決方案 - Drink Drank Drunk - CSDNBlog
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]出現java.lang.IllegalStateException的幾種情況
(轉)出現java.lang.IllegalStateException的幾種情況
原文連接:出現java.lang.IllegalStateException的幾種情況

出現java.lang.IllegalStateException的幾種情況

拋出異常:
ERROR [Engine] StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response


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

解決方案:
1.在程序中添加:
out.clear();
out = pageContext.pushBody();

就可以了;
我是在頁面輸出圖片之後寫的這兩句,代碼如下:
//輸出圖像到頁面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();

2,不要在%〕〔%之間寫內容包括空格和換行符
3,在頁面寫入圖片的時候,需要flush()
 OutputStream output=response.getOutputStream();
 output.flush();

4,在頁面確定寫入
<meta http-equiv="Content-Type" content="text/html;charset=GB18030">


----------------------------------------------------------------------------------------------

在response.sendRedirect()時也可能會出現下列錯誤:
java.lang.IllegalStateException:
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:423)


解決辦法如下:
在response.sendRedirect("");語句後面加上return語句就OK了。
例如:
response.sendRedirect("");
return ;
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]那,改採Java Script轉址吧!
冷日順帶一提:
在Search完關於IllegalStateException的問題之後,冷日發現有某網友提到了:
引言:
不一定要把自己侷限在Servlet裡面,可以改用JavaScript啊!

這倒也讓冷日有另一個觀點,也是啦,如果Servlet就是容易有這樣的狀況,何不採用其他的方案解決呢!?
可以採行的方案如下:
out.println( "<script language='JavaScript'>window.location.replace('http://www.new-url.com');</script>");

這樣也可以達到轉址的目的嘛!
何樂而不為呢?

助大家順利!
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|