springmvc的ModelAttribute注解,在controller每个方法执行前被执行

转载 2016年05月30日 16:00:17

先看一个没有使用@ModelAttribute的Controller方法.

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping("/save")  
  2. public String save(User user) {  
  3.     user.setUsername("U love me");  
  4.     userService.save(user);  
  5.     return "result";  
  6. }  
其中User包含id和username两个私有属性,含有公共setter和getter方法.
执行此方法时会将key为"user"(注意:这里即使参数名称是user1,key一样还是"user"),value为user的对象加入到model.在jsp页面可以通过${user.id}和${user.name}得到值的,即上面方法和下面方法是相当的.
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping("/save")  
  2. public String save(Model model,int id,String username) {  
  3.     User user=new User();  
  4.     //这里是通过反射从request里面拿值再set到user  
  5.     user.setId(id);  
  6.     user.setUsername(username);  
  7.     model.addAttribute("user",user);  
  8.       
  9.     user.setUsername("U love me");  
  10.     userService.save(user);  
  11.     return "result";  
  12. }  
一.下面再来看看@ModelAttribute的基本用法.
1.在方法上使用@ModelAttribute
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @ModelAttribute("user1")  
  2. public User addUser(User user) {  
  3.     return new User(520,"I love U");  
  4. }  
假设此方法是写在UserController内,那么执行UserController内带有@RequestMapping的方法之前,都会先执行此addUser方法.并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute("user1")引起的).

2.在方法参数上使用@ModelAttribute.

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @RequestMapping("/save")  
  2. public String save(@ModelAttribute User user) {  
  3.     user.setUsername("U love me");  
  4.     userService.save(user);  
  5.     return "result";  
  6. }  
此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中key为"user").
使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.


3.再来看看在方法和方法参数上结合使用@ModelAttribute,即上面两步的两个方法都添加UserController,如下:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @ModelAttribute("user1")  
  2. public User addUser(User user) {  
  3.     return new User(520,"I love U");  
  4. }  
  5. @RequestMapping("/save")  
  6. public String save(@ModelAttribute User user) {  
  7.     user.setUsername("U love me");  
  8.     userService.save(user);  
  9.     return "result";  
  10. }  
假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.
再来个小小假设,将上面@ModelAttribute("user1")的user1改为user,其它不变.虽然执行了addUser方法,那么执行到save方法内,user对象的字段值还是来源于请求,最后返回到jsp页面,model里也只有一个User类型对象.


4.另类:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @ModelAttribute  
  2. @RequestMapping("/save")  
  3. public String save(@ModelAttribute User user) {  
  4.     user.setUsername("U love me");  
  5.     userService.save(user);  
  6.     return "result";  
  7. }  
此种情况,会添加一个key为"user"的User对象到model,还会添加一个key为"string",value为"result"的对象到model,而视图名称则变为了"save"而不是"result".相信一般开发者都不会这样用.

二.下面再看看结合@SessionAttributes的用法.

1.先看看这段代码

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Controller  
  2. @RequestMapping("user")  
  3. @SessionAttributes("test")  
  4. public class UserController {  
  5.     @RequestMapping(value = "test1")  
  6.     public String test1(Map<String, Object> model, SessionStatus sessionStatus) {  
  7.         model.put("test","something");  
  8.         //sessionStatus.setComplete();  
  9.         return "user/list";  
  10.     }  
  11.   
  12.     @RequestMapping(value = "test2")  
  13.     public String test2(Map<String,?>  model) {  
  14.         Object test = model.get("test");  
  15.         System.out.println(test);  
  16.         return "user/list";  
  17.     }  
  18. }  
在类级别上使用@SessionAttributes("test"),它的作用是在controller共享 model 属性,直到调用org.springframework.web.bind.support.SessionStatus#setComplete会清除此session值.否则长期保留(session过期,这个值也不再保留).因此先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法put进去的值.当移除上面的注解,因为属性为test的session也被清除了,所以test2方法会得到是null.

2.再看结合@ModelAttribute的用法.

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Controller  
  2. @RequestMapping("user")  
  3. @SessionAttributes("test")  
  4. public class UserController {  
  5.     @RequestMapping(value = "test1")  
  6.     public String test1(HttpServletRequest request) {  
  7.         User user = new User("xiejx618");  
  8.         request.getSession().setAttribute("test",user);  
  9.         return "user/list";  
  10.     }  
  11.     @RequestMapping(value = "test2")  
  12.     public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {  
  13.         System.out.println(user.getUsername());  
  14.         sessionStatus.setComplete();  
  15.         return "user/list";  
  16.     }  
  17. }  
一样先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法set进去的值.使用了@SessionAttributes,如果在controller的方法参数上有@ModelAttribute,那么此方法会确保属性test的session会存在,否则会抛org.springframework.web.HttpSessionRequiredException异常,即上面代码先不调/user/test1,直接调/user/test2就会抛此异常

SpringMVC @ModelAttribute 的使用

在 SpringMVC 的 Controller 中使用 @ModelAttribute 时,应用位置包括下面几种:1、应用在方法上。 2、应用在方法的参数上。 3、应用在方法上,并且方法也使用了...
  • catoop
  • catoop
  • 2016年04月16日 23:41
  • 8972

Spring Boot Controller

接上篇文章,HelloWorld程序中我们已经创建了一个HellController,里面包含了响应JSON的方法,本文针对Controller再做一下讲解。回顾上篇文章,我们在Controller中...
  • catoop
  • catoop
  • 2016年01月12日 09:18
  • 50407

Spring注解@ModelAttribute与@RequestBody的区别

@RequestBody 用于接收json串  如ajax请求的data参数    可在直接接收转换到Pojo @ModelAttribute 用于直接接受url?后面的参数 如url?id...
  • hpym365
  • hpym365
  • 2017年02月23日 16:07
  • 3059

SpringMVC学习之@ModelAttribute运用详解

@ModelAttribute使用详解 1.@ModelAttribute注释方法     例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此contro...
  • Baple
  • Baple
  • 2015年01月21日 09:51
  • 10184

Spring MVC中常用注解之@SessionAttributes @ModelAttribute详解

绑定模型对象中某个属性 Spring 2.0 定义了一个 org.springframework.ui.ModelMap 类,它作为通用的模型数据承载对象,传递数据供视图所用。我们可以在请求处理方法中...
  • linzhiqiang0316
  • linzhiqiang0316
  • 2016年08月25日 22:21
  • 5199

Spring-Boot+thymeleaf3

spring-Boot-thymeleaf3
  • qq_17616169
  • qq_17616169
  • 2016年12月24日 20:10
  • 3672

Spring Boot实践应用开发(11)

百度云盘 http://pan.baidu.com/s/1o6spOJS spring boot快速开发WEB系统,使用spring boot 1.2.3,spring framework4.1.6...
  • engchina
  • engchina
  • 2015年10月11日 09:34
  • 1705

java规范(二)------方法调用---springMVC中调用controller的方法

我们有一个路由StudentController,里面有一个方法count()。如果要在另外一个GradeController中调用count()方法有2种方式:因为StudentController...
  • q383965374
  • q383965374
  • 2016年09月09日 10:40
  • 8840

自定义注解以及反射得到当前的调用方法

自定义注解以及反射得到当前的调用方法
  • paincupid
  • paincupid
  • 2016年01月11日 01:21
  • 1745

springMVC中controller之前执行的方法

@ModelAttribute()        public void getSessionUser() throws IOException, ServletException {      ...
  • u014426603
  • u014426603
  • 2016年07月14日 16:32
  • 2981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:springmvc的ModelAttribute注解,在controller每个方法执行前被执行
举报原因:
原因补充:

(最多只允许输入30个字)