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. poj 2773(容斥原理)

    容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3 ...

  2. HDU 1072 (不一样的入队条件) Nightmare

    之前的BFS都是需要一个标记数组,但这个题不一样,因为可能一个格子不止走一次. 那么我们就要寻找新的入队条件:left比上次经过的时候大才入队(left表示上次经过该点时剩余的时间). 为什么呢?我们 ...

  3. IE 火狐浏览器对时间格式的兼容性;使用原型对象的方式 prototype关键字;时间格式化

    在ie中 时间格式如果用横杠来显示  "2013-05-10 19:20:59" 是可以正确识别的(如果用斜杠,IE也可以正确识别), 但是如果是火狐,则只能识别斜杠模式 &quo ...

  4. BZOJ 1010 玩具装箱

    斜率优化. 事实上是选一个大于某个数的最小斜率.维护下凸壳. #include<iostream> #include<cstdio> #include<cstring&g ...

  5. BZOJ 1003 物流运输

    最短路+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorith ...

  6. Calculate drive total/free/available space

    using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Consol ...

  7. Android 源代码自动编译packages/apps

    /*************************************************************************** * Android 源代码自动编译packag ...

  8. I.MX6 shutdown by software

    /************************************************************************ * I.MX6 shutdown by softwa ...

  9. AutoGenSystem

    #coding=utf-8 # # AutoGenSystem # 声明: # 该软件主要是为了解决Android系统更新时,由于版本很多,管理起来复杂,容易出错,于是采用软件 # 自动对系统软件进行 ...

  10. matplotlib 中文问题

    matplotlib的缺省配置文件中所使用的字体无法正确显示中文.为了让图表能正确显示中文,主要有三种设置中文的方法: (1)直接读取指定的字体文件.这种方法的依赖性最小,缺点是要指定字体文件的路径. ...