Java中Struts2的值棧ValueStack詳解
值棧
值棧(ValueStack)就是 OGNL 表達(dá)式存取數(shù)據(jù)的地方。
在一個(gè)值棧中,封裝了一次請(qǐng)求所需要的所有數(shù)據(jù)。
在使用 Struts2 的項(xiàng)目中,Struts2 會(huì)為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新的值棧,也就是說(shuō),值棧和請(qǐng)求是一一對(duì)應(yīng)的關(guān)系,這種一一對(duì)應(yīng)的關(guān)系使值棧能夠線程安全地為每個(gè)請(qǐng)求提供公共的數(shù)據(jù)存取服務(wù)。
1.值棧的作用
值棧可以作為一個(gè)數(shù)據(jù)中轉(zhuǎn)站在前臺(tái)與后臺(tái)之間傳遞數(shù)據(jù),最常見(jiàn)的就是將 Struts2 的標(biāo)簽與 OGNL 表達(dá)式結(jié)合使用。
值棧實(shí)際上是一個(gè)接口,在 Struts2 中利用 OGNL 時(shí),實(shí)際上使用的就是實(shí)現(xiàn)了該接口的 OgnlValueStack 類,這個(gè)類是 OGNL 的基礎(chǔ)。
2.值棧的聲明周期
值棧貫穿整個(gè) Action 的生命周期,每個(gè) Action 類的對(duì)象實(shí)例都擁有一個(gè) ValueStack 對(duì)象,在 ValueStack 對(duì)象中保存了當(dāng)前 Action 對(duì)象和其他相關(guān)對(duì)象。
Struts2 框架把 ValueStack 對(duì)象保存在一個(gè)名為 struts.valueStack 的 request 屬性中,也就是說(shuō),值棧與 Action 的生命周期一致。值棧的生命周期隨著 request 的創(chuàng)建而創(chuàng)建,隨著 request 的銷毀而銷毀。
3.值棧的獲取方式
要獲取值棧中存儲(chǔ)的數(shù)據(jù),首先應(yīng)該獲取值棧。
值棧的獲取有兩種方式,具體如下。
1) 在request中獲取值棧
ValueStack 對(duì)象在 request 范圍內(nèi)的存儲(chǔ)方式為 request.setAttribute(“struts.valueStack”,valuestack),可以通過(guò)如下方式從 request 中取出值棧的信息。
//獲取 ValueStack 對(duì)象,通過(guò) request 對(duì)象獲取
ValueStack valueStack = (ValueStack)ServletActionContext.getRequest()
.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);ServletActionContext.STRUTS_VALUESTACK_KEY 是 ServletActionContext 類中的常量,它的值為 struts.valueStack。
2)在ActionContext中獲取值棧
在使用 Struts2 框架時(shí),可以使用 OGNL 操作 Context 對(duì)象從 ValueStack 中存取數(shù)據(jù),也就是說(shuō),可以從 Context 對(duì)象中獲取 ValueStack 對(duì)象。實(shí)際上,Struts2 框架中的 Context 對(duì)象就是 ActionContext。
ActionContext 獲取 ValueStack 對(duì)象的方式如下所示:
//通過(guò) ActionContext 獲取 valueStack 對(duì)象 ValueStack valueStack = ActionContext.getContext().getValueStack();
ActionContext 對(duì)象是在 StrutsPrepareAndExcuteFilter 的 doFilter() 方法中被創(chuàng)建的,在源碼中用于創(chuàng)建 ActionContext 對(duì)象的 createActionContext() 方法內(nèi)可以找到獲取的 ValueStack 對(duì)象的信息。
方法中還有這樣一段代碼:
ctx=new ActionContext(stack.getContext());
從上述代碼中可以看出,ValueStack 對(duì)象中的 Context 對(duì)象被作為參數(shù)傳遞給了 ActionContext 對(duì)象,這也就說(shuō)明 ActionContext 對(duì)象中持有了 ValueStack 對(duì)象的引用,因此可以通過(guò) ActionContext 對(duì)象獲取 ValueStack 對(duì)象。
到此這篇關(guān)于Java中Struts2的值棧ValueStack詳解的文章就介紹到這了,更多相關(guān)Struts2的值棧ValueStack內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決maven?maven.compiler.source和maven.compiler.target的坑
這篇文章主要介紹了解決maven?maven.compiler.source和maven.compiler.target的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java Hibernate多對(duì)多映射詳解及實(shí)例代碼
這篇文章主要介紹了java Hibernate多對(duì)多映射詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
關(guān)于junit單元測(cè)試@Test的使用方式
這篇文章主要介紹了關(guān)于junit單元測(cè)試@Test的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java 實(shí)戰(zhàn)項(xiàng)目之教材管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)教材管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11

