了解 Tapestry,第 1 部分

级别: 初级

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 5.0 中的一项新特性是标注语法。使用标注,可以用一种与内联注释非常相似的样式对代码进行标记,标注以 @ 符号开始。可以使用标注为类添加元数据,然后编译器或 Tapestry 这样的框架可以使用元数据。具体来说,Tapestry 允许使用标注,直接在代码中描述原本需要在额外页面或组件中定义的行为。请参阅 参考资料 学习关于 Java 5.0 中标注的更多内容。

前提条件 1:Java 5.0

显然,使用 Tapestry 的第一个要求是,在机器上要有 Java 平台正在运行。虽然 Tapestry 几乎可以和任何相对较新的 Java 版本合作(Java 1.3 及以上版本),但最好是使用 Java 5.0。Tapestry 的几个可选特性只能在 Java 5 下工作。而且,现在真的是没有什么理由 转换到 Java 5:它是稳定并经过良好测试的,已经经过了最初始的发展痛苦。

前提条件 2:构建工具

有了 JVM 和 servlet 引擎,还需要 Apache Ant 这样的构建工具。虽然下载 Ant 很容易,但需要确定在路径中有 Ant 的二进制代码(对于 Linux/Mac OS X 系统是 ant,对于 Windows 系统是 ant.bat)。如果在空目录中输入 ant,可能会看到下面这样的输出:


Buildfile: build.xml does not exist!
Build failed

前提条件 3:微内核

最后需要安装一个微内核,叫作 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 引擎。



回页首


下载 Tapestry 4.0

所有的前提条件就绪之后,请前往 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 了解顶级目录结构:


图 1. Tapestry 目录结构
Tapestry 拥有预先构建好的 JAR 文件和许多源代码

Tapestry 已经就位!

术语安装 对于 Tapestry 来说,有点儿名不符实!Tapestry 与在后台运行的 Java 应用程序或者在网络上提供内容的 servlet 引擎不同。相反,它是一组可以在应用程序中使用的实用工具 —— 从类到标记。所以不是 “安装” Tapestry,而是让 Web 应用程序可以使用它,并把 Tapestry 和它的依赖项与 Web 应用程序绑在一起。

变化、变化、变化

JAR 文件的名称可能略有不同,这与下载的 Tapestry 版本对应。但是,不管 Tapestry 的主版本号是多少,所有 Tapestry 安装中都应当有四个 JAR 文件。

设置 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 文件


# Copyright 2005 The Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

jboss.dir = c:/Work/jboss-3.0.6

jython.dir = c:/Work/Jython21

jetty.dir = c:/Work/Jetty-4.2.22

tomcat.dir = C:/Program Files/Apache Group/Tomcat 4.1

hivebuild.dir=c:/workspace/jakarta-hivemind/hivebuild

clover.dir=c:/Work/clover-1.0

jboss.dir=C:/jboss-4.0.2

如果这些项目和分配给它们的位置看起来比较怪,那就对了。实际上应当清除掉属性文件中的全部内容,除了以 hivebuild.dirtomcat.dir 开始的之外,因为这些依赖项应当已经就绪。请修改这些依赖项的位置,使其与 HiveMind 和 Tomcat 的安装位置匹配,build.properties 的最终版本看起来应当像清单 2 这样:


清单 2. 修改后的 build.properties 文件


# Copyright 2005 The Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

tomcat.dir=/usr/local/java/jakarta-tomcat-5.5.9

hivebuild.dir=c:/workspace/jakarta-hivemind/hivebuild

保存这个文件,并返回 Tapestry 的根目录,设置 Ant。

设置 Ant

Ant 的安装非常简单,只是需要些时间。首先在 Tapestry 的根目录下输入 ant install。可以忽略所有文本,直到看到 像这样的文本 为止。

不必担心奇怪的格式;请输入 “continue” 并按下回车,就开始下载 Tapestry 的额外依赖项。这一步骤要花些时间,所以如果构建过程看起来已经执行了一段时间,请不要担心:要下载多个库,还要编译许多代码。甚至还会看到安装了一些测试,然后可能得到 以下(明显的)错误

对于高级开发人员

如果想在 Tapestry 开发中使用额外项目,只需修改 build.properties,反映这些项目的位置即可。然后,只需删除没有 的项目对应的行,并让 Tapestry 下载实际的依赖项。

不要被错误消息吓倒:一定要阅读各种 echo 语句的输出;它们表明 JUnit 已经下载并安装,只需要重新启动构建过程。

构建和更多构建

这是对的,现在还没有完。在提示符下,再次输入 ant install,继续构建。安装了 JUnit 之后,构建会运行许多 JUnit 测试,以确保 Tapestry 的设置正确。因为这个构建过程要花许多时间,所以可以去喝杯咖啡,或者到另一台机器上编写一些 XHTML。如果事情进展顺利,构建过程的末尾 看起来会像这样

这些库都是什么?

构建完成之后,请进入 ext-package/lib 目录,列出目录列表。应当看到像这样的列表:


[bmclaugh:/usr/local/java/tapestry-4.0-beta-12/ext-package/lib]$ ls
cglib-full-2.0.1.jar                    jdom-1.0.jar
cglib-full-2.0.2.jar                    junit-3.8.1.jar
commons-codec-1.3.jar                   log4j-1.2.8.jar
commons-fileupload-1.0.jar              ognl-2.6.7.jar
commons-logging-1.0.4.jar               oro-2.0.8.jar
easymock-1.1.jar                        portlet-api-1.0.jar
easymockclassextension-1.1.jar          servletapi-2.3.jar
hivemind-1.1-rc-1.jar                   spring-1.1.jar
hivemind-lib-1.1-rc-1.jar               tapestry-4.0-beta-12.jar
javassist-3.0.jar                       tapestry-annotations-4.0-beta-12.jar
jboss-j2ee-3.2.1.jar                    tapestry-contrib-4.0-beta-12.jar
jboss-j2ee-4.0.0DR4.jar                 tapestry-portlet-4.0-beta-12.jar
jcharts-0.6.0.jar                       vlibbeans-4.0-beta-12.jar

可以看到,构建过程下载了许多 额外的库。其中有许多是在构建 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 应用程序能做什么,就会有良好的认识。

要做的第一件事是进入 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(具体的版本可能会有不同),开始下载,然后坐下来休息一会儿,因为需要花上一些时间。

Workbench 应用程序

快速入门档案是一套预先配置好的示例,包括需要的全部依赖项,包括做好运行准备的 JBoss 应用程序服务器。要运行 Workbench 应用程序,请展开档案,并在生成的文件夹中找到可以运行示例的目录;例如 C:/java/tapestry/jboss-tapestry-examples-4.0-beta-12/。然后,进入这个新目录,再进入 bin 子目录。如果在 Windows 系统上,请输入命令 run;在 Linux、Unix 或 Mac OS X 上,请输入 sh run.sh(或者用来运行 shell 脚本的其他变体)。在控制台上会出现许多内容,结尾的内容 与这个类似

两个 Tomcat?

要运行 Tapestry 应用程序,Tomcat(或类似的 servlet 引擎)是必需的,所以在第 2 部分中从头开始构建应用程序时,如果机器上已经安装了 Tomcat 会很方便。但是,如果现在机器上已经安装了 Tomcat,那么在运行预先配置的示例之前,需要先关闭 Tomcat,因为快速入门档案中包含一个 Tomcat 安装。如果在启动示例时,原有的 Tomcat 正在运行,那么会出现端口冲突,因为两个 Tomcat 都会试图使用端口 8080。

这个脚本在 http://localhost:8080 上启动 JBoss 应用服务器预先配置好的示例(JBoss 使用 Tomcat 作为 servlet 引擎)。打开 Workbench 应用程序后,应当看到类似图 2 所示的内容:


图 2. Workbench 应用程序
Workbench 应用程序演示了 Tapestry 的用户界面组件

继续使用这个示例应用程序。Workbench 可以让您看到 Tapestry 如何处理国际化(I18N)、字段、图片(如图 3 所示)、日期、颜色调色板、文件上载等。使用 Tapestry,只需要一两行代码就可以构建这些组件。


图 3. Tapestry 的图表组件,jCharts
Tapestry 使用像 jCharts 这样的辅助库提供精彩的显示

虚拟库应用程序

接下来看虚拟库应用程序。如果已经停止了 JBoss,请再启动它,然后导航到虚拟库应用程序。这个应用程序的前端不像 Workbench 那么漂亮,但是通过它可以体会到 Tapestry 如何用 EJB 容器(在这个示例中,显然是 JBoss)访问数据库。

如果想对这个应用程序有所体验,请从图书查询开始:输入标题、作者或者选择出版者(请参见图 4 的示例):


图 4. Tapestry 虚拟库中的图书查询
虚拟库演示了 Tapestry 的数据库交互

请单击左侧的 Login 链接并输入用户名 “ringbearer@bagend.shire” 和口令 “secret”。虽然这个用户没有书,但是他被分配了管理员权限,所以在屏幕的左侧可以看到出现几个新选项(请参见图 5)。请使用这些选项,体验 Tapestry 的运行方式。当您认识到 Tapestry 是一个简单的、模板驱动的框架,要让应用程序运行只需要很少的硬编码编程,那么就会开始认识到这些示例应用程序的复杂性。


图 5. 管理员用户的额外选项
Tapestry 处理权限和角色很容易


回页首


方便的示例

除了让您自己查看 Tapestry 应用程序的样子以及它们的运行方式之外,快速入门档案还包括更多的方便示例,可以让您体会 Tapestry 应用程序的结构。请导航回档案 并找到名为 tapestry-tutorials.tar.gz 的文件。像预先构建的 Tapestry 示例一样,教程示例基本上也做好了运行的准备。

这是对的 —— Hello World!

理解这些应用程序非常简单。先进入档案展开所创建的新目录,然后进入 helloworld/ 子目录。虽然可以签出源代码树,但是源代码的组织主要是个人偏好的问题。所以不必在这上面花费时间,请把示例构建为一个 WAR 文件:输入 ant 并让 Ant 替您构建 Hello World 示例应用程序。输出并不太令人振奋:


Buildfile: build.xml

compile:
 [mkdir] Created dir: /usr/local/java/tapestry-tutorials/helloworld/target/classes

war:
[war] Building war: /usr/local/java/tapestry-tutorials/helloworld/target/helloworld.war

BUILD SUCCESSFUL
Total time: 2 seconds

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 的一个简单而良好的实际演示

应用程序目录结构

可以用 Direct Link 教程熟悉 Tapestry 应用程序的目录结构。首先,找到预先配置好的快速入门 Tomcat 安装并进入 webapps/ 目录。可以看到刚才移进去的 WAR 文件 —— 例如 directlink.war —— 还有一个同名目录。同名目录中是展开的 WAR 文件,所以请进入这个目录到处看看。可以看到一些文件:

  • META-INF 是 WAR 文件清单的目录。
  • Home.html 是 HTML 模板,Tapestry 用它显示主页。
  • WEB-INF 是全部应用程序资源、web.xml 部署描述符和属性文件所在的目录。

现在进一步详细研究 Tapestry 的 HTML 模板和部署描述符。

HTML 模板

首先,打开 Home.html 并签出 Tapestry 极为简单的页面设计模板;这个文件如 清单 3 所示。

在第 2 部分中,将学习许多关于页面创建的内容,但是现在要注意的主要事情是:对于大多数情况来说,Tapestry 中的 Web 页面都是用普通 HTML 加少数额外属性构建的。如果不愿意,可以不编写 JSP 代码,而且也不必把 HTML 放在众多的 servlet out.println() 语句中。相反,只要创建丰富的 HTML(或 XHTML)和 CSS 页面,并添加少数 Tapestry 特有的属性,那么就拥有了一个非常动态的应用程序。

这么做的结果就是,可以方便地让专家用 HTML、CSS 对整个站点进行布局,并用伪链接进行设计。到了部署应用程序的时候,只需用 Tapestry 的元素替换链接和组件即可。例如,请注意在清单 3 中,计数器的初始值被设置为默认值 “37”,包围在 span 标记内。设计师可以方便地用 spandiv 标记把动态值或动态区圈出来。然后,Tapestry 设计师可以插入像 jwcidlistener 这样的属性,得到拥有出色外观的页面,但是却不需要让页面设计师学习 Java 或 Servlet API。

部署描述符

清单 4 显示了 Tapestry 应用程序典型的部署描述符。像在其他 Web 应用程序中一样,部署描述符只是把 servlet 映射到名称。具体地说,Tapestry ApplicationServlet 映射到 app URI。这是 Tapestry 中的标准实践,所以可能想把这个描述符放到您的所有 Tapestry 应用程序中。(关于这一点,在第 2 部分中会学到更多。)


清单 4. 示例 Tapestry 描述符



<?xml version="1.0" encoding="UTF-8"?>
<!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>
  <display-name>Tutorial: DirectLink</display-name>
  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app</url-pattern>
  </servlet-mapping>
</Web-app>



回页首


代码展示!

到了现在,您可能非常想看看让 Tapestry 应用程序运行的实际代码。让人大吃一惊的是:几乎没什么代码要看!虽然很可能需要编写定制代码(而且这种情况也很常见),但是对于许多任务来说,只需要使用基本的 Java 类。在 Direct Link 应用程序中(在其中要显示动态值),Tapestry 加上大约 20 行 Java 代码就满足了需求。清单 5 显示了为 Direct Link 示例应用程序驱动计数器的简单 Java 类。


清单 5. Tapestry 非常简单的 Java


import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.html.BasePage;

public abstract class Home extends BasePage
{
    @Persist
    public abstract int getCounter();
    public abstract void setCounter(int counter);

    public void doClick(int increment)
    {
        int counter = getCounter();

        counter += increment;

        setCounter(counter);
    }

    public void doClear()
    {
        setCounter(0);
    }
}

有一个方法递增计数器,还有一个方法清除计数器,这就够了!没有特定于 HTML 的逻辑,没有奇怪的 Tapestry 交互(只有 @Persist 标注,在下一篇文章中将介绍它),以及两个获取和设置计数器的抽象方法。有了这个类负责计数器之后,只需要让 Tapestry 知道它要使用哪个标识符,那么像 Home.html 这样的页面组件就可以访问标识符了。可以通过 app.application 文件做这件事,这个文件保存在应用程序的 WEB-INF/ 目录中,如下所示:


<?xml version="1.0"?>

<!DOCTYPE application PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">

<application>
  <meta key="org.apache.tapestry.page-class-packages" 
  value="tutorials.directlink.pages"/>

</application>

请注意 app.application 文件实际上没有把 Home.class 文件直接映射到名称;相反,它只是告诉应用程序应当到哪儿去寻找 Java 类。所以,在 HTML 页面中的任何 Java 引用都会让 Tapestry 查看 tutorials.directlink.pages 包。不需要直接映射:包中的任何类,对页面来说都可用。在这个示例中,页面的名称(Home.html)自动与同名类映射(Home.class)。足够简单,对吗?剩下的要理解的就是,在 Tapestry 和定制的 Home.class 中,HTML 实际上如何引用特定动作和方法。



回页首


Tapestry 的组件集

这个谜的最后一部分就是 清单 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” 前缀(看起来多余,是不是?)。除了 PageLinkInsert 之外,还有哪些组件构建到了 Tapestry 中?这些都是好问题,请等到下一篇文章就会知道答案。(是的,这就是 所谓的 “好戏在后头”。)



回页首


Tapestry:值得使用

正如我在这篇文章开始时说的,而且也像您自己看到的,Tapestry 的口号是简单。虽然 Tapestry 只是 Web 开发的众多选择之一,但是在有些方面它很不寻常:它可以让您几乎只用 HTML、一些模板标记和一些 XML(多数情况下只是可选的),就能创建基于 servlet 的 Web 应用程序。而且,与其他简单的 Web 应用程序解决方案不同,Tapestry 会随着项目的成长而伸缩 —— 即使成百上千个页面也可以。

在这篇文章的第 2 部分中,我将深入研究 Tapestry 的 Web 应用程序开发。我将介绍如何创建 Web 页面并添加动态数据的占位符。还将学习如何创建 Java 类、把它们登记到 Tapestry 以及把它们打包成 Web 应用程序的组成部分。我还会介绍如何在页面中使用这些 Java 类,以及 Tapestry 提供的其他一些很酷的用户界面组件。在第 2 部分中,您将学会如何把简单的 HTML、模板标记和属性文件添加在一起,形成很棒的 Web 应用程序。



回页首


参考资料

学习


获得产品和技术

  • Tapestry:一个开放源码的 Web 应用程序开发框架。

  • Apache Tomcat:一个优秀的 servlet 引擎,与 Tapestry 合作得非常好。

  • Apache Ant:基于 Java 的构建工具,用来构建 Tapestry。

  • HiveMind:Tapestry 用来登记对象的接口。

  • Apache Struts:Tapestry 的一个流行的替代品。

  • 开放源码项目页面:开放源码项目的 developerWorks 指南。


讨论

  • 加入本文的论坛 。(您也可以通过点击文章顶部或者底部的论坛链接参加讨论。)

  • developerWorks blogs:加入 developerWorks 社区。



回页首


关于作者

Brett McLaughlin 的照片

Brett McLaughlin 从 Logo 时代就开始使用计算机(还记得那个小三角吗?),并在 Nextel Communications 以及 Lutris Technologies 这样的公司工作。最近几年,他成为 Java 和 XML 阵营最知名的作者和程序员。他的最新力作 Java 5.0 Tiger: A Developer's Notebook,是关于 Java 最新版本的第一本书,而他的经典作品 Java and XML 仍然是在 Java 中使用 XML 技术的绝对经典之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值