springMVC的参数绑定和返回值类型封装处理原理解析
2017-01-16 15:45
2151 查看
1.进行方法参数值的解析的接口是HandlerMethodArgumentResolver
下面是一些具体的实现类,它们针对不同的注解实现不同的解析绑定功能:
1. RequestParamMethodArgumentResolver
支持带有@RequestParam注解的参数或带有MultipartFile类型的参数
2. RequestParamMapMethodArgumentResolver
支持带有@RequestParam注解的参数 && @RequestParam注解的属性value存在 && 参数类型是实现Map接口的属性
3. PathVariableMethodArgumentResolver
支持带有@PathVariable注解的参数 且如果参数实现了Map接口,@PathVariable注解需带有value属性
4. MatrixVariableMethodArgumentResolver
支持带有@MatrixVariable注解的参数 且如果参数实现了Map接口,@MatrixVariable注解需带有value属性
5. RequestResponseBodyMethodProcessor
解析绑定带有@RequestBody的方法参数和带有@ResponseBody的方法返回值
6. ServletRequestMethodArgumentResolver
参数类型是实现或继承或是WebRequest、ServletRequest、MultipartRequest、HttpSession、Principal、Locale、TimeZone、InputStream、Reader、HttpMethod这些类。
7. ServletResponseMethodArgumentResolver
参数类型是实现或继承或是ServletResponse、OutputStream、Writer这些类
8. RedirectAttributesMethodArgumentResolver
参数是实现了RedirectAttributes接口的类
9. HttpEntityMethodProcessor
参数类型是HttpEntity
从名字我们也看的出来, 以Resolver结尾的是实现了HandlerMethodArgumentResolver接口的类,以Processor结尾的是实现了HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler的类。
注意:[b]如果controller的方法没有任何参数的注解,但有参数对象而且参数对象的类型是简单类型,则会默认调用RequestParamMethodArgumentResolver类进行解析,从httpServletRequest中获取parameter,然后调用参数对象的set方法进行注入。[/b]
这是RequestParamMethodArgumentResolver类所支持的解析类型方法:
[java] view
plain copy
public boolean supportsParameter(MethodParameter parameter) {
Class<?> paramType = parameter.getParameterType();
if (parameter.hasParameterAnnotation(RequestParam.class)) {
if (Map.class.isAssignableFrom(paramType)) {
String paramName = parameter.getParameterAnnotation(RequestParam.class).value();
return StringUtils.hasText(paramName);
}
else {
return true;
}
}
else {
if (parameter.hasParameterAnnotation(RequestPart.class)) {
return false;
}
else if (MultipartFile.class.equals(paramType) || "javax.servlet.http.Part".equals(paramType.getName())) {
return true;
}
else if (this.useDefaultResolution) {
return BeanUtils.isSimpleProperty(paramType);//判断是否是简单类型
}
else {
return false;
}
}
}
判断简单类型的方法:
[java] view
plain copy
public static boolean isSimpleValueType(Class<?> clazz) {
return ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() ||//isPrimitiveOrWrapper方法是判断参数类型是否是基本类或基本类的包装类
CharSequence.class.isAssignableFrom(clazz) ||
Number.class.isAssignableFrom(clazz) ||
Date.class.isAssignableFrom(clazz) ||
clazz.equals(URI.class) || clazz.equals(URL.class) ||
clazz.equals(Locale.class) || clazz.equals(Class.class);
}
如果没有注解的参数的类型不是简单类型而是复合类型,就是用类ModelAttributeMethodProcessor来解析:
[java] view
plain copy
/**
* @return true if the parameter is annotated with {@link ModelAttribute}
* or in default resolution mode also if it is not a simple type.
*/
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(ModelAttribute.class)) {
return true;
}
else if (this.annotationNotRequired) {
return !BeanUtils.isSimpleProperty(parameter.getParameterType());
}
else {
return false;
}
}
2.方法返回值处理接口HandlerMethodReturnValueHandler
下面是一些具体的实现类,它们针对不同的注解或返回值类型实现不同的功能:
1. ModelAndViewMethodReturnValueHandler
返回值类型是ModelAndView或其子类
2. ModelMethodProcessor
返回值类型是Model或其子类
3. ViewMethodReturnValueHandler
返回值类型是View或其子类
4. HttpHeadersReturnValueHandler
返回值类型是HttpHeaders或其子类
5. ModelAttributeMethodProcessor
返回值有@ModelAttribute注解
6. ViewNameMethodReturnValueHandler
返回值是void或String,并且返回值没有注解
7.RequestResponseBodyMethodProcessor
返回值有@ResponseBody注解
下面是一些具体的实现类,它们针对不同的注解实现不同的解析绑定功能:
1. RequestParamMethodArgumentResolver
支持带有@RequestParam注解的参数或带有MultipartFile类型的参数
2. RequestParamMapMethodArgumentResolver
支持带有@RequestParam注解的参数 && @RequestParam注解的属性value存在 && 参数类型是实现Map接口的属性
3. PathVariableMethodArgumentResolver
支持带有@PathVariable注解的参数 且如果参数实现了Map接口,@PathVariable注解需带有value属性
4. MatrixVariableMethodArgumentResolver
支持带有@MatrixVariable注解的参数 且如果参数实现了Map接口,@MatrixVariable注解需带有value属性
5. RequestResponseBodyMethodProcessor
解析绑定带有@RequestBody的方法参数和带有@ResponseBody的方法返回值
6. ServletRequestMethodArgumentResolver
参数类型是实现或继承或是WebRequest、ServletRequest、MultipartRequest、HttpSession、Principal、Locale、TimeZone、InputStream、Reader、HttpMethod这些类。
7. ServletResponseMethodArgumentResolver
参数类型是实现或继承或是ServletResponse、OutputStream、Writer这些类
8. RedirectAttributesMethodArgumentResolver
参数是实现了RedirectAttributes接口的类
9. HttpEntityMethodProcessor
参数类型是HttpEntity
从名字我们也看的出来, 以Resolver结尾的是实现了HandlerMethodArgumentResolver接口的类,以Processor结尾的是实现了HandlerMethodArgumentResolver和HandlerMethodReturnValueHandler的类。
注意:[b]如果controller的方法没有任何参数的注解,但有参数对象而且参数对象的类型是简单类型,则会默认调用RequestParamMethodArgumentResolver类进行解析,从httpServletRequest中获取parameter,然后调用参数对象的set方法进行注入。[/b]
这是RequestParamMethodArgumentResolver类所支持的解析类型方法:
[java] view
plain copy
public boolean supportsParameter(MethodParameter parameter) {
Class<?> paramType = parameter.getParameterType();
if (parameter.hasParameterAnnotation(RequestParam.class)) {
if (Map.class.isAssignableFrom(paramType)) {
String paramName = parameter.getParameterAnnotation(RequestParam.class).value();
return StringUtils.hasText(paramName);
}
else {
return true;
}
}
else {
if (parameter.hasParameterAnnotation(RequestPart.class)) {
return false;
}
else if (MultipartFile.class.equals(paramType) || "javax.servlet.http.Part".equals(paramType.getName())) {
return true;
}
else if (this.useDefaultResolution) {
return BeanUtils.isSimpleProperty(paramType);//判断是否是简单类型
}
else {
return false;
}
}
}
判断简单类型的方法:
[java] view
plain copy
public static boolean isSimpleValueType(Class<?> clazz) {
return ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() ||//isPrimitiveOrWrapper方法是判断参数类型是否是基本类或基本类的包装类
CharSequence.class.isAssignableFrom(clazz) ||
Number.class.isAssignableFrom(clazz) ||
Date.class.isAssignableFrom(clazz) ||
clazz.equals(URI.class) || clazz.equals(URL.class) ||
clazz.equals(Locale.class) || clazz.equals(Class.class);
}
如果没有注解的参数的类型不是简单类型而是复合类型,就是用类ModelAttributeMethodProcessor来解析:
[java] view
plain copy
/**
* @return true if the parameter is annotated with {@link ModelAttribute}
* or in default resolution mode also if it is not a simple type.
*/
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(ModelAttribute.class)) {
return true;
}
else if (this.annotationNotRequired) {
return !BeanUtils.isSimpleProperty(parameter.getParameterType());
}
else {
return false;
}
}
2.方法返回值处理接口HandlerMethodReturnValueHandler
下面是一些具体的实现类,它们针对不同的注解或返回值类型实现不同的功能:
1. ModelAndViewMethodReturnValueHandler
返回值类型是ModelAndView或其子类
2. ModelMethodProcessor
返回值类型是Model或其子类
3. ViewMethodReturnValueHandler
返回值类型是View或其子类
4. HttpHeadersReturnValueHandler
返回值类型是HttpHeaders或其子类
5. ModelAttributeMethodProcessor
返回值有@ModelAttribute注解
6. ViewNameMethodReturnValueHandler
返回值是void或String,并且返回值没有注解
7.RequestResponseBodyMethodProcessor
返回值有@ResponseBody注解
相关文章推荐
- SpringMVC源码之参数解析绑定原理
- springMVC中Controller的返回值处理和参数绑定
- springmvc 处理lsit类型的请求参数映射成实体属性
- 【SpringMVC整合MyBatis】案例驱动-包装类型pojo参数绑定
- SpringMVC之绑定参数的类型转换(Date/Double)
- springMvc接受日期类型参数处理
- springMvc 数据绑定,类型转换,数据校验 解析
- Spring表单参数绑定中对“is”开头的boolean类型字段的的处理
- Springmvc学习笔记(4)之复杂参数类型绑定、校验、数据回显和异常处理
- springmvc注解开发-springmvc参数绑定-包装类型pojo参数绑定
- SpringMVC中,前台jsp封装参数,绑定参数,传递参数到后台controller的过程详解
- springMVc方法参数绑定常见的数据类型
- SpringMVC的java基础类型参数绑定方式
- SpringMVC绑定基本类型参数的问题
- 框架 day68 SpringMVC入门(框架原理,springmvc和mybatis整合,参数绑定)
- springMVC 返回值的几种处理类型
- springMvc 数据绑定,类型转换,数据校验 解析
- SpringMVC中自定义参数解析器及内置类型的绑定
- springmvc中的对象、数组、集合类型的参数绑定
- SpringMVC 参数绑定获取的CST时间(Java.util.Date)类型问题