程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 了解Tapestry,第1部分 - 啟動Tapestry並在Java環境中運行

了解Tapestry,第1部分 - 啟動Tapestry並在Java環境中運行

編輯:關於JAVA

如果想出售產品,那麼擁有在線設施是很重要的,不論是運作一家數百萬美元的公司,還是只是想在假日處理幾千個線手镯。在某些情況下,修補一些 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 允許使用標注,直接在代碼中描述原本需要在額外頁面或組件中定義的行為。

前提條件 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 鏈接並輸入用戶名 “[email protected]” 和口令 “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 應用程序。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved