ActionContext

什麼是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=國際化資源信息:年齡必須在min {max}之間

(2)在Struts 2配置文件中,引用OGNL表達式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章