- 浏览: 413608 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
liyuanhoa_:
...
struts2.0中struts.xml配置文件详解 -
chenmingde:
...
Velocity应用(一) -
weizhikai_ai:
第二十六,当一个线程进入一个对象的一个synchronized ...
Java常见面试题(含答案) -
Aurora_lr:
...
Spring宠物商店学习笔记(一) - -
zs911zs:
all copy from http://www.iteye ...
Mule入门文档
在这篇由两部分构成的文章的前一部分中,作者兼 developerWorks 的热心贡献者 Brett McLaughlin 对 Tapestry 进行介绍,从它的安装一直到文件结构。您可以看到 Tapestry 怎样帮助使用 HTML 和模板标记进行基于 servlet 的 Web 应用程序开发。
如果想出售产品,那么拥有在线设施是很重要的,不论是运作一家数百万美元的公司,还是只是想在假日处理几千个线手镯。在某些情况下,修补一些 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 已经就位!
术语安装 对于 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.dir 和 tomcat.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 如何处理国际化(I18N)、字段、图片(如图 3 所示)、日期、颜色调色板、文件上载等。使用 Tapestry,只需要一两行代码就可以构建这些组件。
图 3. Tapestry 的图表组件,jCharts
虚拟库应用程序
接下来看虚拟库应用程序。如果已经停止了 JBoss,请再启动它,然后导航到虚拟库应用程序。这个应用程序的前端不像 Workbench 那么漂亮,但是通过它可以体会到 Tapestry 如何用 EJB 容器(在这个示例中,显然是 JBoss)访问数据库。
如果想对这个应用程序有所体验,请从图书查询开始:输入标题、作者或者选择出版者(请参见图 4 的示例):
图 4. Tapestry 虚拟库中的图书查询
请单击左侧的 Login 链接并输入用户名 “ringbearer@bagend.shire” 和口令 “secret”。虽然这个用户没有书,但是他被分配了管理员权限,所以在屏幕的左侧可以看到出现几个新选项(请参见图 5)。请使用这些选项,体验 Tapestry 的运行方式。当您认识到 Tapestry 是一个简单的、模板驱动的框架,要让应用程序运行只需要很少的硬编码编程,那么就会开始认识到这些示例应用程序的复杂性。
图 5. 管理员用户的额外选项
回页首
方便的示例
除了让您自己查看 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 应用程序的目录结构。首先,找到预先配置好的快速入门 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 标记内。设计师可以方便地用 span 或 div 标记把动态值或动态区圈出来。然后,Tapestry 设计师可以插入像 jwcid 或 listener 这样的属性,得到拥有出色外观的页面,但是却不需要让页面设计师学习 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” 前缀(看起来多余,是不是?)。除了 PageLink 和 Insert 之外,还有哪些组件构建到了 Tapestry 中?这些都是好问题,请等到下一篇文章就会知道答案。(是的,这就是 所谓的 “好戏在后头”。)
回页首
Tapestry:值得使用
正如我在这篇文章开始时说的,而且也像您自己看到的,Tapestry 的口号是简单。虽然 Tapestry 只是 Web 开发的众多选择之一,但是在有些方面它很不寻常:它可以让您几乎只用 HTML、一些模板标记和一些 XML(多数情况下只是可选的),就能创建基于 servlet 的 Web 应用程序。而且,与其他简单的 Web 应用程序解决方案不同,Tapestry 会随着项目的成长而伸缩 —— 即使成百上千个页面也可以。
在这篇文章的第 2 部分中,我将深入研究 Tapestry 的 Web 应用程序开发。我将介绍如何创建 Web 页面并添加动态数据的占位符。还将学习如何创建 Java 类、把它们登记到 Tapestry 以及把它们打包成 Web 应用程序的组成部分。我还会介绍如何在页面中使用这些 Java 类,以及 Tapestry 提供的其他一些很酷的用户界面组件。在第 2 部分中,您将学会如何把简单的 HTML、模板标记和属性文件添加在一起,形成很棒的 Web 应用程序。
如果想出售产品,那么拥有在线设施是很重要的,不论是运作一家数百万美元的公司,还是只是想在假日处理几千个线手镯。在某些情况下,修补一些 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 已经就位!
术语安装 对于 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.dir 和 tomcat.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 如何处理国际化(I18N)、字段、图片(如图 3 所示)、日期、颜色调色板、文件上载等。使用 Tapestry,只需要一两行代码就可以构建这些组件。
图 3. Tapestry 的图表组件,jCharts
虚拟库应用程序
接下来看虚拟库应用程序。如果已经停止了 JBoss,请再启动它,然后导航到虚拟库应用程序。这个应用程序的前端不像 Workbench 那么漂亮,但是通过它可以体会到 Tapestry 如何用 EJB 容器(在这个示例中,显然是 JBoss)访问数据库。
如果想对这个应用程序有所体验,请从图书查询开始:输入标题、作者或者选择出版者(请参见图 4 的示例):
图 4. Tapestry 虚拟库中的图书查询
请单击左侧的 Login 链接并输入用户名 “ringbearer@bagend.shire” 和口令 “secret”。虽然这个用户没有书,但是他被分配了管理员权限,所以在屏幕的左侧可以看到出现几个新选项(请参见图 5)。请使用这些选项,体验 Tapestry 的运行方式。当您认识到 Tapestry 是一个简单的、模板驱动的框架,要让应用程序运行只需要很少的硬编码编程,那么就会开始认识到这些示例应用程序的复杂性。
图 5. 管理员用户的额外选项
回页首
方便的示例
除了让您自己查看 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 应用程序的目录结构。首先,找到预先配置好的快速入门 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 标记内。设计师可以方便地用 span 或 div 标记把动态值或动态区圈出来。然后,Tapestry 设计师可以插入像 jwcid 或 listener 这样的属性,得到拥有出色外观的页面,但是却不需要让页面设计师学习 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” 前缀(看起来多余,是不是?)。除了 PageLink 和 Insert 之外,还有哪些组件构建到了 Tapestry 中?这些都是好问题,请等到下一篇文章就会知道答案。(是的,这就是 所谓的 “好戏在后头”。)
回页首
Tapestry:值得使用
正如我在这篇文章开始时说的,而且也像您自己看到的,Tapestry 的口号是简单。虽然 Tapestry 只是 Web 开发的众多选择之一,但是在有些方面它很不寻常:它可以让您几乎只用 HTML、一些模板标记和一些 XML(多数情况下只是可选的),就能创建基于 servlet 的 Web 应用程序。而且,与其他简单的 Web 应用程序解决方案不同,Tapestry 会随着项目的成长而伸缩 —— 即使成百上千个页面也可以。
在这篇文章的第 2 部分中,我将深入研究 Tapestry 的 Web 应用程序开发。我将介绍如何创建 Web 页面并添加动态数据的占位符。还将学习如何创建 Java 类、把它们登记到 Tapestry 以及把它们打包成 Web 应用程序的组成部分。我还会介绍如何在页面中使用这些 Java 类,以及 Tapestry 提供的其他一些很酷的用户界面组件。在第 2 部分中,您将学会如何把简单的 HTML、模板标记和属性文件添加在一起,形成很棒的 Web 应用程序。
发表评论
-
初识Firebug 全文 — firebug的使用
2009-02-09 14:53 1261http://www.ooso.net/index.php/a ... -
XmlHttp封装研究
2009-01-05 15:18 1555虽然ajax有很多很牛的框 ... -
web.xml详解
2008-12-31 18:03 6479部署描述符实际上是一 ... -
Windows下svn客户端TortoiseSVN的安装和操作
2008-12-23 17:15 2903介绍几家免费提供svn源代码管理的站点 国内: http:/ ... -
Ant入门
2008-12-19 12:07 2056一. 配置环境变量 1. 添加ANT_HOME—— ... -
xfire定义
2008-12-19 10:44 1377XFire是新一代的Java Web服 ... -
JSTL定义
2008-12-19 10:00 1035JSTL(JSP Standard Tag Lib ... -
UDDI定义
2008-12-19 09:47 1382UDDI Universal Descripti ... -
SOA定义
2008-12-19 09:47 1110向服务的体系结构(Serv ... -
SOAP定义
2008-12-19 09:43 1464soap n. (英文)肥皂 SOAP:简单对象访 ... -
XMLHttpRequest对象
2008-12-18 17:35 852<%@ page contentType="t ... -
掌握 Ajax,第 2 部分: 使用 JavaScript 和 Ajax 发出异步请求
2008-12-17 11:53 862在 Web 请求中使用 XMLHttp ... -
掌握 Ajax 系列 一 Ajax 入门简介
2008-12-16 17:17 775Ajax 由 HTML、JavaScript™ ... -
响应重定向与请求转发
2008-12-16 12:16 2183摘要在javaEE Web组件开发中,页面之间的跳转无疑是必不 ... -
Struts分页的一个实现
2008-12-16 10:43 829在Web应用程序里,分页总让我们开发人员感到很头疼,倒不是因为 ... -
Tapestry 建立自己得 Validator
2008-12-11 17:07 881今天介绍一下如何建立自己得Validator 1. 建立Val ... -
正则表达式之道
2008-12-11 17:05 1162正则表达式之道 原 ... -
ognl的学习例子
2008-12-10 14:39 2119原贴见:http://blog.csdn.ne ... -
TextArea 组件
2008-12-09 20:55 1695A) Insert 组件 e.g. <in ... -
JS中文长度校验
2008-12-05 17:23 1500function changeAlert() { v ...
相关推荐
本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用。 首先,让我们深入理解Tapestry的核心理念。Tapestry的目标是通过提高开发效率、简化代码结构和增强可维护性来改善Java Web应用的...
1. **Tapestry Core**: 这是Tapestry框架的基础部分,包含了核心组件、服务容器(Tapestry IoC)和页面生命周期管理。通过源码分析,我们可以理解其如何实现页面组件的渲染、事件处理和依赖注入。 2. **Tapestry ...
#### 第7章:深入了解Tapestry - **内部架构**:深入解析Tapestry的内部架构,包括其核心模块、运行时机制等,有助于理解其运作原理。 - **组件生命周期**:详细介绍了Tapestry中组件的生命周期,包括初始化、渲染、...
7. **tapestry-core-NOTICE.txt**:除了许可,NOTICE文件通常包含对第三方代码或组件的引用和版权信息,帮助开发者了解他们使用了哪些外部资源。 8. **tapestry-hibernate-NOTICE.txt, tapestry-hibernate-core-...
接下来,我们将通过一个具体的示例来深入了解Tapestry 5的实际应用。假设我们需要开发一个简单的CRUD应用,该应用包含创建(Create)、读取(Read)、更新(Update)和删除(Delete)功能。 1. **环境搭建** - 安装JDK 5.0...
这本书将引领读者走进Tapestry 4的世界,了解其核心概念、架构以及最佳实践。 首先,书中会详细介绍Tapestry 4的基本概念,如组件、页面、事件和链接。组件是Tapestry 4的核心,它们是可重用的代码单元,可以是HTML...
- **配置文件详解**:解析 Tapestry 5 配置文件的各个部分及其功能。 ##### 3. **组件开发** - **基本组件开发**:教授如何创建简单的组件并将其嵌入到页面中。 - **高级组件特性**:介绍更复杂的组件功能,如事件...
通过学习这份指南,开发者不仅可以掌握Tapestry4的基本用法,还能了解到如何利用其特性来构建高效、可扩展的Web应用。 遗憾的是,提供的压缩包文件列表只包含一个名为“Tapestry4开发指南.doc”的文档,无法提供更...
Tapestry框架本身包含大量的类和接口,但开发者通常只需要了解和使用一小部分核心组件。例如,`IComponent`和`IPage`是两个关键接口,定义了组件和页面的行为。开发者通常不会直接实现这些接口,而是继承如`...
此外,Tapestry还提供了AJAX支持,使得部分页面更新成为可能,从而提升用户体验。 7. **集成其他技术**: Tapestry可以与各种数据库、ORM工具(如Hibernate)、安全框架(如Spring Security)和MVC框架(如Spring...
- 学习Tapestry的AJAX集成,首先需要熟悉Tapestry的基本概念和组件模型,然后了解AJAX的工作原理和JavaScript API。 - 通过阅读PPT和运行示例代码,实践并理解AJAX事件的触发和响应过程,以及如何在Tapestry中处理...
1. **Tapestry Core**:Tapestry的核心组件,提供基础架构,包括页面和组件的生命周期管理、事件处理、页面状态管理等。它的LICENSE和NOTICE文件详细描述了该模块的授权条件和版权信息。 2. **Tapestry Hibernate**...
了解这些库的用途和用法,对于理解Tapestry 如何整合和利用这些资源至关重要。 接下来,"tapestry-project-4.1.5"很可能包含了一个完整的Tapestry 应用示例。这个项目通常会包含源代码、配置文件、测试案例等,是...
"Tapestry4 Users Guide" 和 "Tapestry4 Quick Start" 这两份文档,分别提供了全面的用户指南和快速入门教程,帮助开发者了解和掌握Tapestry 4的使用方法和最佳实践。 10. **社区支持**: 作为Apache项目的一部分...
对于初次接触Tapestry的朋友们,了解其核心概念和特性是至关重要的。 1. **组件化编程**: Tapestry的核心理念是组件化,这意味着你可以将一个复杂的Web页面分解为多个独立的、可重用的组件。每个组件都有自己的...
- **第一个Tapestry应用**:通过创建一个简单的“Hello World”示例项目来快速上手Tapestry的基本用法。 - **项目结构**:理解Tapestry项目的目录结构,包括源代码、配置文件等组成部分。 - **构建工具**:介绍如何...
《Tapestry 5.0:构建Web应用程序》是一份专为深入了解Tapestry 5.0框架而准备的详细指南。Tapestry是Apache软件基金会的一个开源项目,它提供了一种基于Java的声明式MVC(Model-View-Controller)框架,用于构建...
接着,"**MyTapestry4-TWF**"可能代表Tapestry Web Forms,这是Tapestry4中处理用户输入和表单验证的重要部分。TWF(Tapestry Web Forms)提供了丰富的表单组件,如文本输入框、选择列表和按钮等,并支持事件处理和...
- **学习目标**:深入了解Tapestry的运行机制,为解决复杂问题打下基础。 #### 第8章:高级技术 - **主要内容**:涵盖更高级的Tapestry技术,如自定义渲染器、事件处理等。 - **学习目标**:掌握Tapestry中的高级...