OGNL中$、%、#、{}、^、$ 標簽的使用簡介

jopen 11年前發布 | 30K 次閱讀 OGNL Struts2 Web框架

Struts2ActionContext是來自于Ognl的上下文,是OGNL的一個增強,在Struts2Context的根對象就是Action。因為只有根對象時可以直接訪問的,不需要加任何標記,比如request,session,application這些對象在訪問時都不需要加#號。OGNL中$、%、#、{}、^、$ 標簽的使用簡介

OGNL$號的使用
1..在國際化資源文件中,引用OGNL表達式
2..struts.xml文件中,引用OGNL表達式

 

OGNL%號的使用

“%”符號的用途是在標簽的屬性值被理解為字符串類型時,告訴執行環境%{}里的是OGNL表達式。 

這個類似js中的eval,很暴力。 

1..使用%{}可以取出保存在值堆棧中的Action對象,直接調用它的方法
2..如果Action繼承了ActionSupport,那么在頁面標簽中可以使用%{getText('key')}獲取國際化信息

 

OGNL#號的使用
OGNL
中的#號可以取出堆棧上下文中存放的對象

名稱

作用

例子

attr

用于按request>>session>>application順序訪問其屬性

#attr.userName相當于按順序從三個范圍讀取userName屬性直到找到為止

request

包含當前HttpServletRequest的屬性的Map

#request.userName相當于request.getAttribute("userName")

session

包含當前HttpSession的屬性的Map

#session.userName相當于session.getAttribute("userName")

application

包含當前應用的ServletContext的屬性的Map

#application.userName相當于application.getAttribute("userName")

parameters

包含當前HTTP請求參數的Map

#parameters.id[0]相當于request.getParameter("id")

 

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

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

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

三、用來構造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

 

利用投影獲取屬性
利用投影獲取List中對象的username屬性時,其中{}表示的是一個集合
stus.{username}就表示將suts中所有的username屬性取出組成一個新的列表

 

利用選擇獲取屬性

OGNL表達式是很靈活的,可以同時使用選擇技術投影技術獲取屬性
使用選擇技術時,#this代表當前元素,問號?是把所有滿足條件的元素都取出來。
上箭頭^是開始的意思,即取符合條件的數據索引中第一條數據,所以stus.{^#this.grade>=60}.{username}輸出的是[張三]
注意,此時輸出文本中包含中括號,這表示它是一個列表。
stus.{?#this.grade>=60}.{username}[0]輸出的是張三,是字符串,二者是不同的。
美元符號$是結束的意思,即取符合條件的數據索引中最后一條數據,所以stus.{$#this.grade>=60}.{username}輸出的是[王五]
這三個符號:問號、上箭頭、美元符所返回的都是List

 

另符兩語法:

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

使用 N 語法獲取值棧中的第二個對象的屬性:<s:propertyvalue="[1].username"/>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!