@ResponseBody用法
作用:
该注解用于将Controller的方法返回的对象,根据 HTTP Request Header 的 Accept 的内容,通过适当的 HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。
使用时机:
返回的数据不是html标签 的页面,而是其他某种格式的数据时(如json、xml等)使用.
配置返回JSON和XML数据
<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 />
@RequestMapping ("/testResponseBody" )
@ResponseBody
Person testResponseBody() {
Person p = new Person();
p.setName("xiaohong" );
p.setAge(12 );
return p;
}
@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({
url: "testResponseBody" ,
type: 'GET' ,
headers: {
Accept: "application/xml" ,
},
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" />
<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 >