编程开发

Struts2 下自定义 VelocityContext

07-06-28 | No Comments |

  但凡使用过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两个方法,如下:

  1. public class TychoVelocityContext extends VelocityContext { 
  2.  private static final String MY_UTIL = "MyUtil"
  3.  private static final MyUtil UTIL = new MyUtil(); 
  4.  
  5.  public Object internalGet(String arg0) { 
  6.   if (MY_UTIL.equals(arg0)) { 
  7.    return UTIL; 
  8.   } 
  9.   return super.internalGet(arg0); 
  10.  } 
  11.   
  12.  public boolean containsKey(Object key) { 
  13.   return MY_UTIL.equals(key)||super.containsKey(key); 
  14.  } 

  在上面的代码中,我们自定义了一个MyUtil类,当internalGet方法传入的参数是MyUtil时,就返回该对象。这里需要说明的是,internalGet传入的参数就是vm页面中调用的对象名称。例如,在页面中这样写:

  $MyUtil.test()

  那么internalGet方法的参数就是MyUtil。

  第二步将Struts2与Velocity结合。我们需要将Struts2使用我们定义的TychoVelocityContext类而不是Velocity默认的VelocityContext类。打开struts.propertys,在其中加入如下代码:

  1. struts.velocity.contexts=com.mxjava.tycho.servlet.TychoVelocityContext 

  注意,多个类之间用逗号“,”分隔。如下:

  1. struts.velocity.contexts=com.mxjava.tycho.servlet.TychoVelocityContext,com.mxjava.tycho.servlet.MyVelocityContext 

  Velocity + Struts2 绝对经典组合。


五冠 Nokia/诺基亚 5230 5230XM 送证书V20版 内有港行 销数千台
1000.0元
批发 雷朋3025镜面反光太阳镜 太阳眼镜 19.9/副 顶级质量
19.9元
促销笔记本电脑 13.3英寸超薄N450无线网卡视频
1999.0元

留下您的脚印


«
»