文章目录
SpringMVC - (09) 报文信息转换器
1. HttpMessageConverter的介绍
HttpMessageConverter,报文信息转换器
作用:
- 将请求报文转换为Java对象
- 将Java对象转换为响应报文
HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody,RequestEntity,ResponseEntity
- @RequestBody 将报文中的请求体转换为Java对象
- @ResponseBody 将Java对象转换为响应报文的响应体
- RequestEntity 将整个请求报文转换为Java对象
- ResponseEntity 将Java对象转换为响应报文
数据转换流程:
利用SpringMVC框架,可以使得我们在开发时,只要在代码中使用@RequestBody和@ResponseBody两个注解,就可以分别完成从请求报文到对象和从对象到响应报文的转换。而在源码内部,其实这种灵活的消息转换机制就是利用HttpMessageConverter来实现的。
HttpMessageConverter的调用是RequestResponseBodyMethodProcessor类的解析请求参数的方法resolveArgument()和处理返回值的方法handleReturnValue()中进行调用的。这是关于@RequestBody和@ResponseBody两个注解的原理。
2. @RequestBody注解
作用:获取请求体
位置:控制器方法的形参的注解
用法:需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值
定义一个控制方法:
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
public String testUser(@RequestBody String requestBody){
System.out.println("请求体:" + requestBody);
return "success";
}
}
前端提交请求:
服务器接收到数据:
3. RequestEntity类型
作用:封装请求报文的一种类型,获取请求报文
位置:控制器方法的形参位置
用法:需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
定义一个控制方法:
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
public String testUser(RequestEntity<String> request){
System.out.println("请求头:" + request.getHeaders());
System.out.println("请求体:" + request.getBody());
return "success";
}
}
前端提交请求:
服务器接收到数据:
3. @ResponseBody
作用:用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器
位置:控制器方法上
定义一个控制器方法:
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
@ResponseBody // 注解在方法上
public String testUser(){
return "我已收到信息";
}
}
前端提交请求:
注意:加上@ResponseBody注解之后,方法的返回值不再是视图了,而是一个字符串
测试返回值是否可以一个对象:
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
@ResponseBody
public User testUser(){
User user = new User(1001,"julissa","julissa@163.com",1);
return user;
}
}
前端提交请求:
可以看到前端无法接收一个对象类型的数据
那该怎么办呢?可以将响应到浏览器的Java对象转换为Json格式的字符串
4. SpringMVC处理JSON数据
将响应到浏览器的Java对象转换为Json格式的字符串,浏览器就可以接收
@ResponseBody处理json的步骤:
第一步:导入jackson的依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
第二步:在SpringMVC的核心配置文件中开启mvc的注解驱动
此时在HandlerAdaptor中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,可以将响应到浏览器的Java对象转换为Json格式的字符串
<mvc:annotation-driven />
第三步:在处理器方法上使用@ResponseBody注解进行标识
第四步:将Java对象直接作为控制器方法的返回值返回,就会自动转换为Json格式的字符串
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
@ResponseBody
public User testUser(){
User user = new User(1001,"julissa","julissa@163.com",1);
return user;
}
}
浏览器的页面中展示的结果:
5. SpringMVC处理Ajax请求
请求按钮:
<div id="app">
<button type="button" @click="sendGet">ajax的get请求</button>
<button type="button" @click="sendPost">ajax的post请求</button>
</div>
通过vue和axios处理点击事件:
<script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
<script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
<script type="text/javascript">
// 请求路径
baseUrl = "http://localhost:8080/springMVC/user2/test";
// 创建Vue实例
const vm = new Vue({
el:'#app',
methods:{
sendGet(){
axios({
method:"get",
url:baseUrl,
params:{
username:"julissa",
email:"julissa@example.com"
}
}).then(function(response){
console.log(response.data)
});
},
sendPost(){
axios({
method:"post",
url:baseUrl,
params:{
username:"julissa",
email:"julissa@example.com"
}
}).then(function(response){
console.log(response.data)
});
}
}
});
</script>
控制器方法:
@Controller
@RequestMapping("/user2")
public class UserController2 {
@RequestMapping("/test")
@ResponseBody
public User testUser(String username,String email) {
User user = new User(1001,username,email,1);
return user;
}
}
前端提交请求:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHnine5z-1680015947402)(E:\截图图片\image-20230328200840363.png)]
6. @RestController注解
作用:是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解
7. ResponseEntity
作用:用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
位置:控制器方法的返回值位置