首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 中 Map 與原生域對象屬性同步機制深度解析

     編輯:程式設計綜合問答

Struts2 開發中,經常聽到「把數據放進 Map,域對象裡也會有嗎?」這類疑問。本文從源碼角度徹底釐清 Map 與 request/session/application 原生域對象的屬性同步關係。

核心結論

Struts2 最終會將 Map 中的鍵值對「平鋪」存入對應的原生域對象中。 即:map.put("key", val) 實際上等價於 request.setAttribute("key", val)(以 request 域為例)。

源碼級驗證路徑

  1. ActionContext.getContext().getValueStack() 獲取值棧。
  2. 值棧內部持有 CompoundRoot,包含 Action 實例及 Map 結構的上下文映射。
  3. ServletActionContext.getRequest() 獲取原生 HttpServletRequest。
  4. Struts2 的 RequestMap、SessionMap、ApplicationMap 分別實現 Map 接口,內部委託調用 request.setAttribute/getAttribute/removeAttribute。

同步規則總結表

操作Map 端原生域端說明
增/改map.put(k,v)request.setAttribute(k,v)雙向同步,實時生效
刪map.remove(k)request.removeAttribute(k)雙向同步
查map.get(k)request.getAttribute(k)數據源同一份
遍歷map.keySet()request.getAttributeNames()視圖一致

實戰避坑指南

  • 不要同時用 Map 和原生 API 操作同一 key,雖然同步但易產生並發困惑。
  • Session/Application 域同理,SessionMap 委託 HttpSession,ApplicationMap 委託 ServletContext。
  • 值棧優先級高於域屬性:EL 表達式 ${key} 先找值棧,再找 request、session、application;同名屬性以值棧為準。

一句話記住

Struts2 的 Map 只是原生域對象的「Map 介面適配器」,底層數據始終存儲在 Servlet 規範定義的 request/session/application 中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved