邮件通知改造之Thymeleaf渲染模板生成静态页面

写在开始

上一篇 微服务架构实践之邮件通知系统改造,有简单的提到过如果使用Thymeleaf生成邮件模版。今天来跟大家详细的聊一聊,如何优雅的生成邮件内容。

实现流程

email.png

Thymeleaf

首先,我们先了解一下Thymeleaf 究竟是个什么东西。简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下四个极吸引人的特点:

  • Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
  • Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
  • Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
  • 由于微服务的盛行,Thymeleaf也是SpringBoot以及相关书籍中大量推荐的一种现代化模板技术。

服务配置

导入相关jar包

<!-- thymeleaf 模版引擎 -->
        <dependency>
          <groupId>org.thymeleaf</groupId>
          <artifactId>thymeleaf</artifactId>
          <version>3.0.0.RELEASE</version>
        </dependency>
        <dependency>  
            <groupId>org.thymeleaf</groupId>  
            <artifactId>thymeleaf-spring4</artifactId>  
            <version>3.0.0.RELEASE</version>  
        </dependency> 

注入配置spring-context.xml

<!-- 模版 -->
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolvers">
            <set>
                <ref bean="templateResolver" />
            </set>
        </property>
    </bean>
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/WEB-INF/templates/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML" />
    </bean>

编写模版example.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>邮件主题</h1>
    <ul>
        <li th:text="${email.subject}">科帮网</li>
        <li th:text="${email.content}">充值成功</li>
        <li th:text="${email.kvMap.key}">这是个钥匙</li>
    </ul>
</body>
</html>

发送类实现SendMailServiceImpl.java

public class SendMailServiceImpl implements ISendMailService {
    private static final Logger LOG = LogManager.getLogger(SendMailServiceImpl.class.getName());
    @Autowired
    private SpringTemplateEngine  templateEngine;
    @Override
    public String sendMail(MailParameter params) {
        String message = Constants.SUCCESS;
        try {
           //构造上下文(Model)
            Context context = new Context();
            context.setVariable("email", params);
            //构造静态文件地址
            String result = UUID.randomUUID().toString()+".html";
            FileWriter write = new FileWriter(Constants.TEMP+result);
            //构造模板引擎并渲染
            templateEngine.process(params.getTemplate(), context, write);
            params.setTemplate(result);
            message =   MailUtil.sendEmail(params);
        } catch (Exception e) {
            LOG.error("邮件:{} 发送异常{}",params.getEmail(),e);
            message = Constants.FAIL;
        }
        return message;
    }
}

当然这里只是提供了部分代码实现,比如实体类,邮件发送工具类并未罗列。还有就是关于Thymeleaf 标签的一些实用说明,网上很多,请自行百度。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒信息

【漏洞公告】Tomcat信息泄漏和远程代码执行漏洞【高危】

2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞...

35170
来自专栏技术碎碎念

Jsp语法、指令及动作元素

一、JSP的语法 1、JSP的模板元素:(先写HTML)    就是JSP中的那些HTML标记    作用:页面布局和美化 2、JSP的Java脚本表达式:  ...

48660
来自专栏java架构师

老生常谈GET和POST,以备常查

------------------- GET 和 POST 请求的区别 // --TCP/IP 协议详解卷3 13.3.1 报文类型:请求与响应 HTTP ...

33970
来自专栏算法+

unisound_asr 云知声 语音识别 python版接口

抽空,实现了一份云知声 语音转写的python版本。 使用python通过调用动态库实现。 云知声官网: http://dev.hivoice.cn/sdk_d...

49880
来自专栏java学习

javaEE面试题题集

1. 简述 Java Server Page 和 Servlet 的联系和区别? 2. jsp有哪些内置对象?作用分别是什么? 3. jsp有哪些动作?作用...

44970
来自专栏技术碎碎念

EL函数以及自定义标签的应用

一、EL函数(调用普通类的静态方法) 编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤): ①编写一个普通的java类,提供一个静态方法,功能自定...

42480
来自专栏IT笔记

Nginx学习之反向代理

配置静态网站 server { listen 80; server_name localhost; ...

38160
来自专栏技术碎碎念

数据的分页处理

当页面中要显示的内容过多需要分多页显示、或是数据量过大内存吃不消时,需要分页处理。 原理:每次从数据库中取出一定量的数据,通过jsp页面显示 实现: ①写一个类...

32350
来自专栏陈树义

从头学一次J2EE笔记

1、在Servlet3.5规范之前,Java Web 应用的绝大部分组件都通过web.xml 文件来配置管理, Servlet3.0 规范可通过Annotati...

31650

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励