您的位置:首页 > 编程语言 > Java开发

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注解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: