JSP戰力倍增器----JSTL詳解

上一篇,我們學了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後面接elseelse 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這一專欄會是一個系列博客,喜歡的話可以持續關注,如果本文對你有所幫助,還請還請點贊、評論加關注。

​有任何疑問,可以評論區留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章