OGNL表达式语言
OGNL:Object Graphic Navigation Language(對(duì)象圖導(dǎo)航圖語言)
1、上下文------>ActionContext------>Map集合
OGNL有一個(gè)上下文概念,在Struts2中上下文的實(shí)現(xiàn)為ActionContext,它就是一個(gè)Map結(jié)構(gòu),它實(shí)現(xiàn)了java.utils.Map 接口。
OGNL COntext:
- ValueStack(值棧,它是根對(duì)象)
- parameters
- request
- session
- application
- attr
Action中的實(shí)例變量為什么可以被OGNL訪問呢?
當(dāng)Struts2接受一個(gè)請(qǐng)求時(shí),會(huì)迅速創(chuàng)建ActionContext,ValueStack,action 。然后把a(bǔ)ction存放進(jìn)ValueStack,所以action的實(shí)例變量可以被OGNL訪問。
2、怎么訪問上下文中的對(duì)象呢?
訪問上下文(Context)中的對(duì)象需要使用#符號(hào)標(biāo)注命名空間,如#application、#session.
特例:OGNL會(huì)設(shè)定一個(gè)根對(duì)象(root對(duì)象),在Struts2中根對(duì)象就是ValueStack(值棧) 。如果要訪問根對(duì)象(即ValueStack)中對(duì)象的屬性,則可以省略#命名空間,直接訪問該對(duì)象的屬性即可。
3、ValueStack(值棧)為什么特殊
根對(duì)象ValueStack的實(shí)現(xiàn)類為OgnlValueStack,該對(duì)象不是我們想像的只存放單個(gè)值,而是存放一組對(duì)象。在OgnlValueStack類里有一個(gè)List類型的root變量,就是使用他存放一組對(duì)象。
OgnlValueStack root變量[action ,Ognl util,......]
在root變量中處于第一位的對(duì)象叫棧頂對(duì)象。通常我們?cè)贠GNL表達(dá)式里直接寫上屬性的名稱即可訪問root變量里對(duì)象的屬性,搜索順序是從棧頂對(duì)象開始尋找,如果棧頂對(duì)象不存在該屬性,就會(huì)從第二個(gè)對(duì)象尋找,如果沒有找到就從第三個(gè)對(duì)象尋找,依次往下訪問,直到找到為止。
4、為何使用EL表達(dá)式能夠訪問valueStack中對(duì)象的屬性
原因是Struts2對(duì)HttpServletRequest作了進(jìn)一步的封裝:
5、實(shí)戰(zhàn)分析
1、訪問Context中的其他對(duì)象:
<s:property value="#request.user"/><s:property value="#session.name"/>2、采用OGNL表達(dá)式創(chuàng)建List、Map集合對(duì)象
List對(duì)象:
<s:set name="list" value="{'第一個(gè)','第二個(gè)','第三個(gè)'}"/><s:iterator value="#list"><s:property/><br/></s:iterator>#list :因?yàn)閘ist放在Context中,和訪問application、request等等一樣,需要使用#
<s:iterator> 標(biāo)簽有個(gè)特點(diǎn):在迭代集合時(shí)候,會(huì)把當(dāng)前迭代對(duì)象放在值棧的棧頂
<s:property>中value省略,默認(rèn)從棧頂查找。
Map:
<s:set name="maps" value="#{'key1':90,'key2':34}"/><s:iterator value="#maps"><s:property value="key"/> = <s:property value="value"/><br/> </s:iterator>value="#{}" 比set對(duì)了一個(gè)#
?
3、判斷對(duì)象是否存在于集合中
?
轉(zhuǎn)載于:https://www.cnblogs.com/lyjs/p/4984685.html
總結(jié)
- 上一篇: 解决Windows下运行php Comp
- 下一篇: hdu1242 Rescue DFS(路