2012-02-10 11 views
0

GlassFish 3.1をターゲットとするDynamic Web App 3.0にオーバーライドされたdoGetメソッドを持つサーブレットがあります。sendRedirect()は、GlassFish 3.1.1でサーブレット3.0でIllegalStateExceptionをスローしません。

私はOCEJWCD試験のために勉強しており、どのような状況でどのような例外が発生するのかを記憶しようとしています。

サーブレット2.5 APIのみをサポートするTomcat 6.0のため、Glassfish 3を使用する必要があります。次のような状況に非常に混乱します。

多くのことを古いsources状態:サーブレットが出力ストリームに 何かを書くために起動すると応答が、すぐにコミットされ

。 応答がコミットされた後にリダイレクトを試みると、IllegalStateExceptionエラーが発生します。

しかし3.0最終仕様のセクション5.3の状態servletのデータ(すなわち、応答がコミットされません)応答バッファに書き込まれますが、 クライアントに戻っていないされている場合は、データを

を 応答バッファをクリアし、これらの方法で で設定したデータに置き換える必要があります。応答がコミットされている場合は、これらの方法は は、なぜこれらの行はIllegalStateExceptionをスローすることはありませんレスポンスをコミットPrintWriter.print()あるを考慮すると、IllegalStateExceptionが

私が知りたいのですスローする必要がありますか?私はそれを注意する必要が

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
    String url = "http://someurl.com/"; 
    PrintWriter out = response.getWriter(); 
    out.print("This will be written into response buffer"); 
    response.sendRedirect(url); // sendRedirect() after writing into buffer 
} 

、私はGlassFishサーバーログから例外を取得することができるよ、私ははっきりHttpServletResponse.sendRedirect(url);続いHttpServletRequest.getRequestDispatcher().forward(req,res);が実際にGlassFishのコンテナにIllegalStateExceptionを投げないことがわかります。

+1

* "Servlet 2.5 APIのみをサポートするTomcat 7.0のため" *これは間違いです。 Tomcat 7.0はServlet 3.0をサポートしています。おそらくあなたはTomcat 6.0と混乱しているでしょうか? http://tomcat.apache.org/whichversion.html – BalusC

+0

私はTomcat 6.0を参照しようとしていました。修正をありがとう。 –

答えて

1

実際、PrintWriter.print() が応答をコミットしています。これは、バッファがいっぱいである場合、またはバッファリングがまったくない場合に発生します。サイズを確認するには、ServletResponse.getBufferSize()に電話してください。

ServletResponse.flushBuffer()またはPrintWriter.flush()間違いはレスポンスをコミットします。

したがって、PrintWriter.print()が応答をコミットしていた場合、HttpServletResponse.sendRedirect()は確かにIllegalStateExceptionを投げます。

関連項目サーブレット仕様のセクション5.1バッファリング

とbtw。はありません。RequestDispatcher.dispatch()はありません。 ;)

+0

詳細な回答ありがとうございます。最近私はあまりにも多くのスペックを読んできたので、メソッド名を作り上げています。今修正する。 –

関連する問題