一、OGNL的概述
1、什麼是OGNL
OGNL比EL強大很多被的表達式語言(EL獲取的數據來源與四個作用域,EL提供11個web對象),OGNL是一個獨立的表達式語言。Struts2發現OGNL功能很強大,將OGNL引入到自身當中,作爲自己的表達式語言。
OGNL全稱是對象圖導航語言(Object-Graph Navigation Language),可以通過某種表達式語法,存取Java對象的任意屬性,調用Java對象的方法,同時能夠自動實現必要的類型轉換。
2、OGNL的作用
l 訪問對象的方法。如:objName.methodName();
l 訪問對象的靜態方法:@java.lang.String@format();
l 支持賦值操作和表達式串聯
l 訪問OGNL上下文(OGNL context)和ActionContext
l 操作集合對象
3、OGNL的要素
(1)表達式:帶有語法含義的字符串,規定了“做什麼”
(2)Root:OGNL的操作對象,規定了“對誰操作”
(3)OgnlContext對象:Root對象所在的環境就是OGNL的上下文環境(Context),規定了“在哪裏進行”
注:上下文環境Context是一個Map類型的對象,在表達式中訪問Context中的對象,需要使用“#”加上對象名稱:#對象名稱
二、OGNL的入門
1、OGNL在Java工程使用(瞭解)
@Test
// 獲得對象的方法
public void demo1() throws OgnlException{
// 獲得數據:
OgnlContext context = new OgnlContext();
Object value = Ognl.getValue("'helloworld'.length()", context, context.getRoot());
System.out.println(value);
}
@Test
// 調用對象的靜態方法
public void demo2() throws OgnlException{
// 獲得數據:
OgnlContext context = new OgnlContext();
Object value = Ognl.getValue("@java.lang.Math@random()", context, context.getRoot());
System.out.println(value);
}
@Test
/**
* OGNL獲得root的數據
* * root中一般存對象
*/
public void demo3() throws OgnlException{
Product product = new Product();
product.setName("電視機");
product.setPrice(2999d);
// 獲得Context對象:
OgnlContext context = new OgnlContext();
context.setRoot(product);
Object value = Ognl.getValue("name", context, context.getRoot());
System.out.println(value);
}
@Test
/**
* OGNL獲得context的數據
* * context中存入的List集合,其他的普通的值
* * 獲取context數據需要加#
*/
public void demo4() throws OgnlException{
// 獲得Context對象:
OgnlContext context = new OgnlContext();
context.put("key", "郝強寶");
Object value = Ognl.getValue("#key", context, context.getRoot());
System.out.println(value);
}
注:root中一般存對象。