值棧和上下文

2021-09-21 01:57:08 字數 1802 閱讀 1593

struts2在ognl之上提供的最大附加特性就是支援值棧(valuestack),在ognl上下文中只能有乙個根物件,struts2的值棧則允許存在許多虛擬物件。

一:值棧(valuestack)

我們可以先獲得valuestack介面物件

// 01.獲取到valuestack介面物件 ,在request請求中。

打上斷點進行除錯

下面我們使用action類分別向value stack和stack context放值:

//放到單列value stack

user user = new user();

user.setage(12);

user.setusername("陳坤");

vs.getroot().add(user);

//放到雙列stack context(取值得加#)

vs.getcontext().put("user", user);

我們訪問頁面:

姓名:

姓名:

結果:

我們知道ognl中有乙個標籤 

我們使用來監視value stack和stack context中的值變化

明顯,我們在value stack中找到我們剛剛加入的值

同樣,我們在stack context中也找到我們剛剛加入的值(內容太多,只截圖了一部分)

總結:

1.struts2將ognl上下文設定為struts2中的actioncontext(內部使用的仍然是ognlcontext,這點在我們上面除錯中的圖可以明顯的看出),並將值棧作為ognl的根物件。值棧類似於正常的棧,符合後進先出的棧特點,你可以在值棧中放入,刪除和查詢物件,值棧是struts2的核心。

2.值棧通過乙個介面(com.opensymphony.xwork2.util.valuestack)來定義,對應的實現類是com.opensymphony.xwork2.util.ognlvaluestack。

可以舉個例子:

4.我們知道,ognl上下文中的根物件可以直接訪問,不需要使用任何特殊的「標記」,而引用上下文中其他物件則需要使用「#」來標記。由於值棧是上下文中的根物件,因此可以直接訪問。那麼對於值棧中的物件如何訪問呢?struts2提供了乙個特殊的ognlproperty accessor,它可以自動查詢棧內的所有物件(從棧頂到棧底),直到找到乙個具有你所查的屬性的物件。也就是說,對於值棧中的任何物件都可以直接訪問,二不需要使用「#」。

上下文 上下文棧

全域性 函式 區域性 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 window 開始執行全域性 在呼叫函式...

提公升 執行上下文和執行上下文棧

提公升 1.變數宣告提公升 通過var定義 宣告 的變數,在之前就可以直接使用,但不會被賦值 值 undefined 2.函式宣告提公升 通過function宣告的函式,在之前就可以直接呼叫 函式表示式不能在定義前呼叫 值 函式定義 物件 3.問題 變數提公升和函式提公升怎麼產生的?變數提公升簡單理...

執行上下文棧

如果要問到 j ascript 執行順序的話,想必寫過 j ascript 的開發者都會有個直觀的印象,那就是順序執行,畢竟 var foo function foo foo1 var foo function foo foo2 然而去看這段 function foo foo foo2 functi...