Velocity源码阅读

是一个基于Java的模板引擎 。它高效、简洁,且有很好的可扩展性,适合在Web项目中做为MVC模型中的视图,也可以在内容生成、数据转换等应用中独立使用 。本文将以源码阅读的方式,浅析的实现机制,并通过几个小例子来阐述中主要使用的技术点 。
1.下载源码
是的顶级项目 。可以从上获取最新源码,最新版本是1.7 。为了契合日常的工作,这里使用1.6.3版本做为本文基准版本,可以从获取Older 版本 。
下载:
原始的使用ant构建工程,如果要使用maven可以单独下载对应的pom文件,重命名后放入工程目录 。
下载完成后,解压,放入pom.xml,然后mvn : -=true,可以愉快的看源码了~
2.代码结构
看代码前,先来了解一下的工程目录结构:
目录说明
build/
存放一些ant构建脚本,比如可以使用ant 生成
/
到的转换程序,是老牌模板引擎,脱胎于它,参见了解它们的不同 。
docs/
开发文档,快速指南等
docs/api/
/
如何使用的几个例子
lib/
依赖的包
lib/test/
单元测试依赖的包
src/
源码包
test/
单测
xdocs/
从xml构建docs站点的源文件
2.0 ,可作为开源或商业软件再发布
-1.6.3.jar
jar

Velocity源码阅读

文章插图
-1.6.3-dep.jar
将依赖打入的 jar
2.1.Hello World !
在开始Hello World前,可以思考一下,如果是自己来设计一个模板引擎需要哪些步骤?
嗯,应该需要一个上下文变量,用于存放一些会渲染到模板中的变量;然后通过文件或是常量字符串来获取模板;模板里面掏几个占位符,用一些特殊的标记隔离出来(比如#name#);最后解析模板中的占位符,将中的变量的实际值替换进去,然后输出merge后的结果完成模板渲染 。(之前自定义短信模板这么做的,很轻巧;邮件内容较多,则使用 。)
思考过后,我们来run一个目录下的例子,找到应用程序的入口点,然后进行代码阅读,看看跟我们想的是否一样 。将/下的第一个例子/的样例文件(主要是.java、.vm、.)copy到src里 。
public class Example {public Example(String templateFile) {try {/** Velocity的初始化可以使用Velocity类通过RuntimeSingleton类的单例模式初始化,或者使用* VelocityEngine类创建并初始化 。两者用在不同的场景 。*/Velocity.init("velocity.properties");/** 构建模板上下文,放入一些将会渲染的变量 。*/VelocityContext context = new VelocityContext();context.put("list", getNames());/** 从文件获取模板:此过程会在调用Template.process()过程中生成抽象语法树AST 。这个貌似比想象的要复杂一点,* 稍后来讨论AST相关内容 。*/Template template = null;try {template = Velocity.getTemplate(templateFile);} catch (ResourceNotFoundException rnfe) {System.out.println("Example : error : cannot find template "+ templateFile);} catch (ParseErrorException pee) {System.out.println("Example : Syntax error in template "+ templateFile + ":" + pee);}/** 模板执行merge动作,将context的变量替换到template中,此过程使用到java的Introspection机制,实现了一套反射功能 。*/BufferedWriter writer = writer = new BufferedWriter(new OutputStreamWriter(System.out));if (template != null)template.merge(context, writer);/** flush and cleanup,放finally比较好,虽然只是测试代码*/writer.flush();writer.close();} ...}...}
通过阅读和执行例子,我们看到运转时的几个关键步骤:
1.引擎初始化 。
2.获取模板文件并解析生成AST 。