前排提示,本篇僅涉及 JSTL 的配置和簡要介紹 JSTL 的 Core 和 Functions 標簽庫中幾個常用的標簽。更加詳細的內容,博主會貼相應超鏈接。
注意:本教程使用的 JSTL 1.2,如果你使用的是 JSTL 1.1 或之前的版本,需要導入 jstl.jar 和 standard.jar 兩個包。可點擊 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 鏈接下載 JSTL 1.1 及之前的版本。
JSTL 規范由 Sun 公司制定,由 Apache 的 Jakarta 小組負責實現。JSTL 由 5 個不同功能的標簽庫組成,包括 Core、I18N、XML、SQL 以及 Functions;
配置 JSTL
注意:JSTL 現在已經是 Java EE5 的一個組成部分,如果采用支持 Java EE5 或以上版本的集成開發環境開發 Web 應用程序,就不需要再配置 JSTL 了。
Update:2021/12/05
Maven Web 項目下JSTL 使用分為如下步驟:
-
POM.xml 下導入坐標
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> -
在JSP頁面上引入JSTL標簽庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -
使用標簽
JSTL的下載
使用 JSTL 需要引入 JSTL 的 JAR 包和標簽庫描述符文件(擴展名為 .tld),標簽庫描述符文件內包含標簽庫中所有標簽的定義、標簽名、功能類及各種屬性。
- JATL JAR 包官方下載網址:https://tomcat.apache.org/taglibs/standard/
下載完畢以后可以根據使用的軟件進行配置。
Eclipse 平台
如果你再用的是 Eclipse 平台,則需要配置 JSTL。配置 JSTL 的步驟如下:
1)復制 JSTL 的標准實現
在 Tomcat 的 \webapps\examples\WEB-INF\lib 目錄下找到 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.ja r文件,然后復制到 Web 工程的 WEB-INF\lib 目錄下。
2)使用 taglib 標記定義前綴與 uri 引用
如果使用 Core 標簽庫,首先需要在 JSP 頁面中使用 taglib 標記定義前綴與 uri 引用,代碼如下:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如果使用 Functions 標簽庫,首先需要在 JSP 頁面中使用 taglib 標記定義前綴與 uri 引用,代碼如下:
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
IDEA 平台
1)復制 JSTL 的標准實現
在 Tomcat 的 \webapps\examples\WEB-INF\lib 目錄下找到 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.ja r文件,然后復制到 Web 工程的 WEB-INF\lib 目錄下。
2) 拷貝 tlb 文件
把壓縮包解壓后得將 tld 下的需要引入的 tld 文件復制到 WEB-INF 目錄下。
接下來我們在 web.xml 文件中添加以下配置:可以根據需求增刪
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
使用任何庫,你必須在每個 JSP 文件中的頭部包含<taglib> 標簽。
核心標簽
JSTL 核心(core)標簽是最常用的 JSTL 標簽,導入核心標簽庫的語法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
| 標簽 | 說明 |
|---|---|
| <c:out> | 將表達式的結果輸出到頁面中,類似於 <%= ...%> |
| <c:set> | 在指定范圍內設置變量或屬性值 |
| <c:if> | 類似於 Java if 語句,用於條件判斷 |
| <c:choose> | 類似於 Java switch 關鍵字,為 <c:when>和<c:otherwise> 的父標簽 |
| <c:when> | <c:choose> 的子標簽,用來判斷條件是否成立 |
| <c:otherwise> | <c:choose> 的子標簽,當所有的 <c:when> 標簽判斷為 false 時被執行 |
| <c:forEach> | 類似於 Java for,用於迭代集合中的信息 |
| <c:forTokens> | 類似於 Java split,用於分隔字符串 |
| <c:remove> | 用於刪除數據 |
| <c:catch> | 用於捕獲異常 |
| <c:import> | 用來導入靜態或動態文件 |
| <c:param> | 用來傳入參數 |
| <c:redirect> | 用於將當前頁面重定向至另一個 URL |
| <c:url> | 用於將 URL 格式化為一個字符串 |
格式化標簽
JSTL 格式化(fmt)標簽可以通過很簡單的方式轉換數字、日期,導入格式化標簽庫的語法如下。
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
| 標簽 | 說明 |
|---|---|
| <fmt:requestEncoding> | 設置請求數據的字符編碼 |
| <fmt:setLocale> | 用於設置用戶本地化環境 |
| <fmt:bundle> | 綁定資源 |
| <fmt:message> | 用來從指定的資源文件中調用信息 |
| <fmt:setBundle> | 綁定資源 |
| <fmt:formatNumber> | 用於格式化數字、百分比和貨幣 |
| <fmt:parseNumber> | 用於解析數字、貨幣和百分比 |
| <fmt:formatDate> | 用於使用不同的方式格式化日期 |
| <fmt:parseDate> | 用於把字符串類型的日期轉換成日期數據類型 |
| <fmt:timeZone> | 用於指定時區 |
| <fmt:setTimeZone> | 用於設定默認時區 |
SQL標簽
JSTL SQL 標簽提供了許多操作數據庫(MySQL、Oracle、SQL Server 等)的標簽。雖然在大型的網站中不建議使用這種標簽庫,但在小型網站中經常會用到。導入 SQL 標簽庫的語法如下。
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
| 標簽 | 說明 |
|---|---|
| <sql:setDataSource> | 用來在 JSP 頁面中配置數據源 |
| <sql:query> | 查詢數據庫中的數據 |
| <sql:update> | 更新數據庫中的數據 |
| <sql:dateParam> | 提供日期和時間的動態值 |
| <sql:transaction> | 事務管理 |
| <sql:param> | 設置 SQL 語句中的動態值 |
函數標簽
JSTL 函數(fn)標簽大部分是通用的字符串處理函數,導入函數標簽庫的語法如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
| 標簽 | 說明 |
|---|---|
| fn:contains() | 用於判斷一個字符串是否包含指定的字符串,區分大小寫 |
| fn:containsIgnoreCase() | 用於判斷一個字符串是否包含指定的字符串,不區分大小寫 |
| fn:endsWith() | 用於判斷一個字符串是否以指定的后綴結尾 |
| fn:escapeXml() | 用於轉義 HTML/XML 中的字符 |
| fn:indexOf() | 用於返回字符串在指定字符串中的開始位置 |
| fn:join() | 用來將數組中的所有元素利用指定的分隔符來連接成一個字符串 |
| fn:length() | 用於返回指定字符串的長度 |
| fn:split() | 用於將字符串用指定的分隔符分隔為一個子串數組 |
| fn:startsWith() | 用於判斷一個字符串是否以指定的前綴開頭 |
| fn:substring() | 用來返回指定字符串的子字符串 |
| fn:substringAfter() | 用來返回字符串中指定子字符串后面的部分 |
| fn:substringBefore() | 用來返回字符串中指定子字符串前面的部分 |
| fn:toLowerCase() | 用來將指定字符串中的所有字符轉為小寫 |
| fn:toUpperCase() | 將指定字符串中的所有字符轉為大寫 |
| fn:trim() | 用來刪除指定字符串兩端的空格 |
自定義標簽
自定義標簽就是用戶(開發者)自己定義的標簽。自定義標簽可以讓 JSP 頁面中不含有 Java 代碼,只含有 HTML 代碼和部分標簽,就能實現業務邏輯的調用。
自定義標簽的優點如下:
- 減少 JSP 頁面對腳本的需求和依賴性
- 將 JSP 頁面和業務邏輯分開,增加了程序的可維護性
- 可重復調用相同的業務邏輯,增加了程序的可重用性
使用自定義標簽步驟如下:
- 自定義標簽實現類
- 編寫 tld 標簽庫描述文件
- 在 JSP 頁面中使用自定義標簽
自定義標簽的語法
使用 taglib 指令指定 tld 文件的路徑。
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
其中:prefix 指定自定義標簽的前綴,uri 指定 tld 文件的路徑。
使用自定義標簽有以下 2 種格式:
<prefix:tagname attr1=value1....attrn=valuen />
或
<prefix:tagname attr1=value1....attrn=valuen >
標簽體
</prefix:tagname>
其中:prefix 表示自定義標簽的前綴,tagname 表示自定義標簽的名稱,attr 表示自定義標簽的屬性,value 表示自定義標簽的屬性值。
簡單示例
下面創建一個簡單的自定義標簽 <ex:Hello>。
1. 創建處理標簽的Java類
創建處理標簽的 HelloTag 類,代碼如下:
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Tag!!!");
}
}
以上代碼重寫了doTag() 方法,getJspContext() 方法用來獲取 JspContext 對象,並將 out.println 中的內容傳遞給 JspWriter 對象。
注意:SimpleTagSupport 實現了 SimpleTag 接口,該接口是 JSP 2.X 標簽庫新增的自定義標簽接口類。該接口極其簡單,提供了 doTag() 方法去處理自定義標簽中的邏輯以及標簽體。相對來說,JSP 1.X 比較復雜,處理標簽的 Java 類需要繼承 TagSupport 類,重寫 doStartTag()、doAfterBody()、doEndTag() 等方法。
2. 創建tld標簽庫描述文件
tld 文件采用 XML 文件格式進行描述,后綴名為 .tld,用來將寫好的類映射成 JSP 標簽。tld 文件保存在 WEB-INF 目錄下,為了管理方便,可以在目錄下創建 tlds 文件夾。
custom.tld 代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 標簽庫版本號 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本號 -->
<jsp-version>2.0</jsp-version>
<!-- 當前標簽庫的前綴 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定義標簽的名稱,在頁面中通過它來使用標簽 -->
<name>Hello</name>
<!-- 自定義標簽的實現類路徑 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文內容正文內容,沒有則用 empty 表示 -->
<body-content>empty</body-content>
<!-- 自定義標簽的功能描述 -->
<description>輸出內容</description>
</tag>
</taglib>
tld 文件中只能有一對 taglib 標簽,taglib 標簽下可以有多個 tag 標簽,每個 tag 標簽代表一個自定義標簽。
文章后面會對 tld 文件中的各個標簽進行說明。
3. 使用自定義標簽
使用自定義標簽和使用 JSTL 標簽是一樣的, JSP 文件中使用 Hello 標簽代碼如下。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
<!DOCTYPE html>
<html>
<head>
<title>Tag.jsp</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
</html>
運行結果如下:

tld標簽庫描述文件
tld 文件中常用的標簽有 taglib、tag、attribute 和 variable。下面以 custom.tld 文件為例介紹其含義。
1. <taglib>標簽
<taglib> 標簽用來設置整個標簽庫信息,其說明如下表所示。
| 屬 性 | 說 明 |
|---|---|
| tlib-version | 標簽庫版本號 |
| jsp-version | JSP版本號 |
| short-name | 當前標簽庫的前綴 |
| uri | 頁面引用的自定義標簽的 uri 地址 |
| name | 自定義標簽名稱 |
| tag-class | 自定義標簽實現類路徑 |
| description | 自定義標簽的功能描述 |
| attribute | 自定義標簽的指定屬性,可以有多個 |
2. <tag>標簽
<tag> 標簽用來定義標簽具體的內容,其說明如下表所示。
| 屬 性 | 說 明 |
|---|---|
| name | 自定義標簽名稱 |
| tag-class | 自定義標簽實現類 |
| body-content | 有 3 個值:empty(表示沒有標簽體)、JSP(表示標簽體可以加入 JSP 程序代碼)、tagdependent(表示標簽體中的內容由標簽自己處理) |
| description | 自定義標簽的功能描述 |
| attribute | 自定義標簽功能的指定屬性,可以有多個 |
| variable | 自定義標簽的變量屬性 |
3. <attribute>標簽
<attribute> 標簽用來定義 <tag> 標簽中的屬性,其說明如下表所示。
| 屬 性 | 說 明 |
|---|---|
| name | 屬性名稱 |
| description | 屬性描述 |
| required | 指定屬性是否是必須的,默認值:false |
| rtexprvalue | 屬性值是否支持 JSP 表達式 |
| type | 定義該屬性的 Java 類型,默認值:String |
| fragment | 如果聲明了該屬性,屬性值將被視為一個 JspFragment |
使用 <attribute> 的屬性時要注意元素順序。
4. <variable> 標簽
<variable> 標簽用來定義 <tag> 標簽中的變量屬性,其說明如下表所示。
| 屬 性 | 說 明 |
|---|---|
| declare | 變量聲明 |
| description | 變量描述 |
| name-from-attribute | 指定的屬性名稱,其值為變量,在調用 JSP 頁面時可以使用的名字 |
| name-given | 變量名(標簽使用時的變量名) |
| scope | 變量的作用范圍,有 3 個值:NESTED 開始和結束標簽之間、AT_BEGIN 從開始標簽到頁面結束、AT_END 從結束標簽之后到頁面結束 |
| variable-class | 變量的 Java 類型,默認值:String |
自定義標簽屬性
在自定義標簽中設置屬性,自定義標簽類中必須有相應的 setter 方法。為 bc:Hello 標簽添加 message 屬性,HelloTag 類代碼如下:
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String message) {
this.message = message;
}
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException {
if (message != null) {
// 從屬性中使用 message
JspWriter out = getJspContext().getOut();
out.println(message);
} else{
// 從內容中使用 message
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
下面使用 <attribute> 標簽為 <ex:Hello> 標簽添加 message 屬性:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 標簽庫版本號 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本號 -->
<jsp-version>2.0</jsp-version>
<!-- 當前標簽庫的前綴 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定義標簽的名稱,在頁面中通過它來使用標簽 -->
<name>Hello</name>
<!-- 自定義標簽的實現類路徑 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文內容正文內容,沒有則用 empty 表示 -->
<body-content>tagdependent</body-content>
<!-- 自定義標簽的功能描述 -->
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
這時就可以在 JSP 頁面中使用 message 屬性了,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
<!DOCTYPE html>
<html>
<head>
<title>Tag.jsp</title>
</head>
<body>
<ex:Hello message="Welcome to RioTian'blog..."/>
</body>
</html>
</html>

自定義標簽的標簽體
可以像 JSTL 標簽庫一樣在標簽中包含消息內容,如在 Hello 標簽中包含內容,JSP 使用格式如下:
<ex:Hello>
Demo Demo Hello JSP Tap....
</ex:Hello>
修改 HelloTag 類,如下:
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
@Override
public void doTag() throws JspException, IOException {
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
//super.doTag();
}
}
修改 custom.tld 文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 標簽庫版本號 -->
<tlib-version>1.0</tlib-version>
<!-- JSP版本號 -->
<jsp-version>2.0</jsp-version>
<!-- 當前標簽庫的前綴 -->
<short-name>Example TLD</short-name>
<tag>
<!-- 自定義標簽的名稱,在頁面中通過它來使用標簽 -->
<name>Hello</name>
<!-- 自定義標簽的實現類路徑 -->
<tag-class>com.riotian.tag.HelloTag</tag-class>
<!-- 正文內容正文內容,沒有則用 empty 表示 -->
<body-content>tagdependent</body-content>
</tag>
</taglib>
運行結果如圖所示。

