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 数据绑定的更多相关文章

  1. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  2. Spring MVC 数据绑定流程分析

    1.    数据绑定流程原理★ ①   Spring MVC 主框架将 ServletRequest  对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 Data ...

  3. Spring MVC数据绑定(一)

    1.数据绑定介绍 在执行程序时,Spring MVC会根据客户端请求参数的不同,将请求消息中的信息以一定的方式转换并绑定到控制器类的方法参数中.这种将请求消息数据与后台方法参数建立连接的过程就是Spr ...

  4. spring mvc 数据绑定总结

    spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时间的应用 ...

  5. Spring MVC数据绑定大全 .

    刚开始用spring mvc 做web开发时,经常会不知道如何合适绑定页面数据.用惯struts2的朋友更认为spring mvc 绑定数据不如struts2方便(本人最开始也是这么认为),经过一段时 ...

  6. Spring MVC 数据绑定 (四)

    完整的项目案例: springmvc.zip 目录 实例 项目结构路径: 一.配置web.xml <?xml version="1.0" encoding="UTF ...

  7. Spring MVC数据绑定(二)

    之前学习了SpringMVC数据绑定的基本知识和简单数据绑定以及POJO类型数据的绑定.接下来总结剩下的一些数据类型的绑定 1. 绑定包装POJO 所谓的包装POJO,就是在一个POJO中包含另一个简 ...

  8. Spring MVC 数据绑定(四)

        Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型     接下 ...

  9. Spring MVC数据绑定入门总结

    1.基本类型 基本类型参数不可为空 正例:http://localhost:8080/demo/he?id=2 反例:http://localhost:8080/demo/he?id=(报400错误) ...

随机推荐

  1. 转:Entity Framework对NULL值的处理

    今天拿Entity Framework改写早期的一个项目,涉及到对NULL值处理的时候,遇到了点问题,就是如何查询数据库中某字段为NULL的记录,写了几个测试用的例子,然后用SQL Server Pr ...

  2. mysql免安装版安装

    MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe,面对一堆文件一头雾 ...

  3. BZOJ 1176 MOKIA

    cdq分治. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...

  4. python练习程序(c100经典例11)

    题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? a=1;b=1 print a,b, for i ...

  5. SQL Server 2008 序列号

    SQL Server 2008 序列号:Developer: PTTFM-X467G-P7RH2-3Q6CG-4DMYBEnterprise:   JD8Y6-HQG69-P9H84-XDTPG-34 ...

  6. ORACLE执行计划 explain说明

    ORACLE SQL优化工具系列之--EXPLAIN PLAN 对于oracle数据库来说,sql语句的优化可能是对性能提升最为明显的,当然对于DBA来说,也是挑战性比较大的.为了优化一个复杂的SQL ...

  7. Java Observable 模式

    一.Observer模式的意图: 在对象的内部状态发生变化时,自动通知外部对象进行响应. 二.Observer模式的构成: ·被观察者:内部状态有可能被改变,而且又需要通知外部的对象 ·观察者:需要对 ...

  8. html:唤起手机qq开始对话 & 自动拨号

    <a href="mqqwpa://im/chat?chat_type=wpa&uin=[qq号]&version=1">XXX</a> 另 ...

  9. 虚拟机VMware tools作用以及其安装

    虚拟机VMware tools的作用(1). 更新虚拟机中的显卡驱动, 使虚拟机中的XWindows可以运行在SVGA模式下.在客户操作系统中安装Mware Tools非常重要.如果不安装VMware ...

  10. Linux中用stat命令查看文件时3个时间点解析

    有些时候,我们需要在Linux中使用stat命令来查看文件的详细信息.另外联想下,ls -l命令显示的是什么时间,touch命令修改文件的时间戳,修改的又是什么时间?在这里我们一起来试验下. 首先,我 ...