是一种模板工具,完成模板和动态数据的合并。
作用
1. 进行web开发
2. 自动的Email生成。。
3. XML转换。Velocity提供了一个叫Anakia的Ant任务,这个任务能读入一个XML文件并将之转换成Velocity模版。一个常见的应用是将保存为通用"xdoc"格式的文件转换成HTML文档。
4. 它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为、web开发架构提供模板服务(template service)。
简单示例
Java程序
Velocity.init();
VelocityContext context = new VelocityContext();
//向context 中放入要在模板中用到的数据对象
context.put( "name", new String("Velocity") );
context.put(“words”, new ArrayList());
Template template = Velocity.getTemplate("mytemplate.vm");
模板文件 *.vm:
这是 ${name} !
VTL
VTL中有俩种,#和$分别代表函数和变量。
仅仅把VTL做为插入信息到文本的工具,不要再VTL中改变对象,尽量不要使用Iterator和Enumeration(List和Set代替)。
组成:
1. 变量和对象,如 ${person.name} ${i}
2. 控制语句 #if #elseif #else #foreach #break
3. Directive
#include 包含文件,不使用velocity解析
#parse 包含文件,并使用velocity解析
#evaluate 执行字符串,类似于js中的eval
#define,类似于c中的使用
#define( $hello ) Hello $who
#end #set( $who = "World!") $hello ## displays Hello World!
#macro 定义 Velocimacro (可重复的VTL模板的代码段),类似于函数
4. 注释
## 或者 #* *#
5. 不对内容解析: #[[ ]]#
参考网址: http://velocity.apache.org/engine/devel/vtl-reference-guide.html
调用函数
vm模板可以直接执行对 java对象的调用,如下
#set($myarr=[“a”,”b”,”c”]);
$foo.bar($myarr);
当在vm中使用 set将对象加入context后,模板合并输出后,java对象可以访问这些对象。
可以通过函数来获取数据,但不如果函数修改了对象状态,则不建议在模板中调用
事件处理
预定义了三种事件处理接口:NullSetEventHandler ReferenceInsertionEventHandler MethodExceptionEventHandler
Resource Loader
定义从什么地方加载资源。有FileResourceLoader JarResourceLoader ClassPathResourceLoader DataSourceResourceLoader,WebappResourceLoader(在webapps中用的较多,属于VelocityTools)
velocity配置
在velocity.properties文件中对velocity的一些参数进行配置。默认的配置信息在:/src/java/org/apache/velocity/runtime/defaults/velocity.
配置属性如下:
日志相关:
Rntime.log 指定日志路径和文件名
Runtime.log.error.stacktrace=false
Runtime.log.warn.stacktrace=false 指定日志的显示级别
Runtime.log.invalid.references=true 引用无效时输出日志
编码方式:
Input.encoding 指定模板的编码方式
Output.encoding 输出流的编码方式
Foreach循环
Directive.foreach.counter.name 循环计数的名称
Directive.foreach.counter.initial.value 计数的起始值
#include和#parse
Directive.include.output.errormsg.start
Directive.include.output.errormsg.end 定义错误消息标记
资源加载
webapp.resource.loader.path=/WEB-INF/mytemplates/
宏
就是类似于函数定义
多实例和单实例
最简单的情况,在程序中只有一个context。
可以使用VelociytEngine组织多个cotnext。
context chaining:连接多个独立的velocity的context,以便在template中使用