ActionContext

什么是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表達式

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容