什么是ActionContext
ActionContext就是一個Map結構的容器
表示Action的上下文,存放Action執(zhí)行過程中的信息,包括request,session,application等數(shù)據(jù)。
Struts1的Action必須依賴于web容器,它的execute方法會自動獲得HttpServletRequest,HttpServletResponse對象,從而可以跟web容器進行交互
Struts2的Action不依賴于Web容器,本身只是一個普通的Java類。但是,如果開發(fā)中我們需要用到request之類的對象,則可以通過ActionContext來獲取。
在每次執(zhí)行Action的方法之前都會創(chuàng)建新的ActionContext對象,所以ActionContext是線程安全的。struts2是采用ThreadLocal模式來保存ActionContext,ThreadLocal變量為每個線程提供獨立的變量值的副本,使得每個線程都可以獨立的使用自己的副本,從而不會跟其他線程發(fā)送沖突。
通過ActionContext獲取的request,session,application并不是真正的HttpServletRequest,而是將這三個對象里面的值重新包裝成Map對象。這樣處理,是一種完全的解耦。
ActionContext創(chuàng)建時機
每次請求都會創(chuàng)建一個新的ActionContext來存放當前的Action信息,而且采用的ThreadLocal的方式來存儲的,所以線程是安全的。
獲取ActionContext
ActionContext.getContext()
在整個線程都是通用的,所以可以在任何地方拿到。
ActionContext是基于請求創(chuàng)建的
所以在非請求的線程中是不能使用ActionContext對象的,比如Filter的init方法
ThreadLoacal的原理
ActionContext的6大對象
ValueStack
ValueStack是ActionContext的一個對象,是棧結構,F(xiàn)ILO(先進后出)
存放的就是Action對象,就是把Action的信息壓入棧,由于是ActionContext根對象,所以如果采用ONGL訪問,可以直接訪問。
OGNL
OGNL的全稱是Object GraphNavigation Language,即對象導航圖語言。它是一個開源項目,工作在視圖層,用來取代頁面中的Java腳本,簡化數(shù)據(jù)的訪問操作。
OGNL的使用原則
存在值棧的數(shù)據(jù)可以直接取,而存在非值棧的數(shù)據(jù)就要通過#來獲取
以上案例是通過手工的方式來設置context和root
Root的數(shù)據(jù)是可以直接訪問,而非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’}”,這種方式
“%”符號
“%”符號是在標簽的屬性值被理解為字符串類型時,告訴執(zhí)行環(huán)境%{}里的是 OGNL表達式。%符號的用途是在標志的屬性為字符串類型時,計算 OGNL 表達式的值
“$”符號
(1)在國際化資源文件中,引用OGNL表達式。例如,國際化資源文件中的代碼:
reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間
(2)在Struts 2配置文件中,引用OGNL表達式