在开发基于Java的网站的视图层时,JavaServer Pages 被广泛地认为是自然而然的(或唯一的)选择。事实上,每个建立在 Java 平台上的站点实际上都用到了 JSP 技术。JSP技术非常有名,大多数应用程序服务器都支持它,J2EE 计划也认可了它。为什么还要选择其它技术呢?在这篇由两部分组成的文章的第一部分中,向您介绍了 Tea 模板语言,还向您演示了Tea是如何能够成为JSP技术的一种可行的替代方案。在第二部分中,您将探索如何将 Tea集成为模型-视图-控制器(Model-View-Controller (MVC))2 体系结构(尤其是 Struts 应用程序)中的视图。 不宜使用 JSP 技术的情形 尽管JSP技术广受欢迎,但它却不是唯一选择。而且,也有一些充分的理由不使用这项技术。在 Servlets.com 上的一篇文章中,Jason Hunter 指出了 JSP 环境的七个问题(参阅参考资料)。总结起来,那些问题是: ? 将(原始 Java 代码形式的)业务逻辑置于页面上的诱惑很大。 ? 大多数普通任务的性能需要 java 代码。 ? 简单的任务很难,因此,非 Java 设计者无法执行这些任务。 ? JSP 环境中的循环很笨拙 ― 定制标记令人信服地解决了这一问题。 ? 会出现无用的错误消息。 ? JSP 编程需要 Java 编译器。 ? 生成的中间servlet浪费了空间。 注:自 Jason 最初写这篇文章以来,JSP技术规范已经经历了两次修订,上面的一些问题已经得到了部分解决。然而,JSP 技术仍然有其不足。 除了 Jason 列举的那些问题之外,我也想补充 JSP 技术的另一个问题: ? 很容易由于部署一个带有错误的 JSP 页面而无意中破坏网站中的某个页面(或多个页面)。 ? 一些模板引擎已经被开发出来以替代 JSP 技术。它们包括 WebMacro、Velocity、Enhydra XMLC 以及本文的主题――Tea。 介绍 Tea Tea 是一种简单的模板语言,它已由 Walt Disney Internet Group(WDIG)作为开放源码发布。Tea 是 Disney 的许多网站背后的技术选择,这些网站包括 ESPN.com、Disney.com 和 ABCNews.com。 Tea 的目标是提供简单安全的模板引擎以便用最少的错误构建高度动态的网站。这一目标是通过最少的编程构造和更简单、更不易混淆的语言机制来实现的。Tea 留给我们的是类似于 HTML 但动态性一样高的语言。由于 Tea 的简单性,Web 开发团队可以聘请专业性不太强的程序员――WDIG 称这样的人员为技术制作者――来制作站点的表示层。 使用 Tea 构建的网站有三种主要组件: ? TeaServlet ? 一个或多个 Tea 模板 ? 一个或多个 Tea 应用程序 TeaServlet 是 Tea 模板编译器和执行引擎。它对于 Tea 模板就象 Tomcat 的 Jasper 对于 JSP 页面。TeaServlet 编译 Tea 模板(如果必要的话),在收到请求时执行它们。 Tea 模板是JSP页面的 Tea 等价物。然而,和 JSP 编程不一样,Tea 模板不经过到 Java Servlet 代码这一中间转换。相反,Tea 编译器直接将 Tea 模板编译成类文件。这是一项重要的差异,它直接解决了 Jason Hunter 的 JSP 问题列表中的第六和第七个问题,间接地解决了第五个问题(随后您将看到)。 Tea 应用程序是一种机制,通过这种机制使得业务逻辑可为 Tea 模板所用。Tea 应用程序通过 Tea 应用程序的上下文实现的 public 方法来暴露业务逻辑。这些方法可以作为可从任何 Tea 模板调用的函数获得。Tea 模板和 Tea 应用程序之间的交互类似于 JSP 环境中 JSP 技术和 JavaBeans 之间的交互。 安装 Tea Tea 和 Tomcat 在为本文编写代码时,我使用 Jakarta Tomcat 4.0.4 作为我的 servlet 容器。这些安装指示信息假定您正在使用 Tomcat 4.0.4 作为您的 servlet 容器,还假定 Web 应用程序名为“teademo”。您的安装可能会有些变化,这取决于您对服务器的选择以及 Web 应用程序名称。 可以从网址为http://opensource.go.com 的 WDIG 网站下载 Tea,它可以以 Apache 样式许可证获得。除了其它内容以外,分发版中包含 TeaServlet.jar 文件,它组成了 Tea 引擎。您也可以在 WDIG 的网站上找到一个名为 Kettle 的用于 Tea 的 IDE,不过我在本文中不讨论 Kettle。 下载了 TeaServlet.zip 文件之后,将其解压缩然后把 TeaServlet.jar 文件移到 Tomcat 的webapps/teademo/WEB-INF/lib 目录。 接下来,需要在 webapps/teademo/WEB-INF 目录下创建一个 web.xml 文件。该文件将用您的应用程序注册 TeaServlet,并将某种 URL 模式同 TeaServlet 相关联。该 web.xml 文件如下: 清单 1. web.xml teaservlet com.go.teaservlet.TeaServlet properties.file
/jakarta-tomcat-4.0.4/webapps/teademo/WEB-INF/TeaServlet.properties
teaservlet *.tea teaservlet /dynamic/* 请注意,TeaServlet 获取一个名为 properties.file 的参数,该参数指向 TeaServlet.properties 文件。随后将创建此文件。 还需要注意的是,您将两个 URL 模式映射到了 TeaServlet。任何具有.tea扩展名或以 /dynamic/* 开始的 URL 都将被委托给 TeaServlet 以进行处理。映射 .tea 扩展可能是很明显的,但映射/dynamic/* 可能就不明显。创建这一映射是因为 Tea 模板可能会被作为预编译的类文件而不是未编译的模板分发。没有.tea扩展名,则需要另一种方法来访问这些预编译的模板。后面有更多关于预编译模板的内容。 现在需要设置 TeaServlet.properties 文件。TeaServlet.properties 文件是配置您的 Tea 应用程序的地方。它也是您指示 TeaServlet 找到其模板文件的地方,它还是为 TeaServlet 设置日志记录级别的地方。 如同 web.xml 文件所显示的那样,该文件应该位于 web.xml 文件旁的 WEB-INF 目录中。TeaServlet 下载中有一个一般的TeaServlet.properties文件,它起到一个好起点的作用。您会注意到,已经有了一个名为 System 的已配置应用程序。该应用程序提供了一些便捷的系统范围函数,这些函数可能在大多数 Tea 模板中都是必需的。后面将添加一个额外的应用程序。 在 TeaServlet.properties 文件中要设置的两个重要特性是 template.path 和 template.class。template.path 特性告诉 TeaServlet 在何处放置未编译的 Tea 模板。虽然可以将 Tea模板置于任何地方,但我却更愿意将我的模板放置在 Web 应用程序的 WEB-INF 目录下的名为 tea_templates 的目录中。至于 template.class,该特性告诉 TeaServlet 在哪里放置和寻找已编译的模板类文件。我更愿意将我的模板类文件放置在名为 tea_classes 的目录中,该目录同样直接处于 Web 应用程序的 WEB-INF 目录下。 一旦设置了这些文件,请启动 Tomcat。现在,您已经准备好了,可以开始使用 Tea 进行开发。 Tea 管理 随 Tea 一起还提供了一个管理工具,可以通过您的Web浏览器访问该工具。您将使用此工具来部署您的 Tea 模板文件,因此在可以编写任何代码之前,需要熟悉该应用程序。可以通过http://localhost:8080/teademo/dynamic/system/teaservlet/Admin?admin=true访问此Tea管理工具。如果您没有看到Tea管理屏幕,那么一定是安装中出了一些问题。请重复上面的安装步骤,然后再试。 该管理工具有五个子工具: ? Templates ? Functions ? Applications ? Logs ? Servlet Engine Templates 是一个您将逐渐熟悉的工具。此工具列出您的 Web 应用程序中的所有模板及其 URL 以及该模板所获取的任何参数。在靠近顶部的地方也有一个 reload 按钮。按这个按钮将导致 TeaServlet 寻找任何新的或更改了的模板并部署这些模板。 和 JSP 技术不一样,简单地将一个 Tea 模板复制到 templates 目录本身并不会部署该模板。直到您按下 reload按钮,模板才会被部署。而且,如果模板中有任何错误,它们都不会被部署。请再读一次。如果有错误,绝对没有模板被部署。即使众多模板中的一个里面有一个错误,也不会有模板会被部署。这防止了部署有问题的 Tea 模板,解决了我们的问题 #8。 Templates 工具的另外一个特征是 Recompile all 复选框。如果您选择该复选框并单击 Reload,那么会重新编译所有模板而不仅仅是那些已经改变了模板。 Functions 和 Applications 工具分别归档已配置的 Tea 函数和应用程序。Functions 工具按照字母顺序列出 Tea 模板可用的所有函数。Applications 工具按照提供函数的 Tea 应用程序对函数进行分组。 Logs 工具简单地显示 Tea 日志文件。