程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Spring Boot

    • Spring Boot - 自动配置
    • Spring Boot - 自定义starter
    • Spring Boot - 配置文件
    • Spring Boot - 自定义SpringApplication
    • Spring Boot - 生命周期与事件
    • Spring Boot - 事件驱动
    • Spring Boot - Bean 加载方式
    • Spring Boot - 容器资源感知与获取
    • Spring Boot - 定时任务
    • Spring Boot - 异步任务
    • Spring Boot - 内置日志
    • Spring Boot - 函数式 Web
    • Spring Boot - 响应式远程调用
    • Spring Boot - 接口文档
    • Spring Boot - 单元测试
    • Spring Boot - 内容协商
    • Spring Boot - 参数校验
    • Spring Boot - HTTP客户端工具
    • Spring Boot - 控制器请求映射
    • Spring Boot - 请求参数接收
    • Spring Boot - 通用响应类
    • Spring Boot - 全局异常处理
    • Spring Boot - 整合Druid
    • Spring Boot - 整合Thymeleaf
      • 1. 添加依赖
      • 2. 配置邮件服务器
      • 3. 创建邮件服务
      • 4. 创建Thymeleaf邮件模板
      • 5. 发送邮件
      • 6. 模板引擎类的常用api
        • 1. process 方法
        • 2. setTemplateResolver 方法
        • 3. addDialect 方法
    • Spring Boot - 国际化实现
    • Spring Boot - 自定义注解
  • Spring高级
  • Spring Boot
scholar
2024-03-30
目录

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>
1
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
1
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);
    }
}
1
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>
1
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!";
        }
    }
}
1
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);
1
  • 参数说明:

    • 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);
1
2
3

这里,emailTemplate 是位于 src/main/resources/templates 下的模板文件名(不包含 .html 后缀),context 包含了一个键为 message 的变量,模板中可以通过 ${message} 来访问这个变量。

# 2. setTemplateResolver 方法

setTemplateResolver 方法用于设置模板解析器。模板解析器负责解析模板名称到模板资源的过程,例如,将模板名称解析为文件系统上的一个具体文件或其他类型的资源。

public void setTemplateResolver(ITemplateResolver templateResolver);
1
  • 参数说明:

    • templateResolver:实现了 ITemplateResolver 接口的模板解析器实例。
  • 用法示例:

通常在配置 SpringTemplateEngine 的 Bean 时设置模板解析器:

@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    return templateEngine;
}
1
2
3
4
5
6

在 Spring Boot 中,模板解析器通常会通过自动配置被设置,因此你很少需要手动调用这个方法。

# 3. addDialect 方法

addDialect 方法用于添加一个方言(Dialect)。Thymeleaf 的方言用于扩展 Thymeleaf 的标准功能,比如添加新的属性处理器、表达式处理器等。

public void addDialect(IDialect dialect);
1
  • 参数说明:

    • 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;
}
1
2
3
4
5
6
7

通过添加方言,你可以使 Thymeleaf 支持更多功能,比如处理安全相关的逻辑、集成其他库等。

编辑此页 (opens new window)
上次更新: 2025/03/31, 02:05:41
Spring Boot - 整合Druid
Spring Boot - 国际化实现

← Spring Boot - 整合Druid Spring Boot - 国际化实现→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式