一、簡介
OGNL(Object-Graph Navigation Language)的全稱是對象圖導航語言,它是一種功能強大的開源表達式語言,比EL(隻能從域或内置對象中)表達式更強大,使用這種表達式語言,可以通過某種表達式文法,OGNL可以存取Java任意對象的任意屬性,調用Java對象的方法,同時能夠自動實作必要的類型轉換。如果把表達式看作是一個帶有語義的字元串,那麼OGNL無疑成為了這個語義字元串與Java對象之間溝通的橋梁。
Struts2的預設表達式語言就是OGNL
二、作用
1.支援對象方法調用 objName.methodName()
2.支援類靜态方法調用和值通路 @[email protected]('name','mark')
3.支援指派操作和表達式串聯 price=100,calculatePrice()
4.支援通路OGNL上下文(OGNL context)和ActionContext
5.支援操作集合對象
三、要素(表達式、根對象、上下文環境)
OGNL的操作實際上就是圍繞着OGNL結構的三個要素而進行的,分别是表達式(Expresssion)、根對象(Root Object)、上下文環境(Context)
1.表達式
表達式是整個OGNL的核心,OGNL會根據表達式去對象中取值。所有OGNL操作都是針對表達式解析後進行的。它表明了此次OGNL操作要"做什麼"。表達式就是一個帶有文法含義的字元串,這個字元串規定了操作的類型和操作的内容。OGNL支援大量的表達式文法,不僅支援這種"鍊式"對象通路路徑,還支援在表達式中進行簡單的計算
2.根對象
實際上OGNL的取值還需要一個上下文環境。設定了Root對象,OGNL可以對Root對象進行取值或寫值等操作,Root對象所在環境就是OGNL的上下文環境(Context)。上下文環境規定了OGNL的操作"在哪裡進行"。上下文環境Context是一個Map類型的對象,在表達式中通路Context中對象,需要使用"#"号加上對象名稱,即"#對象名稱"的形式
3.上下文環境
實際上OGNL的取值還需要一個上下文環境,設定了Root對象,OGNL可以對Root對象進行取值或寫值等操作,Root對象所在環境就是OGNL的上下文環境(Context)。上下文環境規定了OGNL的操作"在哪裡進行"。上下文環境Context是一個Map類型的對象,在表達式中通路Context中的對象,需要使用"#"号加上對象名稱,即"#對象名稱"的形式
四、用法
1.通路對象的方法
public void testOGNL(){
//獲得上下文環境Context
OgnlContext context = new OgnlContext();
//獲得根對象Root
Object root = context .getRoot();
//執行表達式
Object obj = Ognl.getValue("'helloWorld'.length()",context ,root);
}
2.通路對象的靜态方法
public void testOGNL(){
//獲得上下文環境Context
OgnlContext context = new OgnlContext();
//獲得根對象Root
Object root = context .getRoot();
//執行表達式 @類名@方法名
Object obj = Ognl.getValue("@[email protected]()",context ,root);
}
3.擷取Root中資料(不需要加#)
public void testOGNL(){
//獲得上下文環境Context
OgnlContext context = new OgnlContext();
//向root傳入Java對象
context.setRoot(new User("mark", 15));
//獲得根對象Root
Object root = context .getRoot();
//執行表達式 擷取對象中屬性值
Object username = Ognl.getValue("username",context ,root);
Object age = Ognl.getValue("age",context ,root);
}
4.擷取Context中的資料(需要加#)
public void testOGNL(){
//獲得上下文環境Context
OgnlContext context = new OgnlContext();
//獲得根對象Root
Object root = context .getRoot();
//向Context傳入值
context.put("username","mark");
//執行表達式 擷取Context中屬性值
Object username = Ognl.getValue("#username",context ,root);
}