EL、JSTL

1、EL、JSTL html

  首先咱們要明白爲何要使用EL(Expression Language 表達式語言)、JSTL(JSP Standard Tag Library JSP標準標籤庫),jsp頁面徹底能夠用java代碼取代他們,也就是說原本是能夠沒有這兩種技術的,可是咱們實際開發中,有一個原則:頁面中不該該出現java代碼。由於滿篇的<% %>和java代碼,會使頁面極度混亂,到後期根本沒法維護。因此這時EL和JSTL就出現了,使用各類標籤方式,可讓頁面不出現一行<% %>。JSTL是sun公司定義的標準,它不依賴於任何一種框架,因此咱們應該重點掌握。 java

  一、下面舉一些簡單的例子說明如何使用EL: 數組

  假設在服務器端,設置了request.setAttribute("hello", "Hello World !") ; 服務器

  在jsp頁面能夠有兩種方式顯示hello中的內容: session

  (jsp腳本方式:)<%=request.getAttribute("hello") %>    -->打印結果:Hello World ! app

  (EL表達式,使用方法,$和{ }:)${hello}    -->打印結果:Hello World ! 框架

  大括號裏面的hello 就是scope中的變量,也就是在服務器端setAttribute中的hello 變量。這樣咱們就把<%%>去掉了,並且代碼也簡化了不少。 jsp

  在EL表達式中也有內置對象(也叫隱含對象,隱式對象都是一個意思),和jsp的內置對象基本上對應着,包括:pageScope,requestScope,sessionScope,applicationScope。 函數

  那麼既然有這麼多個對象,上面那個例子中,EL表達式它怎麼去找那個hello呢? 它會按範圍從小到大的順序依次查找hello這個變量,上個例子中,咱們把hello放在了request中,那麼她首先看pageScope中有這個hello嗎,發現沒有,那麼繼續requestScope,找到了,而後就顯示其內容。 性能

  這時默認的查找方法,咱們還能夠明確的告訴它從那個scope中去找,這樣能夠提升性能,由於明確了嘛,不用一個個挨着去找了,上面的例子咱們能夠改成:${ requestScope.hello }  

  注意的一點:EL和jsp腳本的不一樣,假設在服務器端並無設置hello這個變量,那麼jsp腳本就會顯示null,而是用EL則什麼都不顯示。


  再舉一個取對象的例子:

  假設定義了一個User類,裏面包含了:userName, userAge, group 屬性,還有相應的getter ,setter 方法。

  還定義了一個Group類,裏面包含了:groupName 屬性,還有相應的getter, setter 方法。

  在服務器端,有以下的代碼:

  Group group = new Group() ;

  group.setGroupName("培訓機構") ;


  User user = new User() ;

  user.setUserName("張三") ;

  user.setUserAge(20) ;

  user.setGroup(group) ;


  request.setAttribute("userObject", user) ;

  那麼如今要在jsp頁面中顯示:

  姓名:${userObject.userName}

  年齡:${userObject.userAge}

  所屬組:${userObject.group.groupName}

  這樣就能夠用「.」(存取器)導航把相應的信息顯示出來了。內部實現的機制依舊是利用反射機制,因此「.」後面的名字要和getter方法上的名字一致。


  再舉一個例子用於顯示Map和數組:

  在服務器端,有以下代碼

  Map map = new HashMap() ;

  map.put("key1", "value1") ;

  map.put("key2", "value2") ;

  String[] strArry = new String[]{"abc", "def", "ghi"}

  request.setAttribute("mapvalues", map) ;

  request.setAttribute("strarry", strArry) ;

  在jsp中顯示:

  mapvalue.key1: ${ mapvalues.key1 }    -->value1

  mapvalue.key2: ${ mapvalues.key2 }    -->value2

  strArry的第二個元素:${ strarry[1]}    --> def 

  對於對象數組,以及List的顯示,也是相似的,以下語法:

  ${ userArray[1].userName }、 ${ userList[2].userName }


  對於運算符的支持,如:${ 1+ 2 } --> 打印3 

  對函數的支持,如:${ empty value1} -->用於判斷value1的值是否爲空,爲空這打印true , 不存在value1 也爲true 


  二、JSTL(只總結核心標籤C:)

  *<c:out >:  用於輸出,自己EL表達式就能夠完成輸出,爲何還要用這個呢,這裏面有一個default參數,就是當爲空時,能夠默認輸出default裏面的內容,這個EL表達式是不能作到的。 例如:<c:out value="${ abc }" default="不存在abc變量" /> -->若是在服務器端沒有setAttribute abc 的值,那麼此時就會輸出:不存在abc變量 這樣的結果。 另一種寫法:<c:out value="${abc}" >不存在abc變量</c:out>

  若是value中的值不是EL表達式,則直接打印出其中的字符串。

    還能夠設置out的escapeXml屬性:分爲true和false,true是默認屬性,即把內容原樣輸出;false是轉意輸出,好比輸出的若是是html代碼,則能夠按html效果輸出。

  *<c:if>: 用於條件判斷,例如 :<c:if test="${ empty value1 }" var="v">value1爲空</c:if>  此句代碼的含義是:若是value1爲空的話,則打印出 -->value1爲空 並把判斷結果放在v變量中。 

  *<c:choose>,<c:when>,<c:otherwise>: 用於條件分支選擇,例如:

    <c:choose>

        <c:when test="${ empty value1 }">

          value1爲空!

        </c:when>

        <c:otherwise>

          value1不爲空!

        </c:otherwise>

        </c:choose>

  能夠有多個<c:when>,<c:when>必須在<c:otherwise>的前面

  *<c:forEach>: 用於循環打印輸出,例如:

    <table border="1" width="100%">

      <tr>

        <td>姓名</td>

        <td>年齡</td>

        <td>所屬組</td>

      </tr>

      <c:choose>

        <c:when test="${ empty userlist}">

          <tr>

            <td colspan="3">沒有符合條件的數據!</td>

          </tr>

        </c:when>

        <c:otherwise>

          <c:forEach items="userlist" var="user">

            <tr>

              <td>${ user.userName}</td>

              <td>${ user.userAge}</td>

              <td>${ user.group.groupName}</td>

            </tr>

          </c:forEach>

        </c:otherwise>

      </c:choose>

    </table>

  如今有另一個需求,要求偶數行的背景設置爲紅色,則能夠這樣寫代碼:

    <table border="1" width="100%">

      <tr>

        <td>姓名</td>

        <td>年齡</td>

        <td>所屬組</td>

      </tr>

      <c:choose>

        <c:when test="${ empty userlist}">

          <tr>

            <td colspan="3">沒有符合條件的數據!</td>

          </tr>

        </c:when>

        <c:otherwise>

          <c:forEach items="userlist" var="user" varStatus="vs">

            <c:choose>

              <c:when test="${ vs %2 == 0 }">

                <tr bgcolor="red">

              </c:when>

              <c:otherwise>

                <tr>

              </c:otherwise>

            </c:choose>

              <td>${ user.userName}</td>

              <td>${ user.userAge}</td>

              <td>${ user.group.groupName}</td>

            </tr>

          </c:forEach>

        </c:otherwise>

      </c:choose>

    </table>

    也能夠在<forEach>標籤中加入begin, end, step 參數,表明從第幾個開始輸出,每次輸出的步長爲多少,如<c:forEach items="userlist" var="user" begin="2" end="8" step="2">。

    還能夠用<forEach:>標籤循環取得Map中的值。例如:

    <c:forEach items="mapvalue" var="v">

      ${ v.key } = ${ v.value }<br>

    </c:forEach>

    這樣就循環輸出Map的內容了。


  *<c:forTokens>: 用於按特定的字符分隔的輸出。例如:

    假設在服務器端有這樣的代碼:request.setAttribute("strTokens", "1, 2, 3, 4, 5") ;

    <c:forTokens items="strTokens" delims="," var="v" >

      ${ v } <br>

    </c:forTokens>


  *<c:url>: 用於生成一個url 地址。例如:

    <c:url value="http://localhost/sysmgr/add_user.jsp" var="v">

      <c:param name="userName" value="Jack" />

      <c:param name=「userAge" value=30 />

    </c:url>

     <a href="${ v }">增長用戶</a>

  

  *<c:set>:用於設置一個變量的值,或者變量屬性。


補充:<c:forEach>標籤用法

<c:foreach>的varStatus屬性暫存項的相關狀態屬性,可由EL表達式引用。繼續上例所述。 

${vs.index} 此項的索引,從0開始 
${ vs .count} 此項的計數序號,從1開始 
${ vs .first} 此項是不是第一項,布爾值 
${ vs .last} 此項是不是最後一項,布爾值 
${ vs .begin} 這次迭代的起始索引,對應<c:foreach>中begin屬性值 
${ vs .end} 這次迭代的終止索引,對應<c:foreach>中end屬性值 
${ vs .step} 這次迭代的跳躍步伐,對應<c:foreach>中step屬性值 
相關文章
相關標籤/搜索