什么是ognl?
- OGNL是Struts2中使用的一種表達式語言。
- 它可以用於在JSP頁面,使用標簽方便的訪問各種對象的屬性;
- 它可以用於,在Action中獲取傳遞過來的頁面中的參數(並進行類型轉換);
- 它還可以用在struts2的配置文件中!
在OGNL的使用中,需要訪問到一系列的對象,這些對象都存放在OGNL的context(上下文)中,context是一個Map結構,存放了一系列的key-value對,實際上,它和ActionContext類是相對應的。在OGNL的context中,有一個根對象為ValueStack,該對象實際上是一個棧,但在Struts 2框架中只存放了一個對象,就是action對象。在action中數據會被壓入值棧中,那么在頁面中就可以通過ongl表達式取出值棧中的值。
(要了解值棧的概念可以看大佬的這篇 Struts2 | 深入淺出理解struts2中的值棧:https://www.jianshu.com/p/82954b841b5e)
ognl表達式的使用
ognl表達式要結合Struts的標簽庫來使用,主要有#、%和$三個符號的使用。
1、#符號的三種用法
1)訪問非根元素(在struts中值棧為根對象),如ongl上下文和Action上下文,這里#相當於ActionContext.getContext()
下表有幾個ActionContext中有用的屬性:
屬性 | 說明 | 表達式 | 表達式說明 |
parameters | 包含當前HTTP請求參數的Map | #parameters.paramName[0] | 相當於request.getParameter("paramName"); |
request | 包含當前HttpServletRequest的屬性(attribute)的Map | #request.key | 相當於request.getAttribute(“key”) |
session | 包含當前HttpSession的屬性(attribute)的Map | #session.key | 相當於session.getAttribute(“key”) |
application | 包含當前應用的ServletContext的屬性(attribute)的Map | #application.key | 相當於application.getAttribute(“key”) |
注:attr 用於按request > session > application順序訪問其屬性(attribute),#attr.key相當於按順序在以上三個范圍(scope)內讀取key對應的屬性值,直到找到為止。
2)用於過濾和投影(projecting)集合,
如: persons.{?#this.age>20}。
3)用來構造Map,
如下面的: #{’foo1′:’bar1′,’foo2′:’bar2′}。
2、%符號
%符號用於標志的屬性為字符串類型時,計算ognl表達式的值,示例:
<center> <s:set var="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> </center>
運行結果:
3、$符號
$符有兩種用法:
(1)在國際化資源文件中,引用OGNL表達式。
(2)在Struts 2配置文件中,引用OGNL表達式:
<action name=”saveUser” method=”save”> <result type=”redirect”>listUser.action?msg=${msg}</result> </action> <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>
需要注意的是:在Struts2的標簽中不能用EL表達式,而可以用OGNL表達式。