JSTL全名稱:JaveServer Pages Standard Tag Library.JSTL是由JCP(Java Community Process)所定制的标準規範,它主要提供給Java Web開發人員一個标準通用的函數庫。
Java Web程式員能利用JSTL和EL來開發Web程式,取代傳統直接在頁面上嵌入JAVA程式(Scripting)的做法,以提高的閱讀性、維護性和友善性。
- 安裝
要想使用使用jstl标簽庫,首先要引入jstl标簽庫包:jstl.jar,standard.jar
官網下載下傳位址:http://tomcat.apache.org/taglibs/standard/
這裡選擇的是下載下傳jstl标簽庫是1.1版本(http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/jakarta-taglibs-standard-1.1.2.zip),目前最新版本是1.2。
下載下傳好後,解壓目錄下:\lib下,可以發現這兩個包。
JSTL所提供的标簽函數庫主要分為五大類:
(1) 核心标簽庫 (Core tag library)
(2) I18N格式标簽庫 (I18N-capable formatting tag library)
(3) SQL标簽庫 (SQL tag library)
(4) XML标簽庫 (XML tag library)
(5) 函數标簽庫 (Functions tag library)
JSTL | 前置名稱 | URI | 範例 |
核心标簽庫 | c | http://java.sun.com/jsp/jstl/core | <c:out> |
I18N格式标簽庫 | fmt | http://java.sun.com/jsp/jstl/xml | <fmt:formatDate> |
SQL标簽庫 | sql | http://java.sun.com/jsp/jstl/sql | <sql:query> |
XML标簽庫 | xml | http://java.sun.com/jsp/jstl/fmt | <x:forBach> |
函數标簽庫 | fn | http://java.sun.com/jsp/jstl/functions | <fn:split> |
- 核心标簽庫(Core tag library)
建立一個Dynamic Web Project,命名為:MyJSTL001工程。
在default.jsp頁面中頭部引入核心标簽庫:
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4 <%@ page import="com.dx.work.Customer" %>
5 <%@ page import="java.util.*" %>
6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
7 <html>
8 <head>
9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10 <title>Insert title here</title>
11 </head>
12 <body>
- 表達式操作
表達式操作分類中包含四個标簽:<c:out>、<c:set>、<c:remove>和<c:catch>。
- <c:out>主要用來顯示資料的内容,就像是 <%= scripting-language %> 一樣
文法1:沒有本體(body)内容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
文法2:有本體内容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>
用法示例:
<h4>c:out 可以對特殊字元進行轉換</h4>
<%
request.setAttribute("BookName", "<<jsp2.0技術手冊>>");
%>
BookName:${requestScope.BookName}
<br/>
<br/>
BookName:<c:out value="${requestScope.BookName}"/>
<br/>
BookName(escapeXml="false"是,将取消對特殊字元進行轉換操作):<c:out value="${requestScope.BookName}" escapeXml="false"/>
<br/>
浏覽效果:
- <c:set>主要用來将變量儲存至JSP範圍中或是JavaBean的屬性中。
文法1:将value的值儲存至範圍為scope的 varName 變量之中
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
文法2:将本體内容的資料儲存至範圍為scope的 varName 變量之中
<c:set var="varName" [scope="{ page|request|session|application }"]>
… 本體内容
</c:set>
文法3:将 value的值儲存至 target 對象的屬性中
<c:set value="value" target="target" property="propertyName" />
文法4:将本體内容的資料儲存至target 對象的屬性中
<c:set target="target" property="propertyName">
1 <h4>c:set 可以對域對象進行指派,為域對象裡邊的某一個javabean屬性指派。</h4>
2 <c:set var="Title" value="dkkkd" scope="request" /><br/>
3 title:${requestScope.Title}<br/>
4 title:<c:out value="${requestScope.Title}" /><br/>
5 <%
6 Customer cust=new Customer();
7 cust.setId(1);
8 cust.setName("number one");
9
10 request.setAttribute("cust", cust);
11 %>
12 <br/>
13 id:${requestScope.cust.id}<br/>
14 <c:set target="${requestScope.cust}" property="id" value="1001" /><br/>
15 id:${requestScope.cust.id}<br/>
- c:remove 用來移除變量。
<c:remove var="varName" [scope="{ page|request|session|application }"] />
1 <h4>c:remove 用來移除變量。</h4>
2 <c:set var="waitRemoveObject" value="abcde" scope="request" />
3 waitRemoveObject:<c:out value="${waitRemoveObject }" /><br/>
4 <c:remove var="waitRemoveObject" scope="request"/>
5 從requestScope中移除waitRemoveObject:<c:out value="${waitRemoveObject }"/><br/>
6
- c:catch 用來撲捉異常,并把異常資訊存儲到某個指定的變量中。
<c:catch [var="varName"] >
… 欲抓取錯誤的部分
</c:catch>
1 <h4>c:catch 用來撲捉異常,并把異常資訊存儲到某個指定的變量中。</h4><br/>
2 <c:catch var="errorParseMessage">
3 <%
4 String intStr="111Acx";
5 int intVal= Integer.parseInt(intStr);
6 %>
7 </c:catch><br/>
8 <c:out value="${errorParseMessage}"/><br/>
- 流程控制
流程控制分類中包含四個标簽:<c:if>、<c:choose>、<c:when>和<c:otherwise>
- <c:if>
文法1:沒有本體内容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本體内容
</c:if>
1 <h4>c:if 用來判定條件是否滿足。不能實作if ... else if ... else ... ;也不能實作 if ... else ...</h4>
2 <c:set var="currentUser" value="administrator" scope="session" />
3 <c:if var="ifConditionResult" test="${sessionScope.currentUser=='administrator'}" scope="request">
4 <c:out value="目前使用者是:admin"/><br/>
5 </c:if>
6 <br/>
7 result:<c:out value="${requestScope.ifConditionResult }"/><br/>
效果:
- c:choose,c:when,c:otherwise。可以實作if ... else if ... else ... ;也能實作 if ... else ...語句。
<c:choose>
本體内容( <when> 和 <otherwise> )
</c:choose>
1 <h4>c:choose,c:when,c:otherwise。可以實作if ... else if ... else ... ;也能實作 if ... else ...語句。<br/>
2 其中:c:choose以c:when,c:otherwise的父标簽出現;
3 c:when,c:otherwise不能脫離c:choose單獨使用;
4 c:otherwise 必須在c:when之後使用。
5 </h4>
6
7 <c:set var="age" value="20" scope="request" />
8 the age is:<c:out value="${age}"/>
9 <br/>
10 <c:choose>
11 <c:when test="${requestScope.age>=65}">
12 老年。
13 </c:when>
14 <c:when test="${requestScope.age>=40}">
15 中年
16 </c:when>
17 <c:when test="${requestScope.age>=18}">
18 青年
19 </c:when>
20 <c:when test="${requestScope.age>=12}">
21 成年
22 </c:when>
23 <c:when test="${requestScope.age>=3}">
24 少年
25 </c:when>
26 <c:otherwise>
27 兒童
28 </c:otherwise>
29 </c:choose>
30
31
- 疊代操作
疊代(Iterate)操作主要包含兩個标簽:<c:forEach>和<c:forTokens>
- <c:forEach>
<c:forEach> 為循環控制,它可以将集合(Collection)中的成員循序浏覽一遍。運作方式為當條件符合時,就會持續重複執行<c:forEach>的本體内容。
文法1:疊代一集合對象之所有成員
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
</c:forEach>
文法2:疊代指定的次數
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
使用示例:
1 <h4>疊代操作:</h4>
2 <c:forEach begin="0" end="2" step="1" var="item">
3 <c:out value="${item}"/><br/>
4 </c:forEach>
5 item:<c:out value="${item}"/><br/>
6
7 <%
8 List<Customer> custs=new ArrayList<Customer>();
9 custs.add(new Customer(1,"first member"));
10 custs.add(new Customer(2,"first member"));
11 custs.add(new Customer(3,"first member"));
12 custs.add(new Customer(4,"first member"));
13
14 request.setAttribute("custs", custs);
15 %>
16 <c:forEach items="${requestScope.custs }" var="item" varStatus="status">
17 first:${status.first}-index:${status.index}-count:${status.count}-last:${status.last}-${item.id}-${item.name}<br/>
18 </c:forEach>
- <c:forTokens>
<c:forTokens> 用來浏覽一字元串中所有的成員,其成員是由定義符号(delimiters)所分隔的。
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
</c:forTokens>
1 <h4>字元分割:用來浏覽一字元串中所有的成員,其成員是由定義符号(delimiters)所分隔的。</h4>
2 <c:set var="delimsOriginal" value="a,b,c,1;2;3;-xx-yy-zz" scope="request" />
3 <c:forTokens items="${requestScope.delimsOriginal}" delims=",;-" var="item">
4 <c:out value="${item}"/><br/>
5 </c:forTokens>
- URL操作
JSTL包含三個與URL操作有關的标簽,它們分别為:<c:import>、<c:redirect>和<c:url>。它們主要的功能是:用來将其他檔案的内容包含起來、網頁的導向,還有url的産生。