spring mvc 数据绑定
1、spring mvc 默认提供的数据绑定类
private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
// Annotation-based argument resolution
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
resolvers.add(new RequestParamMapMethodArgumentResolver());
resolvers.add(new PathVariableMethodArgumentResolver());
resolvers.add(new PathVariableMapMethodArgumentResolver());
resolvers.add(new MatrixVariableMethodArgumentResolver());
resolvers.add(new MatrixVariableMapMethodArgumentResolver());
resolvers.add(new ServletModelAttributeMethodProcessor(false));
resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));
resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));
resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
resolvers.add(new RequestHeaderMapMethodArgumentResolver());
resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));
// Type-based argument resolution
resolvers.add(new ServletRequestMethodArgumentResolver());
resolvers.add(new ServletResponseMethodArgumentResolver());
resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));
resolvers.add(new RedirectAttributesMethodArgumentResolver());
resolvers.add(new ModelMethodProcessor());
resolvers.add(new MapMethodProcessor());
resolvers.add(new ErrorsMethodArgumentResolver());
resolvers.add(new SessionStatusMethodArgumentResolver());
resolvers.add(new UriComponentsBuilderMethodArgumentResolver());
// Custom arguments
if (getCustomArgumentResolvers() != null) {
resolvers.addAll(getCustomArgumentResolvers());
}
// Catch-all
resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));
resolvers.add(new ServletModelAttributeMethodProcessor(true));
return resolvers;
}
2、其中解析自定义class的为 ServletModelAttributeMethodProcessor
所有参数对应解析类如下:
RequestParamMethodArgumentResolver
处理类型:
1、包含注解RequestParam,但不处理参数类型为Map,且不包含value值
2、参数类型为MultipartFile,或javax.servlet.http.Part的类型
处理方式:
1、如果参数类型为MultipartFile,返回MultipartFile
2、如果参数类型为List<MultipartFile>,返回List<MultipartFile>
3、如果参数类型为javax.servlet.http.Part,返回Part
4、否则返回request.getParameter("key")
RequestParamMapMethodArgumentResolver
处理类型:
1、参数包含RequestParam注解,且注解的value值为空,且参数类型为Map
处理方式:
1、把parameter以map形式保存,如果value有多个值,只取第一个
PathVariableMethodArgumentResolver
处理类型:
1、包含注解PathVariable,如果参数类型为Map,且PathVariable的value为空不处理
处理方式:
1、根据把RequestMapping的url表达式,找到对应的值
2、把对应的值转换为参数类型对象
3、以View.class.getName() + ".pathVariables" 为key,参数值为value,放入request 的Attribute中
PathVariableMapMethodArgumentResolver
处理类型:
1、包含注解PathVariable,且参数类型为Map,且PathVariable的value为空
处理方式:
1、返回Map形式的对象
MatrixVariableMethodArgumentResolver
处理类型:
1、包含注解MatrixVariable,如果参数类型为Map,且MatrixVariable的value为空不处理
处理方式:
1、把对应的值反射到参数中
例子
// GET /owners/42;q=11/pets/21;q=22
@RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
public void findPet(
@MatrixVariable(value="q", pathVar="ownerId") int q1,
@MatrixVariable(value="q", pathVar="petId") int q2) {
// q1 == 11
// q2 == 22
}
MatrixVariableMapMethodArgumentResolver
处理类型:
1、包含注解MatrixVariable,且参数类型为Map,且MatrixVariable的value为空
处理方式:
2、生产Map
ServletModelAttributeMethodProcessor
处理类型:
1、参数包含注解ModelAttribute
处理方式:
1、获取name,默认为value,如果没有则使用参数名
2、如果model包含了name的对象,这返回,如果没有则创建对象,然后把request.getParameter的值反射到对象中
3、将对象放入model中
RequestResponseBodyMethodProcessor
处理类型:
1、参数包含注解RequestBody
处理方式:
1、将post数据转换成对应的对象
RequestPartMethodArgumentResolver
处理类型:
1、包含注解RequestPart
2、类型为MultipartFile,但是没有注解RequestParam
3、类型为javax.servlet.http.Part
处理方式:
1、返回对象的类型数据
RequestHeaderMethodArgumentResolver
处理类型:
1、包含注解RequestHeader,且类型不是Map
处理方式:
1、返回request.getHeaderValues(name)[0]
RequestHeaderMapMethodArgumentResolver
处理类型:
1、包含注解RequestHeader,且类型是Map
处理方式:
1、把Heander转换成Map
ServletCookieValueMethodArgumentResolver
处理类型:
1、包含注解CookieValue
处理方式:
1、找到对应的cookie,如果参数类型为Cookie则返回cookie,如果是String,返回cookie的值
ExpressionValueMethodArgumentResolver
处理类型:
1、包含注解Value
处理方式:
ServletRequestMethodArgumentResolver
处理类型:
处理方式:
ServletResponseMethodArgumentResolver
处理类型:
1、处理类型为WebRequest.class.isAssignableFrom(paramType) ||
ServletRequest.class.isAssignableFrom(paramType) ||
MultipartRequest.class.isAssignableFrom(paramType) ||
HttpSession.class.isAssignableFrom(paramType) ||
Principal.class.isAssignableFrom(paramType) ||
Locale.class.equals(paramType) ||
InputStream.class.isAssignableFrom(paramType) ||
Reader.class.isAssignableFrom(paramType);
处理方式:
1、返回对应类型
RedirectAttributesMethodArgumentResolver
处理类型:
1、参数类型为RedirectAttributes
处理方式:
ModelMethodProcessor
处理类型:
1、处理类型为Model
处理方式:
1、返回Model
MapMethodProcessor
处理类型:
1、处理类型为Map
处理方式:
1、返回Model
ErrorsMethodArgumentResolver
处理类型:
1、处理类型为Errors
处理方式:
1、如果model没有数据,抛出IllegalStateException异常,否则返回BindingResult
SessionStatusMethodArgumentResolver
处理类型:
1、类型为SessionStatus
处理方式:
1、return mavContainer.getSessionStatus();
UriComponentsBuilderMethodArgumentResolver
处理类型:
1、类型为UriComponentsBuilder
处理方式:
1、返回UriComponentsBuilder
spring mvc 数据绑定的更多相关文章
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...
- Spring MVC 数据绑定流程分析
1. 数据绑定流程原理★ ① Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...
- Spring MVC数据绑定(一)
1.数据绑定介绍 在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中.这种将请求消息数据与后台方法参数建立连接的过程就是Spr ...
- spring mvc 数据绑定总结
spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用 ...
- Spring MVC数据绑定大全 .
刚开始用spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时 ...
- Spring MVC 数据绑定 (四)
完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...
- Spring MVC数据绑定(二)
之前学习了SpringMVC数据绑定的基本知识和简单数据绑定以及POJO类型数据的绑定.接下来总结剩下的一些数据类型的绑定 1. 绑定包装POJO 所谓的包装POJO,就是在一个POJO中包含另一个简 ...
- Spring MVC 数据绑定(四)
Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型 接下 ...
- Spring MVC数据绑定入门总结
1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...
随机推荐
- 【Scala学习笔记】第01弹——Scala安装与配置
安装Scala之前先要安装JDK(1.5以上),最好安装JDK 1.8+,安装好JDK后配置JDK的环境变量. 然后去Scala官网(http://www.scala-lang.org/downloa ...
- laravel中的$request对象构造及请求生命周期
laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...
- 51nod1354 选数字
01背包tle. 解题报告(by System Message) 类似于背包的DP,以乘积为状态.先把等选数字里面不是K约数的去掉.然后找出K的约数,进行离散化.然后dp[i][j]表示前i个数字乘积 ...
- scala学习笔记(3):类
1 类 (1) scala把主构造函数放到类的定义中,让定义字段及相应方法变得简单起来. class People(age: Int, name: String) scala会自动将这个类变成publ ...
- dede 首页调用单页->栏目内容
{dede:sql sql='Select content from dede_arctype where id=47'} [field:content/] {/dede:sql}
- SOAP+WSDL
一 SOAPSOAP最开始是用作RPC机制的,后来XML的出现使其应用非常广泛.它与HTTP一样是一种应用级协议,使用他可以在不同的应用程序之间进行数据交换.SOAP可以基于HTTP,也可以基于HTT ...
- 关于微信扫描二维码下载apk文件的细节设计
微信使用的人数越来越多,渐渐的用户形成了一种习惯,扫描二维码的时候,也会打开微信去扫描,但是微信不支持第三方的链接下载,有些厂商已经发现了这一特点,所以在使用二维码下载自家的app时,会做一个提示,引 ...
- 树莓派 安装 php
执行如下命令(注意红色字部分是关键!) sudo apt-get install apache2 php5 libapache2-mod-php5 然后把网页文件复制到 /usr/www 中即可 参考 ...
- YII 配置文件
用YIIFramework的库开发 .... Yii::createWebApplication($config); //没有run Yii::import(class1,true),在将class1 ...
- Effective c++ 小结
来源:http://www.cnblogs.com/feisky/archive/2009/11/04/1595990.html 最近又重新看了Effective C+,不过到现在还是有好多地方不懂的 ...