2014-03-02 35 views
0

我有以下代码:我得到这个异常java.lang.IllegalStateException当我尝试重定向到另一页

  1. util.library.mvc.Controller =>控制器从Servlet的
  2. 模块扩展.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"); 
} 

它工作正常。

任何帮助?

+1

让我们完整的堆栈跟踪重写代码。 –

+0

这个异常很明显在'render'方法中发生。我们来看看。 –

回答

2

的问题是在这一点,如果块

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

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

所以它应该是

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

希望这有助于。

1

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

当您使用

response.sendRedirect(url); 

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

一旦Servlet容器发送了这个HTTP响应,响应处理就完成了。如果您尝试使用HttpServletResponse做其他任何事情,例如转发到JSP,您将会遇到一些异常情况。

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

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

+0

感谢您的解释。 – afym

+0

@afym不客气。 –

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

} 
相关问题