如何使用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
相关产品推荐
相关产品推荐

