How to use Thymeleaf with Spring Boot
Thymeleaf是一种流行的服务器端模板引擎,适用于 Web 和独立 Java 应用程序。
它被开发用于处理不同类型的文件,如 HTML、XML、JavaScript、CSS 和纯文本。
使用 Thymeleaf 的最大优势是它为您的开发工作流程带来了自然模板——HTML模板可以直接在浏览器中打开并仍然正确呈现为网页。这为快速开发静态原型提供了极大的灵活性,而无需在创建后端服务器上浪费时间。
与其他著名的模板引擎(如 JavaServer Pages (JSP))相比,Thymeleaf 使整个开发过程变得非常简单和快速。在本文中,您将学习如何将 Thymeleaf 模板引擎与 Spring Boot 结合使用来提供动态 Web 内容。
依赖关系
Spring Boot 对 Thymeleaf 模板引擎提供了极好的支持,使得整个集成过程非常简单明了。您需要做的只是将Thymeleaf 的Spring Boot starter包含到您的应用程序依赖项中。Spring Boot 将自动配置您使用 Thymeleaf 引擎所需的一切。要激活 Spring Boot Web 支持,请确保同时包含 Spring Boot Web starter 依赖项 ( spring-boot-starter-web)。
对于 Gradle 项目,将以下依赖项包含到您的build.gradle文件中:
1 | implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' |
对于 Maven,将以下依赖项添加到pom.xml文件中:
1 | <dependency> |
如果您是从头开始,只需使用Spring Initializr Web 工具或Spring Boot CLI即可使用上述依赖项快速引导一个新的 Spring Boot 项目。
模板
Thymeleaf 模板只是HTML 静态文件(.html扩展名),可在浏览器和 Web 应用程序中使用。默认情况下,这些模板存储在src/main/resources/templates/文件夹中。Spring Boot 会在需要时自动选择并呈现这些 HTML 文件。
让我们创建我们的第一个 Thymeleaf 模板index.html,并将其放入src/main/resources/templates文件夹中:
1 |
|
Thymeleaf 引擎将解析上述index.html文件,评估th:text表达式并替换${message}为 Spring Boot Web 控制器类提供的实际值。
Spring Boot 控制器
现在让我们定义一个名为 Spring Boot 控制器类IndexController.java,它处理端点上的所有 HTTP GET请求/并返回需要作为响应呈现的视图的名称:
1 | package com.attacomsian.getstarted.controllers; |
正如你在上面看到的,我们定义了一个简单的 Spring 控制器,它只接受端点上的GET请求/。所述@Controller注释指示注解的类是“控制器”(例如一个网络控制器)。
该@GetMapping注释被用于映射HTTP GET请求到特定的控制器的方法。在上面的例子中,它将/端点映射到index()方法上。Model是一个特殊的接口,用于在 Spring Boot 中的控制器和视图之间共享数据。我们已将message属性添加到Model视图模板中所需的对象 —index.html文件。
该index()方法以字符串形式返回视图模板的名称。Thymeleaf 将在默认文件夹 ( src/main/resources/templates/) 中搜索此模板并进行渲染。
运行和测试应用程序
1 | package com.attacomsian.getstarted; |
应用程序启动后,在 Web 浏览器中打开http://localhost:8080/以查看输出。这是它的样子:
更改 Thymeleaf 默认属性
Spring Boot 为 Thymeleaf 模板引擎提供了默认配置。要覆盖默认属性值,您可以在application.properties或application.yml配置文件中定义属性。
更改模板文件夹位置
要更改 HTML 模板的默认文件夹位置,您需要覆盖以下属性:
1 | change location from `templates` to `views` |
禁用模板缓存
默认情况下,Spring Boot 会缓存 Thymeleaf 模板以提高性能。如果您希望模板在修改时自动更新,请覆盖以下属性(不推荐在生产中使用):
1 | spring.thymeleaf.cache=false |