How Velocity Works?
当在一个应用程序或是servlet中使用Velocity 的时候,通常有以下几个步骤:
1.初始化Velocity ,Velocity有两种实例,一个是单例(Singleton )一个是每次运行时一个实例(separate runtime instance)。
2.创造一个上下文环境(Context )对象。
3.往Context 里增加对象。
4.选择一个模板(template)。
5.将模板和对象一起输出。
在代码中使用单例模式,需要用到org.apache.velocity.app.Velocity这个类,通过这个类完成第一步的初始化工作和第四步的获取模板工作。下面是一个实例:
package com.javachen.velocity;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
public class HelloVelocity {
public static void main(String[] args) {
try {
Velocity.setProperty( Velocity.RUNTIME_LOG_LOGSYSTEM, this);
Velocity.init();
VelocityContext context = new VelocityContext();
context.put("name", "javachen");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
System.out));
Template template = Velocity.getTemplate("src/com/javachen/velocity/hello.vm");
template.merge(context, writer);
writer.flush();
writer.close();
} catch (ResourceNotFoundException e) {
e.printStackTrace();
} catch (ParseErrorException e) {
e.printStackTrace();
} catch (MethodInvocationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
hello.vm如下:
Hello, $name
过程是这样的:初始化 – 获取context – context 输出对像给值 – 获取模板文件 – 写模板文件 – 关闭资源 .
这只是Velocity的基本用法,现在通过一些工具jar包,可以封装这些操作,使Velocity的操作变得更加简单。
上面是Velocity单例实例,还有一个Separate Instance(单个实例)实例,可以在同一个JVM中配置并使用多个Velocity实例。为了获得Separate Instance,必须使用org.apache.velocity.app.VelocityEngine这个类。代码类似如下:
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
...
/*
* create a new instance of the engine
*/
VelocityEngine ve = new VelocityEngine();
/*
* configure the engine. In this case, we are using
* ourselves as a logger (see logging examples..)
*/
ve.setProperty(
VelocityEngine.RUNTIME_LOG_LOGSYSTEM, this);
/*
* initialize the engine
*/
ve.init();
...
Template t = ve.getTemplate("foo.vm");