運算式語言主要有以下幾大好處:
- 避免(MyType) request.getAttribute()和myBean.getMyProperty()之類的語句,使頁面更簡潔;
- 支援運算子(如+-*/),比普通的標誌具有更高的自由度和更強的功能;
- 簡單明了地表達代碼邏輯,使用代碼更可讀與便於維護。
OGNL是通常要結合Struts 2的標誌一起使用,如<s:property value="xx" />等。大家經常遇到的問題是#、%和$這三個符號的使用。下面我想通過例子講述這個問題:
“#”主要有三種用途:
- 訪問OGNL上下文和Action上下文,#相當於ActionContext.getContext();下表有幾個ActionContext中有用的屬性:
| 名稱 |
作用 |
例子 |
| parameters |
包含當前HTTP請求參數的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) |
#attr.userName相當於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到為止 |
- 用於過濾和投影(projecting)集合,如books.{?#this.price<100};
- 構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
“%”符號的用途是在標誌的屬性為字串類型時,計算OGNL運算式的值。
“$”有兩個主要的用途
- 用於在國際化資源檔中,引用OGNL運算式,例子請參考《在Struts 2.0中國際化(i18n)您的應用程式》
- 在Struts 2設定檔中,引用OGNL運算式,如<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>