無論是經營跨國企業,還是只是想在假期銷售手工藝品,擁有完善的線上銷售平台都至關重要。雖然拼湊幾個網頁並接入 PayPal 或 eBay 等現成系統能暫時應付,但一個設計良好的 Web 應用程式才能將線上銷售從「小打小鬧」提升為專業、動態的線上商店。消費者天生更傾向於在正規商店而非跳蚤市場消費,這正是專業 Web 架構的價值所在。
然而,踏入 Java Web 開發框架的世界往往令人望而卻步——Struts、JSF、Spring 雖然強大,但學習曲線陡峭,光是向新手解釋「控制反轉」就足以讓人頭大。幸運的是,還有一條更輕鬆的路:Apache Tapestry。
Tapestry 是基於 Apache 授權條款的開源 Java 框架,專為簡化 Web 開發而生。其核心優勢在於:
Tapestry 的安裝哲學是「簡單不代表簡陋」。入門門檻極低,對 Web 開發者而言幾乎都是標配:
雖然 Tapestry 相容 Java 1.3 以上版本,但強烈建議使用 Java 5.0。註解特性僅在 Java 5 下生效,且 Java 5 早已穩定成熟,無理由不升級。
確保 ant(Linux/Mac)或 ant.bat(Windows)已在 PATH 中。空目錄執行 ant 若顯示 Buildfile: build.xml does not exist! 即代表安裝正常。
HiveMind 負責 Tapestry 應用程式的物件註冊。下載後放置於任意目錄(如 /usr/local/java/hivemind-1.1),稍後配置路徑即可。
前往 Jakarta Tapestry 官網下載最新版(撰寫時為 tapestry-4.0-beta-12.tar.gz)。雖然通常建議用穩定版學習,但 Tapestry 4.0 已接近 Beta 尾聲,較 3.x 有顯著改進。解壓後將資料夾移至 /usr/local/java 或 C:/java 等慣用路徑。
關鍵觀念:Tapestry 不像 Tomcat 那樣「安裝後常駐後台」,它只是一組工具類庫(JAR 檔與標籤)。所謂安裝,實際上是將 Tapestry 及其依賴綁定到您的 Web 應用程式中。
將 Tapestry 根目錄下的四個核心 JAR 複製到 Web 應用的 WEB-INF/lib:
tapestry-4.0-beta-12.jar(框架核心)tapestry-annotations-4.0-beta-12.jar(Java 5 註解支援)tapestry-contrib-4.0-beta-12.jar(擴充元件)tapestry-portlet-4.0-beta-12.jar(JSR-168 Portlet 支援)Tapestry 依賴多個第三方庫,但透過 HiveMind 可自動下載管理。關鍵步驟:
config/build.properties,僅保留 tomcat.dir 與 hivebuild.dir,並指向正確安裝路徑ant install,輸入 continue 確認開始下載依賴ext-package/lib 將包含所有運行時依賴運行時必須複製到 WEB-INF/lib 的關鍵依賴包括:commons-codec、commons-fileupload、commons-logging、hivemind、hivemind-lib、javassist、ognl、oro 等。放好即可一勞永逸。
與其從零開始,不如先跑通官方範例。下載 tapestry-examples-4.0-beta-12.tar.gz(含預配置 JBoss/Tomcat),解壓進入 bin 目錄:
run.batsh run.sh
Workbench 展示了國際化、表單驗證、圖表(jCharts)、檔案上傳、色盤等豐富元件——每個僅需一兩行程式碼。
Virtual Library(虛擬圖書館)則示範了 EJB 容器存取資料庫的完整流程。以管理員帳號 ringbearer@bagend.shire / secret 登入後,可體驗完整的後台管理功能。
教程包 tapestry-tutorials.tar.gz 提供即拿即用的 WAR 檔。以 helloworld 為例:
cd helloworld
ant
# 輸出 target/helloworld.war
cp target/helloworld.war $TOMCAT_HOME/webapps/
Tomcat 會自動解壓部署。展開後的目錄結構清晰明瞭:
META-INF/:WAR 清單Home.html:HTML 模板WEB-INF/:部署描述符、屬性檔、應用資源Tapestry 頁面本質是純 HTML/XHTML + CSS,僅添加少量 jwcid、listener 等屬性。設計師可用 <span> 或 <div> 標記動態區塊,開發者再注入邏輯——完全分離關注點。
<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>
將 ApplicationServlet 映射至 /app 是 Tapestry 慣例,可直接複用於所有專案。
Direct Link 範例中,動態計數器功能僅需 ~20 行 Java 程式碼:
public abstract class Home extends BasePage {
@Persist
public abstract int getCounter();
public abstract void setCounter(int counter);
public void doClick(int increment) {
setCounter(getCounter() + increment);
}
public void doClear() { setCounter(0); }
}
無 HTML 邏輯、無 Servlet API、無複雜配置。透過 app.application 指定頁面類別包路徑 tutorials.directlink.pages,Tapestry 自動依慣例映射 Home.html ↔ Home.class。
ognl:counter 從 Java 取值)listener:doClick、listener:doClear)更多元件細節(by5、by10 參數含義、listener: 前綴用途等)將在下集深入解析。
Tapestry 證明了「簡單」與「強大」並不衝突。它讓您幾乎只用 HTML、模板標記與少量 XML,即可構建可隨專案無限擴展的 Servlet 應用。下一集我們將深入頁面建構、動態資料綁定、Java 類別註冊與封裝部署,掌握更酷的 UI 元件——敬請期待!