getWriter() 和Response.getOutputStream沖突 – JAVA編程語言程序開發技術文章

今天寫java驗證碼程序,完成後使用一切正常,但是總拋出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對象回顯操作結果。
 

作者“StudyBao”

發佈留言