Struts2使用之值棧與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 , 99).username"/>

?

1.5. 訪問數(shù)組

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

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

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

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

獲取 Set 中的某一個元素 (Set 由于沒有順序,所以不能使用下標獲取數(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ù)組中的下標獲取 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() 等等 . 當表達式引用這些屬性時 ,OGNL 會調(diào)用相應的方法 , 這就是偽屬性 .

集合

偽屬性

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 表達式計算階乘 :

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

OGNL # 的使用

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

名稱

作用

例子

parameters

包含當前 HTTP 請求參數(shù)的 Map

#parameters.id[0] 作用相當于

request.getParameter("id")

request

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

#request.userName 相當于

request.getAttribute("userName")

session

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

#session.userName 相當于

session.getAttribute("userName")

application

包含當前應用的 ServletContext 的屬性( attribute )的 Map

#application.userName 相當于

application.getAttribute("userName")

attr

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

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

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

OGNL % 的使用

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

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

? OGNL $ 的使用

$ ”有兩個主要的用途

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

l ???????? Struts 2 配置文件中,引用 OGNL 表達式

? 值棧

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

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 :表示第一個。