日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

OGNL表达式语言

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

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)一步的封裝:

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中查找對(duì)象的屬性值 ......ValueStack stack = ctx.getValueStack();attribute = stack.findValue(s);......}}return attribute;}}

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ì)象是否存在于集合中

<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表达式语言的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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