web-dev-qa-db-fra.com

comment résoudre Impossible d'appeler sendRedirect () une fois la réponse validée?

J'essaye de passer des valeurs du servlet à la page jsp en utilisant le code ci-dessous:

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();            
    }
}

lorsque je lance ma page, je reçois:

Erreur:

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)

J'ai essayé d'utiliser:

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

mais j'ai eu la même erreur.

Comment corriger cette erreur?

19
MMMMS

vous avez déjà transmis la réponse dans le bloc catch:

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

dd.forward(request, response);

vous ne pouvez donc plus appeler:

response.sendRedirect("usertaskpage.jsp");

car il est déjà transmis (engagé).

Donc, ce que vous pouvez faire est de: conserver une chaîne pour assigner où vous devez transmettre la réponse.

    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

La cause première de l'exception IllegalStateException est un Java tente d'écrire dans le flux de sortie (réponse) une fois la réponse validée).

Il est toujours préférable de s'assurer qu'aucun contenu n'est ajouté à la réponse après le transfert ou la redirection pour éviter IllegalStateException. Cela peut être fait en incluant une instruction "retour" juste à côté de l'instruction forward ou redirect.

LIEN OFFICIEL Java 7

INFOS SUPPLÉMENTAIRES

4
sunleo

vous ne pouvez pas appeler sendRedirect (), après avoir déjà utilisé forward (). Donc, vous obtenez cette exception.

2
DeepInJava