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