SpringMVC的HttpMessageConverter

前提:

从浏览器向服务器发送请求时,发送的数据都是字符串;

浏览器接收到服务器的响应时,接收的数据也是字符串;

也就是说:Http请求报文和响应报文其实都是字符串,意味着浏览器和服务器是通过交换原始文本进行通信的。

现象:

请求报文到达SpringMVC后 ,转换成了java对象;

响应在从SpringMVC 出去前也是java对象;

这就说明:存在一个字符串到java对象的转化问题。

过程:

@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。 

在SpringMVC / SpringBoot中,上面描述的转换过程使用的转换器就是HttpMessageConverter;

还可以通过设置HttpMessageConverter的属性来改变转换过程中的行为;例如:设置编码,设置日期转换格式等;

转换过程如下图:

工具:

常用的HttpMessageConverter的子类如下:

StringHttpMessageConverter:负责java对象和字符串类型报文之间的转换,可设置编码;

MappingJackson2HttpMessageConverter:负责java对象和Json类型报文之间的转换,但需要JSON的jar包的配合;

具体配置:

<mvc:annotation-driven>
   <mvc:message-converters>
      <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
   </mvc:message-converters>
 </mvc:annotation-driven>

或者

@Configuration
@EnableWebMvc
@ComponentScan("com.centfor.www")
public class ServletConfig  implements WebMvcConfigurer{
	@Override
	// 设置MessageConverter
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		converters.add(stringHttpMessageConverter());
		converters.add(mappingJackson2HttpMessageConverter());
	}
}
原文地址:https://www.cnblogs.com/hzcya1995/p/13302439.html