我是 ABin-阿斌:写一生代码,创一世佳话。如果小伙伴们觉得我的文章有点 Feel ,那就点个赞再走哦。
前言
今日在写一个 SpringBoot 结合 Thymeleaf 的 demo 的时候遇到了一个低级错误,在写个测试案例的时候可能是平时写习惯了,一上来就是一个 @RestController 注解。结果导致前端一直取不到值,这可把我呼住了。一开始还以为代码出错了,结果才发现是入坑了…
入坑场景
1、后台:
就是这里使用了这个@RestController注解,导致我前台一直获取不到数据。
/**
* @author ABin-阿斌
* @description: Thymeleaf 模板引擎
* @date 2020/12/27 22:22
*/
@RestController
public class TestController {
@RequestMapping("/tt")
public String test(Model model) {
//将数据存放进去
model.addAttribute("msg", "2020年接近尾声");
return "test";
}
}
2、前台:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>模板引擎演示</title>
</head>
<body>
<h3 style="color: red">两只老虎会跳舞,小兔子乖乖拔萝卜!</h3>
<!--th:text就是将div中的内容设置为它指定的值,和Vue一样-->
<div th:text ="${msg}"></div>
</body>
</html>
原理分析
@RestController
如何我们想要获取前端那边的一个数据的话(jsp 页面或者 html 页面),那么就要注意不要使用 @RestController。如果只是使用 @RestController 注解 Controller 层的话,那么 Controller 层中的方法无法返回 jsp 页面,或者 html 。因为配置的视图解析器 InternalResourceViewResolver 不会起到任何作用,那么结果返回的内容就是 return 里的内容,而不是前端那边的内容。
想要达到我们预期的一个结果让它返回我们自己指定的一个页面,那么我们只能使用 @Controller 配合视图解析器 InternalResourceViewResolver 才行。
1.1 @RestController 注解解析
当我们使用 @RestController 注解时,我们不在需要将 @ResponseBody 注解添加到所有请求映射方法中,因为 @RestController 中为我们自动添加了 @Controller 和 @ResponseBody 注解。
1.2 @ResponseBody 注解解析
@ResponseBody 注解的作用是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,通常用来返回 JSON 数据或者是 XML 数据。需要注意的是,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,它的效果等同于通过 response 对象输出指定格式的数据。
注意事项
在使用 @RequestMapping 后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。