@ResponseBody用法:
作用:该注解用于将Controller的方法返回的对象,根据HTTP Request Header的Accept的内容,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json,xml等)使用。
配置返回json和xml数据
添加jackson依赖
<dependence> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.1</version> </dependence> <dependence> <groupId>com.fasterxml.jackson.core</groupId> <artifacted>jackson-databind</srtifacted> <version>2.8.1</version> </dependence>
开启<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; } public void setAge(int age) { this.age = age; } }
Ajax代码:
$.ajax({ url:"testResponseBody", type:'Get', header: { Accept:"application/xml" , }, success:function(data,testStatus){ console.log(data); alert(data) }, error:function(data,textStatus,errorThrown) { console.log(data); } });
分析:
如果没有配置Person类的xml注解,那么只会json数据,无论Accept是什么。
如果配置了Person类的xml注解,那么如果Accept含有application/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>
@RequestBody使用:
作用:注解用于将controller的方法参数,根据HTTP Request Header的content-Type的内容,通过适当的HttpMessageConverter转换为java类
使用时机:
POST或者PUT的数据是JSON格式或者是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:"testResponseBody", data:{"name":"小红","age":"123"}, // json形式要用双引号 content });