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

来源:百度文库 编辑:神马文学网 时间:2024/04/24 23:10:58
在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML、XML等)。这和 JSP 技术的目标非常接近。但是,JSP 模型可以毫无阻碍地访问底层的 Servlet API 和 Java 编程语言。事实上,为了避免访问这些固有的特性,您在编码中必须严格约束(只是使用 EL、标签库和类似的特性)。它基本上是一种在很大程度上开放的访问模型。
拿 Velocity 与之比较。作为一种完全自包含的模板引擎和脚本解释器,Velocity 拥有完全封闭的模型。任何针对系统和/或 Java 编程语言的访问都必须明确地启用。默认情况,Velocity 模板中不能访问 Java 编程语言的任何方面。这种封闭的模型使 Velocity 能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。
现在让我们把这种模板引擎与 Tomcat 5 的最新版本集成在一起,看一看 Velocity 在服务器端的应用。




回页首
Velocity 发行包带有一个 org.apache.velocity.servletVelocityServlet 库类,扩展它可以很快地创建一个模板处理 servlet。作为独立的客户机应用程序测试的任何模板都可以使用 VelocityServlet 部署在服务器上。把独立的 Velocity 模板转移到 Web 应用程序中相对比较简单。只需要以下几个步骤:

工具是在模板中可以通过 Velocity 上下文使用的实用 Java 对象。虽然可以手工把这些对象附加到上下文中,但 VelocityViewServlet 工具箱管理器可通过更加灵活和结构化的方式完成。在模板中一般是通过调用工具的方法来使用它们。 VelocityViewServlet 与 VelocityStruts 都提供了非常有价值的经过测试的工具,在作为一种视图技术部署 Velocity 时极其有用。
从 org.apache.velocity.servlet.VelocityServlet 类派生一个 Servlet 类。 重写并实现其中的一个 handleRequest() 方法。 在 handleRequest() 的实现中,添加希望在模板中作为上下文属性使用的数据或工具(请参阅侧栏Velocity 中的工具)。 在 handleRequest() 的实现中,从文件或资源(如 JAR 文件)中取得模板并返回它。
在示例代码包中, com.ibm.dvworks.velocity.VelTestServlet 就是按照上述步骤创建的一个 servlet。您可以查看 webapps\vservlet\WEB-INF\src 目录下的代码。如果改变了这些代码,一定要使用 compile.bat 批处理文件重新编译它。
部署描述符(web.xml 文件)定义了该 servlet 并把它映射到 /vServlet URL 模式中,如清单 19 所示:
vServlet com.ibm.dvworks.velocity.VelTestServlet vServlet /vServlet
加载并处理的模板放在 webapps\vServlet 目录中。在这个例子中,模板文件称为 variables.vm 。测试之前一定要保证 velocity-dep---?.jar 文件已经放在 webapps\vServlet\WEB-INF\lib 目录下,然后启动 Tomcat 5 并访问 http://localhost:8080/vservlet/Servlet URL。
要把模板功能扩展到 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 所示:
velocityView org.apache.velocity.tools.view.servlet.VelocityViewServlet org.apache.velocity.toolbox /WEB-INF/toolbox.xml velocityView *.vm
该例子的工具箱描述符(toolbox.xml)文件中,包含了两个来自 Velocity 工具库的通用工具可以在模板 DateTool 和 MathTool 中访问。这两个工具使我们能够格式化日期和时间信息,并在模板中执行浮点运算,如清单 21 所示:
date application org.apache.velocity.tools.generic.DateTool math application org.apache.velocity.tools.generic.MathTool ...
在 VelocityViewServlet 中有一组常用的标准工具,如表 1 所示:
工具名 描述
LinkTool 处理 URI。该工具经常会用到,如果在模板中创建可点击的链接就要用到该工具,可以生成依赖于上下文的 URI 部分。
CookieTool 使模板能够创建或访问浏览器缓冲的 cookie。
ParameterParser 简化后面收到的请求参数的解析。
还有两个高度专门化的、不那么常用的工具,如表 2 所示:
工具名 描述
ViewRenderTool 使模板能够解析包含 VTL 的字符串。
AbstractSearchTool 提供了一种骨架工具(必须使用自定义的 Java 代码来扩展),以便实现在线搜索和搜索结果分页。
您可以使用 http://localhost:8080/velview/variables.vm URL 测试 velview 应用程序。您应该打开模板源代码看一看所用的 Velocity 引擎、 LinkTool 和 CookieTool 。




回页首
Struts 是一种构造基于 MVC 模型的框架的流行 Web 应用程序。Struts 默认的视图组件技术是 JSP 技术。但是,可以很容易把 Velocity 集成进来作为视图组件。图 1 说明了 Velocity 的这种具体应用:

重要的是要看到,在这种结合中 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

在部署描述符 WEB-INF\web.xml 文件中配置 VelocityViewServlet 处理 .vm 文件。同样把欢迎文件设为 index.vm 而非 index.jsp,如清单 23 所示:
清单 23. 改变 struts 示例 Web 应用程序的部署描述符
action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml 1 velocity org.apache.velocity.tools.view.servlet.VelocityViewServlet org.apache.velocity.toolbox /WEB-INF/toolbox.xml org.apache.velocity.properties /WEB-INF/velocity.properties action *.do velocity *.vm index.vm
最后,把 toolbox.xml 和 velocity.properties 文件从本文的源代码下载中(请参阅参考资料)移动到 WEB-INF 目录下。
 
新的 index.vm 文件如清单 24 所示,可以把它与原来的 index.jsp 文件比较。
$msg.get("index.title") #if ( !$application.database) ERROR: User database not loaded -- check servlet container logs for error messages.
#end

$msg.get("index.heading")

 

$msg.get("index.tour")

 

Powered by Velocity
在 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 的视图技术协作,也可以和选择的任何模型技术进行交互。
您可以参阅本文在 developerWorks 全球站点上的英文原文.
下载本文的源代码。
关于 Velocity 模板引擎的最新版本、相关文档、邮件列表和社区新闻,请访问Velocity 官方站点。
可以从Velocity 工具子项目 下载 VelocityView servlet、与 Struts 集成的 VelocityStruts 以及其他一些工具。
Struts MVC 框架是一种非常流行的开放源代码的用于创建 Web 应用程序的框架。Velocity 可以与 JSP 技术一起作为 Struts 的视图技术。
Turbine是一种从头开始设计的开放源代码 MVC 框架,可以很好地使用 Velocity 作为视图组件技术。
看看 Srikanth Shenoy 和 Nithin Mallya 的文章,了解如何集成 Struts、Tiles 和 Java Server Faces( developerWorks,2003 年 9 月)。
要使用 WebSphere Studio V5 创建基于 Struts 的 Web 应用程序,请阅读 Colin Yu 和 Jane Fung 的系列文章(2003 年 11 月)。
访问Developer Bookstore,上面有丰富的技术书籍列表,其中包括数百本和Java 有关的书籍。
在developerWorksJava 技术专区 可以找到关于 Java 编程语言各个方面的很多文章。



Sing Li 是Professional Apache Tomcat 、Pro JSP 、 Early Adopter JXTA、 Professional Jini 以及 Wrox Press 出版的许多其他书籍的作者,也是 Wrox Press 很多其他书籍的作者。他定期为技术杂志撰稿,也是 P2P 发展的积极倡导者。Sing 是咨询顾问和自由作家,可以通过westmakaha@yahoo.com与他联系。