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棧中便可;
第二種:在頁面中直接使用表達式取值便可;