上一篇,我們學了EL表達式的使用,我們將其稱爲簡化JSP頁面的屠龍寶刀,今天我們就來學下’倚天劍’----JSTL。
1.JSTL的概念
JSTL(Java Server Pages Standard Tag Library),即JSP標準標籤庫,是由Sun公司制定的一套標籤標準,爲開發者提供更加方便、有效的標籤,以減少JSP開發的難度。
JSTL雖然被稱作標準標籤庫,實際上由5個不同功能的標籤庫共同組成,如下所示:
其中的每個標籤庫的具體功能如下:
- Core:核心標籤庫,包含了實現Web應用中通用操作的標籤;
- I18N:國際化/格式化標籤庫,它包含實現Web應用程序的國際化標籤和格式化標籤;
- SQL:數據庫標籤庫,它包含了用於訪問數據庫和對數據庫中的數據進行操作的標籤;
- XML:操作XML文檔的標籤庫,它包含對XML文檔中的數據進行操作的標籤;
- Functions:函數標籤庫,它提供了一套自定義EL函數,包含了JSP網頁製作用到的字符串操作。
對於以上五個標籤庫,因爲MVC設計模式,其中的SQL、XML、Functions中標籤所實現的功能,我們會將對應的操作放在服務端來實現,I18N我們也很難用得到。因此,JSTL中對我們而言,最重要的也就是Core標籤庫,下面我們來一起學習下。
2.JSTL的使用
相比於EL表達式,JSTL在使用上稍微麻煩些,主要有如下步驟。
2.1 下載JSTL包
我們要使用JSTL,需要依賴兩個jar包,下載方式主要有如下兩種。
官網下載,下載地址爲:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,選擇最新的版本的壓縮包下載即可。
maven倉庫下載,下載地址分別爲:https://repo1.maven.org/maven2/javax/servlet/jsp/jstl/jstl/1.2/
https://mvnrepository.com/artifact/taglibs/standard/1.1.2
下載完成後,可以得到jstl.jar、standard.jar,其中jstl.jar中包含JSTL規範中定義的接口和相關類,standard.jar包含用於實現JSTL的實現類和JSTL五個標籤庫的描述符文件(TLD)。
2.2 導入JAR包
將上面下載的兩個jar包複製到Web-Inf下的lib目錄下,並右擊build path。
2.3 JSTL初體驗
以上就是所有的準備工作,下面我們通過一個簡單的頁面來試一下JSTL的功能。
需要注意的是,在使用JSTL時,頁面上需要使用taglib指令導入Core標籤庫,語法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
下面,我們通過一個簡單的頁面來展示JSTL的使用,頁面代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:out value="你好,歡迎使用JSTL標籤庫" />
</body>
</html>
頁面效果和out.println("你好,歡迎使用JSTL標籤庫")
相同,運行效果如下圖所示:
3.Core標籤庫中常用的標籤
在MVC之前,JSP文件是一個獨立、能自主完成所有任務的模塊,因此JSTL提供的強大、便捷的標籤庫便是節約成本、簡化JSP開發的無上利器。
因爲MVC的設計理念,JSP承擔的功能比較明確,JSP中的許多的功能被放在Controller、和Model中,因此JSTL中的許多標籤就沒了用武之地。我們在本文中,也僅僅介紹一些到現在仍有較強生命力的一些標籤,這些標籤仍然可以給我們的開發工作帶來很大的便捷。
3.1 <c:if>標籤
在程序開發中,經常需要使用if
語句進行條件判斷,從<c:if>
標籤的名字,我們就可以猜到,此標籤的可以在JSP頁面中進行條件判斷。<c:if>
標籤有兩種語法,具體如下:
語法1:沒有標籤體的情況
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>
語法2:有標籤體的情況
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
dody content
</c:if>
其中,test屬性用與設置邏輯表達式,即需要進行的判斷條件;var屬性用與指定邏輯表達式中變量的名字;scope屬性用與指定var設定的變量的作用範圍(JSP四大域對象)。如果test計算的結果爲true,那麼標籤體纔會被執行,否則標籤中的內容不會被執行。
下面,我們通過一個例子,來演示下<c:if>
標籤的使用,示例代碼如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<h1>param.role: ${param.role }</h1>
<c:if test="${ param.role == 'admin' }">
<h1>This is admin page!</h1>
</c:if>
<c:if test="${ param.role eq 'user' }">
<h1>This is user page!</h1>
</c:if>
<c:if test="${ empty param.role }">
<h1>非法用戶!</h1>
</c:if>
</body>
</html>
其中的${param.role }
是通過EL表達式獲取url中的參數,頁面運行效果如下所示:
當在url中輸入role=admin後,可以看到,頁面中輸出了<h1>This is admin page!</h1>
,和我們預計相符。同理,url中輸入role=user後,頁面中會輸出<h1>This is user page!</h1>
。
3.2 <c:choose>標籤
看完上面的<c:if>
標籤,是不是會疑惑,如果我想在if
後面接else
、else if
,那要怎麼處理呢?爲了實現你的需求,Core標籤庫提供了<c:choose>
標籤,該標籤可以指定多個條件的組合邊界。
<c:choose>
標籤沒有屬性,在他的標籤體中,只能和一個或多個<c:when>
、零個或一個<c:otherwise>
一起配套使用。其語法類似於if-else if-...-else
。
<c:choose>
、<c:when>
、<c:otherwise>
配合使用的語法如下:
<c:choose>
Body Content(when、otherwise、other label)
<c:when test="testCondition">
Body Content
</c:when>
...
<c:otherwise>
Body Content
</c:otherwise>
</c:choose>
下面,我們通過一個例子,來演示下<c:choose>
標籤的使用,示例代碼如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<c:choose>
<c:when test="${empty param.username}">
unKnown user.
</c:when>
<c:when test="${param.username == 'admin'}">
${ param.username} is admin manager.
</c:when>
<c:otherwise>
${ param.username} is employee.
</c:otherwise>
</c:choose>
</body>
</html>
頁面運行結果如下圖所示:
3.3 <c:forEach>標籤
接下來就是我們今天的重頭戲了,也是我個人覺得Core標籤庫中最重要的一個標籤----<c:forEach>
。從名字也能看出來,這是JSP頁面中用於遍歷集合中的元素,就像for
循環一樣。
<c:forEach>
有兩種使用方式,一種是迭代對象結合,也是我們java中常用的for(A a : aList)
,語法如下:
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="beginIndex"] [end="endIndex"] [step="step"]>
body content
</c:forEach>
<c:forEach>
的另一種方式,就是迭代指定的範圍,類似於java中常用的for(int i=0;i<N;i++)
,語法如下:
<c:forEach [var="varName"] [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
body content
</c:forEach>
在上述語法中,出現的屬性的具體含義如下:
- var屬性用於指定將當前迭代的元素保存到page域中的哪個變量中;
- items屬性用與指定將要迭代的結合對象;
- varStatus屬性用與指定當前迭代狀態信息(比如index)保存到page域中的名稱;
- begin屬性用於指定從集合的第幾元素開始進行迭代,默認從0開始;如果是第二種方式,即沒有items屬性,則從begin指定的值開始迭代;
- end屬性用於指定最後迭代結束的值;
- step屬性用與指定迭代的步長。
而且,<c:forEach>
可以和EL表達式結合在一起使用,當我們需要在頁面上展示列表數據時,就可以非常方便的實現。下面,我們通過一個例子來演示下,示例代碼如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body style="text-align: center;">
<%
//構造List,添加測試數據
List userList = new ArrayList();
userList.add("lizishu");
userList.add("admin");
userList.add("user");
%>
<table border="1">
<tr>
<td>序號</td>
<td>索引</td>
<td>是否爲第一個元素</td>
<td>是否爲最後一個元素</td>
<td>元素的值</td>
</tr>
<c:forEach var="name" items="<%=userList%>" varStatus="status">
<tr>
<td>${status.count}</td>
<td>${status.index}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<td>${name}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
從代碼中,我們可以看到,<c:forEach>
標籤可以用於迭代輸出table中的每行數據,並且可以很好的和EL表達式結合,非常方便的完成了數據的列表展示。其中count、index、first、last爲varStatus中保存的信息。
上面頁面運行的結果如下圖所示:
4.總結
雖然JSTL標籤庫中的許多標籤因爲各種原因,變得不再常用,而EL與JSTL也因爲JSP的慢慢的退出核心舞臺也沒有之前一樣耀眼了,但是,在需要的時候,或者說在使用JSP開發前後端不分離的頁面時,EL與JSTL一定可以成爲你的手中的倚天、屠龍,蕩平複雜的數據交互,橫掃一切不服之臣。
又到了分隔線以下,本文到此就結束了,本文內容全部都是由博主自己進行整理並結合自身的理解進行總結,如果有什麼錯誤,還請批評指正。
Java web這一專欄會是一個系列博客,喜歡的話可以持續關注,如果本文對你有所幫助,還請還請點贊、評論加關注。
有任何疑問,可以評論區留言。