更新時(shí)間:2023-02-07 來(lái)源:黑馬程序員 瀏覽量:
值棧(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ù)。
值棧可以作為一個(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ǔ)。
值棧貫穿整個(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的銷毀而銷毀。
要獲取值棧中存儲(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ì)象是在StrutsPrepareAndFilter的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ì)象。