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