OGNL表達式與EL表達式


一、OGNL表達式

    a)什么是OGNL?

      OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達式語言,

      通過它簡單一致的表達式語法。主要功能:

                Ø  可以存取對象的任意屬性;
                Ø  調用對象的方法;
                Ø  遍歷整個對象的結構圖;
                Ø  實現字段類型轉化等功能。

        它使用相同的表達式去存取對象的屬性。這樣可以更好的取得數據。

      b)OGNL與Struts2

             OGNL是獨立的開源組件

             Struts2對其進行了改造和封裝,OGNL內部自己會維護一個OGNL上下文(OgnlContext)是一個實現了Map接

             口的對象,OGNL會將對象放在這個上下文中統一管理的,並且會有一個對象被指定為根對象(root)。  

       c)三種符號

           1#符號的用途一般有三種。  

               1)訪問非根對象屬性,例如示例中的#session.msg表達式,由於Struts 2中值棧被視為根對象,所以訪問其他非根對象時,需要加#前綴。實際上#相當於ActionContext.getContext();#session.msg表達式相當於                  

                  ActionContext.getContext().getSession(). getAttribute(”msg”) 。    

               2)用於過濾和投影(projecting)集合,如示例中的persons.{?#this.age>20}。

               3)用來構造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。

          2%符號 %符號的用途是在標志的屬性為字符串類型時,計算OGNL表達式的值。如下面的代碼所示: 構造Map

    1.   <s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />  
    2.   <p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>  
    3.   <p>不使用%:<s:url value=”#foobar['foo1']” /></p>  
    4.   <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>   
    5.   <s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />  
    6.   <p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>  
    7.   <p>不使用%:<s:url value=”#foobar['foo1']” /></p>  
    8.   <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>   

 

  3$符號  $符號主要有兩個方面的用途。  

                   在國際化資源文件中,引用OGNL表達式,例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。    

                   在Struts 2框架的配置文件中引用OGNL表達式,例如下面的代碼片斷所示:

    1.   <validators>  
    2.       <field name=”intb”>  
    3.               <field-validator type=”int”>  
    4.               <param name=”min”>10</param>  
    5.               <param name=”max”>100</param>  
    6.               <message>BAction-test校驗:數字必須為${min}為${max}之間!</message>  
    7.           </field-validator>  
    8.       </field>  
    9.   </validators>  
    10.   <validators>  
    11.       <field name=”intb”>  
    12.               <field-validator type=”int”>  
    13.               <param name=”min”>10</param>  
    14.               <param name=”max”>100</param>  
    15.               <message>BAction-test校驗:數字必須為${min}為${max}之間!</message>  
    16.           </field-validator>  
    17.       </field>  

       </validators>  

       d)常見用法

              1、訪問基本屬性  <s:property value=“屬性名”/>

              2、訪問實體對象  < s:property value=“PICPICKSHAPE對象名.屬性名”

                        

            

               3、訪問數組/集合  

               4、訪問Map   

               5、運算

                      

             

              6、調用方法   

                  

                   結果:MY NAME:ZHANGSAN

              7、創建集合  

                   

                  

                    創建集合:[a,b,c]

                    集合類型:java.util.ArrayList

              8、創建Map

                  

                  

                  創建Map:{mm:MM,nn:NN}

                  Map類型:java.util.LinkHashMap

二、EL表達式

       a)簡介:EL即Expression Language 表達式語言。該技術主要為了避免JSP中的腳本的出現。該

                   技術中內置很多的隱含對象可以方便開發者直接訪問,同時使用EL可以快速的遍歷域中屬性以及實現算術計算。

        b)基本語法

               1、語法:${expression} 

               2、訪問bean的屬性

                      a. ${user.name};       依次從:pageContext、request、session、application查詢

                      b.也可以用${user[“name”]}    

                      c.也可以用${user[propname]}   沒有引號

                      d.用[ ]里面可以用0,1……這樣的下標,作用是輸出數組里的元素值

                      e.可以使用pageScope、requestScope、sessionScope、applicationScope指定范圍,如:${requestScope.user.name} 只到request中去找

              3、獲取請求參數值

                      a.  ${param.username}    等價於: request.getParameter(“username”);

                      b.  ${paramValues.interest}  等價於:request.getParameterValues(“interest”);

              4、計算一個表達式,將結果作為標簽的屬性或者直接輸出

                     a. 算術運算  “+”,“-”,“*”,“/”,”%”,但是“+”不能連接字符串  

                     b. 關系運算

                         "==" , "!=" , ">" , "<" ,">=" , "<=" 可以使用對應的"eq","nq","lt","gt","le","ge"代替。

                     c. 邏輯運算

                         "&&","||","!",可以使用"and","or","not"代替。

                    d. empty運算

                    判斷一個字符串是否為空,集合內容是否為空,以及綁訂的對象是否存在。

                 

            

            

     三、EL與OGNL區別

          

          EL表達式: 
      >>單純在jsp頁面中出現,是在四個作用域中取值,page,request,session,application.

      >>如果在struts環境中,它除了有在上面的四個作用域的取值功能外,還能從值棧(valuestack)中取值.

      >>特點1:${name},name在值棧中的查找順序是:先從對象棧中取,取到終止,否則,向map中取。

      >>特點2:在對象棧的查找順序是,先從model中找是否有name這個屬性,找到終止,否則,找action中是否有name這個全局變量。

      >>特點3:${name},里面的是不帶#號的。
      >>特點4:如果放在對象棧中的是一個自定義的對象,那么${property}里面可以直接去該對象的屬性值,不用這樣${object.property}

          

        OGNL表達式:

                 1:讀取從后台傳遞的值

                      %{#name}:表示從值棧的map中取值

                      %{name}:表示從值棧的對象棧中取值

                      %{#request.name}:表示從request域中取值

                 2:自己構建數據
                       a,構建Map<s:iterator var="map" value="#{'key1':'value1','key2':'value2'}"/>

                       b,構建List<s:iterator var="list" value="{'one','two','three'}">

 

                 用法區別:OGNL是通常要結合Struts 2的標志一起使用,如<s:property value="#xx" /> struts頁面中不能單獨使用,el可以單獨使用 ${sessionScope.username}

 名稱

servlet

ognl                                                                           el

parameters

request.getParameter("username")

#username                                                              ${username}

request

request.getAttribute("userName")

#request.userName                                ${requestScope.username}

session

session.getAttribute("userName")

#session.userName                               ${sessionScope.username}

application

application.getAttribute("userName")

#application.userName                     ${applicationScope.username} 

attr

用於按request > session > application順序訪問其屬性(attribute)

#attr.userName相當於按順序在以上三個范圍(scope)內讀取userName屬性,直到找到為


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM