struts2的OGNL表达式(二)
下面說說OGNL表達(dá)式的訪問情況:
OGNL表達(dá)式能訪問:訪問屬性,訪問方法,訪問字體對象,訪問靜態(tài)屬性和方法,訪問構(gòu)造方法,訪問數(shù)組,訪問集合 – 投影、選擇(? ^ $)
1,OGNL輸出常量值
<s:property value="常量值"/>可以輸出字符串常量.
字符串常量(string literal)
? ? 以單引號或雙引號括起來的字符串,例如:‘Hello World’和”Hello World”.在JAVA中,不能用單引號來界定字符串常量,而在OGNL中是可以的。不過特別要注意的是:如果是單個字符的字符串常量,則必須使用雙引號來界定,例如:“S”。OGNL的字符串也支持轉(zhuǎn)義序列,例如:要在JSP頁面中輸出”You said ,”Hello World”.”,那么可以使用<s:property>標(biāo)簽,如下:
<s:property value=“’You said,\”Hello World\”.’”/>
? ? ? 注意:不要忽略了用于界定整個常量字符串的單引號。如果沒有寫單引號,那么整個字符串將不會被看成是字符串常量,而是被當(dāng)作根對象的屬性名,從而導(dǎo)致錯誤。
字符常量(Character literal)
? ? ?以單引號括起來的字符。例如,‘H’。注意,不能使用雙引號,否則將被看成是字符串常量。
數(shù)值常量(Numeric literal)
除了Java中的int,long,float,double外,OGNL還讓你用“B”或“b”后綴指定BigDecimal常量,用“H”或”h”后綴指定BigInteger常量,例如,123(int常量),123l(long常量),123.35f(float常量),123b(BigDecimal常量),123h(BigInteger常量)。
2,獲取Action中的屬性值或者Action中的對象的某某屬性值
注意這里的username是action中的屬性,user是action中的屬性對象,因為action是放在值棧中的所以不需要使用#字號訪問
訪問屬性:<s:property value="username"/> 訪問對象屬性(get和set):<s:property value="user.age"/> 訪問對象方法:<s:property value="user.getName()"/> 訪問對象屬性(get和set):<s:property value="employee.manager.name"/>
? ? ? ?默認(rèn)的會把Action放到值棧里面,而值棧在訪問的時候,并不需要值棧的名字
當(dāng)我們調(diào)用<s:property value="user.getVOMethod()"/>的時候,它會自動到值棧里面查找Action對象里面有沒有user對象,然后它就發(fā)現(xiàn)有user,然后它就再找user里面有沒有g(shù)etVOMethod()方法,然后它發(fā)現(xiàn)有,于是調(diào)用getVOMethod(),實際上調(diào)用User中的getVOMethod()方法的過程與獲取表單中的姓名密碼的方式都是相同的,都是到值棧里面查找,找是否存在user對象,如果存在,接著查找user中是否存在某某屬性或方法
4,訪問Action中的靜態(tài)屬性和方法
以@開頭,后面跟上具體的包名,然后@加上靜態(tài)方法
OGNL支持調(diào)用類中的靜態(tài)方法和靜態(tài)字段,格式如下:
@class@method(args)//調(diào)用靜態(tài)方法 @class@field//訪問靜態(tài)字段(public權(quán)限)
其中class必順給出完整的類名。例如:@java.lang.String@valueOf(5)。如果省略class,那么默認(rèn)使用類是java.lang.Math
<span style="font-size:24px;">訪問構(gòu)造方法:<s:property value="new com.neusoft.ognl.User(44)"/></span>
6,OGNL創(chuàng)建和訪問集合數(shù)組
a,OGNL創(chuàng)建集合
? ? 如果需要一個集合元素的時候(例如List對象或者M(jìn)ap對象),可以使用OGNL中同集合相關(guān)的表達(dá)式。可以使用如下代碼直接生成一個List對象:
創(chuàng)建集合:<s:property value="{'a','b','c'}"/> <!--輸出結(jié)果為:[a,b,c]--> 集合類型:<s:property value="{'a','b','c'}.getClass().getName()"/><!--輸出類型名稱是java.util.ArrayList--> ? ? 如下代碼可以直接生成一個Map對象:
創(chuàng)建Map:<s:property value="#{'mm':'MM','nn':'NN'}"/>"<!--輸出結(jié)果為:{mm=MM,nn=NN}--> Map類型:<s:property value="#{'mm':'MM','nn':'NN'}.getClass().getName()"/><strong style="color: rgb(255, 0, 0);"> </strong><!--輸出類型名稱是java.util.LinkedHashMap-->
b,OGNL訪問集合
??
<li>訪問List:<s:property value="users"/> </li> <li>訪問List中某個元素:<s:property value="users[0]"/> </li> <li>訪問List中元素某個屬性的集合: <s:property value="users.{age}"/></li> <li>訪問List中元素某個屬性的集合中的特定值: <s:property value="users.{age}[0]"/>|<s:property value="users[0].age"/> </li> <li>訪問Set:<s:property value="managers"/></li> <li>訪問Set中某個元素:<s:property value="managers[0]"/></li><!-- 錯誤,無法根據(jù)下標(biāo)訪問元素 --> <li>訪問Map:<s:property value="manMap"/></li> <li>訪問Map中某個元素:<s:property value="manMap.mm1"/>|<s:property value="manMap['mm1']"/>|<s:property value="manMap[\"mm1\"]"/></li> <li>訪問Map中所有的key:<s:property value="manMap.keys"/></li> <li>訪問Map中所有的value:<s:property value="manMap.values"/></li> <li>訪問容器的大小:<s:property value="manMap.size()"/></li><strong> </strong>c,集合中的偽屬性
? ? OGNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBeans模式,例如size(),length()等等. 當(dāng)表達(dá)式引用這些屬性時,OGNL會調(diào)用相應(yīng)的方法,這就是偽屬性.
總結(jié)
以上是生活随笔為你收集整理的struts2的OGNL表达式(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts2的OGNL表达式理解(一)
- 下一篇: struts2的OGNL表达式(三)