当前位置:  软件>java软件

Java模板引擎 smarty4j

    来源:    发布时间:2015-02-22

    本文导语:  smarty4j是一个smarty for java的模板引擎,该引擎是将smarty模板从php上移植过来,需要asm-3.0.jar。 smarty4j将文本解析成语法树,然后根据语法树生成Java Code的字节码,相当于一个基于JVM的smarty语法的编译器。语法树的生成采用左序遍...

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

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

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

  • 文档结点
    • 文本结点
    • 函数结点
    • 行函数结点
    • 块函数结点
    • 输出结点

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

  • 输出结点
    • 对象表达式
    • 字符串表达式
    • NULL表达式
    • 变量表达式
    • 变量调节器结点

变量表达式又包含相关的List或者Map扩展信息 除此外,表达式结点还有浮点表达式结点、整数表达式结点与布尔表达式结点,只要是表达式结点对象,就支持在压栈过程中对这三种数值之间进行转化。

执行优化

smarty4j的块函数结点将整个文档分隔成代码块,分析每个代码块是否有变量的回写操作,如assign等。如果不存在,则会在栈内存中自动缓存相关的节点读取操作,第二次需要读取时,是直接从栈内存中读取,减少了分析和从容器中提取数据的问题。特别是针对循环操作时缓存指针变量,能大幅度提高执行的速度。 smarty4j会自动识别条件分支中的“短路”位置,一个布尔表达式结点的真或假的结果成立后,可以直接跳到if等函数指定的出口点,而不需要逐级去验证,对于复杂的布尔表达式,能小幅度的提高执行速度。

功能扩展

smarty4j的语法扩展分为几个层次:

1.直接用java代码实现新的函数与变量调节器

继承org.lilystudio.smarty4j.statement包下的AbstractLineFunction,AbstractBlockFunction,AbstractCustomModifier三个类可以分别实现单行函数、区块函数与变量调节器的java代码实现,新的类名以$符号开头,放置在org.lilystudio.smarty4j.statement.function与org.lilystudio.smarty4j.statement.modifier包下可以被直接引用,否则需要在配置文件中定义函数的自动搜索包。这种方式面向普通的java开发人员

2.实现自己特点的函数语法

继承org.lilystudio.smarty4j.statement包下的AbstractFunction、AbstractModifier或第一点中提供的接口,通过重新实现syntax或process方法来实现函数特有的语法或特定的处理方式,如if,literal,break等均是代表。使用非标准的smarty参数语法应当慎重,一般由架构人员来评估后由普通java开发人员进行。

3.实现自己的函数与变量调节器语法转换节点 

继承org.lilystudio.smarty4j.statement包下的AbstractFunction或AbstractModifier,或者实现IFunction,IBlockFunction,IModifier接口,通过重写parse方法来生成jvm汇编代码。这种方式需要对jvm汇编了解程度较高,而且需要经常对每一个分支的测试才能使用,否则会出现虚拟机的类加载异常或者是jvm汇编校验异常。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java 3D图形引擎 Catcake
  • Java 业务规则引擎 Drools
  • Java的演绎法规则引擎 JEOPS
  • 嵌入式 Java HTTP引擎 AsyncWeb
  • Java 规划引擎 JBoss OptaPlanner
  • Java规则引擎 Mandarax
  • Java表达式引擎 Aviator
  • Java工作流引擎 OpenWFE
  • 开发java下的数据库程序,用什么数据库引擎?
  • 运行ActiveSheets的Java引擎 RefleX
  • Java规则引擎 Hammurapi Rules
  • 高性能的Java 3D引擎 Xith3D
  • jade 模版引擎的 Java 实现 Jade4j
  • UIMA分析引擎 UIMA Java
  • java规则引擎 JRuleEngine
  • Java门户引擎 Lutece
  • Java的索引-搜索引擎 IndexTank
  • Java金融信息交换引擎 QuickFIX/J
  • Java算术引擎 Arity
  • Robocode通过高级机器人战斗仿真引擎学习 Java 编程
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3