Velocity提供了对模板解析过程事件的处理,用户可以响应模板产生的事件。模板事件有设置模板变量、模板参数为空以及调用模板方法时出错等。
要响应模板事件可以实现Velocity的接口,提供相应的处理。模板事件都继承于“org.apache.velocity.app.event.EventHandler”接口,有如下几个接口的实现:
1. ReferenceInsertionEventHandler:要实现的方法为referenceInsert,响应从模板上下文给模板变量赋值。
2. NullSetEventHandler:要实现的方法为shouldLogOnNullSet,响应当赋值的变量为空的事件。
3. MethodExceptionEventHandler:要实现的方法为methodException,响应当调用的方法抛出异常时的处理。
模板的事件提供了用户代码和模板引擎的交互的方式,为演示三种类型的模板事件,可以通过实例进行介绍,如例程9-10所示。
例程9-10 模板事件的处理
public class EventHandler implements ReferenceInsertionEventHandler,
NullSetEventHandler, MethodExceptionEventHandler {
public EventHandler(Context ctx) {
EventCartridge ec = new EventCartridge();
//添加模板事件的处理实例
ec.addEventHandler(this);
//添加模板上下文
ec.attachToContext(ctx);
}
/**
* 处理引用值的插件
* */
public Object referenceInsert(String reference, Object data) {
System.out.println("referenceInsert: " + reference + " data: " + data);
return data;
}
/**
* 处理空值
* @param lhs 被赋值变量
* @param rhs 将要赋的值
* */
public boolean shouldLogOnNullSet(String lhs, String rhs) {
System.out.println("Null:");
System.out.println("lhs:" + lhs + " rhs:" + rhs);
return true;
}
/**
* 处理模板调用方法抛出的异常
* @param cls 抛出异常的类
* @param method 抛出异常的方法
* @param e 抛出的异常
* */
public Object methodException(Class cls, String method, Exception e)
throws Exception {
return "An " + e.getClass().getName() + " was thrown by the " + method
+ " method of the " + cls.getName() + " class ["
+ e.getMessage() + "]";
}
public static void main(String[] args) throws Exception {
Velocity.init();
Template t = Velocity.getTemplate("./src/eventHandler.vm");
Context ctx = new VelocityContext();
ctx.put("person", "Joe");
ctx.put("exception", new ExceptionGenerator());
//设置异常处理类及上下文
EventHandler hdl = new EventHandler(ctx);
Writer writer = new StringWriter();
t.merge(ctx, writer);
System.out.println(writer);
}
}
public class ExceptionGenerator {
public String generate() throws Exception {
Random rnd = new Random();
int x = rnd.nextInt(5);
if (x == 2) {
throw new Exception("Unlucky!");
} else {
return "No Exception";
}
}
}
模板文件eventHandler.vm
#set($myNull1 = $testNull)
This is $person
如上实例,通过ExceptionGenerator来生成异常,测试异常事件的监听,当ExceptionGenerator抛出异常时