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
- AbstractHttpMessageConverter
-
- 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