Cannot forward after response has beencommitted問題の分析と解決
Cannot forward after response has beencommitted問題の分析と解決
toncatによってサーバーを起動して、正常にログインしてアクセスすることができて、ログインしてサブシステムを選択する時クリックしてログインする時、しかし行ってまたログインインタフェースに戻って、このように繰り返してサブシステムに入ることができなくて、バックグラウンドの新聞の誤りを見ます:java.lang.IllegalStateException: Cannot forward after response has been committed
このエラーは500ページでブロックできますが、バックグラウンドではエラーが発生しています.これはコード構文エラーです.
既に[responseがユーザーに応答した]が提出されており、再び転向することができず、JSPタグに設定されたエラーページに基づいてログインページに戻った.
これは、responseが複数回コミットされたため、またはページ表示後もリクエストステアリングを含んでいるため、すなわち、プログラムはreturnの前にジャンプまたはresponseを実行したことがある.私はこれをする時、まるで潰れそうになって、どうやってもだめで、ネット上の資源を探して、最後に以下のいくつかの間違いを総括して、そして解決策を提供しました.
クラス1:
1、出力ストリームに物を書いて、またページをジャンプしました.
つまり、
Stringurl = "/treatDenglu.jsp";
RequestDispatcher rd =request.getRequestDispatcher(url);
rd.forward(request,response);
この文がジャンプする前に、ファイル操作フローを使用しました.コメントしてから試してもいいです.
第2クラス
2、outオブジェクトを使って、JSPページにデータをprintして、それからまたジャンプします.
つまり、PrintWriter out=response.getWriter();
out.println(“”);
私たちが書いたservletクラスは、ユーザーのアクセス要求に応答するためのものであり、out.print()は、コンテンツを(応答)ページに出力するものであり、ユーザアクセスに対する応答でもあるので、ジャンプする前にoutがある.println(")は、responseがユーザ要求に応答したことに相当するので、rd.forward(request、responseは)プロンプトが繰り返しコミットされた.
ソリューション:MVCモデルを使用してout.println(")文は削除され、その機能はJSPページに渡されて表示されます.
第三類
3、前の2種類が間違っている場合は、親のsuperが呼び出された可能性があります.doPost(request,response);
これは,doPost()[doXXX()]メソッドがサービス()実行中にユーザアクセス方式(post,getなど)を判断した後に呼び出される応答メソッド,すなわち,対応するdoXXX()メソッドを実行してユーザに応答し,親を呼び出すdoPost()メソッドを表示し,先に実行すると,一度応答したのに等しい応答をジャンプして応答し,エラーを報告して繰り返しコミットするためである.だからsuperを取り除くdoPost(request,response);
第四類
4、まだ問題があれば、これを見てください.
前述したように、これはエラーがresponseが複数回コミットされているか、ページ表示後もリクエストステアリングを含んでいるために発生している.つまり、プログラムはreturnの前にジャンプを実行しているか、responseを実行している.その後returnに遭遇すると、プログラムは再びジャンプを実行したい.つまりリダイレクトを実行したい.この場合、機能が実現するかもしれない.解決策は、ジャンプ文の末尾にreturnを付けることです.またはreturn null;,,他のページに移動できません
例えばservlet.getServletContext().getRequestDispatcher("/deal.jsp").forward(request, response);
return null;
ヒント:
toncatによってサーバーを起動して、正常にログインしてアクセスすることができて、ログインしてサブシステムを選択する時クリックしてログインする時、しかし行ってまたログインインタフェースに戻って、このように繰り返してサブシステムに入ることができなくて、バックグラウンドの新聞の誤りを見ます:java.lang.IllegalStateException: Cannot forward after response has been committed
このエラーは500ページでブロックできますが、バックグラウンドではエラーが発生しています.これはコード構文エラーです.
既に[responseがユーザーに応答した]が提出されており、再び転向することができず、JSPタグに設定されたエラーページに基づいてログインページに戻った.
これは、responseが複数回コミットされたため、またはページ表示後もリクエストステアリングを含んでいるため、すなわち、プログラムはreturnの前にジャンプまたはresponseを実行したことがある.私はこれをする時、まるで潰れそうになって、どうやってもだめで、ネット上の資源を探して、最後に以下のいくつかの間違いを総括して、そして解決策を提供しました.
クラス1:
1、出力ストリームに物を書いて、またページをジャンプしました.
つまり、
Stringurl = "/treatDenglu.jsp";
RequestDispatcher rd =request.getRequestDispatcher(url);
rd.forward(request,response);
この文がジャンプする前に、ファイル操作フローを使用しました.コメントしてから試してもいいです.
第2クラス
2、outオブジェクトを使って、JSPページにデータをprintして、それからまたジャンプします.
つまり、PrintWriter out=response.getWriter();
out.println(“”);
私たちが書いたservletクラスは、ユーザーのアクセス要求に応答するためのものであり、out.print()は、コンテンツを(応答)ページに出力するものであり、ユーザアクセスに対する応答でもあるので、ジャンプする前にoutがある.println(")は、responseがユーザ要求に応答したことに相当するので、rd.forward(request、responseは)プロンプトが繰り返しコミットされた.
ソリューション:MVCモデルを使用してout.println(")文は削除され、その機能はJSPページに渡されて表示されます.
第三類
3、前の2種類が間違っている場合は、親のsuperが呼び出された可能性があります.doPost(request,response);
これは,doPost()[doXXX()]メソッドがサービス()実行中にユーザアクセス方式(post,getなど)を判断した後に呼び出される応答メソッド,すなわち,対応するdoXXX()メソッドを実行してユーザに応答し,親を呼び出すdoPost()メソッドを表示し,先に実行すると,一度応答したのに等しい応答をジャンプして応答し,エラーを報告して繰り返しコミットするためである.だからsuperを取り除くdoPost(request,response);
第四類
4、まだ問題があれば、これを見てください.
前述したように、これはエラーがresponseが複数回コミットされているか、ページ表示後もリクエストステアリングを含んでいるために発生している.つまり、プログラムはreturnの前にジャンプを実行しているか、responseを実行している.その後returnに遭遇すると、プログラムは再びジャンプを実行したい.つまりリダイレクトを実行したい.この場合、機能が実現するかもしれない.解決策は、ジャンプ文の末尾にreturnを付けることです.またはreturn null;,,他のページに移動できません
例えばservlet.getServletContext().getRequestDispatcher("/deal.jsp").forward(request, response);
return null;
ヒント:
1、forward(request, response); , , , , 。
, forward(request, response); , return;
2、 servlet , , ; web.xml ,tomcat 。