@SessionAttribute和@ModelAttribute詳解

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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章