聲名:轉載自CSDNhtml
經過toncat啓動服務器,能夠正常登錄訪問,登錄進去選擇子系統的時候點擊登錄的時候,但是去又回到了登錄界面,如此反覆就是不可以進入子系統,查看後臺報的錯誤: java.lang.IllegalStateException: Cannot forward after response has been committed java
這個錯誤能夠用500頁面攔截,可是後臺一直報錯。這個是屬於代碼語法錯誤。web
中文意思就是已經有提交了[response已經響應了用戶],不可以再次轉向了,而後根據JSP標籤中設置的錯誤頁面又回到了登錄頁面;tomcat
這個是錯誤是因爲response屢次提交或者是因爲有頁面顯示後仍然含請求轉向產生的,就是說程序在return以前就已經執行了跳轉或者執行過response。我在作這個時,簡直要奔潰了,怎麼弄都不行,網上的資源找遍了,最後總結了如下幾類致使的錯誤,並給出解決方案。服務器
第一類:jsp
一、 往輸出流寫了東西,而後又跳轉了頁面。post
也就是說,url
Stringurl = "/treatDenglu.jsp";spa
RequestDispatcher rd =request.getRequestDispatcher(url);xml
rd.forward(request,response);
在此語句跳轉以前,你使用了文件操做流;能夠先註釋掉再嘗試。
第二類
二、 用out對象,向JSP頁面print了數據,而後又跳轉。
也就是說,PrintWriter out = response.getWriter();
out.println(「<html>」);
得到了out對象,往JSP頁面打印輸出,若是有這樣的語句會報錯,由於咱們寫的servlet類,就是用來響應用戶的訪問請求的,而out.print()是要把內容輸出到(響應)頁面,也是對用戶訪問的響應,因此若是在跳轉以前有out.println(「<html>」)至關於已經response響應了用戶請求,因此再rd.forward(request,response就會)提示已經重複提交。
解決方案:使用MVC模型,把out.println(「<html>」)語句去掉,其相應的功能交給JSP頁面顯示。
第三類
三、 若是前面2種後還有錯,那可能因爲調用了父類的super.doPost(request,response);
這是由於,doPost()[doXXX()]方法就是service()執行過程當中判斷用戶訪問方式(post、get等)後,調用的響應響應方法,即執行相應的doXXX()方法去響應用戶,而顯示調用父類的doPost()方法,且先執行完,就等於已經響應了一次,而後又去跳轉又去響應,就會報錯重複提交。因此去掉super.doPost(request,response);
第四類
四、 若是還有問題,看看這種;
正如前面所說,這個是錯誤是因爲response屢次提交或者是因爲有頁面顯示後仍然含請求轉向產生的,就是說程序在return以前就已經執行了跳轉或者執行過response,以後遇到return的話,程序想再次執行跳轉,也就是重定向,這時功能也許會實現了,解決辦法是在跳轉語句末尾加上return;或return null;,,就不能轉到另外的頁面了
如 servlet.getServletContext().getRequestDispatcher("/deal.jsp").forward(request, response);
return null;
小提示:
一、forward(request, response);跳轉頁面,執行這個語句以後,若是此語句後面還有代碼,既然跳轉了頁面後面代碼執行不了,原頁面的代碼沒有終止必定會出錯。
解決方法,在forward(request, response);跳轉後面不要寫其餘代碼,且加上 return;
二、本身寫的servlet類更改代碼後,從新編譯,且要重啓服務器;修改了配置文件web.xml不需重啓,tomcat會從新加載。