使用 Velocity 实现客户端和服务器端模板(三)

来源:互联网 发布:h3c交换机端口速率 编辑:程序博客网 时间:2024/06/06 09:54
标签: 

velocity

 

杂谈

 

部署 VelocityViewServlet

要把模板功能扩展到 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 框架的互操作

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 列出了最常用的工具:

表 3. 用于 VelocityStruts 集成的工具

 

工具名描述StrutsLinkTool针对 Struts 的 LinkTool 专用版本,提供了 setAction() 和 setForward() 访问预先配置的活动映射。FormTool访问 Struts 的表单 beans。ErrorsTool处理 Struts 错误消息,包括对国际化的支持。MessageTool提供对 Struts 国际化支持的访问,尤为特别的是依赖于语言的消息资源。

 

还有一组工具专用于 Struts 1.1 中的新特性,如表 4 所示:

表 4. 专用的 Struts 1.1 访问工具

 

工具名描述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 应用程序所发布的第一个标题页,您可以试着改变其他的页面。下面列出了操作的步骤。

  1. 把 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

  2. 然后在 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>


  3. 在部署描述符 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>


  4. 最后,把 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>&nbsp;</p> <a href="$link.setURI("tour.do")"> <font size="-1">$msg.get("index.tour")</font> </a> <p>&nbsp;</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 的视图技术协作,也可以和选择的任何模型技术进行交互。

0 0
原创粉丝点击