@ModelAttribute注解

应用场景


@ModelAttribute注解_第1张图片

运行流程:

* 1.执行@ModelAttribute  注解修饰的方法:从数据库取出对象,把对象放入到了Map 中。键为:userinfo

* 2.SpringMVC 从Map 中取出User对象,并把表单的请求参数赋值给该User对应属性。

* 3.SpringMVC 把上述对象传入目标方法的参数

* 注意:在@ModelAttribute 修饰的方法中,放入到Map 时的键需要和目标方法入参类型的第一个字母小写的字符串一致!


@ModelAttribute注解_第2张图片
先执行
@ModelAttribute注解_第3张图片
后执行


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 中不存在 ley 对应的对象,则检查当前的Handler 是否使用@SessionAttributes 注解修饰

*  若使用了该注解,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,

*  若存在则直接传入到目标方法的参数中,若不存在则将抛出异常。

* 4.若Handler 没有标识@SessionAtributes 注解或SessionAttributes 注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标

* 方法的参数

* 5.springMVC 会把 key和value 保存到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作为参数传递给目标方法的入参。

你可能感兴趣的:(@ModelAttribute注解)