Struts(老牌霸主)、Tapestry(組件導向新貴)、JSF(Sun 標準規範)構成 Java Web 表現層三大陣營。Struts 早期佔據絕對優勢;Tapestry 3.0 以強大組件模型崛起;JSF 1.1 正式推出後,以標準化姿態切入。三者各有設計哲學與適用場景,非單純替代關係。
所有表現層框架必須實現三大核心功能:
| 比較維度 | Struts | Tapestry 3.0 | JSF |
|---|---|---|---|
| View 組件要求 | 必須繼承 ActionForm,分顯式/隱式調用 |
必須繼承 BaseComponent |
普通 POJO,無需繼承(Managed Bean) |
| 頁面組件粒度 | 頁面與 ActionForm 1:1:1 綁定,難以複用多組件 | 組件可任意嵌入頁面任何位置,數量無限制 | 同 Tapestry,支援細粒度組件複用 |
| 頁面分區/佈局 | Tiles 標籤庫 + tiles-def.xml 額外配置 |
組件擁有獨立視圖,自然支援強大頁面組合 | 組件+標籤庫實現 Subview,複用 Layout 需結合 Tiles |
| 頁面跳轉 | html:link 指定 path,需對照 struts-config.xml,與 Action 耦合 |
直接以組件名稱跳轉,無路徑概念,穩固不易破壞 | 類似 Struts,需在 faces-config.xml 查找 navigation rule |
| 參數傳遞 | html:link 多參數處理麻煩 |
直接調用組件設定參數,無數量限制 | 參數分離傳遞給組件 |
| 事件觸發粒度 | 整個表單單一事件(submit),無法細化到欄位 | 可為每個表單欄位綁定事件,需實作 PageListener |
同 Tapestry,細化到欄位級,需實作 ActionListener |
Struts 限制 ActionForm 與 Action 1:1 綁定,導致:
Struts/JSF 依賴標籤庫渲染組件,「標籤庫(框架提供)」與「組件(開發者編寫)」的結合點增加認知負擔。Tapestry 以「組件庫」取代標籤庫,統一為組件操作,思維更一致。
| 框架 | 跳轉機制 | 優點 | 缺點 |
|---|---|---|---|
| Struts | <html:link page="/targetPath">,path 對應 struts-config.xml action path |
集中配置管理 | 修改 path 需同步更新所有頁面;多參數傳遞繁瑣 |
| JSF | 導航規則 <navigation-case> 在 faces-config.xml 定義 |
邏輯與視圖分離 | 仍需查找配置檔;from-outcome 機制間接 |
| Tapestry | 直接指定目標組件/頁面名稱,<a href="#" jwcid="@PageLink" page="TargetPage"> |
組件名即路徑,無額外映射;重構安全 | 需適應「無 JSP、全組件」思維轉換 |
三者皆支援多種客戶端輸出(HTML、WML、XUL 等),透過不同 Render Kit 實現。
若 Struts 是左派(動作導向),Tapestry 是右派(組件導向),則 JSF 是中間派(中庸標準化)——這正是 Sun 聯盟策略的體現。
實務建議:技術選型無絕對優劣,關鍵在於團隊經驗、專案屬性、長期演進規劃的匹配度。歡迎分享實戰經驗,為後進提供參考。