Velocity源码分析(一)——概述
Velocity模板引擎处理机制分为五个基本步骤:
整个处理流程如下图所示:

根节点下有三个子节点:
Velocity引擎在这里有个优化策略,可以针对生成的语法树进行cache。
3.创建context并设置参数Context context = new VelocityContext();
context.put("foo", "VV");
创建一个context,并在其中放入一个foo=VV的参数。
当执行tp.merge(context, writer);时,模板遍历其对应的AST树,执行每个节点的渲染过程。如ASTText节点只是简单的将文本写入writer。ASTReference节点需要从context中获取引用的参数foo的值VV,将$foo替换,并写入到writer中。Velocity的AST中有多种节点,如ASTIdentitor等,有些需要反射机制处理。当整个AST遍历结束,也就意味着模板渲染结束,渲染的结果位于writer流中。
三、关于AST解析Velocity作为模板语言,其核心在与模板文件的解析,构建AST。Velocity的解析器是通过JavaCC构建的,JavaCC(Java Complier Complier)是一个用于生成解析器的工具,可以根据语法定义(.jj文件)生成用于校验一份文本是否符合该语法定义的java代码。JJTree是JavaCC中提供的一种根据语法定义(.jjt文件)生成构建符合该语法定义的文本的语法树的java代码的工具。
Velocity源码包中提供了用于构建velocity语法解析的的jjt文件,位于src/parser/Parser.jjt。可以自己手动从源码构建Velocity的解析器。步骤如下:
1.下载安装JavaCC,到http://javacc.java.net/下载即可,velocity的解析器需要3.2版本以上。下载后解压即可。
2.使用JJTree生成节点定义:
$ javacc-5.0/bin/jjtree Parser.jjt
这一过程中会生成节点定义的Java文件和Parser.jj语法定义文件
3.使用JavaCC生成解析器
$ javacc-5.0/bin/javacc Parser.jj
最终会生成Parser.java解析器和个节点定义。
《Velocity Developer Guide》http://velocity.apache.org/engine/devel/developer-guide.html
《JavaCC》http://javacc.java.net/
《Velocity源码分析》http://www.khotyn.com/2011/07/22/velocity_sourcecode/
《Velocity的一些优化记录》http://agapple.iteye.com/blog/1051724
?