|
|
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已! |
|
恭喜您是本站第 1729281
位訪客!
登入 | 註冊
|
|
|
|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2009/2/1 5:43 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [轉貼]簡單理解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
|
|
|
討論串
|