7

RequestDispatcher について学びながら、いくつかの基本的なコードを書いています。rd.forward() が呼び出されると、制御 (および応答処理) がパスで指定されたリソース (この場合は別のサーブレット) に転送されることを理解しています。しかし、コードの前半に out.write() ステートメントがあるため、このコードが IllegalStateException をスローしないのはなぜでしょうか?

私が本当に求めているのは、これらの out.write() ステートメントがいつ、どのようにコミットされるのかということだと思います。

ありがとう、ジェフ

public class Dispatcher extends HttpServlet{
  public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws IOException, ServletException{

    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();
    out.write("In Dispatcher\n");

    String modeParam = request.getParameter("mode");
    String path = "/Receiver/pathInfo?fruit=orange";
    RequestDispatcher rd = request.getRequestDispatcher(path);
    if(rd == null){
        out.write("Request Dispatcher is null. Please check path.");
    }
        if(modeParam.equals("forward")){
            out.write("forwarding...\n");
            rd.forward(request, response);
        }
        else if(modeParam.equals("include")){
            out.write("including...\n");
            rd.include(request, response);
        }
    out.flush();
    out.close();
}

}

4

3 に答える 3

4

あなたが電話していないからですflush

フラッシュしていない場合は、転送する前にすべてがクリアされます。そうしないと、期待どおりの例外が発生します。

ドキュメントのように:

getRequestDispatcher() によって取得された RequestDispatcher の場合、ServletRequest オブジェクトのパス要素とパラメータは、ターゲット リソースのパスに一致するように調整されます。

forward は、応答がクライアントにコミットされる前 (応答本文の出力がフラッシュされる前) に呼び出す必要があります。応答がすでにコミットされている場合、このメソッドは IllegalStateException をスローします。応答バッファー内のコミットされていない出力は、転送の前に自動的にクリアされます。

于 2013-08-14T09:25:22.133 に答える
3

Read the docs.

Calling flush() on the PrintWriter commits the response.

Now, as per your curiosity that why there is no IllegalStateException thrown. It's simply because PrintWriter.flush() doesn't throw this or any checked exception. And, we know that the response was not committed when rd.forward() is invoked, since flush() comes later in the method.

于 2013-08-14T09:33:40.263 に答える
1

forward の前に flush() を呼び出していません。したがって、例外は表示されません。リクエストが転送される前に flush() を記述すると、例外がスローされます。

flush() を呼び出すと、バッファにあったすべてのものがブラウザに送信され、バッファがクリアされます。

次のシナリオでは、例外が発生します。

response.getWriter().print('hello...');  
response.getWriter().flush();  
request.getRequestDispatcher("/index.").forward(request, response);
于 2013-08-14T09:42:41.660 に答える