ZetCode

Spring Boot Thymeleaf 配置

最后修改于 2023 年 7 月 29 日

在本文中,我们将展示如何使用 Spring Boot Web 应用程序配置 Thymeleaf。当 Spring Boot 在 Gradle 构建文件中找到 Thymeleaf 依赖项时,它会自动配置 Thymeleaf 模板引擎。本教程展示了如何使用 Java 配置手动完成此操作。

Spring 是一个流行的 Java 应用程序框架。Spring Boot 旨在以最小的努力创建独立的、生产级的基于 Spring 的应用程序。

Thymeleaf

Thymeleaf 是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境。它基于自然模板的概念构建:模板文件可以直接在浏览器中打开,并且仍然可以正确显示为网页。

Spring Boot Thymeleaf 配置示例

以下示例使用 Java 配置来设置 Spring Boot 的 Thymeleaf。

build.gradle
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           └───config
│   │                   WebConfig.java
│   └───resources
│       └───mytemplates
│               index.html
└───test
    └───java

这是项目结构。 Thymeleaf 模板文件位于自定义的 src/main/resources/mytemplates 目录中。 默认的模板目录是 src/main/resources/templates

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

这是构建文件。 spring-boot-starter-thymeleaf 是一个用于构建带有 Thymeleaf 的 Spring MVC 应用程序的启动器。 spring-boot-starter-web 是一个用于 Web 应用程序的启动器。

com/zetcode/config/WebConfig.java
package com.zetcode.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    @Description("Thymeleaf template resolver serving HTML 5")
    public ClassLoaderTemplateResolver templateResolver() {

        var templateResolver = new ClassLoaderTemplateResolver();

        templateResolver.setPrefix("mytemplates/");
        templateResolver.setCacheable(false);
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCharacterEncoding("UTF-8");

        return templateResolver;
    }

    @Bean
    @Description("Thymeleaf template engine with Spring integration")
    public SpringTemplateEngine templateEngine() {

        var templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());

        return templateEngine;
    }

    @Bean
    @Description("Thymeleaf view resolver")
    public ViewResolver viewResolver() {

        var viewResolver = new ThymeleafViewResolver();

        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");

        return viewResolver;
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }
}

WebConfig 中,我们配置 Thymeleaf 并为首页设置视图和控制器。 模板引擎在 Java 代码中配置。

@Bean
@Description("Thymeleaf template resolver serving HTML 5")
public ClassLoaderTemplateResolver templateResolver() {

此 bean 定义了一个模板解析器。 模板解析器将模板解析为 TemplateResolution 对象,其中包含其他信息,例如模板模式、缓存、模板的前缀和后缀。 ClassLoaderTemplateResolver 用于加载位于类路径上的模板。

templateResolver.setPrefix("mytemplates/");

我们将模板目录设置为 mytemplates。 使用 ClassLoaderTemplateResolver 时,前缀中没有 classpath:

templateResolver.setTemplateMode("HTML5");

模板引擎将提供 HTML5 内容。

@Bean
@Description("Thymeleaf template engine with Spring integration")
public SpringTemplateEngine templateEngine() {
    
    var templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());

    return templateEngine;
}

创建了一个具有 Spring 集成的 Thymeleaf 模板引擎。

@Bean
@Description("Thymeleaf view resolver")
public ViewResolver viewResolver() {

    var viewResolver = new ThymeleafViewResolver();
    
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");

    return viewResolver;
}    

在这里,我们配置一个 bean,它创建一个 ThymeleafViewResolver。 视图解析器负责为特定操作和区域设置获取 View 对象。 然后,视图对象将呈现为 HTML 文件。

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
}

在这个简单的应用程序中,我们没有特定的控制器类。 我们使用 addViewController 方法定义一个自动控制器。

resources/templates/index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Home page</title>
        <meta charset="UTF-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>
    <body>
        <p>
        <span th:text="'Today is: ' + ${#dates.format(#dates.createNow(), 'dd MMM yyyy HH:mm')}" th:remove="tag"></span>
        </p>
    </body>
</html>

这是一个 Thymeleaf 模板文件。 它显示当前日期。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

此代码设置 Spring Boot 应用程序。 @SpringBootApplication 启用自动配置和组件扫描。

$ ./gradlew bootRun

我们启动应用程序。

$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
    <title>Home page</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<p>
    Today is: 21 Jul 2023 17:08
</p>
</body>
</html>

在本文中,我们使用 Thymeleaf 模板引擎创建了一个 Spring Boot Web 应用程序。 我们展示了如何配置 Thymeleaf。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程