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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Struts2中的OGNL详解

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

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

首先了解下OGNL的概念

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

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

?

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

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

上下文中的根對象可以直接使用名來訪問或直接使用它的屬性名訪問它的屬性值。否則要加前綴“#key”。


?

?

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


?

?

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


?

?

4.值棧(ValueStack) :

可以在值棧中放入、刪除、查詢對象。訪問值棧中的對象不用“#”。

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

?

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

OGNL中重要的3個符號:#、%、$:

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

1.#符號

#符號的用途一般有三種。

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

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

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

2.%符號

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

3.$符號

$符號主要有兩個方面的用途。

—??? 在國際化資源文件中,引用OGNL表達(dá)式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${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校驗:數(shù)字必須為${min}為${max}之間!</message>????

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

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

  • </validators>???

  • ?

    下面通過代碼對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實例,以便訪問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頁面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>訪問OGNL上下文和Action上下文</h3>????

  • ????

  • ????<!-使用OGNL訪問屬性值-->????

  • ????

  • ????<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>用于過濾和投影(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>%符號的用法</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.通過ognl表達(dá)式獲取?屬性范圍中的值????

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

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

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

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

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

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

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

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

  • ????

  • ???????2.通過<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.通過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.通過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.通過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集合迭代的時候,從中篩選出當(dāng)前迭代對象>2的集合進(jìn)行顯示?-->????

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

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

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

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

  • ???????6.通過ognl表達(dá)式?訪問某個類的靜態(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)被選中的選項,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)被選中的選項,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的使用方法:

    訪問屬性

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

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

    訪問方法

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

    訪問靜態(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>

    訪問構(gòu)造方法

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

    ?

    1.5.?訪問數(shù)組

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

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

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

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

    獲取Set中的某一個元素(Set由于沒有順序,所以不能使用下標(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中的某一個元素(可以使用類似于數(shù)組中的下標(biāo)獲取List中的內(nèi)容):

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

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

    ?

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

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

    利用選擇獲取List中成績及格的對象的username:

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

    利用選擇獲取List中成績及格的第一個對象的username:

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

    利用選擇獲取List中成績及格的第一個對象的username:

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

    利用選擇獲取List中成績及格的最后一個對象的username:

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

    利用選擇獲取List中成績及格的第一個對象然后求大小:

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

    集合的偽屬性

    OGNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBeans模式,例如size(),length()等等.?當(dāng)表達(dá)式引用這些屬性時,OGNL會調(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á)式計算階乘:

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

    OGNL中#的使用

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

    名稱

    作用

    例子

    parameters

    包含當(dāng)前HTTP請求參數(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順序訪問其屬性(attribute)


    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

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

    OGNL中%的使用

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

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

    ?OGNL中$的使用

    “$”有兩個主要的用途

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

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

    ?值棧

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

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

    l?????????Top語法

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

    l?????????N語法

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

    l?????????@語法

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


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

    總結(jié)

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

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