OGNL的全稱是Object Graph Navigation Language,即對象導航圖語言。它是一個開源項目,工作在視圖層,其通過簡單一致的表達式語言來讀取合適者Java對象的屬性值,調用對象的方法,遍歷整個對象的結構圖,實現字段類型的轉換。
OGNL的計算都是圍繞著OGNL上下文來進行的,OGNL上下文實際就是一個Map集合,由ognl.OgnlContext類來表示(其被封裝到ActionContext中)。其可以包含一個或多個上下文對象。
先面以一個例子來介紹OGNL表達式的使用
普通Action類代碼:
省略action配置信息。。。
視圖頁面代碼:
通過上面的例子我們發現在Action類中我們使用了兩種方式向ValueStack中賦值,且在視圖頁面進行讀取時的語法也不一樣,只是為什麼呢?這就要說到ValueStack了。
ValueStack也就是值棧,簡單的來說,值棧就是框架創建的一個存儲區域,用來保存Model對象。它具有棧的特性,可以存放多個對象。
在視圖頁面中我們也可以使用<s:debug></s:debug>標簽來查看值棧中的信息,如圖所示:
從上圖中我們可以看出頁面顯示的ValueStack中大致劃分了Value Stack Contents和 Stack Context兩塊兒區域,其中Value Stack Contents是Root對象其以ArrayList的形式存放數據。OGNL表達式語言可以直接通過Property Name名稱來獲取其對應的值。而Stack Context中的數據則存放在Context中其是以map集合的形式來存放數據的。在是用OGNL表達式來訪問時需要加上“#”作為前綴。
ActionContext中還有其他的對象這裡就不在進行一一講述,他們可以使用OGNL表達式語言來進行操作。但是除了Root對象中的值以外訪問其他的值是都需要加上“#”作為前綴!