zoukankan      html  css  js  c++  java
  • SpringMVC的Java API(五)

    1. HttpMessageConverter消息转换器

    (1) HttpMessageConverter接口源码:

    public interface HttpMessageConverter<T> {
        boolean canRead(Class<?> clazz, MediaType mediaType);
        boolean canWrite(Class<?> clazz, MediaType mediaType);
        List<MediaType> getSupportedMediaTypes();
        T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
                throws IOException, HttpMessageNotReadableException;
        void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
                throws IOException, HttpMessageNotWritableException;
    
    }

    该接口定义了四个方法,分别是读取数据时的 canRead(), read() 和 写入数据时的canWrite(), write()方法。

    (2) 在使用 标签配置时,默认配置了RequestMappingHandlerAdapter(注意是RequestMappingHandlerAdapter不是AnnotationMethodHandlerAdapter),并为他配置了一下默认的HttpMessageConverter:

    • ByteArrayHttpMessageConverter converts byte arrays.
    • StringHttpMessageConverter converts strings.
    • ResourceHttpMessageConverter converts to/from org.springframework.core.io.Resource for all media types.
    • SourceHttpMessageConverter converts to/from a javax.xml.transform.Source.
    • FormHttpMessageConverter converts form data to/from a MultiValueMap<String, String>.
    • Jaxb2RootElementHttpMessageConverter converts Java objects to/from XML — added if JAXB2 is present on the classpath.
    • MappingJacksonHttpMessageConverter converts to/from JSON — added if Jackson is present on the classpath.
    • AtomFeedHttpMessageConverter converts Atom feeds — added if Rome is present on the classpath.
    • RssChannelHttpMessageConverter converts RSS feeds — added if Rome is present on the classpath.
    • ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
    • StringHttpMessageConverter:负责读取字符串格式的数据和写出二进制格式的数据;
    • ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
    • FormHttpMessageConverter:负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
    • MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;
    • SouceHttpMessageConverter:负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
    • Jaxb2RootElementHttpMessageConverter:负责读取和写入xml 标签格式的数据;
    • AtomFeedHttpMessageConverter:负责读取和写入Atom格式的数据;
    • RssChannelHttpMessageConverter:负责读取和写入RSS格式的数据;

    使用 @RequestBody和 @ResponseBody注解时,RequestMappingHandlerAdapter就使用它们来进行读取或者写入相应格式的数据。

    @RequestBody注解时: 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据。
    @ResponseBody注解时:根据Request对象header部分的Accept属性(逗号分隔),逐一按accept中的类型,去遍历找到能处理的HttpMessageConverter。

    (3) HttpMessageConverter的类图

    • HttpMessageConverter
      • AbstractHttpMessageConverter
        • AbstractJackson2HttpMessageConverter
        • AbstractWireFeedHttpMessageConverter
        • AbstractXmlHttpMessageConverter
        • ByteArrayHttpMessageConverter
        • GsonHttpMessageConverter
        • ObjectToStringHttpMessageConverter
        • ProtobufHttpMessageConverter
        • ResourceHttpMessageConverter
        • StringHttpMessageConverter
        • SourceHttpMessageConverter
      • BufferedImageHttpMessageConverter
      • FormHttpMessageConverter
        • AllEncompassingFormHttpMessageConverter
      • GenericHttpMessageConverter
        • AbstractJackson2HttpMessageConverter
        • GsonHttpMessageConverter
        • Jaxb2CollectionHttpMessageConverter

    2. HandlerMethodArgumentResolver 参数解析器

    在初学springmvc框架时,我就一直有一个疑问,为什么controller方法上竟然可以放这么多的参数,而且都能得到想要的对象,比如HttpServletRequest或HttpServletResponse,各种注解@RequestParam、@RequestHeader、@RequestBody、@PathVariable、@ModelAttribute等。

    主角当然是:org.springframework.web.method.support.HandlerMethodArgumentResolver接口。

    //接口定义
    public interface HandlerMethodArgumentResolver {
        //用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument。
        boolean supportsParameter(MethodParameter parameter);
        //真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象。
        Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
    
    }

    springmvc自带的一些实现:

    • ServletRequestMethodArgumentResolver和ServletResponseMethodArgumentResolver处理了自动绑定HttpServletRequest和HttpServletResponse
    • RequestParamMapMethodArgumentResolver处理了@RequestParam
    • RequestHeaderMapMethodArgumentResolver处理了@RequestHeader
    • PathVariableMapMethodArgumentResolver处理了@PathVariable
    • ModelAttributeMethodProcessor处理了@ModelAttribute
    • RequestResponseBodyMethodProcessor处理了@RequestBody

    3. HandlerMethodReturnValueHandler 返回值解析器

    HandlerMethodReturnValueHandler是用于对Controller中函数执行的返回值进行处理操作的,springMVC提供了多个HandlerMethodReturnValueHandler的实现类。

    (1) HandlerMethodReturnValueHandler的接口定义:

    • supportsReturnType用于判断是否支持对返回值的处理。
    • handleReturnValue实现对返回值的处理操作。

    springMVC中对返回值的操作流程:执行过程是在ServletInvocableHandlerMethod的invokeAndHandle中,具体实现是在HandlerMethodReturnValueHandlerComposite中,HandlerMethodReturnValueHandlerComposite中包含了所有springMVC提供的返回值处理器。

    (2) HandlerMethodReturnValueHandler的类图

    •  AbstractMessageConverterMethodProcessor
    • AsyncTaskMethodReturnValueHandler
    • CallableMethodReturnValueHandler
    • DeferredResultMethodReturnValueHandler
    • HandlerMethodReturnValueHandlerComposite
    • HttpHeadersReturnValueHandler
    • ListenableFutureReturnValueHandler
    • MapMethodProcessor
    • ModelAndViewMethodReturnValueHandler
    • ModelAndViewResolverMethodReturnValueHandler
    时刻与技术进步,每天一点滴,日久一大步!!! 本博客只为记录,用于学习,如有冒犯,请私信于我。
  • 相关阅读:
    python中如何将两个list合并成一个list,不用for语句
    python print的用法
    Pandas Timestamp 和 python 中 datetime 的互相转换
    python eval, exec. compile
    python 用 __all__ 暴露接口
    python functiontools 模块
    Python 修饰符, 装饰符
    Python 字典(Dictionary) update()方法
    Python :random 随机数生成
    Pandas dataframe 标记删除重复记录
  • 原文地址:https://www.cnblogs.com/myitnews/p/11568863.html
Copyright © 2011-2022 走看看