使用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模板引擎进行输出,只需按照以下步骤完成。
-
- 只需要一个选项,原文的汉语翻译如下:
创建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>