web-dev-qa-db-ja.com

修正方法応答がコミットされた後にsendRedirect()を呼び出すことはできませんか?

以下のコードを使用して、サーブレットからjspページに値を渡そうとしています。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    PrintWriter out = response.getWriter();
    try {
        System.out.println("try");

        String taskid=request.getParameter("id");   
        convty = new Connectivity();
        con = convty.setConnection();
        st=con.createStatement();

        query="select * from task_table";

        rset=convty.getResultSet(query, con);
        while(rset.next()) {
            System.out.println("while");
            lst.add(rset.getString("task_id"));
            lst.add(rset.getString("date"));
            lst.add(rset.getString("project_name"));    
        }
        rset.close();
        System.out.println("after while");

    } catch(Exception e) {

        RequestDispatcher dd= request.getRequestDispatcher("error.jsp");
        dd.forward(request, response);

    } finally {
        System.out.println("finally1");
        HttpSession sessionvar = request.getSession();
        sessionvar.setAttribute("TaskData", "lst");

        response.sendRedirect("usertaskpage.jsp");

        lst.clear();
        out.close();            
    }
}

ページを実行すると、次のようになります。

エラー:

Java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
    org.Apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.Java:483)
    src.Taskservlet.doPost(Taskservlet.Java:108)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:51)

私は使用しようとしました:

RequestDispatcher dd=request.getRequestDispatcher("usertaskpage.jsp");
dd.forward(request, response);

しかし、私は同じエラーを受け取りました。

このエラーを修正するには?

19
MMMMS

あなたはすでにcatchブロックで応答を転送しています:

RequestDispatcher dd = request.getRequestDispatcher("error.jsp");

dd.forward(request, response);

だから、あなたは再び呼び出すことはできません:

response.sendRedirect("usertaskpage.jsp");

既に転送(コミット)されているためです。

できることは、文字列を保持して、応答を転送する必要がある場所を割り当てることです。

    String page = "";
    try {

    } catch (Exception e) {
      page = "error.jsp";
    } finally {
      page = "usertaskpage.jsp";
    }

RequestDispatcher dd=request.getRequestDispatcher(page);
dd.forward(request, response);
18
Nomesh DeSilva

IllegalStateException例外の根本的な原因は、Javaサーブレットが応答のコミット後に出力ストリーム(応答)への書き込みを試みていることです。

IllegalStateExceptionを回避するには、転送またはリダイレクトが行われた後、応答にコンテンツが追加されないようにすることを常にお勧めします。 forwardまたはredirectステートメントのすぐ横に「return」ステートメントを含めることで実行できます。

Java 7公式リンク

追加情報

4
sunleo

forward()を既に使用した後は、sendRedirect()を呼び出すことはできません。したがって、その例外が発生します。

2
DeepInJava