1. 程式人生 > >SpringMVC返回客戶端Json/XML資料

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.xstreamorg.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"})