什么是StringTemplate4

StringTemplate4是轻量级模板引擎,Antlr 组织开发,主要用于java代码,网页,邮件,或其他格式化文本的生成,只有一个依赖项。

模板引擎都有语法,如果我们要使用,就必须掌握语法。这里是StringTemplate4 项目地址,本文不讲解语法,只是用一个简单的示例,展示StringTemplate4的功能。

使用版本:

  • JDK 11
  • StringTemplate4 4.3.1

开发项目

在POM文件中引入项目依赖

    <dependencies><dependency><groupId>org.antlr</groupId><artifactId>ST4</artifactId></dependency></dependencies>

编写EMail模板文件email.stg,存放到resources目录下,文件内容如下:

email(order,separator) ::= <<
<! This is a comment
!>Hello, <if(order.customer.firstName)><order.customer.firstName><else>dear customer<endif>!On <order.orderDate> we received the following order:Shipping address:
<if(order.customer.firstName)><order.customer.firstName> <endif><order.customer.lastName>
<order.customer.address><order.items:{item|<item.amount>x <item.article.name> à <item.article.price; format="currency"> = <item.subTotal; format="currency">};separator="\n">
<if(!order.freeShipping)>plus shipping = <order.shippingCost; format="currency"><endif>
<separator>
Total = <order.total; format="currency">Thank you for ordering!
>>

使用StringTemplate4格式化非常简单,如下:

STGroup group = new STGroupFile("email.stg");
ST st = group.getInstanceOf("email");
st.add("order", order);
st.add("separator", "----------------");System.out.println(st.render());

其中 order 变量就是数据。格式化的Email内容输出到控制台。格式化结果如下:

Hello, Oliver!On Fri Jan 28 14:35:02 CST 2011 we received the following order:Shipping address:
Oliver Zeigermann
Gaußstraße 180
22765 Hamburg
GERMANY1x How to become famous à 17.80 = 17.80
2x Cool stuff à 1.00 = 2.00
plus shipping = 3.00
----------------
Total = 22.80Thank you for ordering!

如果我们需要Order(订单)中关于金钱的信息格式化输出,该如何操作?这个很简单,我们需要定义格式化金钱的类(BigDecimalRenderer.java):

public static class BigDecimalRenderer implements AttributeRenderer<BigDecimal> {private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("##,##0.00", DecimalFormatSymbols.getInstance(Locale.GERMANY));private static final String EURO_CHARACTER = "\u20AC";@Overridepublic String toString(BigDecimal value, String formatString, Locale locale) {if (formatString.equals("currency")) {NumberFormat numberFormat = DECIMAL_FORMAT;String formatted = numberFormat.format(value) + " "+ EURO_CHARACTER;return formatted;}return value.toString();}}

然后注册实例即可,如下:

        STGroup group = new STGroupFile("email.stg");group.registerRenderer(Date.class, new DateRenderer());group.registerRenderer(BigDecimal.class, new BigDecimalRenderer());ST st = group.getInstanceOf("email");st.add("order", order);st.add("separator", "----------------");System.out.println(st.render());

DateRenderer是日期格式化类,框架自带的。

最后

本文的全部代码,可以在这里查看string-template4,感谢支持!

Java模板引擎StringTemplate4 - EMail模板格式化相关推荐

  1. 由浅入深:自己动手开发模板引擎——置换型模板引擎(四)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  2. 由浅入深:自己动手开发模板引擎——置换型模板引擎(三)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  3. 由浅入深:自己动手开发模板引擎——解释型模板引擎

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  4. 由浅入深:自己动手开发模板引擎——置换型模板引擎(二)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  5. 由浅入深:自己动手开发模板引擎——置换型模板引擎(一)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  6. 由浅入深:自己动手开发模板引擎——解释型模板引擎(二)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  7. 实现一个简单的模板引擎,输入模板和数据,输出html

    实现一个简单的模板引擎,输入模板和数据,输出html 示例: 输入: "<div>{{$1}}({{$2}}){{$3}}</div>",["第一 ...

  8. php2twig,symfony2 twig模板引擎,symfony2twig模板_PHP教程

    symfony2 twig模板引擎,symfony2twig模板 1.基本语法 Says something:{{ }} Does something:{% %} Comment something: ...

  9. Node.js(二)——pug模板引擎,nunjucks模板引擎,在koa中使用pug和nunjucks模板引擎

    目录 1.知识点及课堂目标 2.模板引擎 3.pug模板引擎使用 3.1安装pug 3.2pug常用语法 3.2.1通过缩进关系,代替以往html的层级包含关系. 3.2.2html 元素属性/sty ...

最新文章

  1. 杀死本地80端口被占用的进程,还你一片宁静乐土
  2. 播放[.m3u8]链接解决方案
  3. javascript中this
  4. Netty实战 IM即时通讯系统(十二)构建客户端与服务端pipeline
  5. Icon class生成器(Python)
  6. aws cognito_AWS Cognito的用户管理—(2/3)核心功能
  7. Python中MySQLdb的各种常见用法
  8. UI登陆页面素材|让设计师在竞争中脱颖而出
  9. java 类一定要声明成public_java测试题(四)--答案
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_15_常用的函数式接口_Predicate接口练习-集合信息的筛选...
  11. 易筋SpringBoot 2.1 | 第十九篇:SpringBoot的常用注解
  12. 如何注册Google Voice账号(电话号码)
  13. Beginning Lua with World of Warcraft Add-ons第三章翻译总结及一些工具
  14. 《Neural Architectures for Nested NER through Linearization》
  15. 1041: 数列求和1
  16. 如何用Java设计一个简单的窗口界面(初级二)
  17. ZUCC_离散数学基础__简单期末复习整理
  18. 中船嘉年华(上海)邮轮有限公司正式宣布落户上海宝山区;“乐高(R)奇妙花园探秘之旅”于宋庆龄文化空间启程 | 全球旅报...
  19. 股指期货的理论价格与期限套利
  20. 【手机电子杂志制作】云展网教程 | 如何隐藏/显示使用说明(移动端)

热门文章

  1. Android11.0(R) framework 新增类 lint 编码检查问题
  2. POJ-2676 Sudoku(简单数独-dfs深搜)
  3. js 预处理网页字体大小
  4. windows系统电脑com端口号太多烦人,怎么删除
  5. 计算机学院实验员岗位基本知识,计算机实验教学中心管理人员岗位职责.doc
  6. Maven仓库(本地仓库+远程仓库)
  7. 全废话SQL Server统计信息(2)——统计信息基础
  8. linux系统工程师的前途在哪里?
  9. Java数据结构-约瑟夫 作者:哇塞大嘴好帥(哇塞大嘴好帅)
  10. DETR代码学习(五)之匈牙利匹配