官网
引用:https://www.dazhuanlan.com/meaninglessbuzz/topics/1450555

ST (StringTemplate) 是一个 java 模板引擎,用于生成源代码、网页、电子邮件或任何其他格式化的文本输出。 相比较与常见的模板,如FreeMarker,Velocity。ST 更加强大,也更加复杂

ANTLR (ANother Tool for Language Recognition)(另一种语言识别工具)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。

引入ST依赖

<dependency><groupId>org.antlr</groupId><artifactId>ST4</artifactId><version>4.3</version><scope>compile</scope>
</dependency>

入门

模板(ST)

本质上,ST 的语法很简单,分为两个部分:文本和属性表达式 (attribute expressions)。

  • 文本部分会被原样输出。
  • 属性表达式会被求值后输出。
    @Testpublic void test01(){ST hello = new ST("Hello <name>");hello.add("name","World");System.out.println(hello.render()); // Hello World}

<name>就被替换为了World,所以合起来的输出是Hello World

分隔符
默认属性表达式使用尖括号包围,当然这个是可以自定义的,比如如果你要生成 HTML 代码,用尖括号就非常麻烦了,可以改用%。比如上面的例子中的模板:

    @Testpublic void test01_delimiter(){ST hello = new ST("Hello %name%",'%','%');hello.add("name","World");System.out.println(hello.render()); // Hello World}

模板组(Groups of templates)

代码生成是具有复杂逻辑的,一般不会在一个模板中搞定,而是分解为多个小的模板,然后拼装起来
ST 的模板更加强大,可以有输入参数,写起来和编程语言很类似。一个模板组里可以定义多个模板,只有在同一个模板组里的模板才可以互相调用

API创建-模板组

    @Testpublic void test_group1(){STGroup stGroup = new STGroup();//defineTemplate 需要三个参数,分别是模板名称,模板参数,模板内容stGroup.defineTemplate("template1","input1","【 <input1> 】");//调用 template1 内容stGroup.defineTemplate("template2","input2","Hello <template1(input2)>");ST st = stGroup.getInstanceOf("template2");st.add("input2","World");System.out.println(st.render()); // Hello 【 World 】}

文件中读入模板组

文件
resources目录下,创建模板文件:/tmp/test.stg,内容如下

/*** <type> : 使用入参* <init(value)>: 调用方法*/
decl(type, name, value) ::= "<type> <name><init(value)>;"
init(v) ::= "<if(v)> = <v><endif>"

执行

    @Testpublic void test03_template_file(){STGroup group = new STGroupFile("tmp\\test.stg");ST st = group.getInstanceOf("decl");st.add("type", "int");st.add("name", "x");st.add("value", 0);System.out.println(st.render()); // int x = 0;}

字符串读取模板组

    @Testpublic void test04_template_String(){String s = "say(name) ::= \"hello, <name>.\"";STGroup group = new STGroupString(s);ST st = group.getInstanceOf("say");st.add("name", "zhangsan");System.out.println(st.render()); //hello, zhangsan.}

向模板赋值

传递数组

如果多次 add 同一个参数的值,是不会覆盖的,而是追加,也就是每个参数其实是一个数组:

    @Testpublic void test04_template_multi_String(){String s = "say(name) ::= \"hello, <name>.\"";STGroup group = new STGroupString(s);ST st = group.getInstanceOf("say");st.add("name", "zhangsan");st.add("name", "lisi");System.out.println(st.render()); //hello, zhangsanlisi.}

控制多个值的输出格式

    @Testpublic void test04_template_array1_String(){// say(name) ::= "hello, <name;separator=",">"    //设置分隔符String s = "say(name) ::= \"hello, <name;separator=\\\",\\\">.\"";STGroup group = new STGroupString(s);ST st = group.getInstanceOf("say");st.add("name", "zhangsan");st.add("name", "lisi");System.out.println(st.render()); //hello, zhangsan,lisi.}

使用模板来处理每一个元素

模板内容

say(name) ::= "hello, <name:bracket();separator=",">"
bracket(x) ::= "(<x>)"

执行程序

st.add("name", "mushan");
st.add("name","willing");// 输出: hello, (mushan),(willing)

匿名模板

模板

say(name) ::= "hello, <name:{x|[<x>]};separator=",">"

执行程序

st.add("name", "mushan");
st.add("name","willing");// 输出: hello, [mushan],[willing]

传递对象

定义对象

public static class User {public int id; // template can directly access via u.idprivate String name; // template can't access this -- 私有属性无法访问public User(int id, String name) { this.id = id; this.name = name; }public boolean isManager() { return true; } // u.managerpublic boolean hasParkingSpot() { return true; } // u.parkingSpotpublic String getName() { return name; } // u.namepublic String toString() { return id+":"+name; } // u
}

属性的范围是比较简单的,仅可以访问public属性
方法的访问有一套映射关系,比如对于o.p,st 会在类上尝试访问getP(), isP(), hasP(),如果都不存在,则会报错。

执行程序

ST st = new ST("<b>$u.id$</b>: $u.name$", '$', '$');
st.add("u", new User(999, "parrt"));
String result = st.render(); // "<b>999</b>: parrt"

可以看到在 ST 模板中使用 Java 类是非常简单的。但是和 js 中直接使用 json 相比,Java 中定义一个类,只是为了传递数据就定义一个类是非常繁琐的,
还好,ST 为我们提供了一种简便的方法来传递对象性质的信息:

//模板
//introduction(person) ::= "I'm <person.name>, I'm <person.age> years old."st = stGroupFile.getInstanceOf("introduction");
st.addAggr("person.{name,age}","mushan",18); // addAggr
System.out.println(st.render());// 输出: I'm mushan, I'm 18 years old.


StringTemplate 模板语

ST 模板的语法很丰富,可以实现复杂逻辑,以处理复杂的代码生成需求。上面我提到的语法是最常用的语法,全面的模板语法可以参考stringtemplate4/cheatsheet.md

StringTemplate模板引擎相关推荐

  1. 【原创】推荐一个模板引擎 - templateengine

    一直都在使用StringTemplate模板引擎,虽然使用方便,但是功能实在太弱太弱,准备放弃使用StringTemplate.刚好碰巧发现了另外一个开源的模板引擎,就是今天要介绍的TemplateE ...

  2. 【ST4】Java 中的模板引擎 StringTemplate

    1.概述 StringTemplate是一种基于java的模板引擎库,类似于velocity,FreeMarker.可以用于生成源代码.web页面.电子邮件等多种样式的文本.选择StringTempl ...

  3. Java开源模板引擎

    Velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象 ...

  4. SpringBoot (三) :SpringBoot使用Freemarker模板引擎渲染web视图

    什么是Freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而 ...

  5. SpringBoot-web开发(三): 模板引擎Thymeleaf

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) 目录 1. 引入 ...

  6. php codeigniter 语言,php – codeigniter模板引擎,包括语言解析器

    不幸的是,CI内置的模板解析器类没有此功能.你可以在 sparks directory中环顾四周,有多个火花集成了许多模板引擎,如smarty或twig,可以通过调整来创建这样的东西. 此外,您可以尝 ...

  7. php smarty模板引擎 性能,smarty性能低?直接使用php模板引擎吧

    skymvc框架使用的php模板引擎 1.[代码][PHP]代码 class smarty{ public $template_dir = '';//模版文件夹 public $cache_dir = ...

  8. java freemarker 模版_Java模板引擎-FreeMarker

    简介: FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.FreeMarker我们的第一印象是用来替代JSP的,但是与JSP不同的是FreeMarker模板可 ...

  9. 模板引擎:VelocityFreeMarker(转)

    Velocity,名称字面翻译为:速度.速率.迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts(Taglib和Tiles)是如何联系?在技 ...

最新文章

  1. 解析卷积的高速计算中的细节,一步步代码带你飞
  2. 前端(一)——HTML之基本标签、图片标签、超链接、锚链接
  3. 初探swift语言的学习笔记七(swift 的关健词)
  4. 如何修改服务器Tomcat的首页为项目
  5. 【PAT乙】1005 继续(3n+1)猜想 (25分)
  6. Vue-CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件
  7. mysql的驱动jar包下载
  8. 谋学网计算机维修,19秋学期西交《计算机组成原理》在线作业1(标准答案).doc...
  9. c语言程序设计的反思,C语言程序设计教学反思
  10. java英文翻译_Java实现英文文本单词翻译器功能的简单实例
  11. c语言逗号分隔字符串,[数字用逗号隔开怎么读]看到一个数字中间有逗号
  12. 使用Scylla获取免费代理IP
  13. 超好看的辅助网站源码
  14. matlab x的平均值符号怎么打出来,教你在Word中输入平均数的符号X上加一横(X拔)...
  15. WPS文档消除格式并消除大片空白格
  16. 企业短信平台 php,梅州PHP短信平台企业,PHP短信平台
  17. java如何实现动态时钟_Java实现动态数字时钟
  18. pytorch torchvision.ops.roi_align
  19. (01)ORB-SLAM2源码无死角解析-(62) BA优化(g2o)→追踪线程:Optimizer::PoseOptimization→仅位姿优化
  20. 【面向对象应用~.~】——项目开发团队分配管理软件

热门文章

  1. 快速web开发框架——learun framework
  2. MathType 快捷键隐藏章节符
  3. 探索数藏未来 秦储数字藏品座谈会成功召开
  4. 基于FPGA的UART串口通信实验(VHDL语言实现)
  5. dell电脑如何安装ubuntu系统_Dell台式机安装Ubuntu 16.04注意事项( Alienware R6)
  6. 计算机三级网络技术大题详解,教你快速拿到60分,附三级题库绿色免安装
  7. 做短视频必须要知道的几个视频设置参数,爆款必备。
  8. Linux的基本使用和程序部署
  9. 【汇正财经】企业资本的具体形式
  10. Android 动态修改app名称(市场和手机中显示两个不同的名称)