getOutputStream() has already been called for this response 這個錯誤遇到過不少次,網(wǎng)上看到大多不能解決問題。
下面兩點是我自己總結(jié)出來的:
1、在我們應用驗證碼時,都會用到字節(jié)流response.getOutputStream()來將驗證碼輸出,但是jsp頁面自己最后會調(diào)用字符流JspWriter的out()方法將頁面的內(nèi)容輸出。通過查看servlet的API我們可以看到知道,在servlet中不能夠同時利用這兩個流輸出,解決辦法將驗證碼寫在servlet中,具體見下面。
2、相信請求轉(zhuǎn)發(fā)( request.getRequestDispacher().forward() )和請求跳轉(zhuǎn)( response.sendRedirect() )的區(qū)別大家都知道。其中request.getRequestDispacher().forward() 方法的調(diào)用者與被調(diào)用者之間共享相同的request對象和response對象,它們屬于同一個訪問請求和響應過程。JSP頁面轉(zhuǎn)譯為的_servlet會最后調(diào)用releasePageContext()方法( All PageContext objects obtained via this method shall be released by invoking releasePageContext().)釋放我們頁面所有的實體對象,當我們的調(diào)用者有頁面輸出時,就會拋出這個異常。具體原因也沒有弄清楚,各位大俠如果誰知道可以告知一下。其實驗證碼也是同一個原理,如果我們將驗證碼的代碼寫在jsp頁面中,因為jsp頁面會調(diào)用JspWriter的out()方法將內(nèi)容輸出,同時我們的圖片又調(diào)用了response.getOutputStream()方法因此會拋出這個異常;如果我們將驗證碼寫在servlet中,就不會同時使用兩種輸出也就不會出錯。有時即使調(diào)用者頁面沒有輸出,也會拋出這個異常,仔細看jsp轉(zhuǎn)譯以后的源碼發(fā)現(xiàn)輸出了換行,因此,我們最好把調(diào)用者頁面的%>和<%之間換行去掉,把%>和<%直接寫在一起。
另外,如果我們實在要在jsp中用到response.getOutputStream(),比如驗證碼、jspSmartUpload,我們需要在最后加入如下代碼:
response.reset();
out.clear();
out=pageContext.pushBody();
有不對之處還望指教!