java servlet:response.sendRedirect()は、response.whyのコミット後に呼び出された場合、不正な状態の例外を与えません。

StackOverflow https://stackoverflow.com/questions/1023443

質問

ここでのリダイレクトステートメントの応答のコミット後、例外を与える必要がありますが、このリダイレクトstatemnetがifブロックにある場合はそうではありませんが、block.iが同じステートメントを示している場合は例外を与えます(以下の2か所に星印を付けてください。理由を教えてください。

protected void doPost(HttpServletRequest request, HttpServletResponse response)          throws    ServletException, IOException {
            // TODO Auto-generated method stub
    synchronized (noOfRequests)
    {
        noOfRequests++;
        }
        PrintWriter pw=null;
        response.setContentType("text/html");
        response.setHeader("foo","bar");

// responseは、上記のステートメントのためにコミットされています

        pw=response.getWriter();
        pw.print("hello : "+noOfRequests);

// ifステートメントの下でこのifステートメントを削除した場合、if block.soステートメントはifブロックにも存在しますが、これは例外を与えるべきですが、そうではありません。なぜですか?

***response.sendRedirect("http://localhost:8625/ServletPrc/login%  20page.html");


    if(true)
    {
                  //same statement as above
        ***response.sendRedirect("http://localhost:8625/ServletPrc/login%20page.html");
    }
    else{

        request.setAttribute("noOfReq", noOfRequests);
        request.setAttribute("name", new Name().getName());
        request.setAttribute("GmailId",this.getServletConfig().getInitParameter("GmailId") );
        request.setAttribute("YahooId",this.getServletConfig().getInitParameter("YahooId") );
        RequestDispatcher view1=request.getRequestDispatcher("HomePage.jsp");
        view1.forward(request, response);

    }


}               
役に立ちましたか?

解決

からサーブレットの仕様、5.3:

  

これらのメソッドには、応答をコミットするという副作用があります。   まだコミットされておらず、終了しています。クライアントへのさらなる出力なし   これらのメソッドが呼び出された後、サーブレットによって作成される必要があります。データが書き込まれた場合   これらのメソッドが呼び出された後の応答、データは無視されます。

     

データが応答バッファーに書き込まれているが、クライアントに返されていない場合   (つまり、応答がコミットされていない)、応答バッファ内のデータは   これらのメソッドによってクリアされ、データセットに置き換えられます。応答が   コミットされた場合、これらのメソッドはIllegalStateExceptionをスローする必要があります。

これら2つの仕様はすべてのケースをカバーすると思います。

他のヒント

最初のブロックが終了する直前にresponse.flushを配置して、必要なだけ書き込みますが、バッファから送信されない限りコミットされません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top