You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Thymeleaf的TemplateEngine处理静态HTML代码(非文件模板)

嘿,我来帮你搞定用Thymeleaf直接处理静态HTML字符串的问题!

通常Thymeleaf的TemplateEngine默认是从文件(比如类路径、Servlet上下文)加载模板的,但要直接处理内存中的HTML字符串,你需要用到StringTemplateResolver——这是Thymeleaf专门为字符串模板设计的解析器。

下面分两种场景给你示例:


1. Spring环境下配置专用的TemplateEngine(推荐长期使用)

如果你在Spring项目里经常需要处理字符串模板,可以专门配置一个TemplateEngine Bean,指定使用StringTemplateResolver:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.templateresolver.StringTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

@Configuration
public class ThymeleafConfig {

    @Bean
    public TemplateEngine stringTemplateEngine() {
        TemplateEngine templateEngine = new TemplateEngine();
        StringTemplateResolver resolver = new StringTemplateResolver();
        
        // 设置模板模式为HTML,确保Thymeleaf能正确解析HTML中的表达式
        resolver.setTemplateMode(TemplateMode.HTML);
        // 如果你的字符串模板每次都是动态生成的,关闭缓存避免问题;固定模板可以设为true
        resolver.setCacheable(false);
        
        templateEngine.setTemplateResolver(resolver);
        return templateEngine;
    }
}

然后在你的邮件发送类里注入这个专用的TemplateEngine,直接传入HTML字符串即可:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.thymeleaf.context.Context;
import org.thymeleaf.TemplateEngine;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.nio.charset.StandardCharsets;

// 假设这是你的邮件发送类
public class MailService {

    @Autowired 
    private JavaMailSender mailSender;
    
    @Autowired 
    private TemplateEngine stringTemplateEngine;

    public void sendMail(){ 
        // 1. 构建Thymeleaf上下文,添加需要替换的变量
        Context context = new Context();
        context.setVariable("username", "Michele"); // 示例变量
        context.setVariable("orderId", "ORD-2024-001"); // 另一个示例变量

        // 2. 定义你的静态HTML字符串模板,里面可以包含Thymeleaf表达式
        String htmlTemplate = """
            <html>
                <body>
                    <h3>Hi <span th:text="${username}"></span>,</h3>
                    <p>Your order <strong th:text="${orderId}"></strong> has been processed successfully!</p>
                    <p>Thanks for using our service!</p>
                </body>
            </html>
            """;

        // 3. 用TemplateEngine处理字符串模板,生成最终HTML内容
        String body = this.stringTemplateEngine.process(htmlTemplate, context); 

        // 4. 构建并发送邮件
        final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
        try {
            final MimeMessageHelper compose = new MimeMessageHelper(mimeMessage, StandardCharsets.UTF_8.toString());
            compose.setTo("recipient@example.com");
            compose.setSubject("Your Order Update");
            compose.setText(body, true); // 第二个参数设为true,表示发送HTML格式邮件
            
            this.mailSender.send(mimeMessage);
        } catch (MessagingException e) {
            // 这里可以添加自定义的异常处理逻辑
            e.printStackTrace();
        }
    }
}

2. 临时创建TemplateEngine(适合偶尔使用)

如果只是偶尔需要处理字符串模板,不想额外配置Bean,也可以在方法内部临时创建TemplateEngine和StringTemplateResolver:

public void sendMail(){ 
    // 临时构建TemplateEngine和字符串解析器
    TemplateEngine tempTemplateEngine = new TemplateEngine();
    StringTemplateResolver resolver = new StringTemplateResolver();
    resolver.setTemplateMode(TemplateMode.HTML);
    tempTemplateEngine.setTemplateResolver(resolver);
    
    // 构建上下文和HTML模板(和上面步骤一样)
    Context context = new Context();
    context.setVariable("username", "Michele");
    String htmlTemplate = "<html><body>Hello <span th:text=\"${username}\"></span>!</body></html>";
    
    // 处理模板
    String body = tempTemplateEngine.process(htmlTemplate, context); 

    // 后续邮件发送代码...
}

为什么你之前的代码不行?

你注释掉的this.templateEngine.process("<html>...</html>",context)之所以失效,是因为默认的TemplateEngine使用的是文件类解析器(比如ClassLoaderTemplateResolver),它会把你传入的HTML字符串当作模板文件名去寻找对应的文件,自然找不到。而StringTemplateResolver会把第一个参数直接当作模板内容来解析,这才是我们需要的行为。

内容的提问来源于stack exchange,提问作者michele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:16:43