应该算是Velocity的扩展,为了Velocity更好用。包括GenericTools VelocityView VelocityStruts三个子项目,其中VelocityStruts是为了与struts整合服务,此处不介绍。
GenericTools
为j2se提供tools使用,具体tools如下:
DateTool: 对Date操作:格式化、比较等
EscapeTool:对template进行escaping
IteratorTool:更好地控制 #foreach loop
ListTool:透明地处理array和list
MathTool:数学运算
NumberTool:对数字格式化和convert
RenderTool:对VTL的字符串执行 eval
ResourceTool:国际化支持
SortTool:对collections array iterator进行排序
XMLTool:对xml文件读取,需要dom4j的支持
VelocityView
使用velocity快速且干净地构建应用程序,可以编写独立于特定技术的前台程序
包含GenericTool,以及为J2EE扩展的tool;
有VelocityViewServlet VelocityLayoutServlet VelocityViewTag(嵌入velocity到jsp) Maven plugin
VelocityViewServlet
就是一个servlet,用于向vm文件的context中插入 request response context对象。
简单示例
1. 编写vm文件作为页面
<html>
<body>
I'm a velocity template.
#if( $XHTML )
#set( $br = "<br />" )
#else
#set( $br = "<br>" )
#end
Here we use a custom tool: $toytool.message
$br
Here we get the date from the DateTool: $date.medium
</body>
</html>
2. Toolbox.xml
被自动加载到velocity的context
<tools>
<data type="boolean" key="xhtml" value="true"/>
<data type="boolean" key="isSimple" value="true"/>
<data type="number" key="version" value="2.0"/>
<data key="foo">this is foo</data>
<data key="bar">this is bar.</data>
<toolbox scope="request">
<tool key="toytool" class="ToyTool" restrictTo="index*"/>
</toolbox>
<toolbox scope="session">
<tool key="map" class="java.util.HashMap"/>
</toolbox>
</tools>
data用来定义常量, tool获取session和request中的数据
3. 配置web.xml文件
<!-- Define Velocity template compiler -->
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>
org.apache.velocity.tools.view.servlet.VelocityViewServlet
</servlet-class>
<!--
Unless you plan to put your toolbox.xml and velocity.properties
under different folders or give them different names, then these
two init-params are unnecessary as of VelocityTools 1.3. The
VelocityViewServlet will automatically look for these files in
the following locations.
-->
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/toolbox.xml</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value>
</init-param>
</servlet>
<!-- Map *.vm files to Velocity -->
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
4. 访问页面
http://localhost:8080/simple/index.vm
Toolbox
定义request session application范围的变量或常量数据,可以调用该变量的方法,使用方法如下:
PipeWrench.java
public class PipeWrench {
public String getSize() {
return "Large Pipe Wrench!";
}
}
ToolBox.xml
<?xml version="1.0"?>
<toolbox>
<tool>
<key>wrench</key>
<scope>request</scope>
<request-path>/catalog/*</request-path>
<class>PipeWrench</class>
</tool>
</toolbox>
Tool Scope
支持request session application三种scope,用过flex的人应该很熟悉了,application在系统启动时实例化。 Session在每个会话开始时实例化,request为每个请求
如果tool实现 ViewTool 接口,可在init函数中接收到 context对象。
Request-path
限制哪个path下的内容可以访问,只支持request
Parameter
可以像tool中传入参数,需要tool定义public void configure(java.util.Map params)
方法
Data
定义 strings, booleans, and numbers
<?xml version="1.0"?>
<toolbox>
<data type="number">
<key>app_version</key>
<value>0.9</value>
</data>
<data type="string">
<key>app_name</key>
<value>Jon's Tool Shop</value>
</data>
<data type="boolean">
<key>debug</key>
<value>true</value>
</data>
</toolbox>
在vm中 $app_version 访问
Tools
AbstractSearchTool:进行查询和分页,需要实现executeQuery方法
PagerTool:基于request的分页
BrowserTool:获取客户端的浏览器、操作系统等相关信息
CookieTool:Cookie的控制
LinkTool:格式化和组装超链接,获取url的相对和绝对路径
ImportTool:以字符串方式导入 url指定的文件
ViewRenderTool:使用当前context执行带VTL的字符串,并以字符串形式返回结果
VelocityLayoutServlet
是VelocityViewServlet的子类,提供了layout和error的支持,特性如下:
1. 修改web.xml 将VelocityViewServlet替换为VelocityLayoutServlet
2. 定义了layou 的vm
3. 使用content vm和layout vm组合生成页面,在layout vm中,使用$screen_context引用content vm。
4. 可选定义 “error” template显示错误
配置
在velocity.properties 中配置
# Filepath for error template,
# relative to web application root directory
tools.view.servlet.error.template = Error.vm
# Directory for layout templates,
# relative to web application root directory
tools.view.servlet.layout.directory = layout/
# Filepath of the default layout template
# relative to the layout directory
# NOT relative to the root directory of the webapp!
tools.view.servlet.layout.default.template = Default.vm
动态切换Layout
在url参数中传入 layout=OtherLayout.vm
在内容页面vm中定义 #set($layout=”OtherLayout.vm”)
Error Screen
对未捕获的异常和错误处理,有两个变量 $error_cause和$stack_trace,可以在$error_screen中输出错误信息
Escaping HTML
通过实现 ReferenceInsertionEventHandler 对引用做字符转义,在velocity.properties中配置:
eventhandler.referenceinsertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference
eventhandler.escape.html.match = /msg.*/
VelocityViewTag
是一个jsp tag,允许在jsp中使用velocity和velocity tools,在jsp中使用如下:
<%@taglib prefix="velocity" uri="http://velocity.apache.org/velocity-view" %> <velocity:view template="foo.vm"/>
其他工具
Anakia 是一个用XSL从XML 中输出视图的例
Texen:用于产生任意文本的工具,It is capable of producing almost any sort of text output. Driven by Ant, essentially an Ant Task
DocBook Framework:创建适合于online查看和打印的文本,如PDF和HTML
DVSL:类似于XSLT,完成xml文件的转换