如何在Velocity模版中使用static类

Posted on 2007-05-17 14:52 bluoy 阅读(2427) 评论(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


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


网站导航: