记录使用thymeleaf 技术开发模板的收获

最近在做消息渲染的项目,总结一下过程中的收获

技术:springboot   thymeleaf模板引擎  vue

项目主要实现了自定义模板,通过参数渲染模板,然后发送(微信/邮件/短信)

 

邮件导出功能

邮件渲染出来的文件需要可以预览,正文可以通过thymeleaf直接渲染成html文件展示,附件展示需要借助文件下载来查看。

过程中发现虽然可以正常导出文件,但是后端出现了大量的报错(可能是因为我本来的controller层方法有字符串或对象作为返回值),经过试验,下面Controller的写法没有再出现报错。

@GetMapping(value="/export/{recordId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ApiOperation("邮件导出接口")
public void export(@PathVariable("recordId") String id, HttpServletResponse response) throws Exception {
     MimeMessage mimeMessage = recordService.export(id);  // 构造邮件对象
response.setContentType("application/octet-stream");
response.addHeader("content-dispostion", "attachment;filename=" + id + ".eml");
ServletOutputStream os = response.getOutputStream();
mimeMessage.writeTo(os);
os.flush();

}

过程中发现附件名过程会导致分割,可以设置下面参数来避免

System.setProperty("mail.mime.splitlongparameters", "false");

 

thymeleaf 只渲染文本,不需要html标签

众所周知,thymeleaf支持在后端渲染html内容,如果我只想使用thymeleaf来渲染一段文字,不要其中的html标签,如何实现?

实际业务场景:我需要创建一个短信模板,通过从数据库中查询出的数据来渲染短信模板,渲染后发送。希望能够支持较为丰富的语法,自己写替换${}占位符比较难以支持数组循环和if判断语法,希望借助thymeleaf来进行短信的渲染。

 

如果使用常见的thymeleaf 语法,我们可能会写成:

尊敬的客户<span th:text="${customer.name}" />,
您的<span th:text="${customer.product}" />已经购买成功

这样,如果 customer 对象值为 { name:"张三", product:"刑法" } 实际渲染出来的文本是“尊敬的客户<span>张三</span>, 您的<span>刑法</span>已经购买成功”。

其实我们更想要的是“尊敬的客户张三, 您的刑法已经购买成功”

这时可以使用 th:block 标签来实现,block是空标签,不显示。(感谢大佬 http://www.yyjjssnn.cn/articles/849.html)

尊敬的客户<th:block th:text="${customer.name}" />,
您的<th:block th:text="${customer.product}" />已经购买成功

 

posted @ 2021-08-09 18:44  国家重点扶贫攻坚对象  阅读(83)  评论(0编辑  收藏  举报