要把模板功能扩展到 Web 应用程序中,应该使用 Velocity 工具集中的 VelocityViewServlet
。Velocity 工具是 Velocity 的一个子项目(请参阅 参考资料 找到这个 URL 并下载最新的版本)。该 Servlet 为 Velocity 用作一种视图层技术提供了更复杂的支持,既可以与 JSP 技术联合使用也可以代替后者。使用VelocityViewServlet
可以减少许多冗余代码,因为它提供了:
- 对请求对象和属性、会话对象和属性以及 servlet 上下文和属性的直接模板访问
- 正式的、可外部配置的“工具箱”,可以增加在模板中使用的自定义工具(这里讲的工具只是具有公共方法的已编译的类)
- 一个通用的、经过测试的、随时可用的工具库
要把 VelocityViewServlet
集成到 Web 应用程序中,可以看一看示例 velview Web 应用程序(在webapps\velview
目录中)。该应用程序包括本文中所讨论的那些模板。此外,它还显示了请求、会话以及 servlet 上下文对象的属性。集成的步骤如下:
首先要保证 velocity-tools-view.jar
文件在应用程序的 lib
目录中。当然,这个 velocity JAR 文件也应该在那儿。
在部署描述符 web.xml 文件中,包括 VelocityViewServlet
。初始化参数是一个工具箱描述 XML 文件。该 servlet 映射为处理所有扩展名为 .vm 的文件,如清单 20 所示:
清单 20. VelocityViewServlet 的 Tomcat 部署描述符(web.xml)
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>velocityView</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet</servlet-class> <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>velocityView</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> </web-app> |
该例子的工具箱描述符(toolbox.xml)文件中,包含了两个来自 Velocity 工具库的通用工具可以在模板DateTool
和 MathTool
中访问。这两个工具使我们能够格式化日期和时间信息,并在模板中执行浮点运算,如清单 21 所示:
清单 21. 包括 DateTool 和 MathTool 的工具箱描述符
<?xml version="1.0"?> <toolbox> <tool> <key>date</key> <scope>application</scope> <class>org.apache.velocity.tools.generic.DateTool</class> </tool> <tool> <key>math</key> <scope>application</scope> <class>org.apache.velocity.tools.generic.MathTool</class> </tool> ... |
在 VelocityViewServlet
中有一组常用的标准工具,如表 1 所示:
表 1. VelocityViewServlet 中的标准工具
工具名 | 描述 |
LinkTool | 处理 URI。该工具经常会用到,如果在模板中创建可点击的链接就要用到该工具,可以生成依赖于上下文的 URI 部分。 |
CookieTool | 使模板能够创建或访问浏览器缓冲的 cookie。 |
ParameterParser | 简化后面收到的请求参数的解析。 |
还有两个高度专门化的、不那么常用的工具,如表 2 所示:
表 2. 专门的 VelocityViewServlet 工具
工具名 | 描述 |
ViewRenderTool | 使模板能够解析包含 VTL 的字符串。 |
AbstractSearchTool | 提供了一种骨架工具(必须使用自定义的 Java 代码来扩展),以便实现在线搜索和搜索结果分页。 |
您可以使用 http://localhost:8080/velview/variables.vm
URL 测试 velview 应用程序。您应该打开模板源代码看一看所用的 Velocity 引擎、 LinkTool
和 CookieTool
。
|
|
Struts 是一种构造基于 MVC 模型的框架的流行 Web 应用程序。Struts 默认的视图组件技术是 JSP 技术。但是,可以很容易把 Velocity 集成进来作为视图组件。图 1 说明了 Velocity 的这种具体应用:
图 1. Velocity 与 Struts MVC 框架集成
重要的是要看到,在这种结合中 Velocity 并没有代替 JSP 技术。相反,JSP 技术和 Velocity 模板可以协同工作。集成 Velocity 需要配置 VelocityViewServlet
以便处理 .vm 模板,就像 部署 VelocityViewServlet部分所讲的那样。这意味着.jsp 文件将继续由容器(即 Tomcat 5 中的 Jasper)处理,而任何 .vm 模板则传递给 Velocity。
Velocity Tools 子项目中的 VelocityStruts
组件(请参阅 参考资料)包含集成 Velocity 与 Struts 的所有功能。 VelocityStruts
提供了一组专用的 Velocity 工具,用于访问 Struts 专有的资源和 Velocity 模板中的信息。表 3 列出了最常用的工具:
工具名 | 描述 |
StrutsLinkTool | 针对 Struts 的 LinkTool 专用版本,提供了 setAction() 和 setForward() 访问预先配置的活动映射。 |
FormTool | 访问 Struts 的表单 beans。 |
ErrorsTool | 处理 Struts 错误消息,包括对国际化的支持。 |
MessageTool | 提供对 Struts 国际化支持的访问,尤为特别的是依赖于语言的消息资源。 |
还有一组工具专用于 Struts 1.1 中的新特性,如表 4 所示:
工具名 | 描述 |
SecureLinkTool | 用于 Struts 1.1 的安全链接(SSL)扩展。 |
ActionMessagesTool | 提供对 Struts 1.1 新对象 ActionMessages 的访问。 |
TilesTool | 提供对 Struts 1.1 Tiles 扩展支持的访问。 |
ValidatorTool | 提供对 Struts 1.1 Validator 扩展的访问,生成代码验证表单输入字段。 |
在 webapps\struts-example
目录中可以找到一个例子,使用 Struts 而非 JSP 技术创建 Struts 页面。本例中我们使用 Struts 取代了实例 Web 应用程序所发布的第一个标题页,您可以试着改变其他的页面。下面列出了操作的步骤。
- 把 Velocity 库复制到 Struts 示例应用程序下的
WEB-INF\lib
目录中。要使用 Tomcat 5(5.0.16 是撰写本文时的最新版本)和 Struts 1.1,需要把以下 JAR 文件复制到webapps\struts-example\WEB-INF\lib
目录中:- velocity-tools-1.1-beta1.jar
- velocity-1.4-rc1.jar
- 然后在 Struts 配置文件(
WEB-INF\struts-config.xml
),把 Struts 动作映射设置为转向 index.vm 文件而不是 index.jsp 文件,如清单 22 所示:
清单 22. 把 Struts 动作转向 index.vm
<action path="/logoff" type="org.apache.struts.webapp.example.LogoffAction"> <forward name="success" path="/index.vm"/> </action>
- 在部署描述符
WEB-INF\web.xml
文件中配置VelocityViewServlet
处理.vm
文件。同样把欢迎文件设为 index.vm 而非 index.jsp,如清单 23 所示:
清单 23. 改变 struts 示例 Web 应用程序的部署描述符
<!-- Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>velocity</servlet-name> <servlet-class>org.apache.velocity.tools.view.servlet.VelocityViewServlet </servlet-class> <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> <!-- Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>velocity</servlet-name> <url-pattern>*.vm</url-pattern> </servlet-mapping> <!-- The Welcome File List --> <welcome-file-list> <welcome-file>index.vm</welcome-file> </welcome-file-list>
- 最后,把 toolbox.xml 和 velocity.properties 文件从本文的源代码下载中(请参阅 参考资料)移动到
WEB-INF
目录下。
新的 index.vm 文件如清单 24 所示,可以把它与原来的 index.jsp 文件比较。
清单 24. 通过使用 index.vm Velocity 模板与 Struts 互操作
<html> <head> <title>$msg.get("index.title")</title> </head> <body bgcolor="white"> #if ( !$application.database) <font color="red"> ERROR: User database not loaded -- check servlet container logs for error messages. </font> <hr> #end <h3>$msg.get("index.heading")</h3> <ul> <li> <a href="$link.setURI("editRegistration.do").addQueryData("action","Create")"> $msg.get("index.registration") </a> </li> <li> <a href="$link.setURI("logon.jsp")"> $msg.get("index.logon") </a> </li> </ul> <p> </p> <a href="$link.setURI("tour.do")"> <font size="-1">$msg.get("index.tour")</font> </a> <p> </p> <img src="$link.setURI("powered-by-logo.gif")" alt="Powered by Velocity"/> </body> </html> |
在 index.vm 中,整个模板都使用 $msg
内的消息工具访问 Struts 的地域有关的国际化资源。通过对包含国际化字符串的资源包的本地化更改,这种方法避免了模板中的多数硬编码字符串。
您可以使用 VTL 的条件指示符 #if
直接检查在 servlet 上下文中是否存在数据库属性。 $application
引用可用于访问 servlet 上下文中的任何属性( $request
、 $response
和 $session
也可用于访问其他 Servlet API 对象的属性)。
LinkTool
的 setURI()
方法用于生成服务器端到 Struts 动作和“Powered by Velocity”标志图片的 URI 链接。注意,这里使用 LinkTool
的 addQueryData()
方法向结果 URI 种增加附加的动作信息。
要测试该 Velocity 页面,您可以启动 Tomcat 5 并访问 http://localhost:8080/struts-example/
URL。注意它的结果与原来的 JSP 版本完全一致。
Velocity 模板处理程序可以直接集成到 Java 语言应用程序中,立即提供报告生成或者模板处理的功能。
将模板引擎扩展到 Web 应用程序,可以使用 VelocityServlet
处理动态生成 HTML 输出的 Velocity 模板。Velocity 工具项目对使用 VelocityViewServlet
组件化 Web 层应用程序开发提供了更多的支持。VelocityViewServlet
以模板为基础为基于 Web 的 UI 构造提供了方便的视图层。
在使用 MVC 模型框架设计复杂的 Web 应用程序时,Velocity 作为一种视图/模板化技术——以VelocityViewServlet
的形式——可以很方便地插入到框架中。对于流行的 Jakarta Struts MVC 框架,Velocity 可以与基于 JSP 的视图技术协作,也可以和选择的任何模型技术进行交互。