在做struts2項目中經常遇到 “#”,“%”,“$”三種表達式符號,一直都是糊里糊塗的用着,至於他們的區別也不太清楚,後來從網上查了一些資料,記下來以備查閱。
“#”主要有三種用途:
1.
訪問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屬性,直到找到爲止
2.
用於過濾和投影(projecting)集合,如books.{?#this.price<100};
3.
構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
“%”的用途是在標誌的屬性爲字符串類型時,計算OGNL表達式的值。例如在Ognl.jsp中加入以下代碼:
<hr />
<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>
“$”有兩個主要的用途 :
1.
用於在國際化資源文件中,引用OGNL表達式,例子請參考《在Struts 2.0中國際化(i18n)您的應用程序》
2. 在Struts
2配置文件中,引用OGNL表達式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack"
/>
<result
type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>