JSTL詳解

前言:

上一篇教程中我們介紹了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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章