1. 程式人生 > >SpringMVC @ResponseBody和@RequestBody使用

SpringMVC @ResponseBody和@RequestBody使用

fas true 寫入 log 方法參數 success ack esp syn

@ResponseBody用法

作用:

  • 該註解用於將Controller的方法返回的對象,根據HTTP Request Header的Accept的內容,通過適當的HttpMessageConverter轉換為指定格式後,寫入到Response對象的body數據區。

使用時機:

  • 返回的數據不是html標簽的頁面,而是其他某種格式的數據時(如json、xml等)使用.

配置返回JSON和XML數據

  • 添加jackson依賴
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.1</version>
</dependency>
  • 開啟<mvc:annotation-driven />

  • java代碼為

 @RequestMapping("/testResponseBody")
    public @ResponseBody
    Person testResponseBody() {
        Person p = new Person();
        p.setName("xiaohong");
        p.setAge(12);
        return p;
    }

Person類

@XmlRootElement(name = "Person")
public class Person {
    private String name;
    private int age;
    public String getName() { return name;    }
    @XmlElement
    public void setName(String name) { this.name = name;    }
    public int getAge() { return age;    }
    @XmlElement
    public void setAge(int age) { this.age = age;    }
}
  • Ajax代碼
$.ajax({
    url: "testResponseBody",
    type: ‘GET‘,
    headers: {
        Accept: "application/xml",
//        Accept:"application/json",
    },
    success: function(data, textStatus){
        console.log(data);
        alert(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);
    },
        });

分析

  • 如果沒有配置Person類的XML註解,那麽只會JSON數據,無論Accept是什麽,

  • 如果配置了Person類的xml註解,那麽如果Accept含有applicatin/xml, 就會返回xml數據.例如通過瀏覽器直接訪問,瀏覽器的http request header appect字段一般都為
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8, 故返回XML數據.
    accept: "application/json",即可返回JSON數據.

用此註解或者ResponseEntity等類似類, 會導致response header含有accept-charset這個字段,而這個字段對於響應頭是沒有用的,以下方法可以關掉

<mvc:annotation-driven>
        <mvc:async-support default-timeout="3000"/>
        <!-- utf-8編碼 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
                <property name="writeAcceptCharset" value="false"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

@RequestBody使用

作用:

  • 註解用於將Controller的方法參數,根據HTTP Request Header的content-Type的內容,通過適當的HttpMessageConverter轉換為JAVA類

使用時機:

  • POST或者PUT的數據是JSON格式或者XML格式,而不是普通的鍵值對形式.

如何使用

其他代碼同上, 配置Controller,如下:

@RequestMapping(value = "/testRequestBody", method= RequestMethod.POST)
    @ResponseBody
    public Person testRequestBody(@RequestBody Person p) {
        System.out.println("creating a employee:" + p);
        return p;
    }

Ajax代碼如下:

 $.ajax({
    url: "testRequestBody",
    data: ‘{"name":"小紅","age":12}‘, //要用雙引號!!
    contentType: "application/json;charset=utf-8", // 因為上面是JSON數據

    type: "POST",
    headers: {
//                Accept: "application/xml",
        Accept: "application/json",
    },
    success: function(data, textStatus){
        console.log(data);
        alert(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);
    },
});

xml類似.

總結

技術分享

推薦閱讀

解析Spring中的ResponseBody和RequestBody

SpringMVC @ResponseBody和@RequestBody使用