一、OGNL表達式
a)什么是OGNL?
OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,
通過它簡單一致的表達式語法。主要功能:
它使用相同的表達式去存取對象的屬性。這樣可以更好的取得數據。
b)OGNL與Struts2
OGNL是獨立的開源組件
口的對象,OGNL會將對象放在這個上下文中統一管理的,並且會有一個對象被指定為根對象(root)。
c)三種符號
1.#符號的用途一般有三種。
1)訪問非根對象屬性,例如示例中的#session.msg表達式,由於Struts 2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當於ActionContext.getContext();;#session.msg表達式相當於
ActionContext.getContext().getSession(). getAttribute(”msg”) 。
2)用於過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用來構造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。
2.%符號 %符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值。如下面的代碼所示: 構造Map
-
- <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>
- <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>
3.$符號 $符號主要有兩個方面的用途。
在國際化資源文件中,引用OGNL表達式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。
在Struts 2框架的配置文件中引用OGNL表達式,例如下面的代碼片斷所示:
-
- <validators>
- <field name=”intb”>
- <field-validator type=”int”>
- <param name=”min”>10</param>
- <param name=”max”>100</param>
- <message>BAction-test校驗:數字必須為${min}為${max}之間!</message>
- </field-validator>
- </field>
- </validators>
- <validators>
- <field name=”intb”>
- <field-validator type=”int”>
- <param name=”min”>10</param>
- <param name=”max”>100</param>
- <message>BAction-test校驗:數字必須為${min}為${max}之間!</message>
- </field-validator>
- </field>
</validators>
d)常見用法
1、訪問基本屬性 <s:property value=“屬性名”/>
2、訪問實體對象 < s:property value=“PICPICKSHAPE對象名.屬性名”
3、訪問數組/集合
4、訪問Map
5、運算
6、調用方法
結果:MY NAME:ZHANGSAN
7、創建集合
創建集合:[a,b,c]
集合類型:java.util.ArrayList
8、創建Map
創建Map:{mm:MM,nn:NN}
Map類型:java.util.LinkHashMap
二、EL表達式
a)簡介:EL即Expression Language 表達式語言。該技術主要為了避免JSP中的腳本的出現。該
技術中內置很多的隱含對象可以方便開發者直接訪問,同時使用EL可以快速的遍歷域中屬性以及實現算術計算。
b)基本語法
1、語法:${expression}
2、訪問bean的屬性
a. ${user.name}; 依次從:pageContext、request、session、application查詢
b.也可以用${user[“name”]}
c.也可以用${user[propname]} 沒有引號
d.用[ ]里面可以用0,1……這樣的下標,作用是輸出數組里的元素值
e.可以使用pageScope、requestScope、sessionScope、applicationScope指定范圍,如:${requestScope.user.name} 只到request中去找
3、獲取請求參數值
a. ${param.username} 等價於: request.getParameter(“username”);
b. ${paramValues.interest} 等價於:request.getParameterValues(“interest”);
4、計算一個表達式,將結果作為標簽的屬性或者直接輸出
a. 算術運算 “+”,“-”,“*”,“/”,”%”,但是“+”不能連接字符串
b. 關系運算
"==" , "!=" , ">" , "<" ,">=" , "<=" 可以使用對應的"eq","nq","lt","gt","le","ge"代替。
c. 邏輯運算
"&&","||","!",可以使用"and","or","not"代替。
d. empty運算
判斷一個字符串是否為空,集合內容是否為空,以及綁訂的對象是否存在。
三、EL與OGNL區別
EL表達式:
>>單純在jsp頁面中出現,是在四個作用域中取值,page,request,session,application.
>>如果在struts環境中,它除了有在上面的四個作用域的取值功能外,還能從值棧(valuestack)中取值.
>>特點1:${name},name在值棧中的查找順序是:先從對象棧中取,取到終止,否則,向map中取。
>>特點2:在對象棧的查找順序是,先從model中找是否有name這個屬性,找到終止,否則,找action中是否有name這個全局變量。
>>特點3:${name},里面的是不帶#號的。
>>特點4:如果放在對象棧中的是一個自定義的對象,那么${property}里面可以直接去該對象的屬性值,不用這樣${object.property}
OGNL表達式:
1:讀取從后台傳遞的值
%{#name}:表示從值棧的map中取值
%{name}:表示從值棧的對象棧中取值
%{#request.name}:表示從request域中取值
2:自己構建數據
a,構建Map<s:iterator var="map" value="#{'key1':'value1','key2':'value2'}"/>
b,構建List<s:iterator var="list" value="{'one','two','three'}">
用法區別:OGNL是通常要結合Struts 2的標志一起使用,如<s:property value="#xx" /> struts頁面中不能單獨使用,el可以單獨使用 ${sessionScope.username}
名稱 |
servlet |
ognl el |
parameters |
request.getParameter("username") |
#username ${username} |
request |
request.getAttribute("userName") |
#request.userName ${requestScope.username} |
session |
session.getAttribute("userName") |
#session.userName ${sessionScope.username} |
application |
application.getAttribute("userName") |
#application.userName ${applicationScope.username} |
attr |
用於按request > session > application順序訪問其屬性(attribute) |
#attr.userName相當於按順序在以上三個范圍(scope)內讀取userName屬性,直到找到為 |