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",);
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();
System.out.println(user);
return new ResponseEntity<User>(user, HttpStatus.OK);
}
(3). html頁面請求
<input type="button" value="testJson" id="button1"/>
$("#button1").click(function(){
$.ajax({
url:"testJson",
data:'{"userName":"張三","password":""}',
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"})