@Controller
@SessionAttributes({"msg"})
public class HelloController {
@RequestMapping("/login01.do")
public ModelAndView login01(@RequestParam("name") String name,@RequestParam("password") String password){
/* 无 @SessionAttributes({"msg"}) 将在requestScope存储 */
/* 有 @SessionAttributes({"msg"}) 将在requestScope和sessionScope同时存储*/
ModelAndView modelAndView = new ModelAndView();
if ("admin".equals(name)&&"123".equals(password)){
modelAndView.setViewName("hello");
modelAndView.addObject("msg","success");
}else {
modelAndView.setViewName("login");
modelAndView.addObject("msg","error");
}
return modelAndView;
}
@RequestMapping("/login02.do")
public String login02(@RequestParam("name") String name, @RequestParam("password") String password, Model model){
/* 无 @SessionAttributes({"msg"}) 将在requestScope存储 */
/* 有 @SessionAttributes({"msg"}) 将在requestScope和sessionScope同时存储*/
String view = null;
if ("admin".equals(name)&&"123".equals(password)){
view = "hello";
model.addAttribute("msg","success");
}else {
view = "login";
model.addAttribute("msg","error");
}
return view;
}
@RequestMapping("/login03.do")
public String login03(@RequestParam("name") String name, @RequestParam("password") String password, HttpSession session){
/*与有无注解直接无关,始终在sessionScope存储*/
String view = null;
if ("admin".equals(name)&&"123".equals(password)){
view = "hello";
session.setAttribute("msg","success");
}else {
view = "login";
session.setAttribute("msg","error");
}
return view;
}
/**
* 从session中获取值 *
* @return
*/
@RequestMapping(path = "/find")
public String find(ModelMap modelMap) {
String username = (String) modelMap.get("username");
String password = (String) modelMap.get("password");
Integer age = (Integer) modelMap.get("age");
System.out.println(username + " : " + password + " : " + age);
return "success";
}
/**
* 清除值 * 需要执行两次
* 第一次删除requestScope
* 第二次删除sessionScope
* @return
*/
@RequestMapping(path = "/delete")
public String delete(SessionStatus status) {
// 清除当前处理器通过@SessionAttribute注册的session属性
status.setComplete();
return "success";
}
}
结论部分参考自 link.
**1、可以通过SpringMVC特有的ModelMap、Model在Controller中自动保存数据到session,也可以通过传统的HttpSession等参数保存session数据
2、保存session数据必须使用@SessionAttributes注解,该注解有2种参数声明方式(value和types),且该注解声明必须写在类上,不能在方法上
3、保存的session数据必须与@SessionAttributes注解中的参数列表对应,未被声明的参数无法保存到session中
4、使用SessionStatus可以清除session中保存的数据,注意是全部清除,无法单独删除指定的session数据。同时,清除时有效权限遵循上述第2、3条规则(借用此规则可人为达到删除指定session数据的效果)
注意:清除值需要执行两次
* 第一次删除sessionScope
* 第二次删除requestScope
5、通过ModelMap等读取session中数据时,也有上述的参数权限限制
6、使用ModelMap或Model等保存session数据时,ModelMap必须作为方法参数传入,在方法中新定义的无效。同时,只要把ModelMap作为参数传入,即使是被别的方法调用也能起效
7、使用@ResponseBody注解时(一般配合ajax使用),无法保存session数据,此时可以用传统HttpSession避免问题。
8、使用HttpSession的传统方式操作没有上述注解及权限等限制。
9. Model ModelMap modelAndView 如果没用注解只会在requestScope中储存,SessionStatus可以清除,如果用了注解SessionStatus不可以清除?(感觉这条是错的,但是我实验是这样。。。,还是单独使用各自好了)