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错误) ...
随机推荐
- git项目实战常用workflow和命令
一个从无到有的项目大体经历-创建项目目录,创建repo,配置过滤集,配置git user,导入已有基础代码入库,将库放到central去,建立分支,修改代码,checkin代码,分支上 测试验证代码, ...
- 【笨嘴拙舌WINDOWS】实践检验之剪切板查看器【Delphi】
该程序能够监视Windows剪切板的内容(文字和图片) 其思路是 先调用SetClipBoardViewer(Self.Handle),让Windows剪切板内容发生改变之后,通知本程序: 然后截获W ...
- UVa 10361 Automatic Poetry
Automatic Poetry Input: standard input Output: standard output Time Limit: 2 seconds Memory Limit: 3 ...
- 转:asmx迷10分钟升级成wcf熟手指南
前言:本文旨在帮助从未接触过wcf(.svc文件)的webservice开发人员,快速将传统的webService/asmx技术迁移到wcf.高手就不用浪费时间往下看了:) 以下所有操作均为vs201 ...
- [反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 自己构建MVC中的M
/** * @ description Model MVC中M 数据模型 * @ Object * @ public * @ create method IE不支持 */ if(typeof Obje ...
- Singleton模式写法
public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...
- 让ecshop编辑器功能更强大
ecshop后台的商品编辑和文章编辑使用的是FCKEDITOR 编辑器, 这个FCKEDITOR的工具条(toolbar)是可以自定义的,ECSHOP默认使用的是 normal ,属于中档功能, 下面 ...
- jsonp调用实例
首先我们来定义接口的规范,就像这样:http://www.mydomain.com/jsonp/ticker?symbol=IBM&callback=showPricesymbol是请求条件, ...
- PHP中cookie与session总结
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置.Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用. 理解:session用于单一用户与服务器的 ...