前段日子對ognl表達(dá)式不是很理解,看了幾本書上關(guān)于ognl表達(dá)式的描述后還是感覺很難,前幾天學(xué)習(xí)了struts2中值棧的內(nèi)容,現(xiàn)在感覺ognl表達(dá)式其實(shí)很容易。
struts2中利用值棧來存儲數(shù)據(jù),在struts2中,把數(shù)據(jù)存在值棧中,然后在jsp頁面用ognl表達(dá)式取出。
在struts2中的action有三種方法獲取值棧
ValueStack valueStack=ActionContext.getContext().getValueStack();ValueStack valueStack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");ValueStack valueStack=ServletActionContext.getValueStack(ServletActionContext.getRequest());
可以看到我們可以利用request來獲取值棧,而request的生命周期為一次請求,所以值棧的生命周期也為一次請求。
ValueStack 是一個(gè)接口,它的實(shí)現(xiàn)類是ognlvalueStack。
在valueStack中有兩個(gè)數(shù)據(jù)結(jié)構(gòu),一個(gè)名字為context,另一個(gè)為root。
context的類型是OgnlContext,OnglContext實(shí)現(xiàn)了Map接口,所以context本質(zhì)上是一個(gè)Map。
valueStack中的另一個(gè)數(shù)據(jù)結(jié)構(gòu)root,它的類型是CompoundRoot,CompoundRoot繼承了ArrayList類,所以它本質(zhì)上是一個(gè)ArrayList,我們稱它為對象棧。
map棧中有一個(gè)名稱為_values的對象,它是一個(gè)HashMap,在這里存放了request,response,session,application等servlet容器的內(nèi)容,我們稱它為map棧。
map棧中還有一個(gè)名稱為_root的對象,它和我們上面說的valueStack中的另一個(gè)數(shù)據(jù)結(jié)構(gòu)root相同,都是對象棧,為什么valueStack中會有兩個(gè)對象棧呢,這是因?yàn)閟truts2繼承了以前一些框架的內(nèi)容導(dǎo)致的。
對象棧中保存了兩個(gè)對象,一個(gè)是ValueStackAction,它代表的是當(dāng)前請求的Action,
另一個(gè)是DefaultTextPRovider,它是用于struts2國際化的。
我手動(dòng)用一個(gè)粗糙的涂鴉圖解下:
所以在jsp頁面中,如果要輸出的內(nèi)容在對象棧中,直接指定屬性名字,如果在map棧中,要用#來指定
例如
1234 | String name= "aaa" ; String Bname= "bbb" ; ActionContext.getContext().getValueStack().push(name); //把字符串放入對象棧中 ActionContext.getContext().put( "Bname" , Bname); //把字符串放入map棧中 |
在jsp頁面中取出的對應(yīng)的值:
<s:property value="name"/><s:property value="#Bname"/>
有錯(cuò)誤請指出
新聞熱點(diǎn)
疑難解答
圖片精選