您的位置:首页 > 编程语言 > Java开发

学习SpringMVC(九)之ModelAttribute源码分析

2016-05-18 15:34 483 查看
这里以前一章节的内容对ModelAttribute源码进行分析:

注:大家可以去看下我的前一讲学习SpringMVC(八)之ModelAttribute

1.首先看下第一阶段的断点情况
















还未调用ModelAttribute修饰方法前,map值为{}






调用它之后:map值为从数据库中






并将map键值对放到implicitModel中:






最后目标方法的参数数据如下:






2.如何解析目标方法的参数

<span style="color:#ff0000;">Object[] args = resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);</span>
执行完这一语句,则name值改变,并且密码是从数据库中获取的

因为resolveHandlerArguments方法的代码很多,不好具体找到,所以我在USER类中的setName()上加了一个断点,便于分析






源码分析流程:

1.调用@ModelAttribute修饰的方法,实际上是把map中的键值对放入到implicitModel当中

2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性






2.1 创建WebDataBinder对象时,需要先确定它的两个属性:target,objectName






下图中,name对应objectName,target对应bindObject

2.1.1 确定objectName属性:

若传入的attrName属性值为“ ”,则objectName为类名第一个字母小写,

若有属性值,则objectName为@modelAttribute的value属性值

2.1.2 确定target属性:

在implicitModel中查找attrName的键名,如果有,则取出返回。如果没有,则

验证当前的controller是否用了@sessionAttributes来修饰,若使用了,则尝试从

session中,获取attrName对应的属性值,若有,则取出,若取出为NULL,则抛出异常;若


当前controller没
有用@sessionAttribute修饰,则通过反射机制创建一个,

WebDataBinder对象。

返回WebDataBinder对象binder






在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之前,binder的

target属性为原来数据库的






在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之后,

binder的target属性为修改后的









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: