21.@RequestBody和@ResponseBody
1.@ResponseBody
1.@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中一般在异步获取数据时使用【也就是AJAX】
2.在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中
3.比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据
测试代码:
@ResponseBody---->方法上添加该标签,结果不会进行路径拼串和跳转,一般用于ajax获取返回的json报文,会自动的将返回对象格式化为json对象,前提是导入jackson的包!
@RequestMapping("/getPersonList")
public List<Person> getpersonList(Book book){
System.out.println("请求体:"+book);
Person P1=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
Person P2=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
Person P3=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
Person P4=new Person("吴孟达",18,new Book("西游记",18.0,"吴承恩"));
List<Person> list=new ArrayList<>();
list.add(P1);
list.add(P2);
list.add(P3);
list.add(P4);
return list;
}
jackson的pom文件如下
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,
封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上
测试代码如下:
1.传入的是json对象
前端代码如:
$(function () {
$("#button").click(function () {
var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
$.ajax({
url: "/getPersonList",
data: emp,----------->此处传入的是json对象,后台代码参数上不用加@RequestBody也可以正常获取到请求参数并格式化为javabean
type:"post",--------->无论get/post请求都可以,ajax默认是get请求
success: function (data) {
console.log(data)
}
})
})
})
后端代码如下:
@RequestMapping("/getPersonList")
public List<Person> getpersonList(Book book){
System.out.println("请求体:"+book);
}
2.传入的是json字符串:
$("#button").click(function () {
var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
var requestJson = JSON.stringify(emp);------>将json对象格式化为json字符串
$.ajax({
url: "/getPersonList",
data: emp,
type:"get",
contentType:"application/json",--------->必须加上这行,否则后台会报解析错误
success: function (data) {
console.log(data)
}
})
})
后台代码如下:
@RequestMapping("/getPersonList")
public List<Person> getpersonList(@RequestBody Book book){-->参数上加上@RequestBody,会将前台传来的json字符串自动格式化为javabean
System.out.println("请求体:"+book);
}
3.HttpEntity可以获取请求体外,还可以获取到请求头中的所有消息
用法:
前端:
$("#button").click(function () {
var emp = {bookName: "西游记", price: 12.3, autor: "吴承恩"}
var requestJson = JSON.stringify(emp);
$.ajax({
url: "/getPersonList",
data: requestJson,--------->这里必须是json字符串
type:"post",--------------->必须是post请求
contentType:"application/json",--->加上这句
success: function (data) {
console.log(data)
}
})
})
后台:
@RequestMapping("/getPersonList")
public List<Person> getpersonList(HttpEntity<Book> book){
System.out.println("请求体:"+book);
}
之前如果要获取请求头信息必须:public List<Person> getpersonList(@RequestHeader("Content-Type")String ContentType ){....}
输出结果是:发现出了前台传的参数外还又全部的请求头信息,
请求体:<Book{bookName='西游记', price=12.3, autor='吴承恩'},
{host=[localhost:8080], connection=[keep-alive], content-length=[57], pragma=[no-cache], cache-control=[no-cache], accept=[*/*],
x-requested-with=[XMLHttpRequest], user-agent=[Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36],
origin=[http://localhost:8080], sec-fetch-site=[same-origin], sec-fetch-mode=[cors], sec-fetch-dest=[empty], referer=[http://localhost:8080/form.jsp],
accept-encoding=[gzip, deflate, br], accept-language=[zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7], cookie=[JSESSIONID=54BB0D8A42382EF2051979FDC7F59D61],
Content-Type=[application/json;charset=UTF-8]}>