当我尝试重定向到另一个页面时,我得到了这个异常java.lang.IllegalStateException

当我尝试重定向到另一个页面时,我得到了这个异常java.lang.IllegalStateException,java,jakarta-ee,Java,Jakarta Ee,我有以下代码: util.library.mvc.Controller=>从Servlet扩展的控制器 modules.user.controllers.UpdateController=>控制器实现 在控制器父类中,我有一个包含以下内容的方法: public void redirect(HttpServletResponse response, String url) throws IOException { response.sendRedirect(url); }

我有以下代码:

  • util.library.mvc.Controller=>从Servlet扩展的控制器
  • modules.user.controllers.UpdateController=>控制器实现
  • 在控制器父类中,我有一个包含以下内容的方法:

    public void redirect(HttpServletResponse response, String url) 
            throws IOException
    {
        response.sendRedirect(url);
    }
    
    但当我尝试在控制器实现上使用它时,会出现以下异常:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Integer id = Integer.parseInt(request.getParameter("id"));
    
        UserRepository users = new UserRepository(request);
        User user = users.getUser(id);
    
                // My validation :
                if (user == null) {
                    this.redirect("list"); // throws me an exception
                }
    
        request.setAttribute("user", user);
        request.setAttribute("action", "update");
        request.setAttribute("legend", "Update User");
    
        this.render(request, response, "/user/form");
    }
    
    我收到了西班牙语的异常消息,但我将其翻译如下:

        java.lang.IllegalStateException: I can not forward after response has been carried out.
    util.library.mvc.Controller.render(Controller.java:31)
    modules.user.controllers.UpdateController.doGet(UpdateController.java:33)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    
    但是,当我在此上下文中使用此方法时:

        protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        User user = new User();
        user.populate(request);
    
        UserRepository userRepository = new UserRepository(request);
        userRepository.update(user);
    
        this.redirect(response, "list");
    }
    
    它很好用


    有什么帮助吗?

    您需要了解什么是重定向

    当你使用

    response.sendRedirect(url);
    
    Servlet容器向客户端返回一个HTTP响应,其中包含一个302状态代码和一个指向重定向应该指向的URI的
    位置
    头。换句话说,您告诉客户端向
    Location
    头中的URI发送newGET请求

    一旦Servlet容器发送了这个HTTP响应,响应处理就完成了。如果您尝试使用
    HttpServletResponse
    执行任何其他操作,比如转发到JSP,您将得到一系列异常

    当您转发到JSP时,您希望Servlet容器呈现JSP的内容并将其写入HTTP响应,但是使用
    sendRedirect
    ,您已经发送了HTTP响应。如果你正在重定向,你不能让它发生


    如何预防它取决于你自己

    您需要了解什么是重定向

    当你使用

    response.sendRedirect(url);
    
    Servlet容器向客户端返回一个HTTP响应,其中包含一个302状态代码和一个指向重定向应该指向的URI的
    位置
    头。换句话说,您告诉客户端向
    Location
    头中的URI发送newGET请求

    一旦Servlet容器发送了这个HTTP响应,响应处理就完成了。如果您尝试使用
    HttpServletResponse
    执行任何其他操作,比如转发到JSP,您将得到一系列异常

    当您转发到JSP时,您希望Servlet容器呈现JSP的内容并将其写入HTTP响应,但是使用
    sendRedirect
    ,您已经发送了HTTP响应。如果你正在重定向,你不能让它发生


    如何预防它取决于你自己

    您需要了解什么是重定向

    当你使用

    response.sendRedirect(url);
    
    Servlet容器向客户端返回一个HTTP响应,其中包含一个302状态代码和一个指向重定向应该指向的URI的
    位置
    头。换句话说,您告诉客户端向
    Location
    头中的URI发送newGET请求

    一旦Servlet容器发送了这个HTTP响应,响应处理就完成了。如果您尝试使用
    HttpServletResponse
    执行任何其他操作,比如转发到JSP,您将得到一系列异常

    当您转发到JSP时,您希望Servlet容器呈现JSP的内容并将其写入HTTP响应,但是使用
    sendRedirect
    ,您已经发送了HTTP响应。如果你正在重定向,你不能让它发生


    如何预防它取决于你自己

    您需要了解什么是重定向

    当你使用

    response.sendRedirect(url);
    
    Servlet容器向客户端返回一个HTTP响应,其中包含一个302状态代码和一个指向重定向应该指向的URI的
    位置
    头。换句话说,您告诉客户端向
    Location
    头中的URI发送newGET请求

    一旦Servlet容器发送了这个HTTP响应,响应处理就完成了。如果您尝试使用
    HttpServletResponse
    执行任何其他操作,比如转发到JSP,您将得到一系列异常

    当您转发到JSP时,您希望Servlet容器呈现JSP的内容并将其写入HTTP响应,但是使用
    sendRedirect
    ,您已经发送了HTTP响应。如果你正在重定向,你不能让它发生


    如何预防它取决于你自己

    问题出在这个if块中

            if (user == null) {
                this.redirect("list"); // throws me an exception
            }
    
    你忘了在这里放回车。因此,它会重定向,然后在渲染中执行某些操作并转发到另一个页面

    应该如此

            if (user == null) {
                this.redirect("list"); // throws me an exception
                return;
            }
    

    希望这有帮助。

    问题出在这个if块中

            if (user == null) {
                this.redirect("list"); // throws me an exception
            }
    
    你忘了在这里放回车。因此,它会重定向,然后在渲染中执行某些操作并转发到另一个页面

    应该如此

            if (user == null) {
                this.redirect("list"); // throws me an exception
                return;
            }
    

    希望这有帮助。

    问题出在这个if块中

            if (user == null) {
                this.redirect("list"); // throws me an exception
            }
    
    你忘了在这里放回车。因此,它会重定向,然后在渲染中执行某些操作并转发到另一个页面

    应该如此

            if (user == null) {
                this.redirect("list"); // throws me an exception
                return;
            }
    

    希望这有帮助。

    问题出在这个if块中

            if (user == null) {
                this.redirect("list"); // throws me an exception
            }
    
    你忘了在这里放回车。因此,它会重定向,然后在渲染中执行某些操作并转发到另一个页面

    应该如此

            if (user == null) {
                this.redirect("list"); // throws me an exception
                return;
            }
    

    希望这对您有所帮助。

    请按如下方式重写您的代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Integer id = Integer.parseInt(request.getParameter("id"));
    
        UserRepository users = new UserRepository(request);
        User user = users.getUser(id);
    
                // My validation :
                if (user != null) {
                      request.setAttribute("user", user);
                      request.setAttribute("action", "update");
                      request.setAttribute("legend", "Update User");
                      this.render(request, response, "/user/form");
                } else {
                      this.redirect("list"); 
                }
    
    }
    

    按如下方式重写代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Integer id = Integer.parseInt(request.getParameter("id"));
    
        UserRepository users = new UserRepository(request);
        User user = users.getUser(id);
    
                // My validation :
                if (user != null) {
                      request.setAttribute("user", user);
                      request.setAttribute("action", "update");
                      request.setAttribute("legend", "Update User");
                      this.render(request, response, "/user/form");
                } else {
                      this.redirect("list"); 
                }
    
    }
    

    按如下方式重写代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Integer id = Integer.parseInt(request.getParameter("id"));
    
        UserRepository users = new UserRepository(request);
        User user = users.getUser(id);
    
                // My validation :
                if (user != null) {
                      request.setAttribute("user", user);
                      request.setAttribute("action", "update");
                      request.setAttribute("legend", "Update User");
                      this.render(request, response, "/user/form");
                } else {
                      this.redirect("list"); 
                }
    
    }
    

    按如下方式重写代码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Integer id = Integer.parseInt(request.getParameter("id"));
    
        UserRepository users = new UserRepository(request);
        User user = users.getUser(id);
    
                // My validation :
                if (user != null) {
                      request.setAttribute("user", user);
                      request.setAttribute("action", "update");
                      request.setAttribute("legend", "Update User");
                      this.render(request, response, "/user/form");
                } else {
                      this.redirect("list"); 
                }
    
    }
    

    让我们获取完整的堆栈跟踪。异常显然发生在
    render
    方法中。让我们看看。让我们获得完整的堆栈跟踪。异常显然发生在
    render
    方法中。让我们看看。让我们获得完整的堆栈跟踪。异常显然发生在
    render
    方法中。让我们看看。让我们获得完整的堆栈跟踪。异常显然发生在
    render
    方法中。让我们看看。谢谢你的解释。谢谢你的解释。谢谢你的解释。谢谢你的解释。