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. R语言实战读书笔记(五)高级数据管理

    5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 sig ...

  2. HDU 1158 Employment Planning

    又一次看题解. 万事开头难,我想DP也是这样的. 呵呵,不过还是有进步的. 比如说我一开始也是打算用dp[i][j]表示第i个月份雇j个员工的最低花费,不过后面的思路就完全错了.. 不过这里还有个问题 ...

  3. 使用MFC中的AfxBeginThread创建多线程

    创建一个基于对话框的工程,工程名为CreateThreadRect   在CreateThreadRect.cpp中增加一个ThreadProc函数,代码如下   工作者线程的函数必须是全局函数或静态 ...

  4. spring事务传播属性与隔离级别

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为. 有以下选项可供使用: PROPAGATIO ...

  5. IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态

    一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...

  6. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...

  7. HDU Sky数 2097

    解题思路:类比求出10进制数各个位上的数字之和,求出12进制和16进制上的数. #include<cstdio> #include<cstring> #include<a ...

  8. 【英语】Bingo口语笔记(80) - 记忆、忘记的表达

  9. Search in Rotated Sorted Array II

    Question: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? W ...

  10. xxx

       <div style="position:absolute;left:0px;top:50px;width:1300px;height:550px;"><d ...