前言:
上一篇教程中我們介紹了EL表達式的使用,可以簡化JSP頁面的代碼開發,但實際上EL表達式也有自己的缺陷,只能做展示,不能編寫動態功能,比如集合的遍歷,爲了解決這一問題,JSP提供了JSTL組件供開發者使用,所以通常情況下JSP頁面的開發爲EL+JSTL。
什麼是JSTL?
JSP Standard Tag Library,簡稱JSTL,JSP標準標籤庫,提供了一系列的標籤供開發者在JSP頁面中使用,編寫各種動態功能。
常用JSTL標籤庫
JSTL提供了很多標籤,以庫爲單位進行分類,實際開發中最常用的標籤庫有3種。
1.核心標籤庫
2.格式化標籤庫
3.函數標籤庫
如何使用?
1.Maven添加JSTL依賴jar文件。
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
2.JSP頁面導入JSTL標籤庫,prefix設置前綴,相當於別名,在JSP頁面中可以直接通過別名使用標籤,uri設置對應的標籤庫。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.使用標籤完成功能。
核心標籤庫
引入核心標籤庫。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
set:向域對象中添加一個數據。
var爲變量名,value爲變量值,scope爲保存的域對象,默認爲pageContext。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="message" value="張三" scope="request"/> ${requestScope.message } </body> </html>
修改對象的屬性值。
property爲屬性名,value爲屬性值,target爲對象名,注意這裏需要使用EL表達式。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="com.southwind.entity.Reader" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% Reader reader = new Reader(); request.setAttribute("reader", reader); %> <c:set value="張三" property="name" target="${reader}"></c:set> <c:set value="1" property="id" target="${reader}"></c:set> ${reader } </body> </html>
out:輸出域對象中的數據。
value爲變量名,default的作用是若變量不存在,則輸出default的值。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="message" value="張三" scope="request"/> <c:out value="${message }" default="未定義"></c:out> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:out value="${message }" default="未定義"></c:out> </body> </html>
remove:刪除域對象中的數據。
var爲要刪除的變量名。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="info" value="Java"></c:set> <c:remove var="info"/> <c:out value="${info }" default="未定義"/> </body> </html>
catch:捕獲異常。
若JSP的Java腳本拋出異常,會直接將異常信息打印到瀏覽器。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% int num = 10/0; %> </body> </html>
使用catch可以將異常信息保存到域對象中。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:catch var="error"> <% int num = 10/0; %> </c:catch> <c:out value="${error }"></c:out> </body> </html>
if :流程控制。
test爲判斷條件,如果條件成立,會輸出標籤內部的內容,否則不輸出。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set value="1" var="num1"></c:set> <c:set value="2" var="num2"></c:set> <c:if test="${num1>num2}">${num1 } > ${num2 }</c:if> <c:if test="${num1<num2}">${num1 } < ${num2 }</c:if> </body> </html>
choose:流程控制。
相當於if-else的用法,when相當於if,otherwise相當於else。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set value="1" var="num1"></c:set> <c:set value="2" var="num2"></c:set> <c:choose> <c:when test="${num1>num2}">${num1 }</c:when> <c:otherwise>${num2 } </c:otherwise> </c:choose> </body> </html>
forEach:迭代集合。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="com.southwind.entity.Reader" %> <%@ page import="java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% Reader reader1 = new Reader(); reader1.setId(1); reader1.setName("張三"); Reader reader2 = new Reader(); reader2.setId(2); reader2.setName("李四"); Reader reader3 = new Reader(); reader3.setId(3); reader3.setName("王五"); List<Reader> list = new ArrayList<Reader>(); list.add(reader1); list.add(reader2); list.add(reader3); request.setAttribute("list", list); Map<Integer,Reader> map = new HashMap<Integer,Reader>(); map.put(1, reader1); map.put(2, reader2); map.put(3, reader3); request.setAttribute("map", map); Set<Reader> set = new HashSet<Reader>(); set.add(reader1); set.add(reader2); set.add(reader3); request.setAttribute("set", set); %> <c:forEach items="${list }" var="reader"> ${reader }<br/> </c:forEach> <hr/> <c:forEach items="${map }" var="reader"> ${reader }<br/> </c:forEach> <hr/> <c:forEach items="${set}" var="reader"> ${reader }<br/> </c:forEach> </body> </html>
格式化標籤庫
可以將日期和數字按照一定的格式進行格式化輸出。
引入格式化標籤庫:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
日期格式化:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ page import="java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("date", new Date()); %> <c:out value="${date }"></c:out><br/> <fmt:formatDate value="${date }"/><br/> <fmt:formatDate value="${date }" pattern="yyyy-MM-dd hh:mm:ss" /> </body> </html>
數字格式化:
value爲數值,maxIntegerDigits爲整數位,maxFractionDigits爲小數位。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <fmt:formatNumber value="32165.23434" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber> </body> </html>
函數標籤庫
引入函數標籤庫。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函數標籤庫的使用與其他標籤稍有區別,類似與EL表達式。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% pageContext.setAttribute("info", "Java,C"); %> 判斷是否包含"Ja":${fn:contains(info,"Java") }<br/> 判斷是否以"Ja"開始:${fn:startsWith(info,"Ja") }<br/> 判斷是否以"C"結尾:${fn:endsWith(info,"C") }<br/> 求"va"的下標:${fn:indexOf(info,"va") }<br/> "Java"替換爲"JavaScript":${fn:replace(info,"Java","JavaScript") }<br/> 截取:${fn:substring(info,2,3) }<br/> 以","分割:${fn:split(info,",")[1] } </body> </html>