什麼是ActionContext
ActionContext就是一個Map結構的容器
表示Action的上下文,存放Action執行過程中的信息,包括request,session,application等數據。
Struts1的Action必須依賴於web容器,它的execute方法會自動獲得HttpServletRequest,HttpServletResponse對象,從而可以跟web容器進行交互
Struts2的Action不依賴於Web容器,本身只是一個普通的Java類。但是,如果開發中我們需要用到request之類的對象,則可以通過ActionContext來獲取。
在每次執行Action的方法之前都會創建新的ActionContext對象,所以ActionContext是線程安全的。struts2是採用ThreadLocal模式來保存ActionContext,ThreadLocal變量爲每個線程提供獨立的變量值的副本,使得每個線程都可以獨立的使用自己的副本,從而不會跟其他線程發送衝突。
通過ActionContext獲取的request,session,application並不是真正的HttpServletRequest,而是將這三個對象裏面的值重新包裝成Map對象。這樣處理,是一種完全的解耦。
ActionContext創建時機
每次請求都會創建一個新的ActionContext來存放當前的Action信息,而且採用的ThreadLocal的方式來存儲的,所以線程是安全的。
獲取ActionContext
ActionContext.getContext()
在整個線程都是通用的,所以可以在任何地方拿到。
ActionContext是基於請求創建的
所以在非請求的線程中是不能使用ActionContext對象的,比如Filter的init方法
ThreadLoacal的原理
ActionContext的6大對象
ValueStack
ValueStack是ActionContext的一個對象,是棧結構,FILO(先進後出)
存放的就是Action對象,就是把Action的信息壓入棧,由於是ActionContext根對象,所以如果採用ONGL訪問,可以直接訪問。
OGNL
OGNL的全稱是Object GraphNavigation Language,即對象導航圖語言。它是一個開源項目,工作在視圖層,用來取代頁面中的Java腳本,簡化數據的訪問操作。
OGNL的使用原則
存在值棧的數據可以直接取,而存在非值棧的數據就要通過#來獲取
以上案例是通過手工的方式來設置context和root
Root的數據是可以直接訪問,而非root的資源需要加“#”
OGNL+StrutsTag
ONGL要結合Struts標籤來使用。由於比較靈活,也容易把人弄暈尤其是“%”,“#”,“$”這三個符號的的使用。
“#”符號
1、訪問飛根對象的屬性,如ActionContext上次文,由於Struts2中值棧被視爲根對象,所以訪問其它非根對象時,需要家“#”前綴。
例如#session.msg表達式,實際上,#相當於ActionContext.getContext();#session.msg表達式相當於ActionContext.getContext().getSession().getAttribute(“msg”)
2、用來構造Map,使用過“#”符號構造Map,
例如“#{‘key1’:‘value1’,‘key2’:‘value2’,‘key3’:‘value3’}”,這種方式
“%”符號
“%”符號是在標籤的屬性值被理解爲字符串類型時,告訴執行環境%{}裏的是 OGNL表達式。%符號的用途是在標誌的屬性爲字符串類型時,計算 OGNL 表達式的值
“$”符號
(1)在國際化資源文件中,引用OGNL表達式。例如,國際化資源文件中的代碼:
reg.agerange=國際化資源信息:年齡必須在
(2)在Struts 2配置文件中,引用OGNL表達式