天天看點

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",);
        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"})
           

繼續閱讀