OGNL是Struts 2框架的默認表達式語言,增強了Struts 2的數據訪問能力,同時簡化了代碼。
Struts 2的OGNL表達式
標準的OGNL會設定一個根對象(root對象)。假設使用標準OGNL表達式來求值(不使用Struts 2的OGNL表達式),如果OGNL上下文(OgnlContext Map類型)有兩個對象:foo對象,在OgnlContext中名稱為foo;bar對象,在OgnlContext中名稱為bar。同時foo對象被設置為根對象(root)。則利用下面的OGNL表達式求值:
// 返回foo.getBlah() #foo.blah //返回bar.getBlah() #bar.blah //返回foo.getBlah() ,因為foo為根對象 blah |
★說明★
使用OGNL是非常簡單的,如果要訪問的對象不是根對象,如示例中的bar對象,則需要使用命名空間,用“#”來標識,如“#bar”;如果訪問一個根對象,則不用指定命名空間,可以直接訪問根對象的屬性。
在Struts 2框架中,值棧(Value Stack)就是OGNL的根對象,假設值棧中存在兩個對對象實例:Man和Animal,這兩個對象實例都有一個name屬性,Animal有一個species屬性,Man有一個salary屬性,假設Animal在值棧的頂部,Man在Animal后面,下面的代碼片斷會幫助讀者更好地理解OGNL表達式:
// 調用animal.getSpecies() species // 調用man.getSalary() salary // 調用animal.getName(),因為Animal位于值棧的頂部 name |
最后一行示例代碼,返回的是animal.getName()返回值,即返回了Animal的name屬性,因為Animal是值棧的頂部元素,OGNL將從頂部元素搜索,所以會返回Animal的name屬性值。如果要獲得Man的name值,則需要如下代碼:
Struts 2允許在值棧中使用索引,示例代碼如下所示:
[0].name?? // 調用animal.getName() [1].name?? // 調用man.getName() |
posted on 2009-08-15 17:18
jadmin 閱讀(88)
評論(0) 編輯 收藏