个人工具
名字空间
变换
操作

Smarty4j

来自站长百科
跳转到: 导航, 搜索

smarty4j是一个smarty for java的模板引擎,该引擎是将smarty模板从php上移植过来,需要asm-3.0.jar支持。

smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍历的方式依次生成,大致的语法结点包含语句与表达式两大基本类型,语句结点能保证JVM的语句栈在执行完毕后没有新压入的数据,而表达式结点将产生一个数据。

目录

smarty4j结构特点

一般的结构,最顶层是一个文档结点,内部可以由三种结点组成,分别是文本结点、函数结点与输出结点

文档结点

  • 文本结点
  • 函数结点
    1. 行函数结点
    2. 块函数结点
  • 输出结点

其中,输出结点是输出一个对象的内容,因此由对象表达式与变量调节器结点组成,对象表达式主要是由字符串表达式、NULL表达式与变量表达式组成

输出结点

  • 对象表达式
    1. 字符串表达式
    2. NULL表达式
    3. 变量表达式
  • 变量调节器结点

变量表达式又包含相关的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汇编校验异常。

相关条目

参考来源

http://www.oschina.net/p/smarty4j

留言