struts2&值棧概念&OGNL


OGNL表達式

    OGNL是對象圖導航語言的縮寫,它是一種功能強大的表達式語言,通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。
作用:
 - 1,支持對象方法調用,如xxx.doSomeSpecial(); 
 - 2,支持類靜態的方法調用和值訪問,表達式的格式:
     
 @[類全名(包括包路徑)]@[方法名 |  值名],例如:
        @java.lang.String@format('foo %s', 'bar')
        或@tutorial.MyConstant@APP_NAME;
 設置 struts.ognl.allowStaticMethodAccess=true

 - 3,訪問OGNL上下文(OGNL上下文)和ActionContext;訪問值棧
 - 4,支持賦值操作和表達式串聯,如price = 100,discount = 0.8 ,
        calculatePrice(),這個表達式會返回80; 
 - 5,操作集合對象。

使用OGNL表達式

Struts2默認的表達式語言是OGNL

@Test // OGNL調用對象的方法:
public void demo1()throws OgnlException { 
    OgnlContext context = new OgnlContext(); 
    Object obj = Ognl.getValue(“'helloworld'.length()”,context,context.getRoot());
    System.out.println(obj); 
} 
@Test // OGNL獲取數據:
public void demo3()throws OgnlException { 
    OgnlContext context = new OgnlContext(); 
    //獲取OgnlContext中的數據:
    / * 
       context.put(“name”,“張三”); 
       String name =(String)Ognl.getValue(“name”,context,context.getRoot()); 
       System.out.println(name); 
    * / 
    //獲得Root中的數據User user = new User(); 
    user.setName(“李四”);
    context.setRoot(用戶);
    String name =(String)Ognl.getValue(“name”,context,context.getRoot());
}

值棧概念

什么是值棧:
    值棧是Struts的的一個接口,字面意義為值棧,OgnlValueStack是值棧的實現類,客戶端發起一個請求struts2的架構會創建一個動作實例同時創建一個OgnlValueStack值棧實例,OgnlValueStack貫穿整個行動的生命周期,Struts2的中使用OGNL將請求操作的參數封裝為對象存儲到值棧中,並通過OGNL表達式讀取值棧的對象屬性值。

值棧的內部結構

在OnglValueStack中包括兩部分,值棧和地圖(即OGNL上下文)

值棧結構代碼:

[值棧結構代碼] [1]

值為結構圖:

![值得注意] [2]

Context:即OgnlContext上下文,它是一個map結構,上下文中存儲了一些引用,參數,請求,會話,應用等,上下文的Root為CompoundRoot.

OgnlContext 中的一些引用:

parameters:該Map中包含當前請求的請求參數
request:該地圖中包含當前請求對象中的所有屬性
session:該地圖中包含當前session對象中的所有屬性
application:該地圖中包含當前應用程序對象中的所有屬性
attr:該地圖按照如下順序來檢索某個屬性:request,session,application

CompoundRoot :存儲了action實例,它作為OgnlContext的根對象.

CompoundRoot繼承的ArrayList實現壓棧和出棧功能,
擁有棧的特點,先進后出,后進先出,后進先出,最后壓棧棧的數據在棧頂。
我們把它稱為對象棧.struts2 對原OGNL作出的改進就是根使用COMPOUNDROOT(自定義 棧),
使用OnglValueStack的findValue方法可以在COMPOUNDROOT中從棧頂向下發現查找的對象的屬性值.
CompoundRoot作為OgnlContext的根對象,並且在COMPOUNDROOT中操作實例位於棧頂,
當讀取操作的屬性值時會先從棧頂對象中找對應的屬性,如果找不到則繼續找棧中的其它對象,如果找到則停止查找。


獲取值棧對象和操作值棧

獲取值棧對象

通過ActionContext對象獲取值棧。

ValueStack stack1 = ActionContext.getContext()。getValueStack();

通過request域獲取值棧

ValueStack stack2 =(ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 

操作值棧:

1.對於Action的屬性提供get方法的方式

因為Action本身在值棧中,Action中的屬性也就默認在值棧中了,所以我們可以通過對Action的屬性提供get方法的方式來操作值棧。

2.手動操作值棧

調用值棧的push和set方法對值棧進行操作(push是壓入對象到根棧頂,set是壓入map集合到root棧頂)



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com