getOutputStream() has already been called for this response

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

    有不對之處還望指教

發佈了40 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章