1. HttpMessageConverter
它是Spring的一个接口,它负责将请求信息转为一个对象(类型为T),将对象(类型为T)输出为响应信息。
DispatcherServlet默认安装了RequestMappingHandlerAdapter作为HandlerAdapter的组件实现类,HttpMessageConverter即由RequestMappingHandlerAdapter使用,将请求信息转为对象,或将对象转为响应信息。RequestMappingHandlerAdapter默认装配了一下的转换器:
StringHttpMessageConverter : 用途为将请求转为字符串,T为String类型,可读取所有媒体的请求信息,响应信息的媒体类型为text/plain。
ByteArrayHttpMessageConverter : 用途为读/写二进制数据,T为byte[]类型,响应信息为application/octet-stream。
SourceHttpMessageConverter : 用于读/写javax.xml.stransfrom.Source类型的数据,可读取text/xml和application/xml类型的请求,响应为text/xml或application/xml类型。
AllEncompassingFormHttpMessageConverter
需要其他类型的HttpMessageConverter,可在Spring的配置文件中定义一个RequestMappingHandlerAdapter,如果显示定义RequestMappingHandlerAdapter,则会覆盖默认的RequestMappingHandlerAdapter。
<!--配置HttpMessageConverter-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
<util:list id="messageConverters">
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
</util:list>
2. 使用HttpMessageConverter
使用@RequestBody/@ResponseBody对处理方法进行注解.
使用HttpEntity/ResponseEntity作为处理方法的入参或者返回值。
@RequestBody将HTTP请求正文转换为适合的HttpMessageConverter对象
@ResponseBody 返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。
@RequestMapping("/handle1")
public String handle1(@ReqeustBody String requestBody){
//@RequestBody将请求报问题转为字符串绑定到requestBody中
System.out.println(requestBody);
return "index";
}
@RequestMapping("/handle2")
@ResponseBody//@ResponseBody使方法返回一个字节流
public byte[] handle2(@PathVariable("imageId") String imageId){
Resource res=new ClassPathResource("/image.jpg");
byte[] fileData=FileCopyUtils.copyToByteArray(res.getInputStream());
return fileData;
}
2.1 处理XML
使用org.springframework.http.converter.xml.MarshallingHttpMessageConverter这个类。
(1). Spring配置文件
需要添加的依赖项:com.thoughtworks.xstream和org.springframework.oxm
<!--配置HttpMessageConverter-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
<util:list id="messageConverters">
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter p:marshaller-ref="xmlMarshaller" p:unmarshaller-ref="xmlMarshaller"/>
</util:list>
<bean id="xmlMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
<property name="streamDriver">
<bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
</property>
<property name="annotatedClasses">
<list>
<value>entity.User</value>
</list>
</property>
</bean>
(2) User类
@XmlRootElement//这个标注必须
public class User {
private String userName;
private String password;
private int age;
private LocalDate birthday;
/*Getter and Setter*/
}
(3). Controller方法
@RequestMapping(value="/testxml")
public @ResponseBody
User getUsers(){
User user=new User("zhangsan","1231",23);
return user;
}
2.2 返回Json数据
需要的依赖项:jackson-databind
(1). Spring配置文件
<mvc:annotation-driven />
<mvc:resources location="/js/" mapping="/js/**"/>//静态js文件。
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:messageConverters-ref="messageConverters"/>
<util:list id="messageConverters">
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</util:list>
(2). Controller方法
@RequestMapping("/testJson")
public ResponseEntity<User> testJson(HttpEntity<User> requestEntity){//这里使用ResponseEntity和HttpEntity作为参数和返回值
User user=requestEntity.getBody();
user.setAge(28);
System.out.println(user);
return new ResponseEntity<User>(user, HttpStatus.OK);
}
(3). html页面请求
![](/qrcode.jpg)
<input type="button" value="testJson" id="button1"/>
$("#button1").click(function(){
$.ajax({
url:"testJson",
data:'{"userName":"张三","password":"1230"}',
type:"post",
headers:{'Content-Type':'application/json'}//Content-type必加,不然会报错
success:function(data){
console.log(data);
}
});
});
**几点说明:
1.在返回XML数据时,如果返回的是一个集合,会有意想不到的情况发生,可能是我没有把转换器设置好的缘故。
2.当实体Bean加上了@XmlRootElement注解后,如果还想返回json数据,可以设置控制器方法的produces属性。**
@RequestMapping(value="/testXML",produces = {"application/json;charset=utf-8"})