大 苹 果

献给Eclipse社区

 

Velocity的事件处理

 

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

 

$exception.generate()

如上实例,通过ExceptionGenerator来生成异常,测试异常事件的监听,当ExceptionGenerator抛出异常时

posted on 2007-04-08 23:53 阿甘 阅读(1126) 评论(1)  编辑  收藏

评论

# re: Velocity的事件处理 2007-06-26 20:39 bearhunter

学习了  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(10)

随笔分类

随笔档案(2)

相册

funny

搜索

最新评论

阅读排行榜

评论排行榜