spring boot 2.7.7 学习问题集
thymeleaf 引入后请求返回的是字符串而非 html 模板页面
先引入 thymeleaf starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.7.7</version>
</dependency>
之后创建一个控制器:
@RestController
public class HomeController {
Logger logger = LoggerFactory.getLogger(getClass());
@ResponseBody
@RequestMapping(path = "/home")
public String home() {
logger.info("access page '/home'");
return "home";
}
@RequestMapping(path = "/success")
public String success() {
return "success";
}
}
在 classpath:templates
中添加了 home.html 和 success.html 以及 error.html 后,运行发现 /home
和 /success
直接返回了字符串,而非预期的模板页面。
通过仔细核对 B站 SpringBoot 视频教程 发现,原教程中并没有使用 @RestController
而是 @Controller
。查看 @RestController
注解内容,其在 @Controller
上增加了 @ResponseBody
注解。
网上找到该注解的作用:
@responseBody 注解的作用是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,通常用来返回 JSON 数据或者是 XML 数据,是 json 还是 xml 根据 springmvc 配置返回如下,需要注意的呢,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 response 对象输出指定格式的数据。
这下清楚了,想要使用视图模板,就要避免使用 @RestController
和 @ResponseBody
注解。
开发期间模板页面修改后,要实时生效
开发期间,如果需要频繁修改模板页面内容,此时重新运行会非常慢,尤其是项目达到一定程度的时候。此时可以通过两个步骤实现:
- 禁用模板引擎的缓存(thymeleaf: spring.thymeleaf.cache=false)
- 页面修改以后 CRTL+F9 重新编译;
应用的上下文路径(也可以称为项目路径) context-path 设置不生效
按照视频教程里添加配置参数:
server.context-path=/amigo
结果访问路径上添加 /amigo
反而无法访问。网上找到一篇博文 Springboot中的context-path 提到
SpringBoot 2.0.0.RELEASE版本以及之后
server.servlet.context-path=/amigo
SpringBoot 2.0.0.RELEASE版本以及之前
server.context-path=/amigo
我用的是 2.7.7,新版本参数设置要增加一个 servlet
端。