Struts2 請求處理涉及三個易混淆的上下文對象,理解它們的層級關係與訪問差異,是掌握框架數據流轉的關鍵。
| 組件 | 核心職責 | 數據結構 | 生命週期 |
|---|---|---|---|
| ValueStack | 存放 Action 屬性值、表單數據 | 棧 | 請求級 |
| StackContext | 請求/會話/應用層級 Map 容器 | Map 映射 | 請求級 |
| ActionContext | Action 執行上下文總入口 | Map(含 ValueStack 引用) | 請求級 |
JSP/EL 表達式中:
${userName}(OGNL 自動查棧)# 前綴,${#request.key}、${#session.user}// 攔截器中 ActionContext ctx = invocation.getInvocationContext(); // 或全局靜態獲取(僅請求線程有效) ActionContext ctx = ActionContext.getContext(); // Action 類中 // 1. 接口注入實現 SessionAware/RequestAware // 2. ActionContext.getContext()
// 獲取原生 Request
HttpServletRequest request = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);
// 獲取 Request Map
Map requestMap = (Map) ctx.get("request");
深度理解:ActionContext = { valueStack, requestMap, sessionMap, applicationMap, parameters, ... }。OGNL 表達式解析時優先搜索 ValueStack,再遍歷 ActionContext 其他 Map。