Struts2高級開發之OGNL
一、OGNL介紹
OGNL是強大的表達式語言,能夠自動導航對象的結構並訪問和設置對象數據。在OGNL表達式中,核心對象為OGNL上下文,相當於一個Map容器。使用OGNL表達式語言,需要導入兩個包:ognl-3.0.jar、javassist-3.7.jar。
OGNL表達式語言的特點如下:
-
- 支持對象方法的調用;
- 支持靜態方法的調用;
- 支持變量的賦值;
- 可以操作集合數據 。
OGNL上下文作用於Struts2中的ActionContext對象,ActionContext對象是Struts2框架中的一個核心對象,結構包括值棧(根)、application、session、request、parameters、attr。其中,值棧中的對象可以直接進行獲取,取值方式為: ${user.name}
註意:使用Struts2標簽需要引入Struts2標簽庫,在JSP頁面頭部通過 <%@ taglib prefix="s" uri="/struts-tags"%> 進行引入。
二、ognlContext補充說明
1. ognlContext(ognl上下文對象),是一個map類型的對象。存在唯一的叫做根的對象(root),可以通過程序設定上下文當中的哪個對象作為根對象。
2. 在OGNL中,如果表達式沒有使用“#”號,那麽OGNL會從根對象中尋找該屬性對應的get方法,如果尋找的不是根對象中的屬性,則以#作為開頭,告訴OGNL,去尋找你所指定的屬性。
例如:
- 建立兩個Bean對象,定義name屬性,設置get或set方法;
- 在ognlTest中, OgnlContext context = new OgnlContext() ;
- context.put("person",person) ; 和 context.put("dog",dog) ;
- 將Person設置為root根對象, context.setRoot(person) ;
-
Object object = Ognl.parseExpression("name"); // 對name屬性進行解析,此處應該對應person,即根對象的name值
Object object1 = Ognl.parseExpression(#dog.name); // 對dog的name屬性進行解析,獲取dog的name值
6. Object object2 = Ognl.getValue(object1,context,context.getRoot());
3. 當使用OGNL調用靜態方法的時候,需要按照如下語法編寫表達式:
@[email protected](parameter) 即: @[email protected](10) ; 對於OGNL來說,java.lang.Math是其的默認格式,如果調用java.lang.Math的靜態方法時,無需指定類的名字,比如: @@min(4,10);
4. 過濾(filltering)方法:
對一個集合進行過濾,返回一個子集合。 Collection.{?expression} 表示對Collection集合進行過濾,條件為expression。 Ognl.getValue("#persons.{?#this.name.length() > 4 }.size()", context, context.getRoot()) ,OGNL針對集合提供了一些偽屬性(如size,isEmpty......),讓我們可以通過屬性的方式來調用方法。
名稱 | 說明 |
? | 獲取滿足指定條件的所有元素 Collection.{?expression} |
^ | 獲取滿足指定條件的所有元素中的第一個元素Collection.{^expression} |
$ |
獲取滿足指定條件的所有元素中的最後一個元素Collection.{$expression} |
5. 投影(projection)方法:Collection.{expression}
註意:過濾與投影之間的差別,類比於數據庫中的表,過濾是取行的操作,而投影是取列的操作。
三、總結
關於Struts2標簽庫屬性值的%與#的關系:
- 如果標簽的屬性值是OGNL表達式,那麽無需加上%{} 。
- 如果標簽的屬性值是字符串類型,那麽在字符串當中凡是出現的%{}都會被解構成OGNL表達式,解析完畢後再與其他的字符串進行拼接組成最後的字符串值。
- 我們可以在所有的屬性值上加%{},這樣如果該屬性是OGNL表達式,那麽標簽處理類就會將%{}忽略。
Struts2高級開發之OGNL