应用场景
运行流程:
* 1.执行@ModelAttribute 注解修饰的方法:从数据库取出对象,把对象放入到了Map 中。键为:userinfo
* 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 中不存在 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作为参数传递给目标方法的入参。