接下來的六天
會針對JSTL和自訂標籤的部分作整理
今天先介紹JSTL的部分
全名為JSP Stand Tag Library(JSP標準標籤函式庫)
雖然已經有EL可以取代scriplet了
但在EL無法做到條件判斷
且EL和scriptlet只能擇一使用
這樣一來需要取前端的值做判斷時還是需要用scriptlet搭配java使用
而JSTL提供了條件判斷的標籤,是一種JSP的標準標籤
此外也提供了擴充及自訂的功能,讓開發上更加彈性
主要的好處如下:
JSTL主要分為幾大類:
相較之下
scriplet和EL比較適用於顯示資料的功用
屬性 | 說明 |
---|---|
value | 顯示要秀出的值 |
default | 如果value不存在,則輸出default屬性 |
escapeXml | 若為true,則顯示內容為XML格式 |
<c:out value="${paramaction. }" default="no values" /></c:out>
此結果若paramaction不存在,就顯示no values的內容
<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
屬性 | 說明 |
---|---|
var | 變數名稱 |
begin | 起始位置 |
end | 結束位置 |
step | 定義增加數 |
<c:forEach var="num" begin="0" end="100" step="1">
<div>${ num }</div>
</c:forEach>
屬性 | 說明 |
---|---|
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>
<c:forEach var="item" items="${ header }">
<tr>
<td>${header.key }</td>
<td>${header.value }</td>
</te>
</c:forEach>
屬性如下:
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的標籤函式庫
其實內容不少,但有些屬性的規則也都大同小異
明日會繼續來看其他類型函式庫