Smarty4j
smarty4j是一个smarty for java的模板引擎,该引擎是将smarty模板从php上移植过来,需要asm-3.0.jar支持。
smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍历的方式依次生成,大致的语法结点包含语句与表达式两大基本类型,语句结点能保证JVM的语句栈在执行完毕后没有新压入的数据,而表达式结点将产生一个数据。
smarty4j结构特点[ ]
一般的结构,最顶层是一个文档结点,内部可以由三种结点组成,分别是文本结点、函数结点与输出结点
文档结点
- 文本结点
- 函数结点
- 行函数结点
- 块函数结点
- 输出结点
其中,输出结点是输出一个对象的内容,因此由对象表达式与变量调节器结点组成,对象表达式主要是由字符串表达式、NULL表达式与变量表达式组成
输出结点
- 对象表达式
- 字符串表达式
- NULL表达式
- 变量表达式
- 变量调节器结点
变量表达式又包含相关的List或者Map扩展信息 除此外,表达式结点还有浮点表达式结点、整数表达式结点与布尔表达式结点,只要是表达式结点对象,就支持在压栈过程中对这三种数值之间进行转化。
执行优化[ ]
smarty4j的块函数结点将整个文档分隔成代码块,分析每个代码块是否有变量的回写操作,如assign等。如果不存在,则会在栈内存中自动缓存相关的节点读取操作,第二次需要读取时,是直接从栈内存中读取,减少了分析和从容器中提取数据的问题。特别是针对循环操作时缓存指针变量,能大幅度提高执行的速度。
smarty4j会自动识别条件分支中的“短路”位置,一个布尔表达式结点的真或假的结果成立后,可以直接跳到if等函数指定的出口点,而不需要逐级去验证,对于复杂的布尔表达式,能小幅度的提高执行速度。
功能扩展[ ]
smarty4j的语法扩展分为几个层次:
直接用java代码实现新的函数与变量调节器[ ]
继承org.lilystudio.smarty4j.statement包下的AbstractLineFunction,AbstractBlockFunction,AbstractCustomModifier三个类可以分别实现单行函数、区块函数与变量调节器的java代码实现,新的类名以$符号开头,放置在org.lilystudio.smarty4j.statement.function与org.lilystudio.smarty4j.statement.modifier包下可以被直接引用,否则需要在配置文件中定义函数的自动搜索包。这种方式面向普通的java开发人员
实现自己特点的函数语法[ ]
继承org.lilystudio.smarty4j.statement包下的AbstractFunction、AbstractModifier或第一点中提供的接口,通过重新实现syntax或process方法来实现函数特有的语法或特定的处理方式,如if,literal,break等均是代表。使用非标准的smarty参数语法应当慎重,一般由架构人员来评估后由普通java开发人员进行。
实现自己的函数与变量调节器语法转换节点[ ]
继承org.lilystudio.smarty4j.statement包下的AbstractFunction或AbstractModifier,或者实现IFunction,IBlockFunction,IModifier接口,通过重写parse方法来生成jvm汇编代码。这种方式需要对jvm汇编了解程度较高,而且需要经常对每一个分支的测试才能使用,否则会出现虚拟机的类加载异常或者是jvm汇编校验异常。