@SessionAttributes("nowUser") nowUser :id/userName/password
public String delectMsg(int id, int num, Model model, @ModelAttribute("nowUser") User user) {}
調用方法時候,傳了個id值,這時候,會修改nowUser裏面的id值。。。。。。。。。。。。javascript
1、@SessionAttributes java
在默認狀況下,ModelMap 中的屬性做用域是 request 級別是,也就是說,當本次請求結束後,ModelMap中的屬性將銷燬。若是但願在多個請求中共享 ModelMap 中的屬性,必須將其屬性轉存到 session 中,這樣ModelMap 的屬性才能夠被跨請求訪問。web
spring 容許咱們有選擇地指定 ModelMap 中的哪些屬性須要轉存到 session 中,以便下一個請求屬對應的 ModelMap 的屬性列表中還能訪問到這些屬性。這一功能是經過類定義處標註 @SessionAttributes 註解來實現的。spring
使模型對象的特定屬性具備 Session 範圍的做用域數組
@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」) 訪問到這個屬性。session
這裏咱們僅將一個 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」})。app
2、@ModelAttributespa
咱們能夠在須要訪問 Session 屬性的 controller 上加上 @SessionAttributes,而後在 action 須要的 User 參數上加上 @ModelAttribute,並保證二者的屬性名稱一致。SpringMVC 就會自動將 @SessionAttributes 定義的屬性注入到 ModelMap 對象,在 setup action 的參數列表時,去 ModelMap 中取到這樣的對象,再添加到參數列表。只要咱們不去調用 SessionStatus 的 setComplete() 方法,這個對象就會一直保留在 Session 中,從而實現 Session 信息的共享。.net
@Controller @SessionAttributes("currentUser") public class GreetingController{ @RequestMapping public void hello(@ModelAttribute("currentUser") User user){ //user.sayHello() } }
A、@SessionAttributesxml
org.springframework.web.bind.annotation.SessionAttributes
public @interface SessionAttributes
這個代表會話屬性的註釋被特定的處理器使用。它一般列出存儲在會話中模型屬性的名稱。聲明在類級別,適用於這個註釋的處理器類能夠操做的模型屬性。
注意:這個註釋代表使用會話中的session就像使用一個特定的模型屬性。一旦處理器完成這些屬性也將被刪除。所以使用這種會話屬性的機制,都應支持在一個特定的會話過程當中臨時存儲。
永久會話屬性(如:用戶身份驗證對象),請使用傳統的session.setAttribute方法。另外,也可考慮使用WebRequest。
注意,當時有Controller接口,確保始終把@RequestMapping和@SessionAttributes放在控制器接口上而不是實現類上。
屬性
String[] value
存儲在會話中的會話屬性名稱。
注意,這裏指定的模型屬性名稱。會話屬性名稱不必定匹配模型屬性名稱。應用程序不該該依賴會話屬性名稱。
Class[] types
存儲在會話中的會話屬性類型。這種類型的全部模型屬性都將存儲在會話中,不管屬性名稱是什麼。
B、舉例說明
範例1:經過Model綁定
Spring容許咱們有選擇地指定Model中的哪些屬性須要轉存到session中,以便下一個請求可經過Session來訪問到這些屬性。這一功能是經過類定義處標註@SessionAttributes註解來實現的。
@Controller
@RequestMapping(value = "login")
@SessionAttributes("mysession")
//定義把Model中的mysession屬性的值綁定到Session中
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute User user, ModelMap model) {
String viewName = "";
boolean check = true;
if (check) {
model.addAttribute("mysession", "123");
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}
}
這樣咱們不但能夠在請求所對應的JSP視圖頁面中經過request.getAttribute()和session.getAttribute()獲取mysession,還能夠在下一個請求所對應的JSP視圖頁面中經過session.getAttribute()或ModelMap#get()訪問到這個屬性。
這裏咱們僅將一個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」})。
範例2:經過@ModelAttribute綁定
咱們使用@ModelAttribute把表單自動綁定到對象上,那這個對象也能夠經過@ModelAttribute(「」)綁定到Session中。
@Controller
@RequestMapping(value = "login")
@SessionAttributes("user")
//此處定義須要綁定到session中的model名稱
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute("user") User user, ModelMap model){
//@ModelAttribute將綁定到session中
String viewName = "";
boolean check = true;
if (check) {
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
return viewName;
}
}
範例3:@SessionAttributes清除
@SessionAttributes須要清除時,使用SessionStatus.setComplete();來清除。注意,它只清除@SessionAttributes的session,不會清除HttpSession的數據。故如用戶身份驗證對象的session通常不一樣它來實現,仍是用session.setAttribute等傳統的方式實現。
@Controller
@RequestMapping(value = "login")
@SessionAttributes("mysession")
// 定義把Model中的mysession屬性的值綁定到Session中
public class LoginController {
@RequestMapping(method = RequestMethod.POST)
public String login(@ModelAttribute User user, ModelMap model,
SessionStatus sessionStatus) {
String viewName = "";
boolean check = true;
if (check) {
model.addAttribute("mysession", "1233");
viewName = "redirect:/home";
} else {
viewName = "redirect:/";
}
sessionStatus.setComplete();
return viewName;
}
}