Struts 早期佔據主導,Tapestry 3.0 以組件化架構嶄露頭角,Sun 推出 JSF 標準化技術。雖 JSF 早期不成熟,但 1.1 版後正面迎戰。三者並非單純正面競爭,各有側重,選型需依專案需求。
所有框架必須實現三大核心能力:
| 比較維度 | Struts | Tapestry 3.0 | JSF |
|---|---|---|---|
| View 顯示元件要求 | 必須繼承 ActionForm |
分顯式/隱式調用,元件繼承 BaseComponent |
普通 POJO,無需繼承,使用 Managed Bean |
| 元件在 View 顯示粒度 | 頁面與 ActionForm 1:1:1,難以引入多元件 | 可任意嵌入多元件,無數量限制 | 同 Tapestry,支援細粒度元件組合 |
| 頁面分區/組合 | Tiles 標籤庫,需額外 tiles-def.xml |
元件擁有獨立視圖,自然組合,強大頁面組合能力 | 元件+標籤庫實現 Subview,複用 Layout 需結合 Tiles |
| 頁面跳轉 | html:link 指定 path,需對照 struts-config.xml,與 Action 耦合 |
目標為元件名/頁面名,無 path 概念,元件名即路徑,穩固方便 | 類似 Struts,需在 faces-config.xml 查找 navigation rule |
| 參數傳遞 | html:link 多參數處理麻煩 |
直接調用元件賦值,無參數個數限制 | 參數分離傳遞給元件 |
| 事件觸發粒度 | 表單層級單一事件,無法細化到欄位 | 可為每個欄位綁定事件,需實作 PageListener |
同 Tapestry,細化到欄位,需實作 ActionListener |
ActionForm 易變成「大雜燴」,違反封裝原則Struts/JSF 採用標籤庫+元件模式,需處理標籤與元件綁定。Tapestry 以元件庫取代標籤庫,純元件組合,無標籤庫學習成本,但需轉換思維(脫離 JSP 體系)。
<html:link page="/targetPath"> 需維護 path 映射,修改配置檔波及所有頁面faces-config.xml,from-outcome 對應目標<a jwcid="@DirectLink" listener="ognl:gotoTarget">,元件名即路徑,零配置若說 Struts 是左派、Tapestry 是右派,JSF 便是中間派——中庸主義正是 Sun 聯盟一貫策略。