Velocity的扩展

之前一直找不到velocity的扩展接口,导致工作一直做不下去。今天看了一个下午+一个晚上的文档,终于找到了突破口(看来我是挺笨的)。就在VelocityTools这一块。
在IBM实习时养成的很好的习惯--看源码--真是受用终身啊。通过不断的对比VelocityTools的文档,javadoc和源码,发现原来在那个toolbox.xml里大有文章。
首先,要指定toolbox.xml的位置,在web.xml里

<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class>
<load-on-startup>10</load-on-startup>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>

这是toolbox.xml的一部份:

<toolbox>

<tool>
<key>math</key>
<scope>application</scope>
<class>org.apache.velocity.tools.generic.MathTool</class>
<request-path>/catalog/*</request-path>
</tool>

</toolbox>

<key>里就是在VTL里写的$math,这样就算引入一个对象了。
<scope>是生命周期,有关init()方法的调用。
其它两个的作用从字面上和表达就可以猜出来了。
对于扩展的类,与web容器相关的主要是一个public void init(java.lang.Object object)的方法,传入的参数是org.apache.velocity.tools.view.context.ViewContext接口,但需要手动转换。从这个接口,可以得到request, session, response, servletContext等对象,同时根据scope的不同在调用次数上也会有不同。application的只初始化一次,request每次请求都会重新初始化,session就是在session建立时初始化。
看过这些以后,对那些VelocityStruts工具的原理就一目了然咯~~

Leave a Reply

Your email address will not be published. Required fields are marked *