级别: 初级
Brett McLaughlin ,作者和编辑,O'Reilly Media, Inc.
2006 年 2 月 06 日
如果想出售产品,那么拥有在线设施是很重要的,不论是运作一家数百万美元的公司,还是只是想在假日处理几千个线手镯。在某些情况下,修补一些 Web 页面,并采用一些像 PayPal 或 eBay 这样的预先打包好的支持系统处理销售事务,也可以做得足够好。但是一个全面的、设计良好的 Web 应用程序应当能把在线销售从小打小闹提升到专业的、动态的在线商店的层次。每个人都知道,消费者在商店中买的东西比从跳蚤市场买的东西多。
问题在于,在进入大多数 Web 开发框架时 —— 特别是在使用 Java™ 作为编程语言的时候 —— 会发现复杂性太高。Struts、JSF 和 Spring 都是优秀的 Web 开发框架,但是它们中没有一个是适合胆小的人。(如果您曾经试着向新 Java 开发人员解释控制反转,您就会知道我谈的是什么了!)幸运的是,还有更容易的选择。
Tapestry 是在 Apache 软件许可下发布的一个开放源码的、基于 Java 的框架,它是专门为了简化 Web 开发设计的。它有以下关键特性:
- 易于安装:不需要是 Web 应用程序高手,就可以让 Tapestry 启动并运行。
- 易于使用:只需要基本的 Java 和 HTML(是的,确实是 HTML,而不是 servlet)技能就可以编写 Tapestry 应用程序。
- 易于扩大规模。当站点增长超过 10、50 或 100 个页面时,也不必抛弃 Tapestry。对于多数 Web 应用程序来说,Tapestry 都足够健壮。
在这篇文章中(系列的前半部分),我会带您入 Tapestry 的世界。我将带您一起经历下载和安装这个框架的每一步,然后运行一些示例应用程序,让您理解它的工作方式。在下一篇文章中,我将介绍更高级的示例,让您更好地掌握 Tapestry 的核心框架。在了解核心框架之前,您将完全适应了 Tapestry 环境。
您很快就会了解到 Tapestry 的口号是简单。这种简单不代表原始 或不成熟,而是代表易于理解、易用 和直观。因为安装是任何一项新技术的入门,所以毫不夸张地说,安装 Tapestry 非常容易。对于入门者来说,只有很少的前提要求,而这些要求对于 Web 开发人员来说,都是相当标准的,所以它们可能已经安装了。(如果没有,那么请参阅 参考资料 一节获得技术下载。)
|
显然,使用 Tapestry 的第一个要求是,在机器上要有 Java 平台正在运行。虽然 Tapestry 几乎可以和任何相对较新的 Java 版本合作(Java 1.3 及以上版本),但最好是使用 Java 5.0。Tapestry 的几个可选特性只能在 Java 5 下工作。而且,现在真的是没有什么理由不 转换到 Java 5:它是稳定并经过良好测试的,已经经过了最初始的发展痛苦。
有了 JVM 和 servlet 引擎,还需要 Apache Ant 这样的构建工具。虽然下载 Ant 很容易,但需要确定在路径中有 Ant 的二进制代码(对于 Linux/Mac OS X 系统是 ant
,对于 Windows 系统是 ant.bat
)。如果在空目录中输入 ant
,可能会看到下面这样的输出:
|
最后需要安装一个微内核,叫作 HiveMind,用它为 Tapestry 应用程序登录对象。我不会在这篇文章中详细讨论 HiveMind —— 它本身就值得用几篇文章讨论!—— 但是您会看到 Tapestry 如何使用它。在从 Jakarta Web 站点下载了 HiveMind 之后,请把它放在与 Tapestry 相同的目录中;例如,可能使用 /usr/local/java/hivemind-1.1 或 C:/java/hivemind-1.1。任何位置都可以,只要记住把它放在哪儿了!
Tapestry 实际上还有许多依赖项,但是安装了 HiveMind、Ant 和 Java 5.0 之后,就能让 Tapestry 自己处理剩下的依赖项。因为 Tapestry 是一个 Web 应用程序框架,所以在准备运行应用程序时,还需要一个 servlet 引擎,例如 Apache Tomcat(请参阅 参考资料)。Tapestry 应用程序打包成 WAR 文件(Web 应用程序档案),这样就可以把它们放进 servlet 引擎的 Web 应用程序目录中。这篇文章的所有示例都使用 Tomcat,但是可以很容易地把 Tapestry 用于您选择的其他 servlet 引擎。
|
所有的前提条件就绪之后,请前往 Jakarta Tapestry 的主页(请参阅 参考资料),从 Apache 的镜像站点下载 Tapestry。先选择最新的 Tapestry 4.0 版,编写这篇文章时是 tapestry-4.0-beta-12.tar.gz(Windows 用户请选择 .zip 文件)。一般来说,最好是用稳定版来学习一个新框架,而不要使用更新的 beta 代码。但是,Tapestry 4.0 在 2005 年 11 月已经接近 beta 周期的末尾,相对于 Tapestry 3.x 来说提供了显著的 改进。(在阅读这篇文章的时候,Tapestry 4.0 可能已经能够使用了。)
在 Tapestry 的下载站点上时,您可能还想下载文档集。在编写这篇文章的时候,文档集文件叫作 tapestry-4.0-beta-12-docs.tar.gz。展开这个档案,应当得到名为 tapestry-4.0-beta-12 的新文件夹,但是如果下载了更新版的 Tapestry,文件夹名称可能会有变化。
请把这个文件夹移动到自己喜欢的保存 Java 项目安装的地方;例如 /usr/local/java 这样的位置就很好,或者也可以考虑 C:/java。在每种情况下,都要新建一个 Tapestry 目录。在这个目录中,有许多信息;请参考图 1 了解顶级目录结构:
术语安装 对于 Tapestry 来说,有点儿名不符实!Tapestry 与在后台运行的 Java 应用程序或者在网络上提供内容的 servlet 引擎不同。相反,它是一组可以在应用程序中使用的实用工具 —— 从类到标记。所以不是 “安装” Tapestry,而是让 Web 应用程序可以使用它,并把 Tapestry 和它的依赖项与 Web 应用程序绑在一起。
|
设置 Tapestry 主要是把正确的类组(打包到 Java JAR 文件中)放在正确的目录中。首先,需要找到核心的 Tapestry JAR 文件。这些文件包含 Web 应用程序中要使用的全部 Tapestry 代码,它们位于 Tapestry 发行目录的根目录中:
- tapestry-4.0-beta-12.jar 包含 Tapestry 的框架部分。
- tapestry-annotations-4.0-beta-12.jar 包含在 Java 5.0 上支持 Tapestry 标注所需要的类。
- tapestry-contrib-4.0-beta-12.jar 包含那些发布到 Tapestry 中,但是对操作来说并非必需的组件。
- tapestry-portlet-4.0-beta-12.jar 包含的类让 Tapestry 可以支持 JSR-168 —— portlet JSR。
请把这四个 JAR 文件放在使用 Tapestry 的 Web 应用程序的 WEB-INF/lib 目录中,就准备好了 —— 差不多是这样。在启动应用程序之前,只需要再做一点儿 设置。
|
Tapestry 试图为 Web 应用程序提供一种简化的编程模型和易于使用的环境。它的做法是抽象出重复的、常见的任务的细节,所以它使用许多 实用工具。不论是支持表达式,还是登记对象,还是创建漂亮的用户界面组件,Tapestry 都依赖第三方库让 Web 开发对于开发人员尽可能容易。
幸运的是,Tapestry 会自己进行大多数依赖项的下载和安装工作。唯一的麻烦就是跟踪这些额外的 JAR 文件,但是正如在这一节中会看到的,这不是个大问题。
因为 Tapestry 用 HiveMind 来确定和下载依赖项,所以第一步是让 Tapestry 知道 HiveMind 文件在哪儿。请转到 Tapestry 目录 —— 可能是 /usr/local/java/tapestry-4.0-beta-12 —— 然后进入 config 目录。应当看到一个 build.properties 文件。打开它的时候,会看到类似清单 1 的内容。在这里列出了 Tapestry 的几个核心库和依赖项,以及它们的位置。这个列表并不反映 Tapestry 需要的全部依赖项,但是反映了编译基本的 Tapestry 应用程序需要的依赖项集合。
清单 1. 默认的 Tapestry build.properties 文件
|
如果这些项目和分配给它们的位置看起来比较怪,那就对了。实际上应当清除掉属性文件中的全部内容,除了以 hivebuild.dir
和 tomcat.dir
开始的之外,因为这些依赖项应当已经就绪。请修改这些依赖项的位置,使其与 HiveMind 和 Tomcat 的安装位置匹配,build.properties 的最终版本看起来应当像清单 2 这样:
清单 2. 修改后的 build.properties 文件
|
保存这个文件,并返回 Tapestry 的根目录,设置 Ant。
Ant 的安装非常简单,只是需要些时间。首先在 Tapestry 的根目录下输入 ant install
。可以忽略所有文本,直到看到 像这样的文本 为止。
不必担心奇怪的格式;请输入 “continue
” 并按下回车,就开始下载 Tapestry 的额外依赖项。这一步骤要花些时间,所以如果构建过程看起来已经执行了一段时间,请不要担心:要下载多个库,还要编译许多代码。甚至还会看到安装了一些测试,然后可能得到 以下(明显的)错误。
|
不要被错误消息吓倒:一定要阅读各种 echo
语句的输出;它们表明 JUnit 已经下载并安装,只需要重新启动构建过程。
这是对的,现在还没有完。在提示符下,再次输入 ant install
,继续构建。安装了 JUnit 之后,构建会运行许多 JUnit 测试,以确保 Tapestry 的设置正确。因为这个构建过程要花许多时间,所以可以去喝杯咖啡,或者到另一台机器上编写一些 XHTML。如果事情进展顺利,构建过程的末尾 看起来会像这样。
构建完成之后,请进入 ext-package/lib 目录,列出目录列表。应当看到像这样的列表:
|
可以看到,构建过程下载了许多 额外的库。其中有许多是在构建 Tapestry 时使用的,其他一些是在编译时使用的。但是,对于运行时,需要把下面这些 Tapestry JAR 文件放在 Web 应用程序的 WEB-INF/lib 目录中:
- tapestry-4.0-beta-12.jar
- tapestry-annotations-4.0-beta-12.jar
- tapestry-contrib-4.0-beta-12.jar
- tapestry-portlet-4.0-beta-12.jar
另外,还需要把以下依赖项文件放在 Web 应用程序的 WEB-INF/lib 目录中:
- commons-codec-1.3.jar:URL 编码和解码工具的文件。
- commons-fileupload-1.0.jar:处理多部分文件上载的库。
- commons-logging-1.0.4.jar:Tapestry 用来记录信息和错误的框架。
- hivemind-1.1-rc-1.jar:Tapestry Java 对象的服务注册表。
- hivemind-lib-1.1-rc-1.jar:HiveMind 库。
- javassist-3.0.jar:运行时代码增强库。
- ognl-2.6.7.jar:导航对象图的表达式语言。
- oro-2.0.8.jar:模式匹配的表达式库。
看起来可能有许多文件,但是对于 Java 库来说,还是很常见的;只要把它们放在正确的位置,就不用再照顾它们了。关于安装的最好的消息就是:现在已经完成了!前提软件安装完成、Tapestry 和全部依赖项设置好之后,就可以看看一些 Tapestry Web 应用程序是什么样了。
|
比起从头开始构建 Tapestry 应用程序,先看看与 Tapestry 捆绑在一起的示例应用程序是个好主意。这样,在开发自己的 Tapestry 应用程序之前,对于 Tapestry 应用程序能做什么,就会有良好的认识。
要做的第一件事是进入 Tapestry 目录,然后进入 Examples 目录,每个示例都有自己的一组文件和子目录:
- Workbench (在 Workbench/ 中)是多个 Tapestry 用户界面组件的示例,例如表格、标签、调色板以及验证。
- 虚拟库 (在 Vlib/ 中),是一个完整的 J2EE 应用程序,使用实体 bean 和 CMP(容器管理的持久性)、会话 bean,当然还有 servlet。
- VlibBeans (在 VlibBeans/ 中)是虚拟库应用程序使用的 bean。
可以用 Ant 编译这些文件,但是其中涉及一个数据库的设置,然后把 Tapestry 设置成与这个数据库通信。这项工作的量很大,所以可以使用一个不错的快捷方法。请导航到 Howard Lewis Ship 的主页 (顺便说一下,这是 Tapestry 的创建者),在上面会看到有几个文件可以下载。请选择 tapestry-examples-4.0-beta-12.tar.gz(具体的版本可能会有不同),开始下载,然后坐下来休息一会儿,因为需要花上一些时间。
快速入门档案是一套预先配置好的示例,包括需要的全部依赖项,包括做好运行准备的 JBoss 应用程序服务器。要运行 Workbench 应用程序,请展开档案,并在生成的文件夹中找到可以运行示例的目录;例如 C:/java/tapestry/jboss-tapestry-examples-4.0-beta-12/。然后,进入这个新目录,再进入 bin 子目录。如果在 Windows 系统上,请输入命令 run
;在 Linux、Unix 或 Mac OS X 上,请输入 sh run.sh
(或者用来运行 shell 脚本的其他变体)。在控制台上会出现许多内容,结尾的内容 与这个类似。
|
这个脚本在 http://localhost:8080 上启动 JBoss 应用服务器预先配置好的示例(JBoss 使用 Tomcat 作为 servlet 引擎)。打开 Workbench 应用程序后,应当看到类似图 2 所示的内容:
继续使用这个示例应用程序。Workbench 可以让您看到 Tapestry 如何处理国际化(I18N)、字段、图片(如图 3 所示)、日期、颜色调色板、文件上载等。使用 Tapestry,只需要一两行代码就可以构建这些组件。
接下来看虚拟库应用程序。如果已经停止了 JBoss,请再启动它,然后导航到虚拟库应用程序。这个应用程序的前端不像 Workbench 那么漂亮,但是通过它可以体会到 Tapestry 如何用 EJB 容器(在这个示例中,显然是 JBoss)访问数据库。
如果想对这个应用程序有所体验,请从图书查询开始:输入标题、作者或者选择出版者(请参见图 4 的示例):
请单击左侧的 Login 链接并输入用户名 “ringbearer@bagend.shire
” 和口令 “secret
”。虽然这个用户没有书,但是他被分配了管理员权限,所以在屏幕的左侧可以看到出现几个新选项(请参见图 5)。请使用这些选项,体验 Tapestry 的运行方式。当您认识到 Tapestry 是一个简单的、模板驱动的框架,要让应用程序运行只需要很少的硬编码编程,那么就会开始认识到这些示例应用程序的复杂性。
|
除了让您自己查看 Tapestry 应用程序的样子以及它们的运行方式之外,快速入门档案还包括更多的方便示例,可以让您体会 Tapestry 应用程序的结构。请导航回档案 并找到名为 tapestry-tutorials.tar.gz 的文件。像预先构建的 Tapestry 示例一样,教程示例基本上也做好了运行的准备。
理解这些应用程序非常简单。先进入档案展开所创建的新目录,然后进入 helloworld/ 子目录。虽然可以签出源代码树,但是源代码的组织主要是个人偏好的问题。所以不必在这上面花费时间,请把示例构建为一个 WAR 文件:输入 ant
并让 Ant 替您构建 Hello World 示例应用程序。输出并不太令人振奋:
|
Ant 创建了一个 WAR 文件(在 target/ 目录中),可以把它放进 Tomcat 的 webapps/ 目录(通常是 /usr/local/jakarta-tomcat-5.5.9/webapps 或类似的地方)。这样 Tomcat 就会自动展开 WAR 文件并把它部署成 Web 应用程序。对于其他教程 Direct Link 和 Forms 来说,也同样操作,在 tapestry-tutorials 基目录下可以找到这些教程自己的目录。图 6 显示了 Direct Link 应用程序在 Tomcat 上运行的情况:
图 6. 在 Tomcat 上运行的 Direct Link
可以用 Direct Link 教程熟悉 Tapestry 应用程序的目录结构。首先,找到预先配置好的快速入门 Tomcat 安装并进入 webapps/ 目录。可以看到刚才移进去的 WAR 文件 —— 例如 directlink.war —— 还有一个同名目录。同名目录中是展开的 WAR 文件,所以请进入这个目录到处看看。可以看到一些文件:
- META-INF 是 WAR 文件清单的目录。
- Home.html 是 HTML 模板,Tapestry 用它显示主页。
- WEB-INF 是全部应用程序资源、web.xml 部署描述符和属性文件所在的目录。
现在进一步详细研究 Tapestry 的 HTML 模板和部署描述符。
首先,打开 Home.html 并签出 Tapestry 极为简单的页面设计模板;这个文件如 清单 3 所示。
在第 2 部分中,将学习许多关于页面创建的内容,但是现在要注意的主要事情是:对于大多数情况来说,Tapestry 中的 Web 页面都是用普通 HTML 加少数额外属性构建的。如果不愿意,可以不编写 JSP 代码,而且也不必把 HTML 放在众多的 servlet out.println()
语句中。相反,只要创建丰富的 HTML(或 XHTML)和 CSS 页面,并添加少数 Tapestry 特有的属性,那么就拥有了一个非常动态的应用程序。
这么做的结果就是,可以方便地让专家用 HTML、CSS 对整个站点进行布局,并用伪链接进行设计。到了部署应用程序的时候,只需用 Tapestry 的元素替换链接和组件即可。例如,请注意在清单 3 中,计数器的初始值被设置为默认值 “37”,包围在 span
标记内。设计师可以方便地用 span
或 div
标记把动态值或动态区圈出来。然后,Tapestry 设计师可以插入像 jwcid
或 listener
这样的属性,得到拥有出色外观的页面,但是却不需要让页面设计师学习 Java 或 Servlet API。
清单 4 显示了 Tapestry 应用程序典型的部署描述符。像在其他 Web 应用程序中一样,部署描述符只是把 servlet 映射到名称。具体地说,Tapestry ApplicationServlet
映射到 app
URI。这是 Tapestry 中的标准实践,所以可能想把这个描述符放到您的所有 Tapestry 应用程序中。(关于这一点,在第 2 部分中会学到更多。)
|
|
到了现在,您可能非常想看看让 Tapestry 应用程序运行的实际代码。让人大吃一惊的是:几乎没什么代码要看!虽然很可能需要编写定制代码(而且这种情况也很常见),但是对于许多任务来说,只需要使用基本的 Java 类。在 Direct Link 应用程序中(在其中要显示动态值),Tapestry 加上大约 20 行 Java 代码就满足了需求。清单 5 显示了为 Direct Link 示例应用程序驱动计数器的简单 Java 类。
|
有一个方法递增计数器,还有一个方法清除计数器,这就够了!没有特定于 HTML 的逻辑,没有奇怪的 Tapestry 交互(只有 @Persist
标注,在下一篇文章中将介绍它),以及两个获取和设置计数器的抽象方法。有了这个类负责计数器之后,只需要让 Tapestry 知道它要使用哪个标识符,那么像 Home.html 这样的页面组件就可以访问标识符了。可以通过 app.application 文件做这件事,这个文件保存在应用程序的 WEB-INF/ 目录中,如下所示:
|
请注意 app.application 文件实际上没有把 Home.class
文件直接映射到名称;相反,它只是告诉应用程序应当到哪儿去寻找 Java 类。所以,在 HTML 页面中的任何 Java 引用都会让 Tapestry 查看 tutorials.directlink.pages
包。不需要直接映射:包中的任何类,对页面来说都可用。在这个示例中,页面的名称(Home.html)自动与同名类映射(Home.class
)。足够简单,对吗?剩下的要理解的就是,在 Tapestry 和定制的 Home.class
中,HTML 实际上如何引用特定动作和方法。
|
这个谜的最后一部分就是 清单 3 中的 Home.html 中使用的 Tapestry 组件集。在第 2 部分中将学到关于 Tapestry 组件集的更多内容,但是在这里我会做一个简短介绍。请注意,每个组件都由 @
符号开始,并用 jwcid
属性进行标注(请回头看清单 3 以恢复记忆)。这些组件与 Tapestry 和定制类进行交互:
Insert
做的事正如其名:把值插入页面。这个示例中的值是ognl:counter
,是从 Java 类中取出的。PageLink
创建了到其他页面的链接;在这个示例中,链接到同一页面,所以实际效果是造成刷新。DirectLink
请求绑定到这个具体页面的 Java 组件(还记得吗,页面的名称与 Java 类的名称对应)。然后,listener
属性允许指定要调用的方法(doClear()
或doClick()
)。
显然,关于 Tapestry 组件,还有许多东西需要知道。在 @DirectLink
之前的那些短文本,像 “by5” 和 “by10”,是什么意思?为什么必须在 listener
属性中的方法名称之前加上 “listener” 前缀(看起来多余,是不是?)。除了 PageLink
和 Insert
之外,还有哪些组件构建到了 Tapestry 中?这些都是好问题,请等到下一篇文章就会知道答案。(是的,这就是 所谓的 “好戏在后头”。)
|
正如我在这篇文章开始时说的,而且也像您自己看到的,Tapestry 的口号是简单。虽然 Tapestry 只是 Web 开发的众多选择之一,但是在有些方面它很不寻常:它可以让您几乎只用 HTML、一些模板标记和一些 XML(多数情况下只是可选的),就能创建基于 servlet 的 Web 应用程序。而且,与其他简单的 Web 应用程序解决方案不同,Tapestry 会随着项目的成长而伸缩 —— 即使成百上千个页面也可以。
在这篇文章的第 2 部分中,我将深入研究 Tapestry 的 Web 应用程序开发。我将介绍如何创建 Web 页面并添加动态数据的占位符。还将学习如何创建 Java 类、把它们登记到 Tapestry 以及把它们打包成 Web 应用程序的组成部分。我还会介绍如何在页面中使用这些 Java 类,以及 Tapestry 提供的其他一些很酷的用户界面组件。在第 2 部分中,您将学会如何把简单的 HTML、模板标记和属性文件添加在一起,形成很棒的 Web 应用程序。
|
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- “Tiger 中的注释,第 1 部分: 向 Java 代码中添加元数据”(Brett McLaughlin,developerWorks,2004 年 9 月):学习关于 Java 5.0 标注语法的更多内容。
- “轻量级开发的成功秘诀,第 1 部分: 核心原则及原理” (Bruce Tate,developerWorks,2005 年 5 月):揭示一些与 Tapestry 类似的轻量级开发框架的秘密。
- JSR 168:Tapestry 提供了 portlet 规范的一种实现。
- Tapestry in Action (Howard Lewis Ship;Manning,2004 年):对 Tapestry 的精彩介绍,带有高级编程示例。
- Java 技术专区:数百篇关于 Java 编程各个方面的文章。
获得产品和技术
- Tapestry:一个开放源码的 Web 应用程序开发框架。
- Apache Tomcat:一个优秀的 servlet 引擎,与 Tapestry 合作得非常好。
- Apache Ant:基于 Java 的构建工具,用来构建 Tapestry。
- HiveMind:Tapestry 用来登记对象的接口。
- Apache Struts:Tapestry 的一个流行的替代品。
- 开放源码项目页面:开放源码项目的 developerWorks 指南。
讨论
- 加入本文的论坛 。(您也可以通过点击文章顶部或者底部的论坛链接参加讨论。)
- developerWorks blogs:加入 developerWorks 社区。
|
Brett McLaughlin 从 Logo 时代就开始使用计算机(还记得那个小三角吗?),并在 Nextel Communications 以及 Lutris Technologies 这样的公司工作。最近几年,他成为 Java 和 XML 阵营最知名的作者和程序员。他的最新力作 Java 5.0 Tiger: A Developer's Notebook,是关于 Java 最新版本的第一本书,而他的经典作品 Java and XML 仍然是在 Java 中使用 XML 技术的绝对经典之一。 |