| 一、OGNL概述1.1OGNL是對象圖導(dǎo)航語言(Object-Graph Navigation Languaged)的縮寫,他是一種功能強大的表達(dá)式語言,通過簡單一致的表達(dá)式語法,可以存取Java對象的任意屬性,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型的轉(zhuǎn)化功能。他使用相同的表達(dá)式去存取對象的屬性。如果吧表達(dá)式看作一個帶有語義的字符串,那么OGNL無疑成為了這個語義字符串與java對象之間溝通的橋梁。 1.2OGNL的要素 表達(dá)式:表達(dá)式是整個OGNL的核心,OGNL會根據(jù)表達(dá)式去對象中取值,所有的OGNL操作都是指對表達(dá)式解析后進(jìn)行的。它表明了此次OGNL操作要做什么。表達(dá)式就是一個帶有語法含義的字符串,這個字符串規(guī)定了操作的類型和操作的內(nèi)容。OGNL支持大量的表達(dá)式語法,不僅支持這種“鏈?zhǔn)健睂ο笤L問路徑,還支持在表達(dá)式中進(jìn)行簡單的計算。 根對象(ROOT):Root對象可以理解為OGNL的操作對象,表達(dá)式規(guī)定了“做什么”,而Root對象則規(guī)定了“對誰操作"。OGNL稱為對象圖導(dǎo)航語言,所謂對象圖,就是以任意對象為根,通過OGNL可以訪問這個對象關(guān)聯(lián)的其他。 Context對象:實際上OGNL的取值還需一個上下文環(huán)境,設(shè)置了Root對象,OGNL可以對root對象進(jìn)行取值或者寫值等操作,root對象所在環(huán)境就是OGNL的上下文環(huán)境(Context)。上下文環(huán)境規(guī)定了OGNL的操作”在哪里進(jìn)行“。上下文環(huán)境COntext是一個map類型的對象,在表達(dá)式中訪問Context中的對象,需要使用”#”號加上對象名稱,即“#對象名稱”的形式。 二值棧的概述在struts2里面提供本身一種存儲機(jī)制,類似于域?qū)ο螅侵禇?,可以存值和取? 在action里面把數(shù)據(jù)放到值棧里面,在頁面中獲取到值棧數(shù)據(jù) servlet和action區(qū)別 Servlet:默認(rèn)在第一次訪問時候創(chuàng)建,創(chuàng)建一次,單實例對象 Action:訪問時候創(chuàng)建,每次訪問action時候,都會創(chuàng)建action對象,創(chuàng)建多次  注:每個action對象總只有一個值棧對象2.1ValueStack是Struts的一個借口,字面意義為值棧,OgnlValueStack是ValueStack的一個實現(xiàn)類,客戶端發(fā)起一個請求struts2架構(gòu)會創(chuàng)建一個action'對象實例,同時也創(chuàng)建一個OgnlValueStack值棧實例,OgnlValueStack會貫穿真?zhèn)€Action的生命周期,struts2中使用OGNL將請求Action的參數(shù)封裝為對象存儲到值棧中,并通過OGNL表達(dá)式讀取值棧中的對象屬性值。 2.2值棧的內(nèi)部結(jié)構(gòu) 在OgnlValueStack中包括兩部分: 第一部分 root,結(jié)構(gòu)是list集合一般操作都是root里面數(shù)據(jù)   第二部分 context,結(jié)構(gòu)為map集合   注:可以在頁面中使用<s:debug/>這個標(biāo)簽產(chǎn)看值棧結(jié)構(gòu)和存儲值。 三、對值棧的存取操作3.1獲取值棧對象1.通過ActionContext對象獲取值棧 ValueStack stack1 = ActionContext.getContext().getValueStack();2.通過request獲取值棧 ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY); 3.2對值棧的操作1.向值棧中放數(shù)據(jù):可以通過值棧的set,push方法或者在action中提供成員變量然后提供get方法即可。 2.從值棧中取數(shù)據(jù):使用struts2的標(biāo)簽+ognl表達(dá)式獲取值棧數(shù)據(jù) <s:property value=”ognl表達(dá)式”/> 獲取對象: 向值棧中放數(shù)據(jù) 
 在頁面中獲取   獲取list集合: 
 第二種實現(xiàn)方式: 
 
 獲取set方法向值棧中放入的數(shù)據(jù): 
 獲取push方法向值棧中放入的數(shù)據(jù): 使用push方法設(shè)置值,沒有名稱,只有設(shè)置的值 向值棧放數(shù)據(jù),把向值棧放數(shù)據(jù)存到數(shù)組里面,數(shù)組名稱 top,根據(jù)數(shù)組獲取值   EL表達(dá)式獲取值棧數(shù)據(jù): 底層增強request對象里面的方法getAttribute方法 (1)首先從request域獲取值,如果獲取到,直接返回 (2)如果從request域獲取不到值,到值棧中把值獲取出來,把值放到域?qū)ο罄锩?/span> 四、 OGNL的#,%的使用4.11.使用#獲取context里面的數(shù)據(jù)
 4.12.演示向request域中放值,在頁面用ognl獲取
 4.2%號的使用在struts2標(biāo)簽里面使用ognl表達(dá)式,如果直接在struts2表單標(biāo)簽里面使用ognl表達(dá)式不識別,只有%之后才會識別。 
 | 
|  |