同屬表現層框架,Struts 與 JSF/Tapestry 卻代表兩種截然不同的架構哲學:動作導向 MVC vs 元件化事件驅動。本文從事件模型、配置機制、IoC 整合、標籤庫表達力四個維度深度剖析。
| 維度 | Struts | JSF |
|---|---|---|
| 事件單元 | 整張表單對應一個 Action(Application Event,粗顆粒) | 單一元件欄位可觸發 ValueChange/Action 事件(Component Event,細顆粒) |
| 機制 | Command 模式 + execute() | Observer 模式 + Listener 綁定於元件 |
| 程式風格 | Web 原生(表單提交) | 桌面應用風格(類 Swing 事件模型) |
JSF 細顆粒事件支援即時欄位驗證、動態 UI 更新,Struts 需配合 JavaScript 繞彎實現。
web.xml Servlet 映射幾乎相同。struts-config.xml 定義 ActionForm/Action/Forward;JSF 用 faces-config.xml 定義 Managed Bean/Navigation Rule,邏輯更清晰分離。JSF managed-bean 內建 Setter 注入:
<managed-property>
<property-name>name</property-name>
<value>me</value>
</managed-property>
Struts 1.x 無原生 IoC,需外掛 Spring 或手工工廠模式。JSF 並支援 #{sessionScope.bean} 等 EL 表達式跨作用域注入。
JSF 推薦 Backing Bean 封裝單一頁面所有元件與邏輯(Facade/Adapter 模式),Managed Bean 可巢狀組合,作用域靈活配置。
Struts 大量 logic: 標籤導致 JSP 嵌套如俄羅斯方塊;JSF 元件屬性綁定極簡潔:
<h:commandLink action="inbox" disabled="#{!authBean.inboxAuthorized}" />
條件渲染一行搞定,邏輯零侵入視圖。