日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OGNL表达式语言

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OGNL表达式语言 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

OGNL:Object Graphic Navigation Language(對象圖導(dǎo)航圖語言)

1、上下文------>ActionContext------>Map集合

OGNL有一個上下文概念,在Struts2中上下文的實現(xiàn)為ActionContext,它就是一個Map結(jié)構(gòu),它實現(xiàn)了java.utils.Map 接口。

OGNL COntext:

  • ValueStack(值棧,它是根對象)
  • parameters
  • request
  • session
  • application
  • attr

Action中的實例變量為什么可以被OGNL訪問呢?

當Struts2接受一個請求時,會迅速創(chuàng)建ActionContext,ValueStack,action 。然后把action存放進ValueStack,所以action的實例變量可以被OGNL訪問。
2、怎么訪問上下文中的對象呢?

訪問上下文(Context)中的對象需要使用#符號標注命名空間,如#application、#session.

特例:OGNL會設(shè)定一個根對象(root對象),在Struts2中根對象就是ValueStack(值棧) 。如果要訪問根對象(即ValueStack)中對象的屬性,則可以省略#命名空間,直接訪問該對象的屬性即可。

3、ValueStack(值棧)為什么特殊

根對象ValueStack的實現(xiàn)類為OgnlValueStack,該對象不是我們想像的只存放單個值,而是存放一組對象。在OgnlValueStack類里有一個List類型的root變量,就是使用他存放一組對象。

OgnlValueStack root變量[action ,Ognl util,......]

在root變量中處于第一位的對象叫棧頂對象。通常我們在OGNL表達式里直接寫上屬性的名稱即可訪問root變量里對象的屬性,搜索順序是從棧頂對象開始尋找,如果棧頂對象不存在該屬性,就會從第二個對象尋找,如果沒有找到就從第三個對象尋找,依次往下訪問,直到找到為止。

4、為何使用EL表達式能夠訪問valueStack中對象的屬性


原因是Struts2對HttpServletRequest作了進一步的封裝:

public class StrutsRequestWrapper extends HttpServletRequestWrapper {public StrutsRequestWrapper(HttpServletRequest req) {super(req);}public Object getAttribute(String s) {......ActionContext ctx = ActionContext.getContext();Object attribute = super.getAttribute(s);//先從request范圍獲取屬性值if (ctx != null) {if (attribute == null) {//如果從request范圍沒有找到屬性值,即從ValueStack中查找對象的屬性值 ......ValueStack stack = ctx.getValueStack();attribute = stack.findValue(s);......}}return attribute;}}

5、實戰(zhàn)分析

1、訪問Context中的其他對象:

<s:property value="#request.user"/><s:property value="#session.name"/>

2、采用OGNL表達式創(chuàng)建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、判斷對象是否存在于集合中

<s:if test="'foo' in {'foo','jia'}"></s:if><s:if test="'foo' not in {'ssss','jia'}">不在 </s:if>

?

轉(zhuǎn)載于:https://www.cnblogs.com/lyjs/p/4984685.html

總結(jié)

以上是生活随笔為你收集整理的OGNL表达式语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。