spring注解开发之@modelAttribute
2017-07-02 16:33
363 查看
1..在我们开发时常常会遇到这样的场景,就是数据库里存在一条数据,但是我在页面form表单中修改其属性值,我未修改的属性在数据库中怎样让其不变呢?此时我们的处理思路一般是这样,就是我在请求目标方法之前将我们查询数据库获取到数据并赋值给实体类,然后传入我们的目标方法中,进而进行业务操作。具体场景如下图:
运行流程:比如我们以USER为例
1.
执行@ModelAttribute
注解修饰的方法:
从数据库中取出对象,
把对象放入到了 Map
中.
键为: user
2.SpringMVC
从 Map
中取出 User
对象,
并把表单的请求参数赋给该 User
对象的对应属性.
3.SpringMVC
把上述对象传入目标方法的参数.
注意:在
@ModelAttribute 修饰的方法中,
放入到Map
时的键需要和目标方法入参类型的第一个字母小写的字符串一致!
SpringMVC
确定目标方法 POJO
类型入参的过程
1.
确定一个key:
1).
若目标方法的 POJO
类型的参数木有使用 @ModelAttribute
作为修饰,
则key
为 POJO
类名第一个字母的小写
2).
若使用了 @ModelAttribute
来修饰,则 key
为 @ModelAttribute
注解的 value
属性值.
2.
在implicitModel
中查找 key
对应的对象,
若存在,
则作为入参传入
1).
若在@ModelAttribute
标记的方法中在 Map
中保存过,
且 key
和 1
确定的 key
一致,
则会获取到.
3.
若implicitModel
中不存在 key
对应的对象,
则检查当前的 Handler
是否使用 @SessionAttributes
注解修饰,
若使用了该注解,
且 @SessionAttributes
注解的 value
属性值中包含了 key,
则会从 HttpSession
中来获取 key
所
对应的value
值,
若存在则直接传入到目标方法的入参中.
若不存在则将抛出异常.
4.
若Handler
没有标识 @SessionAttributes
注解或@SessionAttributes
注解的 value
值中不包含 key,
则
会通过反射来创建 POJO
类型的参数,
传入为目标方法的参数
5.SpringMVC
会把 key
和 POJO
类型的对象保存到 implicitModel
中,
进而会保存到 request
中
源代码分析的流程
1.
调用@ModelAttribute
注解修饰的方法.
实际上把 @ModelAttribute
方法中 Map
中的数据放在了 implicitModel
中.
2.
解析请求处理器的目标参数,
实际上该目标参数来自于 WebDataBinder
对象的 target
属性
1).
创建WebDataBinder
对象:
①.
确定objectName
属性:
若传入的 attrName
属性值为 "",
则 objectName
为类名第一个字母小写.
注意:attrName.
若目标方法的 POJO
属性使用了 @ModelAttribute
来修饰,
则attrName
值即为 @ModelAttribute
的value
属性值
②.
确定 target
属性:
在implicitModel
中查找 attrName
对应的属性值.
若存在, ok
若不存在:则验证当前
Handler 是否使用了 @SessionAttributes
进行修饰,
若使用了,则尝试从 Session
中
获取attrName
所对应的属性值.
若 session
中没有对应的属性值,
则抛出了异常.
若Handler
没有使用 @SessionAttributes
进行修饰,
或@SessionAttributes
中没有使用 value
值指定的 key
和attrName
相匹配,
则通过反射创建了 POJO
对象
2).SpringMVC
把表单的请求参数赋给了 WebDataBinder
的 target
对应的属性.
3).*SpringMVC
会把 WebDataBinder
的 attrName
和target
给到 implicitModel.
近而传到request
域对象中.
4).
把WebDataBinder
的 target
作为参数传递给目标方法的入参.
运行流程:比如我们以USER为例
1.
执行@ModelAttribute
注解修饰的方法:
从数据库中取出对象,
把对象放入到了 Map
中.
键为: user
2.SpringMVC
从 Map
中取出 User
对象,
并把表单的请求参数赋给该 User
对象的对应属性.
3.SpringMVC
把上述对象传入目标方法的参数.
注意:在
@ModelAttribute 修饰的方法中,
放入到Map
时的键需要和目标方法入参类型的第一个字母小写的字符串一致!
SpringMVC
确定目标方法 POJO
类型入参的过程
1.
确定一个key:
1).
若目标方法的 POJO
类型的参数木有使用 @ModelAttribute
作为修饰,
则key
为 POJO
类名第一个字母的小写
2).
若使用了 @ModelAttribute
来修饰,则 key
为 @ModelAttribute
注解的 value
属性值.
2.
在implicitModel
中查找 key
对应的对象,
若存在,
则作为入参传入
1).
若在@ModelAttribute
标记的方法中在 Map
中保存过,
且 key
和 1
确定的 key
一致,
则会获取到.
3.
若implicitModel
中不存在 key
对应的对象,
则检查当前的 Handler
是否使用 @SessionAttributes
注解修饰,
若使用了该注解,
且 @SessionAttributes
注解的 value
属性值中包含了 key,
则会从 HttpSession
中来获取 key
所
对应的value
值,
若存在则直接传入到目标方法的入参中.
若不存在则将抛出异常.
4.
若Handler
没有标识 @SessionAttributes
注解或@SessionAttributes
注解的 value
值中不包含 key,
则
会通过反射来创建 POJO
类型的参数,
传入为目标方法的参数
5.SpringMVC
会把 key
和 POJO
类型的对象保存到 implicitModel
中,
进而会保存到 request
中
源代码分析的流程
1.
调用@ModelAttribute
注解修饰的方法.
实际上把 @ModelAttribute
方法中 Map
中的数据放在了 implicitModel
中.
2.
解析请求处理器的目标参数,
实际上该目标参数来自于 WebDataBinder
对象的 target
属性
1).
创建WebDataBinder
对象:
①.
确定objectName
属性:
若传入的 attrName
属性值为 "",
则 objectName
为类名第一个字母小写.
注意:attrName.
若目标方法的 POJO
属性使用了 @ModelAttribute
来修饰,
则attrName
值即为 @ModelAttribute
的value
属性值
②.
确定 target
属性:
在implicitModel
中查找 attrName
对应的属性值.
若存在, ok
若不存在:则验证当前
Handler 是否使用了 @SessionAttributes
进行修饰,
若使用了,则尝试从 Session
中
获取attrName
所对应的属性值.
若 session
中没有对应的属性值,
则抛出了异常.
若Handler
没有使用 @SessionAttributes
进行修饰,
或@SessionAttributes
中没有使用 value
值指定的 key
和attrName
相匹配,
则通过反射创建了 POJO
对象
2).SpringMVC
把表单的请求参数赋给了 WebDataBinder
的 target
对应的属性.
3).*SpringMVC
会把 WebDataBinder
的 attrName
和target
给到 implicitModel.
近而传到request
域对象中.
4).
把WebDataBinder
的 target
作为参数传递给目标方法的入参.
相关文章推荐
- Spring @ModelAttribute注解用法
- springmvc @ModelAttribute的注解参数用法
- Spring注解@ModelAttribute
- spring @ModelAttribute 注解
- springmvc@ModelAttribute注解
- Spring注解-@ModelAttribute
- spring mvc @ModelAttribute注解使用
- 28、(知识篇)SpringMVC05 Spring 注解@ModelAttribute
- spring学习教程之@ModelAttribute注解运用详解
- Spring的@ModelAttribute注解
- Spring @ModelAttribute注解用法
- Spring MVC @ModelAttribute注解总结
- Spring @ModelAttribute注解用法
- Spring @ModelAttribute注解用法
- spring mvc @ModelAttribute注解应用分析
- spring+hibernate开发中关于项目中@Entity注解报错
- spring注解开发AnnotationConfigApplicationContext的使用
- Spring Aop开发基于AspectJ注解方式的案例
- Spring MVC之注解Annonatoin之@SessionAttributes和@ModelAttribute
- Spring学习笔记四(AOP中的通知参数和注解开发)