开发环境:
jdk1.8
maven3.5.2
Spring MVC 4.3.18.RELEASE
IDEA
一、简介
- @RequestBody用于读取Request请求的body部分数据,使用HandlerAdapter(处理器适配器)配置的HttpMessageConverters来解析json或者xml数据,然后把HttpMessageConverter返回的对象数据绑定到相应的Bean上。该注解常用来处理Content-Type:不是application/x-www-form-urlencoded编码的内容,例如application/json、application/xml等。
- @ResponseBody用于将Controller的请求处理方法返回的对象,通过HttpMessageConverter转换为指定格式,然后写入到Response对象的body数据区。当返回的数据不是HTML标签的页面,而是其他某种格式的数据时(JSON、XML等)使用。
- HttpMessageConverter消息转换接口,它负责将请求信息转换为一个对象(类型为T),并将对象绑定到请求方法参数上或者输出为响应信息。
二、说明
DispatchServlet默认已经装配了RequestMappingHandlerAdapter作为HandlerAdapter组件的实现类,即HttpMessageConverter由RequestMappingHandlerAdapter使用,将请求信息转换为对象,或将对象转换为响应信息。Spring为HttpMessageConverter提供了多个实现类,如下:
- StringHttpMessageConverter
- FormHttpMessageConverter
- SourceHttpMessageConverter
- ResourceHttpMessageConverter
- BufferedImageHttpMessageConverter
- ByteArrayHttpMessageConverter
- MarshallingHttpMessageConverter
- Jaxb2RootElementHttpMessageConverter
- MappingJackson2HttpMessageConverter
- RssChannelHttpMessageConverter
- AtomFeedHttpMessageConverter
RequestMappingHandlerAdapter默认已经装配了以下3种HttpMessageConverter
1.StringHttpMessageConverter
2.ByteArrayHttpMessageConverter
3.SourceHttpMessageConverter
如果需要装配其他类型的HttpMessageConverter,则可以在Spring的Web容器的上下文中自定义一个RequestMappingHandlerAdapter,例如:Spring MVC默认使用MappingJackson2HttpMessageConverter转换JSON格式的数据,Spring默认使用Jackson开源框架作为JSON解析框架。Jackson框架可以将Java对象转换成json对象和xml文档,同样也可以将json对象、xml转换成Java对象。
Jackson的Maven依赖
<properties>
<jackson.version>2.5.4</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
spring-servlet.xml配置如下:
<mvc:annotation-driven>
<!--自定义HttpMessageConverter接收JSON格式的数据-->
<!--设置不使用默认消息转换器-->
<mvc:message-converters register-defaults="false">
<!--配置Spring转换器-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<!--配置Jackson中实现HttpMessageConverter接口的转换器-->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--加入支持的媒体类型:返回contentType-->
<property name="supportedMediaTypes">
<list>
<!--这里顺序不能反,一定要先写text/html,不然IE下会出现下载提示-->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
三、自定义HttpMessageConverter
使用阿里巴巴开源的Fastjson处理Json格式数据,配置如下:
<properties>
<fastjson.version>1.2.31</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
</dependencies>
spring-servlet.xml配置如下:
<mvc:annotation-driven>
<!--自定义HttpMessageConverter接收JSON格式的数据-->
<!--设置不使用默认消息转换器-->
<mvc:message-converters register-defaults="false">
<!--配置Spring转换器-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<!--配置fastjson中实现HttpMessageConverter接口的转换器-->
<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!--加入支持的媒体类型:返回contentType-->
<property name="supportedMediaTypes">
<list>
<!--这里顺序不能反,一定要先写text/html,不然IE下会出现下载提示-->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
参考文献:
[1] fastjson官网地址
[2]: 《Spring+MyBatis企业应用实战(第2版)