官术网_书友最值得收藏!

4.2 Struts 2的OGNL表達式與應用案例

OGNL是Object-Graph Navigation Language的縮寫,是一種功能強大的表達式語言。通過簡單的表達式語法,可以存取對象的任意屬性值,也可以調用對象的方法等功能。OGNL通常與Struts 2標簽綁定使用。

提示:OGNL表達式類似于EL表達式,其使用方式也類似。

在JSP頁面上可以利用OGNL訪問到值棧(ValueStack)里的對象屬性。若希望訪問值棧中ContextMap中的數據,需要給OGNL表達式加上一個前綴字符#,如果沒有前綴字符#,搜索將在ObjectStack中進行。

1.讀取ObjectStack里的對象的屬性

若想訪問Object Stack里的某個對象的屬性,可以使用以下幾種形式之一。

    object.propertyName或object['propertyName']或object["propertyName"]

例4-1】本例展示了Struts 2是如何存儲數據,以及如何訪問數據的。

首先定義一個模型Person,然后在Action中定義、創建其對象并賦值,最后在頁面中顯示該對象的值。

1)設計模型類Person,其代碼如下。

    package com.edu.ognl.action;
    import java.util.Date;
    public class Person {
        private String name;
        private int age;
        private Date birthday;
        public Person() {}
        public Person(String name, int age, Date birthday) {
              this.name = name; this.age = age; this.birthday = birthday;
        }
        //省略了getter/setter方法
    }

2)設計Action,并配置Action,其代碼如下。

3)設計顯示信息的JSP頁面(showognl.jsp),其代碼如下。

4)啟動服務器,并在地址欄中輸入下列網址。

其運行界面如圖4-2所示。

圖4-2 【例4-1】的運行界面

2.讀取ContextMap里的對象的屬性

若訪問ContextMap里某個對象的屬性,需要給表達式加上一個前綴字符#,其訪問形式可以是下列形式之一。

    #object.propertyName或 #object['propertyName']或 #object["propertyName"]

例4-2】在Action中,給Web對象request、session和application等提供值,然后在頁面中獲取并顯示。

【設計與實現】

1)設計Action: OgnlAction,并采用注釋配置Action,其代碼如下。

    package com.edu.ognl.action;
    //省略了import;
    @Namespace("/test")
    @ParentPackage("struts-default")
    @Results({ @Result(name = "success", location = "/showognl.jsp")})
    public class OgnlAction extends ActionSupport {
        @Action("ognlTest")
        public String ognlTest() throws Exception {
          // 獲得ActionContext實例,以便訪問Servlet API
          ActionContext ctx = ActionContext.getContext();
          ctx.getApplication().put("msg", "application信息"); //存入到application
          ctx.getSession().put("msg", "seesion信息"); //保存到session
          HttpServletRequest request = ServletActionContext.getRequest(); //獲取request對象
          request.setAttribute("msg", "request信息"); // 保存到request
          return SUCCESS;
        }
    }

2)設計顯示信息的JSP頁面(showognl.jsp),其代碼如下。

3)啟動服務器,并在地址欄中輸入下列網址。

其運行界面如圖4-3所示。

圖4-3 【例4-2】的運行界面

3.訪問數組、List和Map類型的屬性

利用OGNL可以訪問集合(例如,List對象、Map對象或數組對象)類型對象中的數據元素。

(1)訪問數組和List類型的對象

對數組對象和List類型對象的訪問,其訪問格式是一樣的,都是使用從零開始的數字索引的形式,同時也可以調用數組和List類型對象上的方法。

OGNL中使用List對象格式如下。

    {e1, e2, e3, …}

該表達式直接生成一個List對象,該List對象中包含:e1、e2、e3…等元素。

(2)訪問Map類型對象

訪問Map類型對象中的對象時需要將Map中的key作為索引或者將key作為屬性的方式訪問,將返回與該key所對應的value。

OGNL中使用Map對象格式如下。

    #{key1:value1, key2:value2, key3:value3, …}

(3)OGNL集合可以使用in和not in判定元素是否屬于該集合

● in:表達式用來判斷某個元素是否在指定的集合對象中。

● not in:用于判斷某個元素是否不在指定的集合對象中。

例如,基于Struts 2標簽,利用OGNL運算,判斷元素a是否屬于集合{'a', 'b'}。

    <s:if test="'a' in {'a', 'b'}">…</s:if>

(4)OGNL還可以使用某些規則獲取集合對象的子集

常用的相關操作如下。

● ? :用于獲取多個符合邏輯的元素。

● ∧:用于獲取符合邏輯的第一個元素。

● $:用于獲取符合邏輯的最后一個元素。

如下面的代碼所示。

    Student.sex{? #this.sex= ='male'}//獲取Student的所有male的sex集合

例4-3】本例展示了如何創建Map和List對象,并顯示其信息。設計一個JSP頁面,在該頁面內生成OGNL的Map和List對象,并顯示其信息。

【設計與實現】

1)設計的JSP頁面,其代碼如下。

2)啟動服務器,并在地址欄中輸入下列網址。

    http://localhost:8080/c4_ognl_tag/showognl.jsp

其運行界面如圖4-4所示。

圖4-4 【例4-3】的運行界面

主站蜘蛛池模板: 仁布县| 巫山县| 大余县| 确山县| 两当县| 铅山县| 共和县| 牙克石市| 武功县| 八宿县| 板桥市| 罗平县| 奎屯市| 漾濞| 新民市| 五常市| 芦溪县| 项城市| 余庆县| 信宜市| 东安县| 连城县| 开原市| 永川市| 汉沽区| 蒙自县| 马鞍山市| 佛学| 花莲县| 潜江市| 佳木斯市| 华池县| 禹州市| 北票市| 丰都县| 彩票| 安阳县| 轮台县| 汪清县| 左权县| 蕲春县|