一、内容协商原理
HttpMessageConverter
定制
HttpMessageConverter
来实现多端内容协商编写
WebMvcConfigurer
提供的configureMessageConverters
底层,修改底层的MessageConverter
@ResponseBody
由HttpMessageConverter
处理标注了
@ResponseBody
的返回值 将会由支持它的HttpMessageConverter
写给浏览器1、如果controller方法的返回值标注了
@ResponseBody
注解🍕、请求进来先来到
DispatcherServlet
的doDispatch()
进行处理🍔、找到一个
HandlerAdapter
适配器。利用适配器执行目标方法🍟、
RequestMappingHandlerAdapter
来执行,调用invokeHandlerMethod()
来执行目标方法。🌭、目标方法执行之前:①、
HandlerMethodArgumentResolver
:参数解析器,确定目标方法每个参数值。②、HandlerMethodReturnValueHandler
:返回值处理器,确定目标方法的返回值改怎么处理。🧂、
RequestMappingHandlerAdapter
里面的invokeAndHandle()
真正执行目标方法。🥓、目标方法执行完成,会返回返回值对象。
🥚、找到一个合适的返回值处理器
HandlerMethodReturnValueHandler
🍳、
最终找到RequestResponseBodyMethodProcessor
能处理 标注了@ResponseBody
注解的方法。🧇、
RequestResponseBodyMethodProcessor
调用writeWithMessageConverters
,利用MessageConverter
把返回值写出去。2、
HttpMessageConverter
会先进行内容协商🥞、遍历所有的
MessageConverter
看谁支持这种内容类型的数据。🧈、默认
MessageConverter
有以下
🥨、最终因为要
json
所以MappingJackson2HttpMessageConverter
支持写出json。🥯、jackson用
ObjectMapper
把对象写出去。
WebMvcAutoConfiguration
提供几种默认HttpMessageConverters
EnableWebMvcConfiguration
通过addDefaultHttpMessageConverters
添加了默认的MessageConverter。
ByteArrayHttpMessageConverter
: 支持字节数据读写
StringHttpMessageConverter
: 支持字符串读写ResourceHttpMessageConverter
:支持资源读写ResourceRegionHttpMessageConverter
: 支持分区资源写出AllEncompassingFormHttpMessageConverter
:支持表单xml/json读写MappingJackson2HttpMessageConverter
: 支持请求响应体Json读写
系统提供默认的MessageConverter 功能有限,仅用于json或者普通返回数据。额外增加新的内容协商功能,必须增加新的
HttpMessageConverter