大 蘋 果

          獻(xiàn)給Eclipse社區(qū)

           

          Velocity的事件處理

           

          Velocity提供了對模板解析過程事件的處理,用戶可以響應(yīng)模板產(chǎn)生的事件。模板事件有設(shè)置模板變量、模板參數(shù)為空以及調(diào)用模板方法時出錯等。

          要響應(yīng)模板事件可以實(shí)現(xiàn)Velocity的接口,提供相應(yīng)的處理。模板事件都繼承于“org.apache.velocity.app.event.EventHandler”接口,有如下幾個接口的實(shí)現(xiàn):

          1. ReferenceInsertionEventHandler:要實(shí)現(xiàn)的方法為referenceInsert,響應(yīng)從模板上下文給模板變量賦值。

                 2. NullSetEventHandler:要實(shí)現(xiàn)的方法為shouldLogOnNullSet,響應(yīng)當(dāng)賦值的變量為空的事件。

          3. MethodExceptionEventHandler:要實(shí)現(xiàn)的方法為methodException,響應(yīng)當(dāng)調(diào)用的方法拋出異常時的處理。

          模板的事件提供了用戶代碼和模板引擎的交互的方式,為演示三種類型的模板事件,可以通過實(shí)例進(jìn)行介紹,如例程9-10所示。

          例程9-10 模板事件的處理

          public class EventHandler implements ReferenceInsertionEventHandler,

                             NullSetEventHandler, MethodExceptionEventHandler {

           

                   public EventHandler(Context ctx) {

                             EventCartridge ec = new EventCartridge();

           

                             //添加模板事件的處理實(shí)例

                             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;

                   }

           

                   /**

                    * 處理模板調(diào)用方法拋出的異常

                    * @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());

           

                             //設(shè)置異常處理類及上下文

                             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()

          如上實(shí)例,通過ExceptionGenerator來生成異常,測試異常事件的監(jiān)聽,當(dāng)ExceptionGenerator拋出異常時

          posted on 2007-04-08 23:53 阿甘 閱讀(1133) 評論(1)  編輯  收藏

          評論

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

          學(xué)習(xí)了  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(10)

          隨筆分類

          隨筆檔案(2)

          相冊

          funny

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新泰市| 綦江县| 郴州市| 东乡族自治县| 庄浪县| 吉林市| 文昌市| 扎兰屯市| 彩票| 修武县| 封开县| 麦盖提县| 仙居县| 夏邑县| 崇州市| 永靖县| 宁夏| 龙陵县| 江安县| 陇南市| 和政县| 靖西县| 钟祥市| 嘉善县| 女性| 隆昌县| 漯河市| 彰化县| 黎平县| 临安市| 孟连| 曲松县| 绥阳县| 桐城市| 安多县| 江都市| 望江县| 东安县| 武山县| 满洲里市| 远安县|