springMVC中 request请求数据绑定到Controller入参 过程剖析
前言:
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
2、获取Controller入参对象数组 InvocableHandlerMethod.getMethodArgumentValues
①获取Controller入参参数信息 ②遍历创建入参对象
3、创建入参对象 HandlerMethodArgumentResolverComposite.resolveArgument
①创建入参数据绑定处理类(如果Controller中存在@InitBinder注解的方法,会被执行) ②创建入参对象、将request请求参数信息绑定到入参对象

4、将request请求参数信息绑定到入参对象 ServletRequestDataBinder.bind
①将request中的参数取出并封装 ②处理媒体文件上传数据封装
5、初始化入参对象具体的属性值 AbstractNestablePropertyAccessor.setPropertyValue
注:spring对Array、List、Map类型的属性做了处理,如Date日期类型就得自己添加编辑转换器,在Controller中用@InitBinder注解Method方式添加
6、@InitBinder 自定义入参对象属性值的编辑转换器
注:request中Parameter的值都是字符串,所以需要转换器处理(将字符串转换为所需的对象)
参考文献:
http://blog.csdn.net/axin66ok/article/details/17938095
http://www.cnblogs.com/AloneSword/p/3998943.html
springMVC中 request请求数据绑定到Controller入参 过程剖析的更多相关文章
- @ModelAttribute 注解及 POJO入参过程
一.modelattribute注解 @ModelAttribute注解的方法有两种,一种无返回值,一种有返回值,方法的可以用@RequestParam注解来获取请求的参数,如果不获取参数,可以不用此 ...
- springmvc中request的线程安全问题
SpringMvc学习心得(四)springmvc中request的线程安全问题 标签: springspring mvc框架线程安全 2016-03-19 11:25 611人阅读 评论(1) 收藏 ...
- SpringMVC中post请求参数注解@requestBody使用问题
一.httpClient发送Post 原文https://www.cnblogs.com/Vdiao/p/5339487.html public static String httpPostWithJ ...
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
- Java中request请求之 - 带文件上传的form表单
常用系统开发中总免不了显示图片,保存一些文件资料等操作. 这些操作的背后,就是程序员最熟悉的 enctype="multipart/form-data"类型的表单. 说起file类 ...
- 详解SpringMVC中GET请求
GET请求概述 GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接.URL的编码格式采用的是ASCII编码,而不是uniclde,所有的非ASCII字符都要编 ...
- javaWeb中request请求转发和response重定向
1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的&q ...
- (一)将mockjs集成到VUE中后,怎样根据接口入参返回mock结果
1)安装mockjs,这一步跳过 2)在项目中建立mock模块,笔者的目录结构如下 mock模块与接口模块一一对应,有一个接口,就有一个mock 3)编写登陆模块mock接口,代码如下: import ...
- 【SpringMVC】SpringMVC系列8之Servlet API 作为入参
8.Servlet API 作为入参 8.1.概述 MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数: HttpServletRequest HttpServletRes ...
随机推荐
- Linux磁盘分区及配额
在现有磁盘的基础上进行分区格式化并为特定用户实施磁盘配额,使其对磁盘这一分区的写入有一定的限制 前期准备: 在我的虚拟机rhel7上有/dev/sda这一分区和fsy这一用户,我将对/dev/sda进 ...
- bootstrap在jsp中的应用
http://www.bootcss.com/ 下载bootstrap的js,css文件: 在jsp中的应用: 第一步: 新建一个web项目 将bootstrap下载下来的文件放入WEB-INF下面的 ...
- 三、基于hadoop的nginx访问日志分析--计算时刻pv
代码: # cat pv_hour.py #!/usr/bin/env python # coding=utf-8 from mrjob.job import MRJob from nginx_acc ...
- zabbix安装
在服务器10.128.17.136上安装 1.安装mysql \# yum -y install mysql mysql-server mysql-devel MySQL 配置文件/etc/my.cn ...
- Java Annotation概述
@(Java)[Annotation|Java] Java Annotation概述 用途 编译器的相关信息,如用于检测错误和一些警告 编译时和部署时的处理,如一些软件用于自动生成代码之类的 运行时处 ...
- Apache Shiro 学习记录2
写完上篇随笔以后(链接).....我也想自己尝试一下写一个Strategy.....Shiro自带了3个Strategy,教程(链接)里作者也给了2个.....我想写个都不一样的策略.....看来看去 ...
- 在本地调试移动设备上的页面——神器weinre介绍
平时写代码,最喜欢用chrome的developer Tool调试页面了,基本是离不了的工具.但是当页面需要在移动设备上使用,尤其是被嵌入到Hybird APP中时,由于移动版的chrome没有dev ...
- Apache Torque的使用
这篇文章学习如何使用Torque,作为一个ORM(a tool that maps relational databases to java classes) 用Torque访问数据库,需要如下步骤 ...
- 虚函数的使用 以及虚函数与重载的关系, 空虚函数的作用,纯虚函数->抽象类,基类虚析构函数使释放对象更彻底
为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> usi ...
- IE的F12开发人员工具不显示
IE的F12开发人员工具不显示问题: 按下F12之后,开发人员工具在桌面上看不到,但是任务栏里有显示.将鼠标放在任务栏的开发人员工具上,出现一片透明的区域,选中之后却出不来.将鼠标移动到开发人员工具的 ...