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