2013-07-18 46 views
8

我正在使用Spring 3.2.0 MVC。因爲我必須將一個對象存儲到會話中。 目前我正在使用HttpSession集並獲取屬性來存儲和檢索值。Spring @SessionAttribute如何檢索同一控制器中的會話對象

它只返回String not Object。我想用@SessionAttribute當我試圖設置會話對象,但我無法獲取會話對象

@RequestMapping(value = "/sample-login", method = RequestMethod.POST) 
    public String getLoginClient(HttpServletRequest request,ModelMap modelMap) { 
     String userName = request.getParameter("userName"); 
     String password = request.getParameter("password"); 
     User user = sample.createClient(userName, password); 
     modelMap.addAttribute("userObject", user); 
     return "user"; 
    } 


    @RequestMapping(value = "/user-byName", method = RequestMethod.GET) 
    public 
    @ResponseBody 
    String getUserByName(HttpServletRequest request,@ModelAttribute User user) { 

     String fas= user.toString(); 
     return fas; 
    } 

這兩種方法都在同一個控制器。我將如何使用它來檢索對象?

+0

你提到的問題就好像你有代碼試圖使用'@ SessionAttribute',但你的代碼片段不包含它。因此,你是如何使用它的? – sjngm

+0

我添加了@SessionAttributes(「userObject」)'我在代碼中使用了這個 – jackyesind

回答

29

@SessionAttributes註釋是在類級別用於:

  1. 馬克模型屬性應該被保存到HttpSession中後處理方法執行
  2. 與先前保存的對象來填充你的模型從HttpSession中前處理程序方法被執行 - 如果其中一個存在

因此,您可以將它與您的@ModelAttribute註釋就像這個例子:

@Controller 
@RequestMapping("/counter") 
@SessionAttributes("mycounter") 
public class CounterController { 

    // Checks if there's a model attribute 'mycounter', if not create a new one. 
    // Since 'mycounter' is labelled as session attribute it will be persisted to 
    // HttpSession 
    @RequestMapping(method = GET) 
    public String get(Model model) { 
    if(!model.containsAttribute("mycounter")) { 
     model.addAttribute("mycounter", new MyCounter(0)); 
    } 
    return "counter"; 
    } 

    // Obtain 'mycounter' object for this user's session and increment it 
    @RequestMapping(method = POST) 
    public String post(@ModelAttribute("mycounter") MyCounter myCounter) { 
    myCounter.increment(); 
    return "redirect:/counter"; 
    } 
} 

也不要忘記常見noobie陷阱:確保你讓你的對話對象序列化。

+2

最近我遇到了相同的情況 - 需要在我的處理程序方法中獲取會話屬性。由於彈簧數據綁定功能,使用@ModelAttribute並不是最好的解決方案。在你的例子中,如果你得到一個包含名稱與myCounter字段名稱匹配的參數的post請求,spring會自動將該字段設置爲從參數獲得的值,這可能是一個完全驚喜。 http://stackoverflow.com/questions/27744890/spring-mvc-how-to-forbid-data-binding-to-modelattribute – troy

相關問題