WebWork 2 (Struts 2 前身) 採用 **WebWork 2 + XWork 1** 雙層架構,徹底分離 Web 層與核心控制層。本文從宏觀角度梳理完整請求處理流程與關鍵組件職責。
| 層次 | 模組 | 核心職責 |
|---|---|---|
| Web 層 | WebWork 2 | HTTP 請求接收、參數/Session/Application Map 化、Servlet API 隔離、結果渲染 (JSP/Velocity/FreeMarker) |
| 核心層 | XWork 1 | Action 管理、攔截器鏈調度、OGNL 值棧、類型轉換、驗證、IoC 容器整合 |
HttpServletRequest/Response,解析 namespace、actionName。Map (即 ActionContext),保留原始 request/response 供極少數需求。ActionConfig,建立 DefaultActionProxy 與 DefaultActionInvocation。ActionContext (含值棧)。ObjectFactory 實例化 Action。xwork.xml 或註解)。ParametersInterceptor:請求參數 → OGNL → Action/Model 屬性。ModelDrivenInterceptor:模型物件壓入值棧頂端。ValidationInterceptor:執行驗證邏輯。WorkflowInterceptor:驗證失敗時返回 INPUT 結果。action.execute() (或指定方法)。ResultConfig,執行對應 Result 實作 (DispatcherResult → JSP, VelocityResult, StreamResult 等)。HttpServletResponse。HttpServletRequest
│
▼
ServletDispatcher (Front Controller)
│
├─► createContextMap() → Map (ActionContext)
│
▼
ActionProxyFactory → DefaultActionProxy
│
▼
DefaultActionInvocation (Dispatcher)
│
├─► Interceptor Chain (AroundInterceptor template)
│ ├─ ParametersInterceptor
│ ├─ ModelDrivenInterceptor
│ ├─ ValidationInterceptor
│ └─ ...
│
▼
Action (POJO, 可選實作 ModelDriven, Validateable)
│
▼
Result (View Rendering)
│
▼
HttpServletResponse
XWorkConverter + TypeConverter 註冊機制,消除 Action 中重複解析邏輯。ObjectFactory 介面支援 Spring、PicoContainer、Guice 整合,Action 依賴自動注入。com.opensymphony.webwork → org.apache.struts2,com.opensymphony.xwork → com.opensymphony.xwork2。webwork.properties → struts.properties,xwork.xml → struts.xml。<ww:form> → <s:form>,功能相容並增強。WebWork 2 的架構設計在當時極具前瞻性:**Servlet 解耦、POJO Action、攔截器 AOP、OGNL 統一存取**,直接影響了後續 Struts 2、Spring MVC、甚至現代響應式框架的設計思路。深入理解其源碼,有助於掌握 Java Web 框架的核心演進脈絡。