@ModelAttribute
- 1.@ModelAttribute注释在方法上
- 1.1 @ModelAttribute加再void方法上
@ModelAttribute public void setCommonData(@RequestParam String param,Model model){ model.addAttribute("message", param); } @RequestMapping(value="/hello") public String hello(){ return "attributes"; }
在执行/hello所在Controller中的方法之前会先执行setCommonData方法,并且会将请求参数/hello?param=hello解析到message中。这个用法比较适合用于设置公共数据。
1.2@ModelAttribute加在返回具体对象的方法上
@ModelAttribute public User fetchUser(){ return new User(); }
这时,虽然model的属性名没有直接指定,但是默认根据返回的对象类型隐式给出。如上,返回为User对象,则model的属性名为user,对应属性对象为new User();
1.3 上面两种情况的组合使用方法
@ModelAttribute("message") public String setCommonData(@RequestParam String param,Model model){ //model.addAttribute("message", param); return param; } @RequestMapping(value="/hello") public String hello(){ return "attributes"; }
1.4 @RequestMapping与@ModelAttribute一起加在方法上
@RequestMapping(value="/attributes") @ModelAttribute("message") public String attributes(){ return "helloattribute"; }
这时,返回值就不是一个View名称了 而是model的属性值。视图名称将会根据/attributes生成
- 2.@ModelAttribute注释在属性值上
- 2.1 @ModelAttribute注释在一个方法的参数上
@ModelAttribute("user") public User setCommonData(@RequestParam String param,Model model){ return new User("Rose","123",23); } @RequestMapping(value="/onParam") public String onParam(@ModelAttribute("user") User user){ user.setUsername("Tom"); return "attributes"; }
user可以从setCommonData中获取 也可以通过url里的参数获取(此时需要user具有无参构造器)
此时,如果在Controller类上有@SessionAttributes("user")
则user的scope为session否则其scope为request。
默认情况下,ModelMap中的属性的scope是request级别的。也即,一个request请求结束,ModelMap中的属性将会被销毁。如果希望将ModelMap中的属性在多个请求中共享,我们需要使用@SessonAttributes注解来完成。
@SessionAttributes
使用方法:
@Controller @RequestMapping(value="/attributes") @SessionAttributes("user")//将user对象透明地加入到Session中 public class Attributes {
其实,
@SessionAttributes允许指定多个属性。如@SessionAttributes({"attr1","attr2"})
@SessionAttributes允许通过属性类型指定要Session化的ModelMap属性。如@SessionAttributes(types=User.class)也可指定多个@SessionAttributes(types={User.class,Company.class})
也可以联合属性名和属性类型来指定@SessionAttributes(types={User.class,Company.class},value={"attr1","attr2"})
只要我们不调用SessionStatus的setComplete方法,这些对象会一直保存在Session中。
@RequestMapping(value="/complete") public String complete(SessionStatus sessionStatus){ sessionStatus.setComplete();//清除@SessionAttributes在Session中存储的对象信息 return "complete"; }