前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符串模板

字符串模板

作者头像
一个架构师
发布2022-06-27 15:22:35
6960
发布2022-06-27 15:22:35
举报
文章被收录于专栏:从码农的全世界路过

StringTemplate4是一种基于java的模板引擎库;类似于velocity, FreeMarker. 可以用于生成源代码, web页面, 电子邮件等多种样式的文本. StringTemplate4拥有比其他模板引擎更加强大的功能.

1. 字符串应用

解析简单字符串, 并替换模板中内容.

示例代码:

代码语言:javascript
复制
ST hello = new ST("Hello");
hello.add("name","World");
Assert.assertEquals("Hello World", hello.render());

解析字符串, 并将数据以JAVA对象方式传入.

代码语言:javascript
复制
ST st = new ST(":",'<','>');
st.add("user", new User(1, "jack"));
Assert.assertEquals("1: jack", st.render());

public class User {
    private int id;
    private String name;
    public User(int id, String name) { this.id = id; this.name = name; }
    public String getName() { return name; }
    public int getId() { return id; }
}

模板错误信息捕获

代码语言:javascript
复制
ErrorBuffer error = new ErrorBuffer();
STGroup group = new STGroup();
group.setListener(error);
String template = "hi!";
ST st = new ST(group, template);
Assert.assertEquals("hi !", st.render());
Assert.assertTrue((error.errors.get(0).toString()).contains("attribute name isn't defined"));

2. 模板格式

在实际应用中, 很多场景都是以文件形式存储, 或者是带有一定要求的复杂格式模板.

按内容格式要求严格与否可以分为两种: 多行内容模板, 忽略换行符与缩进符的多行内容模板

2.1 多行内容模板

代码语言:javascript
复制
/** 模板外注释 */
templateName(args, agrs, ...) ::= <<

模板内容
模板内容
>>
代码语言:javascript
复制
2.2 忽略换行符和缩进的多行内容模板
代码语言:javascript
复制
/** 模板外注释 */
templateName(args, agrs, ...) ::= <%
模板内容
模板内容
%>

3.邮件内容模板

我们以邮件模板为例, 看下在复杂格式和数据的情况下StringTemplate的应用.

代码语言:javascript
复制
3.1 模板内容

一起看下通知用户的消费情况模板内容.

模板名称为email;

传入参数为[user]和[info];

其中要求在不存在用户名时, 以[用户]显示;

按格式显示多笔消费情况.

代码语言:javascript
复制
/** 邮件模板 */
email(user, info) ::= <<
<! 模板内注释 !>
<if(user.name)><user.name><else>用户<endif>, 您好!

您最近花费:
<info.items:{item|<item.name> -- <item.count; format="currency"> -- <item.date>};separator="\n">
共计: <info.total; format="currency">
谢谢!
>>
代码语言:javascript
复制
3.2 模板数据逻辑

指定模板名称, 并填入相关用户数据(user)和消费信息(info).

在输出内容中, 日期和金额显示需要注册自定义显示格式.

代码语言:javascript
复制
@Test
public void email() {
  STGroup group = new STGroupFile("email.stg");
  group.registerRenderer(BigDecimal.class, new BigDecimalRenderer());
  group.registerRenderer(Date.class, new DateRenderer());
  ST st = group.getInstanceOf("email");
  User user = new User(1, "孙悟空");
  st.add("user", user);
  Item item1 = new Item("吃饭",new BigDecimal(111), new Date());
  Item item2 = new Item("喝水",new BigDecimal(22), new Date());
  List list = new ArrayList();
  list.add(item1);
  list.add(item2);
  Info info = new Info(list, new BigDecimal(133));
  st.add("info", info);
  System.out.println(st.render());
}

@Data
@AllArgsConstructor
public class Info {
  Listitems;
  BigDecimal total;
}

@Getter
@AllArgsConstructor
public class Item {
  String name;
  BigDecimal count;
  Date date;
}
代码语言:javascript
复制
3.3 自定义格式

对于金额需要自定义格式化处理, 需实现AttributeRenderer接口, 并指定[format]值, 此值需要与模板中的[format]属性匹配.

代码语言:javascript
复制
static class BigDecimalRenderer implements AttributeRenderer{
  private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("##,##0.00", DecimalFormatSymbols.getInstance(Locale.CHINA));

  @Override
  public String toString(BigDecimal value, String formatString, Locale locale) {
    if (formatString.equals("currency")) {
      NumberFormat numberFormat = DECIMAL_FORMAT;
      String formatted = "¥"+numberFormat.format(value);
      return formatted;
    }
    return value.toString();
  }
}
代码语言:javascript
复制
3.4 输出结果

一起看下输出结果

代码语言:javascript
复制
孙悟空, 您好!
您最近花费:
吃饭 -- ¥111.00 -- 22-4-6 下午6:03
喝水 -- ¥22.00 -- 22-4-6 下午6:03
共计: ¥133.00
谢谢!
代码语言:javascript
复制
3.5 pom.xml
代码语言:javascript
复制
<dependency>
  <groupId>org.antlr</groupId>
  <artifactId>ST4</artifactId>
  <version>4.0.8</version>
</dependency>

通过上面的例子可以发现StringTemplate4是很容易上手, 并且功能比较完善强大的模板引擎.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从码农的全世界路过 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档