@ResponseBody用法
作用:
- 該注解用于將Controller的方法返回的對象,根據(jù)HTTP Request Header的
Accept
的內(nèi)容,通過適當(dāng)?shù)?code>HttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)。
使用時機(jī):
- 返回的數(shù)據(jù)不是html標(biāo)簽的頁面,而是其他某種格式的數(shù)據(jù)時(如json、xml等)使用.
配置返回JSON和XML數(shù)據(jù)
- 添加
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
數(shù)據(jù),無論Accept
是什么,如果配置了
Person
類的xml注解,那么如果Accept
含有applicatin/xml
, 就會返回xml數(shù)據(jù).例如通過瀏覽器直接訪問,瀏覽器的http request header appect字段
一般都為
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
, 故返回XML數(shù)據(jù).
改accept: "application/json"
,即可返回JSON數(shù)據(jù).
用此注解或者ResponseEntity等類似類, 會導(dǎo)致response header
含有accept-charset
這個字段,而這個字段對于響應(yīng)頭是沒有用的,以下方法可以關(guān)掉
<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的方法參數(shù),根據(jù)HTTP Request Header的
content-Type
的內(nèi)容,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為JAVA類
使用時機(jī):
-
POST
或者PUT
的數(shù)據(jù)是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數(shù)據(jù)
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類似.