【最好去看一下原文】
@SessionAttribution和@ModelAttribute 这两个注解的作用使用联系的。这2个注解除了功能上的区别外,要注意的是:
1】 @SessionAttribution 【从request中拿,放到session中去】
是类级别的注解。在类上标注@SessionAttribution("userA"),作用是:将request中的userA属性保存到session中。
此外,还可以以数组的形式保存多个属性:
1) @SessionAttribution({"a","b"..});按照name取出,并保存到session中。
2) @SessionAttribution(type={A.class,B.class,..},value={"a","b"..});按照类型取出,保存到session中,key是对应的value数组上的name值。
2】 @ModelAttribute【从session中拿,放到ModelMap中去】
是方法、参数级别的注解。在方法、参数上标注@ModelAttribute("user"),作用是:从 session/方法返回值/或某处(我也不是特别了解) 取出user,并注入到ModelMap中。
@ModelAttribute类似于@RequestParam,只是一个request中拿,一个从session中拿。
以上所述仅是@ModelAttribute的小部分功能,@ModelAttribute的功能很强大,详解请看spring学习之@ModelAttribute运用详解
2.1】@ModelAttribute注释一个方法,这个方法的返回值非空
@Controller
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
User user;
@ModelAttribute("key")
public String in(@RequestParam String id) {// 1.先执行
Long longId = Long.parseLong(id);
user = userService.getById(longId);
return "value";
}
@RequestMapping("/list.do")
public String list(String id, HttpServletRequest request) {// 2. 后执行
request.setAttribute("user", user);
return "success";
}
}
请求路径:localhost:8080/user/list.do?id=1
先执行methodA,将methodA的返回值以<Key,Value>的形式,存入到ModelMap中,再执行list方法
将上一页代码中的methodA的返回类型改为void,去掉return语句,去掉@ModelAttribute的参数。
2.3】@ModelAttribute注释一个参数
@Controller
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@RequestMapping("/user")
public class UserController {
@Resource
private IUserService userService;
User user;
public void in(@ModelAttribute String id) { // 这个方法不会预先执行了!!!
Long longId = Long.parseLong(id);
user = userService.getById(longId);
}
@RequestMapping("/list.do")
public String list(String id, HttpServletRequest request) { // 1.直接执行此方法
request.setAttribute("user", user);
return "success";
}
}
小结:@ModelAttribute注释方法,就是存属性到ModelMap中;@ModelAttribute注释参数,就是从ModelMap和request中拿属性,注入到该参数中
如果@ModelAttribute注释一个方法:先看这个注解有没有value参数,如果有注解参数,@ModelAttribute会将该参数作为key,将方法返回值作为value存入ModelMap【若方法返回类型为空,则value为NULL】。如果没有注解参数,就不会存储属性到ModelMap。仅仅预先执行该方法。
如果@ModelAttribute注释一个参数,则从ModelMap和request中注入属性到这个参数中。注意:此时,不会预先执行该参数所在的方法(methodA)。
参考文章:http://www.360doc.com/content/13/0531/01/12565168_289361857.shtml