天天看點

OGNL之簡述

一、簡介

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);
    }