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 端。