iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 21
0

前言

接下來的六天
會針對JSTL和自訂標籤的部分作整理
今天先介紹JSTL的部分


何為JSTL

全名為JSP Stand Tag Library(JSP標準標籤函式庫)
雖然已經有EL可以取代scriplet了
但在EL無法做到條件判斷
且EL和scriptlet只能擇一使用
這樣一來需要取前端的值做判斷時還是需要用scriptlet搭配java使用
而JSTL提供了條件判斷的標籤,是一種JSP的標準標籤
此外也提供了擴充及自訂的功能,讓開發上更加彈性

主要的好處如下:

  • 1.提供條件判斷
  • 2.可以重複使用
  • 3.使JSP較乾淨,可讀性及維護性高

JSTL主要分為幾大類:

  • core標籤函式庫
  • fmt標籤函式庫
  • fn方法函式庫
  • SQL標籤函式庫
  • XML標籤函式庫

相較之下
scriplet和EL比較適用於顯示資料的功用

Core標籤程式庫

  • c:out
    JSTL使用out標籤來輸出EL的資料
    其中共有三個屬性:
屬性 說明
value 顯示要秀出的值
default 如果value不存在,則輸出default屬性
escapeXml 若為true,則顯示內容為XML格式
<c:out value="${paramaction. }" default="no values" /></c:out>

此結果若paramaction不存在,就顯示no values的內容

  • c:if
    使用if標籤來完成java的判斷功能,將判斷的條件寫在test這個屬性
    if標籤的test屬性值為boolean的true或是字串類型的(大小寫皆可)
    回傳值才會是true
<c:if test="${param.action == 'add'}">
 <table>
 <tr>
   <td>name:<input type="text" name="name" /></td>
 </tr>
 <tr>
   <td>number:<input type="text" name="number" /></td>
 </tr>
 </table>
</c:if>
  • c:choose/c:when/c:otherwise
    由於if標籤沒有else的功能
    需透過choose的標籤,搭配when和otherwise一起使用
    類似switch的功能,但when可以當作是一個獨立的判斷

    <c:choose>
       <c:when test="${param.action}">
        <p>this is value </p>
       </c:when>
       <c:otherwise>
          no value
       </c:otherwise>
    </c:choose>
    
  • c:forEach

    • 屬性
      類似java的while或是for
      有四個屬性
    屬性 說明
    var 變數名稱
    begin 起始位置
    end 結束位置
    step 定義增加數
    <c:forEach var="num" begin="0" end="100" step="1">
     <div>${ num }</div>
    </c:forEach>
    
    • List
    屬性 說明
    item iterate每一筆的名稱
    var 傳入的集合(使用EL運算式)
    <%
      List<Person> personsList = new ArrayList();
    
      Person person = new Person();
      person.setID(1);
      person.setName("ZAREK");
      personsList.add(person);
    
      Person person2 = new Person();
      person2.setID(2);
      person2.setName("simen");	
      personsList.add(person2);
    
      request.setAttribute("persons", persons);
    %>
    
    <c:forEach var="person" items="${ persons }">
    <tr>
    <td>name: ${person.name }</td>
    <td>age: ${person.id }</td>
    </tr>
    </c:forEach>
    
    • Map
      也可使用在MAP集合中
      header是一個map的集合
    <c:forEach var="item" items="${ header }">
    <tr>
    <td>${header.key }</td>
    <td>${header.value }</td>
    </te>
    </c:forEach>  
    
    • varStatus
      varStatus提供了index的功能
      可以用此來表示是物件裡面的第幾個

    屬性如下:
    index =>第幾個物件,從0開始算
    count =>已經走訪了幾個物件,從1開始
    first =>檢查物件是否為第一個
    last =>檢查物件是否為最後一個
    current =>目前被檢查的物件
    begin =>傳回此屬性值
    end =>傳回此屬性值
    step =>傳回此屬性值

  • c:forTokens
    和forEach類似,但不同的是forEach的items是集合物件類型或是陣列
    而forTokens是字串,並使用delims的屬性去分隔它

    <c:forTokens var="item" items="zarek,simen,chung" delims="," varStatus="varStatus">
      <tr>
      <td>${ varStatus.index }</td>
      <td>${ item }</td>
      </tr>
    </c:forTokens>
    
  • c:set
    總共有5個屬性
    其中var和taget只能擇一使用
    若有taget時且為java bean一定要有property

    屬性 說明
    var set的物件創建或者修改的值,為字串,不可為EL
    value set進去的值,可為EL運算式
    scope 物件的範圍(session,request,page,applicatiion),default為page
    taget 類似var,能接受java bean或是map,兩者只能擇一使用,可接受EL,只能修改不能建立
    property target是java bean的時候必要存在,設定要修改哪一個property
  • c:remove
    和set相反,只有兩個屬性
    var 和 scope
    和set一樣var只接受字串不能用EL表示
    var若不存在,remove不會拋出exception

  • c:catch
    提供catch標籤可捕捉JSP的exception
    只有一個var屬性,儲存拋出的exception

  • c:import
    相當於JSP的 file include以及jspLinclude
    (此部分尚未提到,過幾天會再補充)
    總共有6個屬性:

    屬性 說明
    url 取得目標位置,可為外部或內部
    charEncoding 設定編碼
    var 將目標網頁內容儲存到var指定的string變數
    varReader 以java.io.Reader類型儲存,不能與var和scope同時存在
    context 若有設定,url和context必須以斜線開頭,即只能呼叫內部網頁
    scope string變數的範圍
    <c:catch var="e">
      <c:import url="http://www.google.com" />
      </c:catch>
    
      <c:if test="${e !=null}">
       exception: ${ e.class.name},reason: ${ e.message}
     </c:if>
    
  • c:url
    類似JSP中response.encoundeURL()方法
    若cilent關掉cookie功能,將資訊儲存在URL裡
    同上面也有context,var,scope,用法同import

    <c:url value="/pageImages/a.gif"
    
  • c:redirect
    實現redirect重新導向功能
    有兩個屬性url及context
    url可以為相對或是絕對路徑
    如果宣告了context,則url必須以斜線開頭

  • c:param
    執行redirect時會需要傳入參數
    這時可使用param標籤,也可以

    <c:import url="https://www.google.com.tw/">
    	<c:param name="a" value="name" />
      <c:param name="b" value="id" />
    </c:import>
    
    <c:redirect url="https://www.google.com.tw/">
      <c:param name="a" value="name" />
      <c:param name="b" value="id" />
    </c:redirect>
    

    小結

    今天整理了JSTL其中core的標籤函式庫
    其實內容不少,但有些屬性的規則也都大同小異
    明日會繼續來看其他類型函式庫

    參考文章

    https://dotblogs.com.tw/alantsai/2013/10/13/jstl-core


上一篇
[Day 20] Expression Language (EL)筆記
下一篇
[Day 22] JSTL筆記 - 細談TLD
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言