JSTL、EL、ONGL、Struts標籤的區別與使用

一、JSTL

   來源

       我們使用JSP開發信息展現非常方便,也可嵌入java代碼用來實現相關邏輯,但同樣帶來了很多問題:

              jsp維護難度增加

              出事提示不明確,不容易提示

              分工不明確等

       解決上面的問題可以使用定製標籤庫,Jstl使JSP開發開發者可以減少對腳本元素的需求,甚至可以不需要它們。

 

    定義

       JSTL(JSP StandardTagLibrary,JSP標準標籤庫)是一個不斷完善的開放源代碼的JSP標籤庫,是由apache的jakarta小組來維護的。JSTL只能運行在支持JSP1.2和Servlet2.3規範的容器上,如tomcat4.x。在JSP 2.0中也是作爲標準支持的。

       引入jar包:jstl.jarstandard.jar

       引入標記庫:<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>

       2.5版本需要加入:<%@page isELIgnored="false"%>  不忽略EL表達式

 

    表達方式

  • JSTL核心庫 [基本的I/O, 流程控制, 循環 等功能]   
  • 數據庫標籤庫 [基本的數據庫操作功能]   
  • XML操作標籤庫 [用來處理XML文檔]   
  • 國際化和格式標籤庫   
  • 函數標籤庫   

     如:<c:out></c:out>、<c:set></c:set>

 

  實例 

       單純的jsp中嵌入java代碼         

 
  1. <span style="font-family:KaiTi_GB2312;font-size:14px;">   <span style="font-size:18px;"><%names = request.getAttribute("name");%>  
  2.     jsp代碼  
  3.     <%for(int i=0;i<names.length;i++){  
  4.               String name=names.get(i);  
  5.     %>  
  6.     <tr>  
  7.         <td><%=name%></td>  
  8.     </tr>  
  9.   
  10.         <% }%></span></span>  

  

   引入Jstl與EL 

 
  1. <span style="font-family:KaiTi_GB2312;font-size:14px;">   <c:forEach var='name' items='${names}'>//此句是Jstl表達式  
  2.     <tr>  
  3.         <td>  
  4.                  ${name}//此句是El表達式  
  5.         </td>  
  6.     </tr>  
  7. </span>  

    作用

      1、在應用程序服務器之間提供了一致的接口,最大程度地提高了WEB應用在各應用服務器之間的移植。

      2、 簡化了JSP和Web應用程序的開發。

與EL關係

      jstl是JSP標籤,有點像html的標籤,JSTL一般配合EL使用。jstl用來取值,而el用來展示。el也可直接取值展示作用域裏對象變量。

 

二、EL

     來源

       大家熟知的 Hibernate,使用HQL(Hibernate Query Language) 來完成數據庫的操作,HQL 成了開發人員與複查的 SQL 表達式之間的一個橋樑。 在 web框架下,表達式語言起到了相似的目的。它的存在消除了重複代碼的書寫,使JSP寫起來更加簡單。

定義

       EL全名爲ExpressionLanguage,它原來是JSTL1.0爲了方便存取數據所定義的語言。到了JSP2.0以後,EL正式納入成爲標準規範之一。只要是支持Servlet2.4/JSP2.0的Container,都可以在JSP網頁中直接使用EL。

 

    表達方式

     ${ ELexprission }

         兩種形式:${bean.name } 或 ${ bean['name'] }

 

    實例

       兩種運算符存儲數據.和[]

             ${user.userName}

             ${user["userName"]}

        當要存取的屬性名稱中包含特殊字符

         如:${user.My-Name}因改爲${user["My-Name"]}

         如果動態取值時,就可以用[]來做

         如:${user.list[0]}

    

      作用

            獲取數據

                 EL表達式主要用於替換JSP頁面中的腳本表達式,以從各種類型的web域中檢索java對象,獲取數據${map.key}

            執行運算

                  利用EL表達式可在JSP中執行一些基本的關係運算、邏輯運算和算數運算,以在JSP頁面中完成一些簡單操作

            獲取web開發常用對象

                    EL表達式定義了一些隱式對象,利用這些隱式對象,web開發人員可以很輕鬆的獲得對web常用對象的引用,從而獲得這些對象中的數據(pageScope/pageContext)

                    常用對象:param、paramValues、

           調用Java方法

                  EL表達式允許用戶開發自定義EL函數,以在JSP頁面中通過EL表達式調用Java類的方法

 

      尋找方式

          ${username}依次從Page、Request、Session、Application範圍查找,找到後直接回傳,如果全部範圍都沒有找到時就回傳“”(不是null,而是空字符串)

 

       隱含對象

          pageScope、requestScope、sessionScope和applicationScope  等同於JSP中pageContext、request、session和application,這四個隱含對象只能用來缺德範圍屬性getAttribute(Stringname)

特點:

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

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

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

         特點3:${#name},裏面的是不帶#號的。

         特點4:如果放在對象棧中的是一個自定義的對象,那麼${property}裏面可以直接去該對象的屬性值,不用這樣${object.property}

        注:EL表達式,需要引入JSTL標記庫,因爲Jsp把EL表達式加入時放在jstl中定義的  

 

三、ONGL

     來源

        OGNL最初是爲了能夠使用對象的屬性名來建立 UI 組件 (component) 和 控制器 (controllers)之間的聯繫,簡單來說就是:視圖與控制器之間數據的聯繫。後來爲了應付更加複雜的數據關係,

 

     定義

        OGNL是Object Graphic Navigation Language(對象圖導航語言)的縮寫,OGNL是一個開源項目,讀者可以訪問其官方站點以獲得源代碼和相關資料。OGNL是一種功能強大的EL(Expression Language,表達式語言),可以通過簡單的表達式來訪問Java對象中的屬性。

        webwork2和現在的Struts2.x中使用OGNL取代原來的EL來做界面數據綁定,所謂界面數據綁定,也就是把界面元素(例如一個textfield,hidden)和對象層某個類的某個屬性綁定在一起,修改和顯示自動同步。

     表達方式

       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'}">

      作用

         通過它簡單一致的表達式語法,可以存取對象的任意屬性,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉化等功能。它使用相同的表達式去存取對象的屬性。這樣可以更好的取得數據。

 

     三種符號

         1、#符號

           1)訪問非根對象屬性,由於Struts2中值棧被視爲根對象,所以訪問其他非根對象時,需要加#前綴。實際上,#相當於ActionContext.getContext();

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

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

          2、%符號

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

  1. <span style="font-family:KaiTi_GB2312;font-size:14px;"><span style="font-size:18px;">s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />    
  2.   
  3. <p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>    
  4.   
  5. <p>不使用%:<s:url value=”#foobar['foo1']” /></p>    
  6.   
  7. <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>  </span></span>  

         3、$符號(兩方面)

                 在國際化資源文件中,引用OGNL表達式

                 在Struts 2框架的配置文件中引用OGNL表達式

 

       既然有了EL爲什麼還需要ONGL?

       相對於其它的表達式語言而言,ONGL的功能更爲強大,它提供了很多高級而必須的特性,例如強大的類型轉換功能,靜態或實例方法的執行,跨集合投影,以及動態lambda表達式定義等

 

與EL區別

     1、用法區別

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

    2、取值

      ognl是在webwork2.0和struts2.x中取代el的。 

      使用ognl ,struts2就無需將對象手動放值進request等範圍,頁面直接取值。

    3、js中的使用情況

       EL表達式能用在內部文件的js裏(jsp被解釋時,內部文件的js代碼也被解釋,然後發送到客戶端,而外部js文件是在客戶端執行的,所以EL表達式不能用在外部js文件裏)

       ONGL只能結合struts2一起使用,不能使用ONGL表達式

    共同點:EL和OGNL都是表達式

  

     ONGL與JSTL區別

        ognl是struts2特有的表達式,jstl是標籤庫,比如c標籤,用來前臺頁面的變量的定義、作用域裏的變量對象的取值等。

 

四、Struts標籤

       定義

       Struts2標籤庫提供了主題、模板支持,極大地簡化了視圖頁面的編寫,而且,struts2的主題、模板都提供了很好的擴展性。實現了更好的代碼複用。Struts2允許在頁面中使用自定義組件,這完全能滿足項目中頁面顯示覆雜,多變的需求。

Struts2的標籤庫有一個巨大的改進之處,struts2標籤庫的標籤不依賴於任何表現層技術,也就是說strtus2提供了大部分標籤,可以在各種表現技術中使用。包括最常用的jsp頁面,也可以說Velocity和FreeMarker等模板技術中的使用。

        

        引入標籤庫:  <%@taglib uri="/struts-tags" prefix="s"%>

        在web.xml中聲明要使用的標籤    

 
  1. <span style="font-size:14px;"><filter>  
  2.   
  3.      <filter-name>struts2</filter-name>  
  4.   
  5.     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  6.   
  7. </filter></span>  

 

      表達方式

            控制標籤:(if, elseif,else, iterator, append, merge, generator, subset, sort)

            數據標籤:(bean, param,date, debug, include, set, url, push

          

     實例   

 
  1. <span style="font-size:14px;">    1、jstl中使用struts2標籤  
  2.   
  3.        <c:forEach var="ee" items="${requestScope.serviceList}" >    
  4.   
  5.            jstl:<c:out value="${ee.id}"></c:out>    
  6.   
  7.            el:${ee.id}     
  8.   
  9.            struts2: <s:property value="#attr.ee.id"/>  </span>  
  10.   
  11.         </c:forEach>    
  12.   
  13.        
  14.      2、jstl中取值  
  15.   
  16.         <c:set var="ctime" value="${el.createtime}" scope="request"/>    
  17.   
  18.         <c:set var="ctime2" value="${el.createtime}" />    
  19.   
  20.         <s:property value="#request.ctime"/>    
  21.   
  22.         <s:property value="#attr.ctime2"/>    
  23.   
  24.   
  25.       3、struts2標籤中使用jstl  
  26.   
  27.       <s:iterator value="#request.serviceList" id="bs">    
  28.   
  29.            struts2:<s:property value="#bs.keyid"/>    
  30.   
  31.            el:${bs.keyid}     
  32.   
  33.            jstl:<c:out value="${bs.keyid}"></c:out>    
  34. </span>  
  35.       </s:iterator>    
  36.   
  37.   
  38.       4、struts2中取值  
  39.   
  40.         <!-- 字符串類型 -->     
  41.   
  42.         <s:set name="pp2" value="'abc'" scope="request"></s:set>    
  43.   
  44.              struts2:<s:property value="#request.pp2"/>    
  45.   
  46.              el:${pp2}     
  47.   
  48.              jstl:<c:out value="${pp2}"></c:out>   </span>  


與ONGL的關係

        Struts2默認的表達式語言是OGNL

 

總結:

        jstl和struts標籤是一類產品,struts標籤提供了更多的功能,並且struts標籤依賴於Struts框架

        EL和ONGL都是表達式,ONGL爲Struts的默認表達式。ONGL比EL更加強大

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章