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

最新文章

  1. 详解javascript的类
  2. ggplot2包的说明文档[分享]
  3. iOS 为iPhone和iPad创建不同的storyboard
  4. ajax json 动态传值
  5. Firefox SVG getBBox方法返回&#39;NS_ERROR_FAILURE&#39;错误分析
  6. keep alive的相关介绍
  7. SQL获取前一天0:00:00至23:59:59数据
  8. spring+struts2+ibatis 框架整合以及解析
  9. 使用JDT.AST解析java源码
  10. linux下vsftpd的安装及配置使用详细步骤
  11. webuploader 上传文件 生成链接下载文件
  12. JSONObject转换分析
  13. PHP与XML技术
  14. 在MSYS2环境下 用msvc 编译 zlib
  15. BZOJ4671 异或图(容斥+线性基)
  16. Redis学习-sorted set数据类型
  17. 关于vue里页面的缓存
  18. CSU 1862 The Same Game(模拟)
  19. redis实现对账(集合比较)功能
  20. 参数innodb_force_recovery影响了整个InnoDB存储引擎的恢复状况

热门文章

  1. UVa 575 Skew Binary 歪斜二进制
  2. 51nod1125 交换机器的最小代价
  3. 【英语】Bingo口语笔记(48) - 关于春节的表达
  4. 【自动化测试】Selenium的智能等待
  5. [转载] FFmpeg API 变更记录
  6. 【转】XCode环境变量及路径设置 -- 待学习
  7. android4.0以上部分手机绘图时会出现重影
  8. 嵌入式 H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
  9. pdf Factory的设置
  10. PyPI镜像网站