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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Struts2中的OGNL详解

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2中的OGNL详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

首先了解下OGNL的概念

OGNL是Object-Graph Navigation Language的縮寫,全稱為對(duì)象圖導(dǎo)航語(yǔ)言,是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,它通過(guò)簡(jiǎn)單一致的語(yǔ)法,可以任意存取對(duì)象的屬性或者調(diào)用對(duì)象的方法,能夠遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)對(duì)象屬性類型的轉(zhuǎn)換等功能。

此外,還得先需弄懂OGNL的一些知識(shí):

?

1.OGNL表達(dá)式的計(jì)算是圍繞OGNL上下文進(jìn)行的。

OGNL上下文實(shí)際上就是一個(gè)Map對(duì)象,由ognl.OgnlContext類表示。它里面可以存放很多個(gè)JavaBean對(duì)象。它有一個(gè)上下文根對(duì)象。

上下文中的根對(duì)象可以直接使用名來(lái)訪問(wèn)或直接使用它的屬性名訪問(wèn)它的屬性值。否則要加前綴“#key”。


?

?

2.Struts2的標(biāo)簽庫(kù)都是使用OGNL表達(dá)式來(lái)訪問(wèn)ActionContext中的對(duì)象數(shù)據(jù)的。如:<s:propertyvalue="xxx"/>。


?

?

3.Struts2將ActionContext設(shè)置為OGNL上下文,并將值棧作為OGNL的根對(duì)象放置到ActionContext中。


?

?

4.值棧(ValueStack) :

可以在值棧中放入、刪除、查詢對(duì)象。訪問(wèn)值棧中的對(duì)象不用“#”。

Struts2總是把當(dāng)前Action實(shí)例放置在棧頂。所以在OGNL中引用Action中的屬性也可以省略“#”。

?

5.調(diào)用ActionContext的put(key,value)放入的數(shù)據(jù),需要使用#訪問(wèn)。

OGNL中重要的3個(gè)符號(hào):#、%、$:

#、%和$符號(hào)在OGNL表達(dá)式中經(jīng)常出現(xiàn),而這三種符號(hào)也是開(kāi)發(fā)者不容易掌握和理解的部分,需要時(shí)間的積累才漸漸弄清楚……

1.#符號(hào)

#符號(hào)的用途一般有三種。

—??? 訪問(wèn)非根對(duì)象屬性,例如#session.msg表達(dá)式,由于Struts 2中值棧被視為根對(duì)象,所以訪問(wèn)其他非根對(duì)象時(shí),需要加#前綴。實(shí)際上,#相當(dāng)于ActionContext. getContext();#session.msg表達(dá)式相當(dāng)于ActionContext.getContext().getSession(). getAttribute("msg")?。

—??? 用于過(guò)濾和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

—??? 用來(lái)構(gòu)造Map,例如示例中的#{'foo1':'bar1',?'foo2':'bar2'}。

2.%符號(hào)

%符號(hào)的用途是在標(biāo)志的屬性為字符串類型時(shí),計(jì)算OGNL表達(dá)式的值,這個(gè)類似js中的eval,很暴力。

3.$符號(hào)

$符號(hào)主要有兩個(gè)方面的用途。

—??? 在國(guó)際化資源文件中,引用OGNL表達(dá)式,例如國(guó)際化資源文件中的代碼:reg.agerange=國(guó)際化資源信息:年齡必須在${min}同${max}之間。

—??? 在Struts 2框架的配置文件中引用OGNL表達(dá)式,例如:

?

  • <validators>????

  • ????<field?name="intb">????

  • ????????????<field-validator?type="int">????

  • ????????????<param?name="min">10</param>????

  • ????????????<param?name="max">100</param>????

  • ????????????<message>BAction-test校驗(yàn):數(shù)字必須為${min}為${max}之間!</message>????

  • ????????</field-validator>????

  • ????</field>????

  • </validators>???

  • ?

    下面通過(guò)代碼對(duì)OGNL有更深的了解:

    action類OgnlAction.java:

  • package?com.tjcyjd.test.action;??

  • ??

  • import?java.util.Date;??

  • import?java.util.LinkedList;??

  • import?java.util.List;??

  • ??

  • import?javax.servlet.http.HttpServletRequest;??

  • ??

  • import?org.apache.struts2.ServletActionContext;??

  • import?org.apache.struts2.convention.annotation.Action;??

  • import?org.apache.struts2.convention.annotation.Namespace;??

  • import?org.apache.struts2.convention.annotation.ParentPackage;??

  • import?org.apache.struts2.convention.annotation.Result;??

  • import?org.apache.struts2.convention.annotation.Results;??

  • import?org.springframework.stereotype.Controller;??

  • ??

  • import?com.opensymphony.xwork2.ActionContext;??

  • import?com.opensymphony.xwork2.ActionSupport;??

  • ??

  • @Controller ??

  • @Namespace ("/test")??

  • @ParentPackage("struts-default")??

  • @Results (?{?@Result (name?=?"success",?location?=?"/other_test/showognl.jsp"),??

  • ????????@Result(name?=?"fail",?location?=?"/bbs/admin_login.jsp"),??

  • ????????@Result(name?=?"input",?location?=?"/bbs/admin_login.jsp")?})??

  • public?class?OgnlAction?extends?ActionSupport?{??

  • ????private?static?final?long?serialVersionUID?=?-1494290883433357310L;??

  • ????private?List<Person>?persons;??

  • ??

  • ????@Action("ognlTest")??

  • ????public?String?ognlTest()?throws?Exception?{??

  • ????????//?獲得ActionContext實(shí)例,以便訪問(wèn)Servlet?API??

  • ????????ActionContext?ctx?=?ActionContext.getContext();??

  • ????????//?存入application??

  • ????????ctx.getApplication().put("msg",?"application信息");??

  • ????????//?保存session??

  • ????????ctx.getSession().put("msg",?"seesion信息");??

  • ????????//?保存request信息??

  • ????????HttpServletRequest?request?=?ServletActionContext.getRequest();??

  • ????????request.setAttribute("msg",?"request信息");??

  • ????????//?為persons賦值??

  • ????????persons?=?new?LinkedList<Person>();??

  • ????????Person?person1?=?new?Person();??

  • ????????person1.setName("pla1");??

  • ????????person1.setAge(26);??

  • ????????person1.setBirthday(new?Date());??

  • ????????persons.add(person1);??

  • ??

  • ????????Person?person2?=?new?Person();??

  • ????????person2.setName("pla2");??

  • ????????person2.setAge(36);??

  • ????????person2.setBirthday(new?Date());??

  • ????????persons.add(person2);??

  • ??

  • ????????Person?person3?=?new?Person();??

  • ????????person3.setName("pla3");??

  • ????????person3.setAge(16);??

  • ????????person3.setBirthday(new?Date());??

  • ????????persons.add(person3);??

  • ??

  • ????????return?SUCCESS;??

  • ??

  • ????}??

  • ??

  • ????public?List<Person>?getPersons()?{??

  • ????????return?persons;??

  • ????}??

  • ??

  • ????public?void?setPersons(List<Person>?persons)?{??

  • ????????this.persons?=?persons;??

  • ????}??

  • }??


  • jsp頁(yè)面showognl.jsp:

  • <%@?page?language="java"?contentType="text/html;?charset=utf-8"?pageEncoding="utf-8"?%>????

  • ????

  • <%@?taglib?prefix="s"?uri="/struts-tags"?%>????

  • <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/?xhtml1/DTD/xhtml1-transitional.dtd">????

  • ????

  • <html?xmlns="http://www.w3.org/1999/xhtml">????

  • ????

  • <head>????

  • ????

  • ????<title>Struts2?OGNL?演示</title>????

  • ????

  • </head>????

  • ????

  • <body>????????

  • ????

  • ????<h3>訪問(wèn)OGNL上下文和Action上下文</h3>????

  • ????

  • ????<!-使用OGNL訪問(wèn)屬性值-->????

  • ????

  • ????<p>parameters:?<s:property?value="#parameters.msg"?/></p>????

  • ????

  • ????<p>request.msg:?<s:property?value="#request.msg"?/></p>????

  • ????

  • ????<p>session.msg:?<s:property?value="#session.msg"?/></p>????

  • ????

  • ????<p>application.msg:?<s:property?value="#application.msg"?/></p>????

  • ????

  • ????<p>attr.msg:?<s:property?value="#attr.msg"?/></p>????

  • ????

  • ????<hr?/>????

  • ????

  • ????<h3>用于過(guò)濾和投影(projecting)集合</h3>????

  • ????

  • ????<p>年齡大于20</p>????

  • ????

  • ????<ul>????

  • ????

  • ????<!-判斷年齡-->????

  • ????

  • ????????<s:iterator?value="persons.{?#this.age>20}">????

  • ????

  • ????????????<li><s:property?value="name"?/>?-?年齡:<s:property?value="age"?/></li>????

  • ????

  • ????????</s:iterator>????

  • ????

  • ????</ul>????

  • ????

  • ????<p>姓名為pla1的年齡:?<s:property?value="persons.{?#this.name=='pla1'}.{age}[0]"/></p>????

  • ????

  • ????<hr?/>????

  • ????

  • ????<h3>構(gòu)造Map</h3>????

  • ????

  • ????<s:set?name="foobar"?value="#{'foo1':'bar1',?'foo2':'bar2'}"?/>????

  • ????

  • ????<p>The?value?of?key?"foo1"?is?<s:property?value="#foobar['foo1']"?/></p>????

  • ??????

  • ????<hr?/>???

  • ??????

  • ????<h4>%符號(hào)的用法</h4>????

  • ????

  • ????<s:set?name="foobar"?value="#{'foo1':'bar1',?'foo2':'bar2'}"?/>????

  • ????

  • ????<p>The?value?of?key?"foo1"?is?<s:property?value="#foobar['foo1']"?/></p>????

  • ????

  • ????<p>不使用%:<s:url?value="#foobar['foo1']"?/></p>????

  • ????

  • ????<p>使用%:<s:url?value="%{#foobar['foo1']}"?/></p>????

  • ????

  • ????<hr?/>??

  • ????????<%????

  • ????????????request.setAttribute("req",?"request?scope");????

  • ????????????request.getSession().setAttribute("sess",?"session?scope");????

  • ????????????request.getSession().getServletContext().setAttribute("app",????

  • ????????????????????"aplication?scope");????

  • ????????%>????

  • ????????1.通過(guò)ognl表達(dá)式獲取?屬性范圍中的值????

  • ????????<br>????

  • ????????<s:property?value="#request.req"?/>????

  • ????????<br?/>????

  • ????????<s:property?value="#session.sess"?/>????

  • ????????<br?/>????

  • ????????<s:property?value="#application.app"?/>????

  • ????????<br?/>????

  • ????????<hr>????

  • ????

  • ???????2.通過(guò)<span?style="background-color:?#fafafa;">ognl表達(dá)式創(chuàng)建list?集合?,并且遍歷出集合中的值????

  • ????????<br>????

  • ????????<s:set?name="list"?value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>????

  • ????????<s:iterator?value="#list"?var="o">????

  • ????????????<!--?${o?}<br/>?-->????

  • ????????????<s:property?/>????

  • ????????????<br?/>????

  • ????????</s:iterator>????

  • ????????<br?/>????

  • ????????<hr>????

  • ????

  • ???????3.通過(guò)ognl表達(dá)式創(chuàng)建Map?集合?,并且遍歷出集合中的值????

  • ????????<br>????

  • ????????<s:set?name="map"????

  • ????????????value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>????

  • ????????<s:iterator?value="#map"?var="o">????

  • ????????????<!--??????${o.key?}->${o.value?}<br/>???-->????

  • ????????????<!--?<s:property?value="#o.key"/>-><s:property?value="#o.value"/><br/>???-->????

  • ????????????<s:property?value="key"?/>-><s:property?value="value"?/>????

  • ????????????<br?/>????

  • ????????</s:iterator>????

  • ????????<br?/>????

  • ????????<hr>????

  • ??????4.通過(guò)ognl表達(dá)式?進(jìn)行邏輯判斷????

  • ????????<br>????

  • ????????<s:if?test="'aa'?in?{'aaa','bbb'}">????

  • ????????????aa?在?集合{'aaa','bbb'}中;????

  • ????????</s:if>????

  • ????????<s:else>????

  • ????????????aa?不在?集合{'aaa','bbb'}中;????

  • ????????</s:else>????

  • ????????<br?/>????

  • ????????<s:if?test="#request.req?not?in?#list">????

  • ????????????????不?在?集合list中;????

  • ????????</s:if>????

  • ????????<s:else>????

  • ?????????????在?集合list中;????

  • ????????</s:else>????

  • ????????<br?/>????

  • ????????<hr>????

  • ??????????

  • ???????5.通過(guò)ognl表達(dá)式?的投影功能進(jìn)行數(shù)據(jù)篩選????

  • ????????<br>????

  • ????????<s:set?name="list1"?value="{1,2,3,4,5}"></s:set>????

  • ????????<s:iterator?value="#list1.{?#this>2}"?var="o">????

  • ????????????<!--?#list.{?#this>2}:在list1集合迭代的時(shí)候,從中篩選出當(dāng)前迭代對(duì)象>2的集合進(jìn)行顯示?-->????

  • ????????????${o?}<br?/>????

  • ????????</s:iterator>????

  • ????????<br?/>????

  • ????????<hr>????

  • ???????6.通過(guò)ognl表達(dá)式?訪問(wèn)某個(gè)類的靜態(tài)方法和值????

  • ????????<br>????

  • ????????<s:property?value="@java.lang.Math@floor(32.56)"?/>????

  • ????

  • ????????<s:property?value="@com.rao.struts2.action.OGNL1Action@aa"?/>????

  • ????????<br?/>????

  • ????????<br?/>????

  • ????????<hr>????

  • ??????7.ognl表達(dá)式?迭代標(biāo)簽?詳細(xì)????

  • ????????<br>????

  • ????????<s:set?name="list2"????

  • ????????????value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>????

  • ????????<table?border="1">????

  • ????????????<tr>????

  • ????????????????<td>索引?</td>????

  • ????????????????<td></td>????

  • ????????????????<td>奇?</td>????

  • ????????????????<td>?偶?</td>????

  • ????????????????<td>首?</td>????

  • ????????????????<td>?尾?</td>????

  • ????????????????<td>當(dāng)前迭代數(shù)量</td>????

  • ????????????</tr>????

  • ????????????<s:iterator?value="#list2"?var="o"?status="s">????

  • ????????????????<tr?bgcolor="<s:if?test="#s.even">pink</s:if>">????

  • ????????????????????<td>????

  • ????????????????????????<s:property?value="#s.getIndex()"?/>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????????<s:property?/>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????????<s:if?test="#s.odd">Y</s:if>????

  • ????????????????????????<s:else>N</s:else>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????????<s:if?test="#s.even">Y</s:if>????

  • ????????????????????????<s:else>N</s:else>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????????<s:if?test="#s.first">Y</s:if>????

  • ????????????????????????<s:else>N</s:else>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????????<s:if?test="#s.isLast()">Y</s:if>????

  • ????????????????????????<s:else>N</s:else>????

  • ????????????????????</td>????

  • ????????????????????<td>????

  • ????????????????????<s:property?value="#s.getCount()"/>????

  • ????????????????</td>????

  • ????????????????</tr>????

  • ????????????</s:iterator>????

  • ????????</table>????

  • ????????<br>????

  • ????????<hr>?????????

  • ??????????

  • ??????????

  • ???????8.ognl表達(dá)式:??if/else?if/else?詳細(xì)<br>????

  • ????????<%?request.setAttribute("aa",0);?%>????

  • ????????<s:if?test="#request.aa>=0?&&?#request.aa<=4">????

  • ????????????????在0-4之間;????

  • ????????</s:if>????

  • ????????<s:elseif?test="#request.aa>=4?&&?#request.aa<=8">????

  • ????????????????在4-8之間;????

  • ????????</s:elseif>????

  • ????????<s:else>????

  • ?????????????大于8;????

  • ????????</s:else>????

  • ????????<br>????

  • ????????<hr>????

  • ????9.ognl表達(dá)式:?url?詳細(xì)<br>????

  • ????????<%?request.setAttribute("aa","sss");?%>????

  • ????????<s:url?action="testAction"?namespace="/aa/bb">????

  • ????????????<s:param?name="aa"?value="#request.aa"></s:param>????

  • ????????????<s:param?name="id">100</s:param>????

  • ????????</s:url>????

  • ????????<br/>????

  • ????????<s:set?name="myurl"?value="'http://www.baidu.com'"></s:set>????

  • ????????value以字符處理:???<s:url?value="#myurl"></s:url><br>????

  • ????????value明確指定以ognl表達(dá)式處理:????<s:url?value="%{#myurl}"></s:url>????

  • ????????<br>????

  • ????????<hr>????

  • ????10.ognl表達(dá)式:?checkboxlist?詳細(xì)<br>????

  • ????????1>?.list?生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>????

  • ????????name:checkboxlist的名字<br>????

  • ????????list:checkboxlist要顯示的列表<br>????

  • ????????value:checkboxlist默認(rèn)被選中的選項(xiàng),checkedchecked=checked<br>????

  • ????????<s:checkboxlist?name="checkbox1"?list="{'上網(wǎng)','看書','爬山','游泳','唱歌'}"?value="{'上網(wǎng)','看書'}"?></s:checkboxlist>????

  • ????????<br>????

  • ?????????以上生成代碼:<br>????

  • ????????<xmp>????

  • ????????????<input?type="checkbox"?name="checkbox1"?value="上網(wǎng)"?id="checkbox1-1"?checked="checked"/>????

  • ????????????<label?for="checkbox1-1"?class="checkboxLabel">上網(wǎng)</label>????

  • ????????????<input?type="checkbox"?name="checkbox1"?value="看書"?id="checkbox1-2"?checked="checked"/>????

  • ????????????<label?for="checkbox1-2"?class="checkboxLabel">看書</label>????

  • ????????????<input?type="checkbox"?name="checkbox1"?value="爬山"?id="checkbox1-3"/>????

  • ????????????<label?for="checkbox1-3"?class="checkboxLabel">爬山</label>????

  • ????????????<input?type="checkbox"?name="checkbox1"?value="游泳"?id="checkbox1-4"/>????

  • ????????????<label?for="checkbox1-4"?class="checkboxLabel">游泳</label>????

  • ????????????<input?type="checkbox"?name="checkbox1"?value="唱歌"?id="checkbox1-5"/>????

  • ????????????<label?for="checkbox1-5"?class="checkboxLabel">唱歌</label>"????

  • ????????</xmp>????

  • ????????2>?.Map?生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>????

  • ????????name:checkboxlist的名字<br>????

  • ????????list:checkboxlist要顯示的列表<br>????

  • ????????listKey:checkbox?的value的值<br>????

  • ????????listValue:checkbox?的lablel(顯示的值)<br>????

  • ????????value:checkboxlist默認(rèn)被選中的選項(xiàng),checkedchecked=checked<br>????

  • ????????<s:checkboxlist?name="checkbox2"?list="#{1:'上網(wǎng)',2:'看書',3:'爬山',4:'游泳',5:'唱歌'}"?listKey="key"?listValue="value"?value="{1,2,5}"?></s:checkboxlist>????

  • ????????<br>????

  • ???????????????????????以上生成代碼:<br>????

  • ????????<xmp>????

  • ????????????<input?type="checkbox"?name="checkbox2"?value="1"?id="checkbox2-1"?checked="checked"/>????

  • ????????????<label?for="checkbox2-1"?class="checkboxLabel">上網(wǎng)</label>????

  • ????????????<input?type="checkbox"?name="checkbox2"?value="2"?id="checkbox2-2"?checked="checked"/>????

  • ????????????<label?for="checkbox2-2"?class="checkboxLabel">看書</label>????

  • ????????????<input?type="checkbox"?name="checkbox2"?value="3"?id="checkbox2-3"/>????

  • ????????????<label?for="checkbox2-3"?class="checkboxLabel">爬山</label>????

  • ????????????<input?type="checkbox"?name="checkbox2"?value="4"?id="checkbox2-4"/>????

  • ????????????<label?for="checkbox2-4"?class="checkboxLabel">游泳</label>????

  • ????????????<input?type="checkbox"?name="checkbox2"?value="5"?id="checkbox2-5"?checked="checked"/>????

  • ????????????<label?for="checkbox2-5"?class="checkboxLabel">唱歌</label>????

  • ????????</xmp>????

  • ????????<hr>????

  • </body>????

  • </html>????

  • 總結(jié)OGNL的使用方法:

    訪問(wèn)屬性

    名字屬性獲取:<s:property value="user.username"/><br>

    地址屬性獲取:<s:property value="user.address.addr"/><br>

    訪問(wèn)方法

    調(diào)用值棧中對(duì)象的普通方法:<s:property value="user.get()"/><br>

    訪問(wèn)靜態(tài)屬性和方法

    調(diào)用Action中的靜態(tài)方法:<s:property value="@struts.action.LoginAction@get()"/>

    調(diào)用JDK中的類的靜態(tài)方法:<s:property value="@java.lang.Math@floor(44.56)"/><br>

    調(diào)用JDK中的類的靜態(tài)方法(同上):<s:property value="@@floor(44.56)"/><br>

    調(diào)用JDK中的類的靜態(tài)方法:<s:property value="@java.util.Calendar@getInstance()"/><br>

    調(diào)用普通類中的靜態(tài)屬性:<s:property value="@struts.vo.Address@TIPS"/><br>

    訪問(wèn)構(gòu)造方法

    調(diào)用普通類的構(gòu)造方法:<s:property value="new struts.vo.Student('李曉紅' , '美女' , 3 , 25).username"/>

    ?

    1.5.?訪問(wèn)數(shù)組

    獲取List:<s:property value="testList"/><br>

    獲取List中的某一個(gè)元素(可以使用類似于數(shù)組中的下標(biāo)獲取List中的內(nèi)容):

    <s:property value="testList[0]"/><br>

    獲取Set:<s:property value="testSet"/><br>

    獲取Set中的某一個(gè)元素(Set由于沒(méi)有順序,所以不能使用下標(biāo)獲取數(shù)據(jù)):

    <s:property value="testSet[0]"/><br>?×

    獲取Map:<s:property value="testMap"/><br>

    獲取Map中所有的鍵:<s:property value="testMap.keys"/><br>

    獲取Map中所有的值:<s:property value="testMap.values"/><br>

    獲取Map中的某一個(gè)元素(可以使用類似于數(shù)組中的下標(biāo)獲取List中的內(nèi)容):

    <s:property value="testMap['m1']"/><br>

    獲取List的大小:<s:property value="testSet.size"/><br>

    ?

    訪問(wèn)集合?–?投影、選擇(? ^ $)

    利用選擇獲取List中成績(jī)及格的對(duì)象:<s:property value="stus.{?#this.grade>=60}"/><br>

    利用選擇獲取List中成績(jī)及格的對(duì)象的username:

    <s:property value="stus.{?#this.grade>=60}.{username}"/><br>

    利用選擇獲取List中成績(jī)及格的第一個(gè)對(duì)象的username:

    <s:property value="stus.{?#this.grade>=60}.{username}[0]"/><br>

    利用選擇獲取List中成績(jī)及格的第一個(gè)對(duì)象的username:

    <s:property value="stus.{^#this.grade>=60}.{username}"/><br>

    利用選擇獲取List中成績(jī)及格的最后一個(gè)對(duì)象的username:

    <s:property value="stus.{$#this.grade>=60}.{username}"/><br>

    利用選擇獲取List中成績(jī)及格的第一個(gè)對(duì)象然后求大小:

    <s:property value="stus.{^#this.grade>=600}.{username}.size"/><br>

    集合的偽屬性

    OGNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBeans模式,例如size(),length()等等.?當(dāng)表達(dá)式引用這些屬性時(shí),OGNL會(huì)調(diào)用相應(yīng)的方法,這就是偽屬性.

    集合

    偽屬性

    Collection(inherited by Map, List & Set)

    size ,isEmpty

    List

    iterator

    Map

    keys , values

    Set

    iterator

    Iterator

    next , hasNext

    Enumeration

    next , hasNext , nextElement , hasMoreElements

    ?

    ?Lambda???:[…]

    格式::[…]

    使用Lambda表達(dá)式計(jì)算階乘:

    <s:property value="#f = :[#this==1?1:#this*#f(#this-1)] , #f(4)"/><br>

    OGNL中#的使用

    #可以取出堆棧上下文中的存放的對(duì)象.

    名稱

    作用

    例子

    parameters

    包含當(dāng)前HTTP請(qǐng)求參數(shù)的Map

    #parameters.id[0]作用相當(dāng)于

    request.getParameter("id")

    request

    包含當(dāng)前HttpServletRequest的屬性(attribute)的Map

    #request.userName相當(dāng)于

    request.getAttribute("userName")

    session

    包含當(dāng)前HttpSession的屬性(attribute)的Map

    #session.userName相當(dāng)于

    session.getAttribute("userName")

    application

    包含當(dāng)前應(yīng)用的ServletContext的屬性(attribute)的Map

    #application.userName相當(dāng)于

    application.getAttribute("userName")

    attr

    用于按request > session > application順序訪問(wèn)其屬性(attribute)


    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    獲取Paraments對(duì)象的屬性:<s:property value="#parameters.username"/>

    OGNL中%的使用

    用%{}可以取出存在值堆棧中的Action對(duì)象,直接調(diào)用它的方法.

    例如你的Action如果繼承了ActionSupport .那么在頁(yè)面標(biāo)簽中,用%{getText('key')}的方式可以拿出國(guó)際化信息.

    ?OGNL中$的使用

    “$”有兩個(gè)主要的用途

    l?????????用于在國(guó)際化資源文件中,引用OGNL表達(dá)式

    l?????????在Struts 2配置文件中,引用OGNL表達(dá)式

    ?值棧

    ValueStack對(duì)象。這個(gè)對(duì)象貫穿整個(gè)Action的生命周期(每個(gè)Action類的對(duì)象實(shí)例會(huì)擁有一個(gè)ValueStack對(duì)象)。當(dāng) Struts 2接收到一個(gè).action的請(qǐng)求后,會(huì)先建立Action類的對(duì)象實(shí)例,但并不會(huì)調(diào)用Action方法,而是先將Action類的相應(yīng)屬性放到 ValueStack對(duì)象的頂層節(jié)點(diǎn)(ValueStack對(duì)象相當(dāng)于一個(gè)棧)。

    在Action中獲得ValueStack對(duì)象:ActionContext.getContext().getValueStack()

    l?????????Top語(yǔ)法

    使用Top獲取值棧中的第二個(gè)對(duì)象:<s:property value="[1].top.對(duì)象"/>

    l?????????N語(yǔ)法

    使用N獲取值棧中的第二個(gè)對(duì)象:<s:property value="[1].對(duì)象"/>

    l?????????@語(yǔ)法

    調(diào)用action中的靜態(tài)方法:<s:property value="@vs1@靜態(tài)方法"/> vs:值棧?1:表示第一個(gè)


    轉(zhuǎn)載于:https://my.oschina.net/Failure/blog/311466

    總結(jié)

    以上是生活随笔為你收集整理的Struts2中的OGNL详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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