Posted on 2007-05-17 14:52
bluoy 閱讀(2450)
評論(0) 編輯 收藏
開發要求:
為了便于維護,頁面端js中的錯誤信息要求不能硬編碼,要根據java端定義的Message對應的常量Key動態獲得。
按照velocity常規做法,無法用VTL語言使用static類。調查了一下,原來velocity還是提供了變通了的實現方案的,官方論壇上還有就這一問題的爭論--“
Add Support for Static Utility Classes”。
基本上集中于兩種思路:static class wrapper 和 put class into context。
前者就是作一個static class 的托管類,將托管類的實例放到context中。
1.3.1版中對應實現為org.apache.velocity.app.FieldMethodizer。
后者的想法是先把static類的Class放到context中,然后模版引擎在碰到Class對象時,優先在java.lang.Class中尋找對應的調用,然后再查找static class的調用。個人感覺這種思路比較好,用戶使用比較簡單直接,不需要額外的wrapper類。但官方好像更鐘情于前者。計劃在未來的1.6版中提供支持。
附帶遇到的其他限制:
1.
velocity 1.3.1版不能正常處理jdk1.5中的
可變參數(Varargs) 特性。可變參數(Varargs) 其實使用對應類型的數組來實現的。velocity會因為匹配不到對應的函數原型而調用失敗。其他版本未作驗證。
2. velocity 1.3.1版不能正常處理jdk1.5中的enum特性。因為enum其實是按類來對待的。而velocity內部對類的處理是“取得所有的public的Methods”。所以類內部定義的enum類型的常量無法取到。這個處理請參見:org.apache.velocity.util.introspection.ClassMap。
3. velocity只能調用類/對象的methods, 無法直接使用public的attributs。原因如2。同時可以參照
Access to public member variable of a class