1. 程式人生 > >轉載一篇關於springmvc下session的用法,覺得作者寫的不錯,給大家分享一下

轉載一篇關於springmvc下session的用法,覺得作者寫的不錯,給大家分享一下

繫結模型物件中某個屬性

Spring 2.0 定義了一個 org.springframework.ui.ModelMap 類,它作為通用的模型資料承載物件,傳遞資料供檢視所用。我們可以在請求處理方法中宣告一個 ModelMap 型別的入參,Spring 會將本次請求模型物件引用通過該入參傳遞進來,這樣就可以在請求處理方法內部訪問模型物件了。來看下面的例子:

使用 ModelMap 訪問請示對應的隱含模型物件

@RequestMapping(params = "method=listBoardTopic")
 public String listBoardTopic(@RequestParam
("id")int topicId, User user,ModelMap model) { bbtForumService.getBoardTopics(topicId); System.out.println("topicId:" + topicId); System.out.println("user:" + user); //① 將user物件以currUser為鍵放入到model中 model.addAttribute("currUser",user); return "listTopic"; }
對於當次請求所對應的模型物件來說,其所有屬性都將存放到 request 的屬性列表中。象上面的例子,ModelMap 中的 currUser 屬性將放到 request 的屬性列表中,所以可以在 JSP 檢視頁面中通過 request.getAttribute(“currUser”) 或者通過 ${currUser} EL 表示式訪問模型物件中的 user 物件。從這個角度上看, ModelMap 相當於是一個向 request 屬性列表中新增物件的一條管道,藉由 ModelMap 物件的支援,我們可以在一個不依賴 Servlet API 的 Controller 中向 request 中新增屬性。
在預設情況下,ModelMap 中的屬性作用域是 request 級別是,也就是說,當本次請求結束後,ModelMap 中的屬性將銷燬。如果希望在多個請求中共享 ModelMap 中的屬性,必須將其屬性轉存到 session 中,這樣 ModelMap 的屬性才可以被跨請求訪問。
Spring 允許我們有選擇地指定 ModelMap 中的哪些屬性需要轉存到 session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。這一功能是通過類定義處標註 @SessionAttributes 註解來實現的。請看下面的程式碼:

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

package com.baobaotao.web;

…
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/bbtForum.do")
@SessionAttributes("currUser") //①將ModelMap中屬性名為currUser的屬性
//放到Session屬性列表中,以便這個屬性可以跨請求訪問
public class BbtForumController {
…
    @RequestMapping
(params = "method=listBoardTopic") public String listBoardTopic(@RequestParam("id")int topicId, User user, ModelMap model) { bbtForumService.getBoardTopics(topicId); System.out.println("topicId:" + topicId); System.out.println("user:" + user); model.addAttribute("currUser",user); //②向ModelMap中新增一個屬性 return "listTopic"; } }
我們在 ② 處添加了一個 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”})。
上面講述瞭如何往ModelMap中放置屬性以及如何使ModelMap中的屬性擁有Session域的作用範圍。除了在JSP檢視頁面中通過傳統的方法訪問ModelMap中的屬性外,讀者朋友可能會問:是否可以將ModelMap中的屬性繫結到請求處理方法的入參中呢?答案是肯定的。Spring為此提供了一個@ModelAttribute的註解,下面是使用@ModelAttribute註解的例子:

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

package com.baobaotao.web;

import com.baobaotao.service.BbtForumService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.annotation.ModelAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/bbtForum.do")
@SessionAttributes("currUser") //①讓ModelMap的currUser屬性擁有session級作用域
public class BbtForumController {

    @Autowired
private BbtForumService bbtForumService;

    @RequestMapping(params = "method=listBoardTopic")
    public String listBoardTopic(@RequestParam("id")int topicId, User user,
ModelMap model) {
        bbtForumService.getBoardTopics(topicId);
        System.out.println("topicId:" + topicId);
        System.out.println("user:" + user);
        model.addAttribute("currUser",user); //②向ModelMap中新增一個屬性
        return "listTopic";
    }


    @RequestMapping(params = "method=listAllBoard")
   //③將ModelMap中的
public String listAllBoard(@ModelAttribute("currUser") User user) { 
//currUser屬性繫結到user入參中。
        bbtForumService.getAllBoard();
        System.out.println("user:"+user);
        return "listBoard";
    }
}
在 ② 處,我們向 ModelMap 中新增一個名為 currUser 的屬性,而 ① 外的註解使這個 currUser 屬性擁有了 session 級的作用域。所以,我們可以在 ③ 處通過 @ModelAttribute 註解將 ModelMap 中的 currUser 屬性繫結以請求處理方法的 user 入參中。
所以當我們先呼叫以下 URL 請求: http://localhost/bbtForum.do?method=listBoardTopic&id=1&userName=tom&dept.deptId=12
以執行listBoardTopic()請求處理方法,然後再訪問以下URL: http://localhost/sample/bbtForum.do?method=listAllBoard

你將可以看到 listAllBoard() 的 user 入參已經成功繫結到 listBoardTopic() 中註冊的 session 級的 currUser 屬性上了。

註明:這裡是原文的網址https://my.oschina.net/rouchongzi/blog/161871