当前位置: MXJAVA > JAVA开发 > 文章正文

Struts2 下自定义 VelocityContext

发表于 2007-06-28 | 阅读 96 views

  但凡使用过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 绝对经典组合。

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网 关键字: , ,
喜欢MXJAVA的文章,那就通过 RSS Feed 功能订阅阅读吧!

我要评论

*

* 绝不会泄露



返回首页 | 关于我们 | 联系我们 | 广告合作 | 友情链接 | 版权声明