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

时间:2014-03-02 04:57:27

标签: java java-ee

我有以下代码:

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

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

    工作正常。

    任何帮助?

3 个答案:

答案 0 :(得分:2)

问题在于此if块

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

你忘记回到这里了。因为它重定向,而不是在渲染和转发到另一个页面。

所以它应该是

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

希望这有帮助。

答案 1 :(得分:1)

您需要了解重定向是什么。

使用时

response.sendRedirect(url);

Servlet容器向客户端返回一个HTTP响应,其中包含302状态代码和指向重定向应该转到的URI的Location标头。换句话说,您告诉客户端向Location标头中的URI发送 GET请求。

Servlet容器发送此HTTP响应后,响应处理完成。如果您尝试使用HttpServletResponse执行任何其他操作,例如转发到JSP,您将获得一堆异常。

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

你如何防止它取决于你。 See Sanjeev's answer for one possibility.

答案 2 :(得分:0)

重写您的代码如下

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

}