2013-10-01 43 views
0

我剛開始學習Spring MVC。所以,如果我的初學者水平讓你感到不快,那很抱歉。維護彈簧控制器中不同URL之間重定向的數據

爲了讓我的問題簡短明瞭,我正在使用下面的簡單代碼示例。

我在兩個不同的彈簧MVC控制器中有兩個函數。 在第一控制器,我有:

@RequestMapping("/first") 
public String first(Model model){ 
    model.addAttribute("user", "User Name"); 
    return "redirect:/second"; 
} 

在第二控制器我有:

@RequestMapping("/second") 
public String second(){ 
    return "myView"; 
} 

實際上所述第一被重定向至第二。 Bt在我看來(html),當我嘗試獲取模型的值如下:

<h1>Welcome! ${user} <h1> //code in html to get user object 

它顯示爲空。

所以我的問題是如何在兩個請求之間重定向的時候在spring MVC中傳輸數據。達到這個目標的最佳解決方案是什麼?我可以通過模型或其他方法達到這個目標嗎? 在此先感謝

+1

請參閱[Flash Attributes](http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes) – GriffeyDog

回答

1

return "redirect:/second"; 

返回導致DispatcherServlet與一個Location頭,告訴你的客戶在哪裏實際查找頁面返回302響應代碼。在你的情況下,去./second尋找它。如果您通過瀏覽器發出請求,則會導致瀏覽器向Location標頭中的URL發送新的HTTP GET請求。

Model屬性,如HttpServletRequest屬性只存在於單個請求的上下文中。由於您正在做的事情發生在兩個請求上,第一個中的屬性不會存在於第二個中。你需要使用Flash屬性。

Spring 3.1提供RedirectAttributes類來實現flash屬性。您可以將RedirectAttributes類型的參數添加到您的處理程序方法中,並使用addFlashAttribute()方法添加將在下一個請求中添加到模型中的屬性。

@RequestMapping("/first") 
public String first(RedirectAttributes redirectAttributes){ 
    redirectAttributes.addFlashAttribute("user", "User Name"); 
    return "redirect:/second"; 
} 

這裏做的事情在幕後爲它增加了通過addFlashAttribute加入HttpSession屬性和特殊鍵的屬性。在下一個請求中,DispatcherServlet將該特殊鍵的所有HttpSession屬性添加到Model中。

+0

感謝您的不錯詳細的答案。根據你的回答 - 使用redirectionAttributes後,當我重定向後來到視圖,對象有它的價值,但刷新它再次得到**空/空**。如果我仍然希望該屬性即使在此刷新上怎麼辦?我應該爲此做些什麼。我有沒有比httpsession更好的解決方案? – vicky