2020久久超碰欧美精品最新亚洲欧美日韩久久精品,国产福利电影一区二区三区,亚洲欧美日韩一区在线观看,亚洲国产欧美日韩欧美特级,亚洲欧美日韩成人一区久久,欧美日韩精品一区二区三区不卡,国产欧美日韩va另类影音先锋,亚洲欧美日韩久久精品,亚洲欧美日韩国产成人精品影院,亚洲国产欧美日韩精品一区二区三区,欧美日韩国产成人高清视频,日韩久久精品国产免费观看频道,久久人人爽人人爽从片av高清,国产精品综合一区二区

首頁常見問題正文

值棧的概念和作用是什么?

更新時間:2023-02-07 來源:黑馬程序員 瀏覽量:

IT培訓班

  值棧(ValueStack)就是OGNL表達式存取數據的地方。在一個值棧中,封裝了一次請求所需要的所有數據。在使用Struts2的項目中,Struts2會為每個請求創建一個新的值棧,也就是說,值棧和請求是一一對應的關系,這種一一對應的關系使值棧能夠線程安全地為每個請求提供公共的數據存取服務。

  1.值棧的作用

  值棧可以作為一個數據中轉站在前臺與后臺之間傳遞數據,最常見的就是將Struts2的標簽與OGNL表達式結合使用。值棧實際上是一個接口,在Struts2中利用OGNL時,實際上使用的就是實現了該接口的OgnlValueStack類,這個類是OGNL基礎。

  2.值棧的生命周期

  值棧貫穿整個Action的生命周期,每個Action類的對象實例都擁有一個ValueStack對象,在ValueStack對象中保存了當前Action對象和其他相關對象。Struts2框架把ValueStack對象保存在一個名為struts.valueStack的request屬性中,也就是說,值棧與Action的生命周期一致。值棧的生命周期隨著request的創建而創建,隨著request的銷毀而銷毀。

  3.值棧的獲取方式

  要獲取值棧中存儲的數據,首先應該獲取值棧。值棧的獲取有兩種方式,具體如下。

  (1)在request中獲取值棧

  ValueStack對象在request范圍內的存儲方式為request.setAttribute(“struts.valueStack”,valuestack),可以通過如下方式從request中取出值棧的信息。

//獲取ValueStack對象,通過request對象獲取
ValueStack valueStack=(ValueStack)ServletActionContext.getRequest()
           .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

  在上述示例代碼中,ServletActionContext.STRUTS_VALUESTACK_KEY是ServletActionContext類中的常量,它的值為struts.valueStack。

  (2)在ActionContext中獲取值棧

  在使用Struts2框架時,可以使用OGNL操作Context對象從ValueStack中存取數據,也就是說,可以從Context對象中獲取ValueStack對象。實際上,Struts2框架中的Context對象就是ActionContext。ActionContext獲取ValueStack對象的方式如下所示:

//通過ActionContext獲取valueStack對象
ValueStack valueStack=ActionContext.getContext().getValueStack();

  ActionContext對象是在StrutsPrepareAndFilter的doFilter()方法中被創建的,在源碼中用于創建ActionContext對象的createActionContext()方法內可以找到獲取的ValueStack對象的信息,方法中還有這樣一段代碼:ctx=new ActionContext(stack.getContext()),從代碼中可以看出,ValueStack對象中的Context對象被作為參數傳遞給了ActionContext對象,這也就說明ActionContext對象中持有了ValueStack對象的引用,因此可以通過ActionContext對象獲取ValueStack對象。

分享到:
在線咨詢 我要報名
和我們在線交談!