springMVC中 request请求数据绑定到Controller入参 过程剖析

时间:2022-07-09 00:06:44

前言:
Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数。众所周知,无论客户端传入的是什么类型的请求参数,最终都要以字节的形式传给服务端。而服务端通过Request的getParameter方法取到的参数也都是字符串形式的结果。所以,需要有一个把字符串形式的参数转换成服务端真正需要的类型的转换工具(基类:PropertyEditorSupport)

注:只有在请求头Content-Type为x-www-form-urlencoded类型时spring才能正常获取值,具体原因调试spring-web中WebUtils.getParametersStartingWith
请求头Content-Type类型参考文献:http://www.cnblogs.com/rgky/p/6081232.html 
1、request请求Controller的调用入口 InvocableHandlerMethod.invokeForRequest

①获取调用Controller所需的入参对象  ②调用Controller
springMVC中 request请求数据绑定到Controller入参 过程剖析

2、获取Controller入参对象数组 InvocableHandlerMethod.getMethodArgumentValues
①获取Controller入参参数信息  ②遍历创建入参对象
springMVC中 request请求数据绑定到Controller入参 过程剖析

3、创建入参对象 HandlerMethodArgumentResolverComposite.resolveArgument
①创建入参数据绑定处理类(如果Controller中存在@InitBinder注解的方法,会被执行)  ②创建入参对象、将request请求参数信息绑定到入参对象
 springMVC中 request请求数据绑定到Controller入参 过程剖析

4、将request请求参数信息绑定到入参对象 ServletRequestDataBinder.bind
①将request中的参数取出并封装  ②处理媒体文件上传数据封装
springMVC中 request请求数据绑定到Controller入参 过程剖析

5、初始化入参对象具体的属性值  AbstractNestablePropertyAccessor.setPropertyValue
注:spring对Array、List、Map类型的属性做了处理,如Date日期类型就得自己添加编辑转换器,在Controller中用@InitBinder注解Method方式添加
springMVC中 request请求数据绑定到Controller入参 过程剖析

6、@InitBinder 自定义入参对象属性值的编辑转换器
注:request中Parameter的值都是字符串,所以需要转换器处理(将字符串转换为所需的对象)
参考文献:
http://blog.csdn.net/axin66ok/article/details/17938095 
http://www.cnblogs.com/AloneSword/p/3998943.html