Struts 基於 Action、無狀態模型將逐漸淡出,基於組件、事件驅動的 JSF (JSR-127) 與 Tapestry 成主流競爭者。本文基於 JSF 1.1 與 Tapestry 3.0.3(涉及 4.0)從頁面開發、Java 編程模型、請求處理生命週期三維度詳細對比,助選型。
| 維度 | JSF | Tapestry |
|---|---|---|
| 模板技術 | JSP 標籤 | 純 HTML + jwcid 屬性 |
| 瀏覽器預覽 | 不可直接預覽,需 IDE 或部署運行 | 可直接在瀏覽器預覽(放入 body 即可) |
| 標籤格式 | 非標準 HTML | 良好格式,成對出現 |
| 支援標記語言 | JSP | HTML、WML |
| 多設備適配 | 宣稱單模板多設備,實際協調差異困難,需學新標籤庫 | 同樣支援多設備,但 HTML 基礎更易控制 |
| 設計師協作 | 衝突:設計師習慣 HTML 工具,不願用 JSF IDE → 工作轉嫁給 Java 程式員 | 設計師可用流行 HTML 工具編寫/預覽,協作順暢 |
Facelets 方案浮現:靈感源自 Tapestry 模板,讓 JSF 擺脫 JSP 依賴,支援 Tapestry 風格標籤。未來將被廣泛採用,或影響 JSF 後續版本。Tapestry 在表現層具備明顯優勢。
| 維度 | JSF | Tapestry |
|---|---|---|
| 頁面定義文件 | 無,僅全局 faces-config.xml 定義 Managed Bean | 每頁需頁面定義文件,綁定控制元素與 Java 類 |
| Java 類約束 | Managed Bean 為標準 JavaBean,無繼承強制 | 頁面類必須繼承 BasePage/AbstractPage,與框架緊耦合(4.0 改善) |
| 代碼組織靈活性 | 組合方式豐富:指定 Bean 完成功能、Bean 間引用共享 | 僅能用類繼承,非理想 |
| Spring 整合 | Managed Bean 即 IoC,JSF-Spring 擴展無縫整合 | 3.0 整合較弱,4.0 引入類似 Managed Bean 技術、支援 Java 5 註解、減少 XML |
| Session/Application 狀態管理 | 直觀:EL 直接訪問任意作用域 Bean | 相對較差,4.0 大幅改進 |
JSF 編程模型靈活性優於 Tapestry。
JSF 生命週期概念更易理解;Tapestry 可針對特定操作定義生命週期,某些問題解決更優雅。