Java中Struts2的值棧ValueStack詳解
值棧
值棧(ValueStack)就是 OGNL 表達(dá)式存取數(shù)據(jù)的地方。
在一個(gè)值棧中,封裝了一次請(qǐng)求所需要的所有數(shù)據(jù)。
在使用 Struts2 的項(xiàng)目中,Struts2 會(huì)為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新的值棧,也就是說,值棧和請(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ù),最常見的就是將 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 屬性中,也就是說,值棧與 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),可以通過如下方式從 request 中取出值棧的信息。
//獲取 ValueStack 對(duì)象,通過 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ù),也就是說,可以從 Context 對(duì)象中獲取 ValueStack 對(duì)象。實(shí)際上,Struts2 框架中的 Context 對(duì)象就是 ActionContext。
ActionContext 獲取 ValueStack 對(duì)象的方式如下所示:
//通過 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ì)象,這也就說明 ActionContext 對(duì)象中持有了 ValueStack 對(duì)象的引用,因此可以通過 ActionContext 對(duì)象獲取 ValueStack 對(duì)象。
到此這篇關(guān)于Java中Struts2的值棧ValueStack詳解的文章就介紹到這了,更多相關(guān)Struts2的值棧ValueStack內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot讀取resource配置文件生成容器對(duì)象的示例代碼
這篇文章主要介紹了springboot讀取resource配置文件生成容器對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07@Transactional解讀(作用、失效場景與解決方式)
這篇文章主要介紹了關(guān)于@Transactional作用、失效場景與解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Spring MVC入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Spring MVC入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08一文總結(jié) Shiro 實(shí)戰(zhàn)教程
shiro是apache的一個(gè)開源框架,是一個(gè)權(quán)限管理的框架,實(shí)現(xiàn) 用戶認(rèn)證、用戶授權(quán),這篇文章詳細(xì)總結(jié)了shiro用法,感興趣的同學(xué)可以參考閱讀2023-04-04Java基礎(chǔ)之位運(yùn)算知識(shí)總結(jié)
最近接觸到了java位運(yùn)算,之前對(duì)位運(yùn)算的了解僅僅停留在表現(xiàn)結(jié)果上,乘2除以2,對(duì)背后的原理并不了解,現(xiàn)在學(xué)習(xí)記錄一下,需要的朋友可以參考下2021-05-05SpringBoot整合Druid實(shí)現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密
Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項(xiàng)目,Druid連接池為監(jiān)控而生,內(nèi)置強(qiáng)大的監(jiān)控功能,監(jiān)控特性不影響性能,本文給大家介紹了SpringBoot整合Druid實(shí)現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-06-06