使用SpringBoot来使用Thymeleaf的文本模板模式

首先

Thymeleaf最初是用作网页(HTML)模板引擎的,专注于生成HTML输出。但是自从Thymeleaf3版本以后,它可以输出纯文本。这使得它可以用于邮件或聊天发布的模板。

准备阶段

本文将介绍如何使用最简化的SpringBoot和Maven来输出文本到标准输出。注意:SpringBoot 的2.x版本和1.x版本具有不同的依赖关系。在创建项目时,请使用SpringTools Suite或可使用Maven的集成开发环境。pom.xml文件将在文章末尾介绍。

将文本模式设置

使用Spring通过文本模式操作Thymeleaf的设置。Thymeleaf的模板是通过继承TemplateEngine接口的类来处理的。由于本次操作是在Spring Boot中进行的,所以需要使用Spring框架中的SpringTemplateEngine。

package com.github.apz.springsample.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.core.env.Environment;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;    // SpringBoot1系は、import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;

@Configuration
public class ThymeleafConfig implements ApplicationContextAware, EnvironmentAware {
    @Bean
    public TemplateEngine textTemplateEngine() {
        final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(textTemplateResolver());
        templateEngine.setTemplateEngineMessageSource(textMessageSource());
        return templateEngine;
    }

    private ITemplateResolver textTemplateResolver() {
        final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setOrder(Integer.valueOf(1));
        templateResolver.setPrefix("/mail/");
        templateResolver.setSuffix(".txt");
        templateResolver.setTemplateMode(TemplateMode.TEXT);
        templateResolver.setCharacterEncoding("utf-8");
        templateResolver.setCacheable(false);
        return templateResolver;
    }

    @Bean
    public ResourceBundleMessageSource textMessageSource() {
        final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("mail/Messages");
        return messageSource;
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    private ApplicationContext applicationContext;
    private Environment environment;
}

要运行TemplateEngine,必须使用负责读取模板文件设置的TemplateResolver。此外,还可以通过Spring中使用的MessageSource将消息从消息定义属性输出。

通过这个类的描述,Spring可以通过 textTemplateEngine 引用,并且可以使用我们定义的 TemplateResolver 来使用文本模板。在 TemplateResolver 中,请特别注意以下配置。

// テンプレートファイルの配置ディレクトリ(src/main/resources/templates/ 以下のディレクトリ)
templateResolver.setPrefix("/mail/");

// テンプレートファイルの拡張子。ここに設定された値以外は読み込まなくなる
templateResolver.setSuffix(".txt");

// Thymeleafのテンプレートモード。テキスト出力なので、TEXTを指定
templateResolver.setTemplateMode(TemplateMode.TEXT);

// 読み込むテンプレートファイルの文字エンコード
templateResolver.setCharacterEncoding("utf-8");

实际输出

我們已經完成了設定,現在該輸出類了。

package com.github.apz.springsample.component;

import java.util.Arrays;
import java.util.Date;
import java.util.Locale;

import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Component
@RequiredArgsConstructor  // ※
@Log4j2                   // ※
public class ThymeleafText {
    private final TemplateEngine templateEngine;

    public void process() {
        final Context ctx = new Context(Locale.getDefault());
        ctx.setVariable("subscriptionDate", new Date());        
        String text = this.templateEngine.process("/mail/sample.txt", ctx);

        log.info(text);
    }
}

※RequiredArgsConstructor和Log4j2是Project Lombok的注解。

要使用Thymeleaf模板引擎进行输出,只需按照以下步骤完成。

    1. 只需要一个选项,原文的汉语翻译如下:

创建Thymeleaf的Context实例,将要在Thymeleaf模板中使用的变量放入Context中,然后只需要将要加载的模板和上下文传递给模板引擎,执行process方法即可。

启动类

创建一个Spring Boot启动类,尝试运行它。

package com.github.apz.springsample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

import com.github.apz.springsample.component.ThymeleafText;

@SpringBootApplication
public class SpringThymeleaf3TextApplication implements CommandLineRunner {

    @Autowired
    private ThymeleafText thymeleafText;

    public static void main(String[] args) {
        new SpringApplicationBuilder(SpringThymeleaf3TextApplication.class).web(false).run(args);
    }

    @Override
    public void run(String... args) throws Exception {
        thymeleafText.process();
    }
}

模板文件

これはThymeleafテキストサンプルです。
[# th:if=${display}]======
  displayがtrueのときは[# th:utext="${#dates.format(subscriptionDate, 'dd/MMM/yyyy HH:mm')}" /]表示されます。
======
[/]末尾です。

在Thymeleaf的文本模式下,[# th:属性名]将作为标签处理,除此之外,Thymeleaf的标准功能基本上都可以直接使用。

执行结果可能如下所示。(省略了Log4J2的输出)

これはThymeleafテキストサンプルです。
======
  displayがtrueのときは11/7/2018 07:32表示されます。
======
末尾です。

这就是以上内容(・ω・)

附录

文献引用

教程:使用Thymeleaf(ja)
教程:Thymeleaf + Spring

样本代码

https://github.com/A-pZ/spring-thymelaf3-text 的内容进行中文释义

pom.xml(SpringBoot2 version)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.github.a-pz.sample</groupId>
    <artifactId>spring-thymeleaf3-text</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-thymeleaf3-text</name>
    <description>spring-thymeleaf-text-sample</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

pom.xml(SpringBoot1.x版本)

SpringBoot1系默认是使用Thymeleaf2系版本的,所以需要指定3系版本,并进一步添加所需的插件。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.github.a-pz.sample</groupId>
    <artifactId>spring-thymeleaf3-text</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-thymeleaf3-text</name>
    <description>spring-thymeleaf-text-sample</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.14.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>nz.net.ultraq.thymeleaf</groupId>
            <artifactId>thymeleaf-layout-dialect</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
广告
将在 10 秒后关闭
bannerAds