Подтвердить что ты не робот

Как исправить Не удается вызвать 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);

но я получил ту же ошибку.

Как исправить эту ошибку?

4b9b3361

Ответ 1

вы уже отправили ответ в блоке 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);

Ответ 2

вы не можете вызвать sendRedirect(), после того как вы уже использовали forward(). Итак, вы получаете это исключение.

Ответ 3

Основной причиной исключения IllegalStateException является сервлет Java, который пытается записать в выходной поток (ответ) после того, как ответ был зафиксирован.

Всегда лучше следить за тем, чтобы контент не добавлялся в ответ после перенаправления или перенаправления, чтобы избежать исключения IllegalStateException. Это можно сделать, включив оператор return непосредственно рядом с оператором forward или redirect.

ОФИЦИАЛЬНАЯ ЛИНИЯ JAVA 7

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ