SpringMVC返回客戶端Json/XML資料
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頁面請求
<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"})