2014-03-02 73 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"); 
      } 

} 
相關問題