學過了EL,不試試JSTL嗎?

1.下載JSTL

      JSTL下載網址,點擊進入
      下載如圖所示的兩個jar包,並複製到你應用程序的WEB-INF/lib目錄下即可。
在這裏插入圖片描述

2.JSTL庫

      JSTL是標準標籤庫,但它四通過多個標籤庫來暴露行爲的。JSTL的標籤可分成5類區域,如下圖表所示:
在這裏插入圖片描述
      在JSP頁面中使用JSTL庫,必須通過以下格式使用taglib指令:

<%@ taglib uri="uri" prefix="prefix" %>

      例如要使用Core庫,必須在JSP頁面的開頭做出以下聲明:

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

      這個前綴可以是任意的。但是,採用慣例能使團隊的其他開發人員以及後續加入該項目的其他人員更容易熟悉這些代碼。因此,建議使用預定義前綴。

3.一般行爲

      下面介紹Core庫中用來操作有界變量的3個一般行爲:out、set、remove。
(1)out標籤
      out標籤在運算表達式時,是將結果輸出到當前的JspWriter。out的語法有兩種形式,有body content和沒有body content:

<d:out value="value" />
<c:out value="value">
default value
</c:out>
例如,下列的out標籤將輸出有界變量X的值
<c:out value="${X}"/>

(2)set標籤
      利用set標籤,可以完成以下工作:

  • 創建一個字符串和一個引用該字符串的有界變量。
  • 創建一個引用現存有界對象的有界變量。
  • 設置有界對象的屬性。

      如果用set創建有界變量,那麼,在該標籤出現後的整個JSP頁面中都可以使用該變量。set標籤的語法有4種形式。第一種形式用於創建一個有界變量,並用value屬性在其中定義一個要創建的字符串或者現存有界對象:

<c:set value="value" var="varName"/>
下面的set標籤則創建了一個名爲job的有界變量,它引用請求範圍的對象position。變量job的範圍爲page:
<c:set var="job" value="${requestScope.position}" scope="page"/>

      第二種形式是設置有界對象的屬性值。target屬性定義有界對象,以及有界對象的屬性。對該屬性的賦值時通過value屬性進行的:

<c:set target="target" property="propertyName" value="value"/>
例如下面的set標籤是將字符串“Tokyo”賦予有界對象address的city屬性:
<c:set target="${address}" property="city" value="Tokyo"/>

第三種形式與第二種形式相似,只是賦值是作爲body content完成的:

<c:set target="target" property="propertyName">
body content
</c:set>
例如,下面的set標籤是將字符串“Beijing”賦予有界對象address的city屬性:
<c:set target="${address}" property="city">Beijing</c:set>

(3)remove標籤
      remove標籤用於刪除有界變量,其語法如下:

<c:remove var="varName"/>
下面的例子就是刪除了頁面範圍的變量job
<c:remove var="job" scope="page"/>

      注意,有界變量引用的對象不能刪除。因此,如果另一個有界對象也引用了同一個對象,仍然可以通過另一個有界變量訪問該對象。

4.條件行爲

      條件行爲用於處理頁面輸出取決於特定輸入值的情況,這在java中是利用if、if…else和switch聲明解決的。JSTL中執行條件行爲的有4個標籤,即if、choose、when和otherwise標籤。下面分別對其進行詳解。
(1)if標籤
      if標籤是對某一條件進行測試,假如結果爲True,就處理它的body content。測試結果保存在Boolean對象中,並創建有界變量來一弄這個Boolean對象,利用var屬性和scope屬性分別定義有界變量的名稱和範圍。if的語法格式如下:

<c:if test="testCondition">
body content
</c:if>

      body content是JSP,當測試條件的結果爲True時,就會得到處理。例如,如果找到請求參數user且值爲ken,並且找到請求參數password且值爲blackcomb,以下if標籤將顯示“You logged in successfully”

<c:if test="${param.user=='ken'&&param.password=='blackcomb'}">
You logged in successfully.
</c:if>

(2)choose、when和otherwise標籤
      choose和when標籤的作用與Java中的關鍵字switch和case類似。也就是說,它們是爲相互排斥的條件執行提供上下文的。choose標籤中必須嵌有一個或者多個when標籤,並且每個when標籤都表示一種可以計算和處理的狀況。otherwise標籤則用於默認的條件塊,假如沒有任何一個when標籤的測試條件結果爲True,它就會得到處理。假如是這種情況,otherwise就必須放在最後一個when後。
      choose和otherwise標籤沒有屬性。when標籤必須帶有定義測試套件的test屬性,用來決定是否應該處理body content。
      舉個例子,以下代碼是測試參數status的值。如果status的值爲full,將顯示“You are a full member”。如果這個值是student,則會顯示“You are a student member”。如果status參數不存在,或者它的值既不是full,也不是student,那麼這段代碼將序顯示任何內容。

<c:choose>
   <c:when test="${param.status=='full'}">
     You are a full member
   </c:when>
   <c:when test="${param.status=='student'}">
     You are a student member
   </c:when>
</c:choose>

5.遍歷行爲

      當無需要無數次地遍歷一個對象集合時,遍歷行爲就很有幫助。JSTL提供了forEach和forTokens兩個執行遍歷行爲的標籤:
(1)forEach標籤
      forEach標籤會無數次地反覆遍歷body content或者對象集合。可以被遍歷的對象包括java.util.Collection和java.util.Map的所有實現,以及對象數組或者主類型。也可以遍歷java.util.Iterator和java.util.Enumeration。forEach標籤的語法有兩種形式。第一種形式是固定次數地重複body content:

<c:forEach [var="varName"] begin="begin" end="end" step="step">
   body content
</c:forEach>

      第二種形式用於遍歷對象集合

<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [begin="begin"] [step="step"]>
   body content
</c:forEach>

      froEach標籤的屬性:

  • var:字符串類型,引用遍歷的當前項目的有界變量名稱。
  • items:支持的任意類型,遍歷的對象集合。
  • begin:整數。
  • end:整數。
  • step:大於或者等於1的整數。

例如,下面的forEach標籤將顯示“1,2,3,4,5”。

<c:forEach var="x" begin="1" end="5">
  <c:out value="${x}"/>
</c:forEach>

6.函數

      JSTL定義了一套可以在EL表達式中使用的標準函數。這些函數都集中放在function標籤庫中。爲了使用這些函數,必須在JSP的最前面使用以下taglib指令:

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

調用函數時,要以下列各式使用一個EL:

${fn:functionName}
functionName是函數名。

      大部分函數都用於字符串刀座。例如,length函數用於字符串和集合。這裏介紹幾個比較常用的函數。
(1)contains函數
      contains函數用於測試一個字符串中是否包含指定的子字符串。如果字符串中包含該子字符串,則返回值爲True,否則,返回False。其語法如下:
contains(string,substring);
例如,下面的EL表達式會返回True;

<c:set var="myString" value="Hello World"/>
${fn:contains(myString,"Hello")}

(2)join函數
      join函數將一個String數組中的所有元素都合併成一個字符串,並用指定的分隔符分開,其語法如下:
join(array,separator)
如果這個數組爲null,就會返回一個空字符串。
例如,如果myArray是一個String數組,它帶有兩個元素“my”和“World”,那麼,下列EL表達式:
${fn:join(myArray,",")}
將返回“my,world”。
(3)length函數
      length函數用於返回集合中的項目數,或者字符串中的字符數,其語法如下:
length(input)
(4)split函數
      split函數用於將一個字符串分離成一個子字符串數組。它的作用和join相反。例如,下列代碼是分離字符串“my,world”,並將結果保存在有界變量split中。隨後,利用forEach標籤將split格式化成一個HTML表:

<c:set var="split" value='$(fn:split("my,world",",")}'/>
 <table>
 <c:forEach var="substring" items="$(split)">
 <tr><td>${substring}</td></tr>
 </c:forEach>
 </table>
 結果爲:
 <table>
 <tr><td>my</td></tr>
 <tr><td>world</td></tr>
 </table>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章