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