struts 2中使用OGNL

OGNL全稱爲Object-Graph Navigation Language,是一種表達式語言(EL)。

EL的支持者認爲,在JSP頁面中應儘可能地避免 <% %> 這樣的標記,而代之以Tag,以使頁面更簡潔,並體現頁面與後臺代碼分離的設計原則。對此我持保留意見,因爲我並不認爲使用Tag後的頁面的可讀性要高於使用<% %>。

Struts 2支持如下幾種EL:

  • OGNL(Object-Graph Navigation Language): 可以方便地操作對象屬性的開源表達式語言
  • JSTL(JSP Standard Tag Library): JSP 2.0集成的標準的表達式語言
  • Groovy: 基於Java平臺的動態語言,它具有時下比較流行的動態語言(如Python、Ruby和Smarttalk等)的一些新特性
  • Velocity: 嚴格來說不是表達式語言,它是一種基於Java的模板匹配引擎,據說其性能要比JSP好

Struts 2默認的表達式語言是OGNL,原因是它相對其它表達式語言具有下面幾大優勢:

  • 支持對象方法調用,如xxx.doSomeSpecial();
  • 支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路徑)]@[方法名 | 值名],例如: @java.lang.String@format('foo %s', 'bar')或 @tutorial.MyConstant@APP_NAME;
  • 支持賦值操作和表達式串聯,如price=100, discount=0.8, calculatePrice(),這個表達式會返回80;
  • 訪問OGNL上下文(OGNL context)和ActionContext;
  • 操作集合對象。

OGNL是通常要結合Struts 2的標誌一起使用,如<s:property value="xx" />等。大家經常遇到的問題是#、%和$這三個符號的使用。下面我講述這個問題:

 

4.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)的Ma, #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'}

 

4.2 %的用法

“%”符號的用途是在標誌的屬性爲字符串類型時,計算OGNL表達式的值。例如在Ognl.jsp中加入以下代碼:

<h3>%的用途</h3>
<p><s:url value="#foobar['foo1']" /></p>
<p><s:url value="%{#foobar['foo1']}" /></p>

刷新頁面,顯示以下內容

%的用途

#foobar['foo1']

bar1

 

4.3 $的用法

“$”有兩個主要的用途:

  1. 用於在國際化資源文件中,引用OGNL表達式
  2. Struts 2配置文件中,引用OGNL表達式,如
<action name="AddPhoto" class="addPhoto">
 <interceptor-ref name="fileUploadStack" />            
 <result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章