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错误) ...
随机推荐
- JAVA WEB项目中使用并改造editor.md实现Markdown编辑器
Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可以用Markdown,设计一篇精彩绝伦的文档而 ...
- HDU 4324 (拓扑排序) Triangle LOVE
因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <c ...
- HDU 1907 (博弈) John
参见上一篇博客,里面有分析和结论. #include <cstdio> int main() { int T; scanf("%d", &T); while(T ...
- 未能加载文件或程序集“XXXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
在本机WIN7机器上的WebService部署到Win2008R2上发现错误 “/”应用程序中的服务器错误. 未能加载文件或程序集“XXXXXX”或它的某一个依赖项.试图加载格式不正确的程序. 说明: ...
- HDU 1058 Humble Numbers【DP】
题意:给出丑数的定义,只含有2,3,5,7这四个素数因子的数称为素数.求第n个丑数. 可以先观察几个丑数得出规律 1:dp[1] 2:min(1*2,1*3,1*5,1*7) 3:min(2*2,1* ...
- setTimeOut() 和 setTimeInterval()
setTimeOut()は.指定された時間「待ってから」指定された動作を行う関数です.setTimeOut():等待指定时间,执行指定方法. setTimeInterval()は.指定された時間「間隔 ...
- Dom文档模型
文档对象模型 通过 JavaScript,您可以重构整个 HTML 文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript 就需要获得对 HTML 文档中所 ...
- 【英文】Bingo口语笔记(18) - Cover系列
cover charge 服务费 cover version 翻唱版本 cover the news 头条新闻
- REDHAT YUM使用网易源
刚装好了 RedHat 6 系统,但是使用 yum 的时候总是提示 nothing to do,并且什么都做不了.后来经过一番搜索才知道,红帽的 yum 在线更新是收费的,而且必须注册系统之后才能使用 ...
- 树莓派 安装 php
执行如下命令(注意红色字部分是关键!) sudo apt-get install apache2 php5 libapache2-mod-php5 然后把网页文件复制到 /usr/www 中即可 参考 ...