在沒有struts框架的時候,我們通常在Servlet中使用域?qū)ο?/strong>進(jìn)行存值和取值亡蓉,將其作為載體來承載頁面和后臺之間的數(shù)據(jù)傳遞。
在struts2中够坐,我們又有了一種新的機(jī)制來進(jìn)行數(shù)據(jù)的傳遞寸宵。
那就是struts2為我們提供的ValueStack即值棧崖面。
在理解ValueStack之前我們先要了解一下Servlet和Action的區(qū)別:
- Servlet:默認(rèn)在第一次訪問的時候創(chuàng)建對象,但是它只會創(chuàng)建一次對象梯影,無論后面訪問多少次這個servlet巫员,都只有一開始創(chuàng)建的那一個servlet對象,因此甲棍,我們說Servlet是單對象的简识。
- Action:也是默認(rèn)第一次訪問的時候創(chuàng)建,但是每一次訪問它的時候感猛,都會創(chuàng)建一個新對象七扰,因此,我們說Action是多對象的陪白。
那么什么是值棧呢颈走?
官方的說法是:
ValueStack是Struts的一個接口,字面意義為值棧咱士,OgnlValueStack是ValueStack的實現(xiàn)類立由。客戶端發(fā)出一個請求序厉,struts2框架會為我們創(chuàng)建一個action锐膜,同時創(chuàng)建一個OgnlValueStack的實例,我們可以在Action中將數(shù)據(jù)封裝到OgnlValueStack中弛房,在頁面中通過Ognl表達(dá)式或者EL表達(dá)式將其取出道盏。
通俗點的理解:
我們可以直接將其理解為一種類似于域?qū)ο蟮挠脕泶嬷岛腿≈怠⒃陧撁婧秃笈_之間傳遞數(shù)據(jù)的功能文捶。** 在action中將數(shù)據(jù)存入值棧荷逞,然后在頁面中通過EL表達(dá)式或者OGNL表達(dá)式將值取出。
值棧儲存的位置:
值棧和Action的關(guān)系是:值棧存在于Action對象中拄轻。 每創(chuàng)建一個Action對象颅围,就會創(chuàng)建一個值棧對象。
需要注意的是:每個Action對象中只有一個值棧對象
在Action中獲取值棧對象的方法:
獲取值棧對象的方法很多恨搓,最常用的是使用ActionContext類來獲取:
//1筏养、獲取ActionContext類的對象
ActionContext context = ActionContext.getContext();
//2斧抱、調(diào)用ActionContext中的方法獲取值棧對象
ValueStack stack = context.getValueStack();
值棧本質(zhì)上是一種棧類型的數(shù)據(jù)結(jié)構(gòu),如圖所示:
棧中數(shù)據(jù)遵循后進(jìn)先出的原則渐溶,在棧最上面的元素叫做棧頂元素辉浦,新的數(shù)據(jù)存儲進(jìn)來的時候會壓在原有數(shù)據(jù)的上面,這個操作被稱為壓棧茎辐。
值棧的內(nèi)部結(jié)構(gòu):
值棧分為兩個部分:root和context
其中宪郊,root部分是list結(jié)構(gòu)掂恕,context部分是map結(jié)構(gòu)
我們存值和取值一般都是操作root部分的數(shù)據(jù),而context部分存儲的是一些對象的引用弛槐,如圖:
使用struts2標(biāo)簽中的s:debug懊亡,使用這個標(biāo)簽可以查看值棧的結(jié)構(gòu)和儲存的值
<!-- 使用struts2標(biāo)簽查看值棧結(jié)構(gòu) -->
<s:debug></s:debug>
可以看到值棧中root部分的結(jié)構(gòu)如下:
可以明顯的看出root部分的結(jié)構(gòu)是一個list集合(在下一篇文章中我們會通過在ValueStack里面存值和取值更加詳細(xì)深入的理解值棧的原理)
這里需要注意的是:在action沒有做任何操作的情況下,棧頂元素是 action引用
因為action對象里面有值棧對象乎串, 值棧對象里面有action引用店枣。這樣的設(shè)計方式有利于action對象和值棧對象的互相調(diào)用。
總結(jié):值棧就是struts2為我們提供的一套類似于域?qū)ο蟮挠脕泶嬷岛腿≈档臋C(jī)制叹誉,自此我們在struts2框架中傳遞數(shù)據(jù)就有了兩種方式:值棧和域?qū)ο笱炝健_@兩種方式都能實現(xiàn)功能,沒有孰高孰低长豁,根據(jù)我們的業(yè)務(wù)需求靈活使用即可钧唐。
感謝您的觀看:)
后一篇文章將會詳細(xì)講解如何在值棧中存值和取值,并通過存值和取值來進(jìn)一步理解值棧內(nèi)部的結(jié)構(gòu)及其工作原理匠襟,盡情期待逾柿。