1. 程式人生 > >spring學習之@SessionAttributes運用詳解

spring學習之@SessionAttributes運用詳解

  一、@ModelAttribute

 在預設情況下,ModelMap 中的屬性作用域是 request 級別是,也就是說,當本次請求結束後,ModelMap中的屬性將銷燬。如果希望在多個請求中共享 ModelMap 中的屬性,必須將其屬性轉存到 session 中,這樣ModelMap 的屬性才可以被跨請求訪問。

      Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。這一功能是通過類定義處標註 @SessionAttributes 註解來實現的。

使模型物件的特定屬性具有 Session 範圍的作用域

Java程式碼  收藏程式碼
  1. package com.baobaotao.web;  
  2. …  
  3. import org.springframework.ui.ModelMap;  
  4. import org.springframework.web.bind.annotation.SessionAttributes;  
  5. @Controller
  6. @RequestMapping("/bbtForum.do")  
  7. <span style="color: #008000;">@SessionAttributes("currUser"//①將ModelMap中屬性名為currUser的屬性
  8. //放到Session屬性列表中,以便這個屬性可以跨請求訪問</span>
  9. publicclass BbtForumController {  
  10. …  
  11.     @RequestMapping(params = "method=listBoardTopic")  
  12.     public String listBoardTopic(@RequestParam("id")int topicId, User user,  
  13. ModelMap model) {  
  14.         bbtForumService.getBoardTopics(topicId);  
  15.         System.out.println("topicId:" + topicId);  
  16.         System.out.println("user:"
     + user);  
  17.         model.addAttribute("currUser",user); <span style="color: #008000;">//②向ModelMap中新增一個屬性</span>
  18.         return"listTopic";  
  19.     }  
  20. }  

    我們在 ② 處添加了一個 ModelMap 屬性,其屬性名為 currUser,而 ① 處通過 @SessionAttributes 註解將 ModelMap 中名為 currUser 的屬性放置到 Session 中,所以我們不但可以在 listBoardTopic() 請求所對應的 JSP 檢視頁面中通過 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 獲取 user 物件,還可以在下一個請求所對應的 JSP 檢視頁面中通過 session.getAttribute(“currUser”) 或ModelMap#get(“currUser”) 訪問到這個屬性。

    這裡我們僅將一個 ModelMap 的屬性放入 Session 中,其實 @SessionAttributes 允許指定多個屬性。你可以通過字串陣列的方式指定多個屬性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 還可以通過屬性型別指定要 session 化的 ModelMap 屬性,如@SessionAttributes(types = User.class),當然也可以指定多個類,如 @SessionAttributes(types = {User.class,Dept.class}),還可以聯合使用屬性名和屬性型別指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})。

二、@ModelAttribute

     我們可以在需要訪問 Session 屬性的 controller 上加上 @SessionAttributes,然後在 action 需要的 User 引數上加上 @ModelAttribute,並保證兩者的屬性名稱一致。SpringMVC 就會自動將 @SessionAttributes 定義的屬性注入到 ModelMap 物件,在 setup action 的引數列表時,去 ModelMap 中取到這樣的物件,再新增到引數列表。只要我們不去呼叫 SessionStatus 的 setComplete() 方法,這個物件就會一直保留在 Session 中,從而實現 Session 資訊的共享。

Java程式碼  收藏程式碼
  1. @Controller
  2. <span style="color: #008000;">@SessionAttributes("currentUser")</span>  
  3. publicclass GreetingController{  
  4. @RequestMapping
  5. publicvoid hello<span style="color: #008000;">(@ModelAttribute("currentUser")</span> User user){  
  6.   //user.sayHello()
  7. }  
  8. }