学习SpringMVC(九)之ModelAttribute源码分析
2016-05-18 15:34
483 查看
这里以前一章节的内容对ModelAttribute源码进行分析:
注:大家可以去看下我的前一讲学习SpringMVC(八)之ModelAttribute
1.首先看下第一阶段的断点情况
还未调用ModelAttribute修饰方法前,map值为{}
调用它之后:map值为从数据库中
并将map键值对放到implicitModel中:
最后目标方法的参数数据如下:
2.如何解析目标方法的参数
因为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属性为修改后的
注:大家可以去看下我的前一讲学习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属性为修改后的
相关文章推荐
- Java异常简介
- 【Java】学习笔记一
- Java 多线程CountDownLatch、CyclicBarrier、Thread.join方法基本用法
- Java中Arrays.asList的使用
- java设计模式分类
- Java编程思想第四版第七章学习(1)——基类初始化
- 重读java编程思想之复用类之final
- Java CopyOnWriteArrayList工作原理及实现(一)
- windows中java读目录空格变成%20 处理方法
- springmvc封装date类型
- java运行原理
- JAVA设计模式之单例模式
- Java进阶学习第十九天——dbutils与案例
- Java设计模式——策略模式
- java获取当前类的绝对路径
- java简单工厂设计模式
- Spring中对properties属性文件加密及其解密
- java Base64加密解密
- Java 特殊性领会
- 一道简单的算法题:输入日期(JAVA)