struts2.0中ognl棧的解析

ongl詳解:架構

ValueStack是Struts2的一個接口,字面意義爲值棧,OgnlValueStack是 ValueStack的實現類,客 戶端發起一個請求,struts2架構會建立一個action實例同時建立一個OgnlValueStack值棧實例, OgnlValueStack貫穿整個Action的生命週期,struts2中使用OGNL將請求Action的參數封裝爲對象存儲 到值棧中,並經過OGNL表達式讀取值棧中的對象屬性值。ide

值棧中分爲兩個部分:idea

ContextMap和值棧(root棧)debug

 OnglValueStack源碼:3d

 

CompoundRoot棧源碼:對象

 從源碼能夠看出 OgnlValueStack由兩部分組成;一部分是由實現了 ArrayList 的CompoundRoot組成。另外一部分是屬於map的key-value類型 blog

在idea中打開debug模式,能夠看到值棧由兩部分組成;context的map類型和root;繼承

從上面的圖中,能夠看出context中是存在HashMap(key-value類型);而在context中國都是對象類型;接口

 在頁面中打開debug也能夠看到生命週期

CompoundRoot繼承ArrayList 實現壓棧和出棧功能,擁有棧的特色,先進後出,後進先出,最後壓進棧的數據在棧頂。
CompoundRoot做爲OgnlContext的Root對象,而且在CompoundRoot中action實例位於棧頂,

當直接使用表達式,讀取deptList的屬性值時會先從棧頂對象中查找對應的屬性,若是找不到則繼續查找棧中的其它對象, 若是未找到則到ContextMap中去查找,未找到,則返回null;
當使用#表達式去,讀取deptList的屬性值時,會直接從ContextMap中去查找,未找到,則返回null;並在頁面中報錯;

報錯信息:

tag 'select', field 'list', name 'parentId.deptId': The requested list key '#deptList' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name}

使用#表達式的時候在context(key-value)中沒有對應的值;

操做的方法是;

第一種:能夠在對應的方法中將key-value放進context棧中便可;

第二種:在頁面中直接使用表達式取值便可;

相關文章
相關標籤/搜索