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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_00112.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2009/2/1 5:43:17

簡單理解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
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

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