天天看點

什麼是OGNL表達式前言OGNL表達式總結

前言

    在經典的SSH架構中,我們在JSP頁面經常會用到OGNL表達式來取值,然後指派給頁面元素,這種方式來指派,JSP頁面的代碼看起來幹淨整潔,沒有過多的Java代碼。但是到底什麼是OGNL表達式呢?

    說道OGNL表達式,我們可能會很快想到EL表達式。沒錯,他們都是很強大的表達式語言,但是EL表達式在Struts1中是比較常用的,Struts2則預設使用了OGNL表達式,結合Struts2的标簽庫,完成了頁面的資料綁定。

OGNL表達式

    OGNL表達式是Object-Graph Navigation Language的縮寫,是一種功能強大的表達式語言,通過簡單一緻的表達式文法,可以存取對象的任意屬性,調用對象的方法,周遊整個對象的結構圖,實作字段類型轉換。在Struts1中,習慣使用的表達式語言是EL,在WebWork2和Struts2.x中使用OGNL來做頁面資料綁定。利用表達式,可以直接利用對象曾的對象,更面向對象的操作使得項目不需要封裝太多的FormBean。

    OGNL表達式是圍繞OGNL上下文來進行的,OGNL上下文實際上是一個Map對象,由ognl.OgnlContext類表示,它可以存放多個JavaBean對象。OGNL上下文具有一個根對象,通路根對象可以直接用名稱或者屬性名通路,而不需要加任何符号。Struts2中将ActionContext作為OGNL上下文,并且将值棧作為OGNL上下文的跟對象,通過Struts2的标簽,直接使用OGNL表達式來通路ActionContext中的對象或者屬性。

    OGNL表達式中有三種符号,分别是#、%和$,但是常用的也就是#符号,%和$兩種并不常用,隻是在特殊情況下會使用。

#符号

    #符号的作用有三方面:

    1、取非根對象屬性值

    在Struts2中,值棧被作為OGNL上下文的根對象,是以通路根對象或者根對象屬性時隻需要名字即可,不需要任何符号。但是通路非根對象或者非根對象的屬性時,需要在前面加#符号,例如:

<s:property value="name"/>
           

這是擷取值棧中的name屬性,name屬于根對象,是以取值時不用任何符号。

#session.msg
           

因為session對象并不在值棧中,是以屬于非跟對象,取值時需要添加#符号,這時#相當于ActionContext.getContext(),是以#session.msg相當于

ActionContext.getContext().getSession().getAttribute("msg")
           

    2、用于過濾或投影集合

    通常我們會傳遞一個集合到頁面上,那麼在頁面上通過一個條件來取出集合中的某些屬性,就需要用到#符号,例如:

<s:property value="persons.{?#this.name=='張三'}.{age}[0]"/>
           

這句話就是從persons集合中取出name為張三的第一個對象的age屬性值。

    3、構造Map

<s:radio name="gender" list="#{'男', '女'}"></s:radio>
           

這句話就是形成性别選項的單選框。

    %符号

    %符号是在标志的屬性為字元串類型時,計算OGNL表達式的值。

<s:a action="department_delete?id=%{id}&parentId=%{parent.id}" onclick="return window.confirm('這将删除所有的下級部門,您确定要删除嗎?')">删除</s:a>
           

這就是将id放到url中,作為id參數的值。

    $符号

    $符号有兩個用途:

    1、在國際化資源檔案中,采用OGNL表達式來傳遞參數。

    2、在struts2的xml中使用$符号做引用。

總結

    動态資料綁定通過OGNL表達式,可以在頁面上代替很多代碼,使得頁面看起來整潔幹淨。另外,用OGNL表達式來指派,可以友善的給頁面元素指派。對于OGNL表達式來說,Struts2中關鍵的也就是值棧了,對于根對象值棧,OGNL表達式在取值時不需要任何符号,對于值棧的結構,也是需要了解的,下篇部落格就介紹一下值棧的結構。