1. 程式人生 > >struts2 值棧 與actionContext

struts2 值棧 與actionContext

1、值棧的簡單定義:

     (1)簡單的說,值棧是對應每一個請求物件的輕量級的資料儲存中心,在這裡統一管理著資料,供Action、Result、Interceptor等Struts2的其他部分使用,這樣資料被集中管理起來而不凌亂。

     (2)當有請求的時候,Struts2會為每個請求建立一個新的值棧,也就是說,值棧和請求是一一對應的,不同的請求,值棧也不一樣, 而值棧封裝了一次請求所有需要操作的相關的資料。

   (3)正是因為值棧和請求的對應關係,因此值棧能保證執行緒安全的為每個請求提供公共的資料存取服務。

     (4)就是ROOT根物件,ognl訪問值棧不用加任何的訪問字首,只需action中宣告相應的屬性,並且生成屬性對應的set和get方法,頁面中通 過struts2標籤就可以存放/取出值棧中的值,EL表示式${username}如果沒有加訪問範圍,訪問的也是值棧,這只是最簡單的值棧應用

     (5)值棧的特點:如果訪問的值棧裡有多個物件,且相同的屬性在多個物件中同時出現,則值棧會按照從棧頂到棧底的順序,尋找第一個匹配的物件。

 2、actionContext(action上下文)的簡單定義:

      (1)ActionContext物件,非根物件,是Action執行的上下文,每個ActionContext是一個基本的容器,包含著Aciton執行需要的資料,比如請求引數,會話等。

       (2)ActionContext也是執行緒安全的,每個執行緒都有一個獨立的ActionContext,這樣就不用擔心值棧中值得執行緒安全問題了。

       (3)獲得ActionContext物件的方式:

                第一種,使用ActionContext自身的方法來獲取: ActionContext ctx = ActionContext.getContext();

                第二種,使用ActionInvocation來獲取:ActionContext ctx = actionInvocation.getInvocationContext();

       (4)ActionContext裡面儲存著很多值:

               a:Request的Parameters,請求中的引數,注意這裡的資料是從資料物件中複製來的,因此這裡的資料的變化是不會影響到請求物件裡面的引數的值的。

               b:Request的Attribute,請求中的屬性,這裡是一個Map,存放著請求物件的屬性資料,這些資料和請求物件的Attribute是聯動的。

                  c:Session的Attribute,會話中的助興,這裡是一個Map,存放著會話物件的屬性資料,這些資料和會話物件的attribute是聯動的。            

                 d:Application的Attribute,應用的屬性,這裡是一個Map,存放著應用物件的屬性資料,這些資料和應用物件的attribute是聯動的。

               e:attr,在所有的屬性範圍中獲取值,依次搜尋page, request, session 和applicaion

       (5)ongl表示式取出action上下文中的值:

                  由於Struts2框架把OGNLContext設定為ActionContext,還把代表application、session、request這些物件的Map物件也放到ActionContext中去。

                 又因為ActionContext為非根物件,所以OGNL表示式訪問ActionContext(action上下文)裡面的application、session、request、attr物件中的值時,

                 需要加訪問字首#,以便告訴OGNL,尋值不是從根物件中,而是從action上下文的其他物件中尋找

值棧中取值:

<s:property value="name"/>
EL表示式寫法${作用域屬性名}   ognl表示式%{作用域屬性名}  也可以是使用Struts標籤<s:property  value="#作用域.屬性名"/>

jstl——JSP Standard Tag Library,(引入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>)
el——Expressiong Language
ognl——Object Graph Notation Language。
一種是標籤,一種是表示式。
jstl能用於servlet和jsp中,
struts標籤針對於使用了struts的專案。(引入:<%@ taglib uri="/struts-tags" prefix="s"%>)
而el表示式是應用在JSP中,簡化一些程式碼用的。
而struts2預設的是ognl表示式,所以說ognl表示式不一定就是和struts一起用的,但是使用了struts框架可以使用ongl。