Spring Boot - 整合Thymeleaf
现在不都前后端分离了么?Vue她不香嘛?
虽然现在慢慢在流行前后端分离
开发,但是还是有一些“灵玩不灵”
的公司依旧在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板引擎【实际上,即使前后端分离,也会在一些场景下需要使用页面模板,举个典型的栗子:邮件发送模板
】。
下面演示Spring Boot - 整合Thymeleaf是如何发送HTML格式的邮件的
# 1. 添加依赖
首先,确保你的pom.xml
文件中包含了Spring Boot邮件发送和Thymeleaf的相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2
3
4
5
6
7
8
# 2. 配置邮件服务器
在application.properties
或application.yml
文件中配置邮件服务器的相关信息:
spring.mail.host=smtp.example.com
spring.mail.port=587
spring.mail.username=user@example.com
spring.mail.password=password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
2
3
4
5
6
# 3. 创建邮件服务
创建一个服务类EmailService
,用于封装发送邮件的逻辑:
@Service
public class EmailService {
@Autowired
private JavaMailSender javaMailSender; // 注入Spring提供的邮件发送器,用于发送邮件
@Autowired
private SpringTemplateEngine templateEngine; // 注入Thymeleaf模板引擎,用于渲染HTML模板
/**
* 发送邮件的方法
*
* @param to 收件人地址
* @param subject 邮件主题
* @param content 邮件正文(文本内容)
* @param code 邮件中要使用的动态代码(例如验证码等)
* @throws MessagingException 邮件发送过程中可能出现的异常
*/
public void sendEmail(String to, String subject, String content, String code) throws MessagingException {
// 创建Thymeleaf上下文对象
Context context = new Context();
// 将正文和代码添加到上下文中,这些数据将用于替换模板中的相应占位符
context.setVariable("content", content);
context.setVariable("code", code);
// 使用Thymeleaf模板引擎渲染邮件内容,"emailTemplate"是模板的名称
// 渲染结果将是一个完整的HTML字符串
String process = templateEngine.process("emailTemplate", context);
// 创建邮件消息对象
MimeMessage message = javaMailSender.createMimeMessage();
// 使用MimeMessageHelper来简化构建邮件的过程
// 参数true表示创建一个multipart message类型的邮件
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 设置发件人邮箱地址
helper.setFrom("user@example.com");
// 设置收件人邮箱地址
helper.setTo(to);
// 设置邮件主题
helper.setSubject(subject);
// 设置邮件内容,第二个参数true表示内容为HTML
helper.setText(process, true);
// 发送邮件
javaMailSender.send(message);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 4. 创建Thymeleaf邮件模板
在src/main/resources/templates
目录下创建一个Thymeleaf邮件模板,例如emailTemplate.html
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
</head>
<body>
<p th:text="${content}">邮件内容</p>
<p>您的验证码是:<span style="color:#f60;font-size: 24px" th:text="${code}">[code]</span>,以完成操作。</p>
</body>
</html>
2
3
4
5
6
7
8
9
10
# 5. 发送邮件
通过调用EmailService
的sendEmail
方法发送邮件:
@RestController
public class EmailController {
@Autowired
private EmailService emailService;
@GetMapping("/send-email")
public String sendEmail() {
try {
emailService.sendEmail("recipient@example.com", "测试邮件", "这是邮件内容", "123456");
return "Email sent successfully!";
} catch (MessagingException e) {
e.printStackTrace();
return "Email sending failed!";
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 6. 模板引擎类的常用api
SpringTemplateEngine
是 Thymeleaf 与 Spring 集成时用于处理模板并渲染视图的核心类。以下是一些常用的 API 及其用法:
# 1. process 方法
process
方法是用来处理模板并生成渲染后的字符串。这是在发送邮件、生成动态内容等场景中最常用的方法。
public String process(String template, Context context);
参数说明:
template
:模板名称,不需要指定模板的全路径,Thymeleaf 和 Spring Boot 的集成会自动在默认的模板目录(通常是src/main/resources/templates
)下查找模板文件。context
:一个org.thymeleaf.context.Context
实例,用于存放渲染模板时需要的数据。你可以将所有需要在模板中使用的变量添加到这个上下文对象中。
用法示例:
Context context = new Context();
context.setVariable("message", "这是一个测试邮件内容");
String content = templateEngine.process("emailTemplate", context);
2
3
这里,emailTemplate
是位于 src/main/resources/templates
下的模板文件名(不包含 .html
后缀),context
包含了一个键为 message
的变量,模板中可以通过 ${message}
来访问这个变量。
# 2. setTemplateResolver 方法
setTemplateResolver
方法用于设置模板解析器。模板解析器负责解析模板名称到模板资源的过程,例如,将模板名称解析为文件系统上的一个具体文件或其他类型的资源。
public void setTemplateResolver(ITemplateResolver templateResolver);
参数说明:
templateResolver
:实现了ITemplateResolver
接口的模板解析器实例。
用法示例:
通常在配置 SpringTemplateEngine
的 Bean 时设置模板解析器:
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
2
3
4
5
6
在 Spring Boot 中,模板解析器通常会通过自动配置被设置,因此你很少需要手动调用这个方法。
# 3. addDialect 方法
addDialect
方法用于添加一个方言(Dialect)。Thymeleaf 的方言用于扩展 Thymeleaf 的标准功能,比如添加新的属性处理器、表达式处理器等。
public void addDialect(IDialect dialect);
参数说明:
dialect
:实现了IDialect
接口的方言实例。
用法示例:
添加 Thymeleaf 的 Spring Security 方言,以便在模板中使用 Spring Security 相关的功能:
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
templateEngine.addDialect(new SpringSecurityDialect());
return templateEngine;
}
2
3
4
5
6
7
通过添加方言,你可以使 Thymeleaf 支持更多功能,比如处理安全相关的逻辑、集成其他库等。