前提:
从浏览器向服务器发送请求时,发送的数据都是字符串;
浏览器接收到服务器的响应时,接收的数据也是字符串;
也就是说: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());
}
}