1. 程式人生 > >關於struts2中直接操作作用域和操作值棧的對比以及值棧的理解

關於struts2中直接操作作用域和操作值棧的對比以及值棧的理解

 注:參考文章:https://www.cnblogs.com/bamaw/p/7259232.html

 自從初學struts2框架以來,時常和值棧打交道。

值棧究竟是什麼,對於我們使用者來說值棧是一個非常方便的東西,很形象的可以稱其為“資料中轉站”。

為什麼會有這種叫法呢,因為我們用struts2框架對資料進行操作時,我們會向值棧存入一些資料,再從值棧中取出一些資料並進行操作。

但是,在struts2框架這個重量級框架中,其實我們的資料都是會一式三分,總會有一份放入作用域中,所以為什麼我們不直接操作作用域呢?這樣不是更加容易上手嗎?

對於框架而言,我們要使用他,我們就需要遵守他的標準,我們既然使用了struts2框架,我們就需要遵守他的規範。在struts2框架中,我們可以在Action中通過定義同名成員變數來自動的獲取存在值棧中的值,這樣我們就很方便的省去了操作作用域的一段程式碼。

而每個Action例項都會對應一個值棧(一個請求對應一個ValueStack物件),也就是說,我們在接受一個action請求的時候,我們會通過核心過濾器首先建立一個ActionContext物件,伴隨著建立一個ValueStack物件(具體流程可以自行參看原始碼),由OgnlValueStack實現類實現。這樣看來action例項和值棧幾乎是生命週期同步的,即一個請求對應一個action對應一個值棧。

那麼,拓展一下,我們在接受請求時建立的值棧是放在哪裡的呢?

不難聯想到,應該是放在request中的。struts2框架會把值棧物件儲存在“struts.valueStack”的請求屬性中,也就是說,值棧物件是request的一個屬性。

所以我們建立值棧物件時候的手段就會多樣化一些,當然最常用的還是:

ActionContext.getContext().getValueStack();

下面兩種僅需要了解:

ServletActionContext.getRequest().getAttribute("struts.valueStack");

ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

當然,很明顯這兩種方法是與Servlet耦合的,所以不推薦使用。

文章主要用於梳理自身知識,如有侵權聯絡刪除。