OGNL是Object Graphic Navigation Language的縮寫,顧名思義,對象圖導航語言。它是struts2框架的默認的表達式語言。
通過OGNL,我們可以在jsp的頁面中很方便獲取一些我們所需要的值。那麼,能獲取哪些值,怎麼獲取的這些值?
這裏我們先清楚三個概念:ActionContext,ValueStack與StackContext.
ActionContext:Action的上下文,每一次的action請求(客戶端行爲)都會創建一個ActionContext,通過ActionContext context = ActionContext.getContext()獲取。context可以獲取servlet的三大作用域。
context.getParameters() //request
context.getSession() //session
context.getApplication() //application
ValueStack 值棧,對於每次請求也會創建一個valueStack.那麼什麼樣的數據存放在裏面?一般來說,裏面存放action的相關的信息 ,比如action的屬性,方法,以及其他的對象。因爲ValueStack爲根對象,而在jsp頁面可以直接的訪問根對象,所以可以直接訪問。其爲棧的結構,先進的會被壓入棧底。那麼如果對於有兩個屬性相同的同時被壓入了值棧中(比如兩個類中都有兩個相同的屬性username,二者之間通過服務器端的跳轉方式,即轉發,那麼將被同時的壓入同一個值棧),這時候取值是如果只寫了username,那麼取到的將是棧頂的相應值。
StackContext:用於存放值的。因爲不是根元素,取值的時候,需要加#號。
在我們發出一個請求後,首先會創建一個ActionContext,然後創建一個值棧valueStack,初始化相應的action的屬性後,存入到valueStack中。然後再調用相應的action的方法。
在使用OGNL的時候,我們需要注意#,$,%的區別:
#號:
StarkContext中相應的獲取時,需要加#
$號:
1.在國際化資源文件中,引用OGNL表達式
2.在struts.xml文件中,引用OGNL表達式
%號:
1.使用%{}可以取出保存在值堆棧中的Action對象,直接調用它的方法
2.如果Action繼承了ActionSupport,那麼在頁面標籤中可以使用%{getText('key')}獲取國際化信息
對於OGNL的具體的語言,可以查看其官方文檔說明。