Struts2 下自定义 VelocityContext
但凡使用过Velocity的人都会有这样的感觉,虽然它有几个内置的对象供我们使用(request、session、 application、attr等),但是,在开发过程中,仅这几个内置的对象并不能完全满足我们的需要。今天我们就要讲讲,在Struts2下面,如何扩展Velocity,自定义出我们的内置对象。
首先需要了解的是,在vm页面中调用Velocity自带的内置对象时,Velocity都会在VelocityContext中进行搜索,例如,在页面中有如下语句:
$request.test
当Velocity引擎发现有该语句后,会在VelocityContext中查找request对象,并调用request的getAttribute("test")方法。
即然Velocity引擎是通过查找VelocityContext中的对象来处理问题的,那么我们是不是可以在VelocityContext中加入自己的对象来完成这个功能呢?答案当然是肯定的。做法如下:
第一步当然是自定义Context类,并继承VelocityContext。覆写internalGet和containsKey两个方法,如下:
- public class TychoVelocityContext extends VelocityContext {
- private static final String MY_UTIL = "MyUtil";
- private static final MyUtil UTIL = new MyUtil();
- public Object internalGet(String arg0) {
- if (MY_UTIL.equals(arg0)) {
- return UTIL;
- }
- return super.internalGet(arg0);
- }
- public boolean containsKey(Object key) {
- return MY_UTIL.equals(key)||super.containsKey(key);
- }
- }
在上面的代码中,我们自定义了一个MyUtil类,当internalGet方法传入的参数是MyUtil时,就返回该对象。这里需要说明的是,internalGet传入的参数就是vm页面中调用的对象名称。例如,在页面中这样写:
$MyUtil.test()
那么internalGet方法的参数就是MyUtil。
第二步将Struts2与Velocity结合。我们需要将Struts2使用我们定义的TychoVelocityContext类而不是Velocity默认的VelocityContext类。打开struts.propertys,在其中加入如下代码:
注意,多个类之间用逗号“,”分隔。如下:
Velocity + Struts2 绝对经典组合。


















