JSP標准標簽庫(JSTL)個人使用指南


前排提示,本篇僅涉及 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),標簽庫描述符文件內包含標簽庫中所有標簽的定義、標簽名、功能類及各種屬性。

下載完畢以后可以根據使用的軟件進行配置。

Eclipse 平台

如果你再用的是 Eclipse 平台,則需要配置 JSTL。配置 JSTL 的步驟如下:

1)復制 JSTL 的標准實現

在 Tomcat 的 \webapps\examples\WEB-INF\lib 目錄下找到 taglibs-standard-impl-1.2.5.jartaglibs-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.jartaglibs-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 頁面和業務邏輯分開,增加了程序的可維護性
  • 可重復調用相同的業務邏輯,增加了程序的可重用性

使用自定義標簽步驟如下:

  1. 自定義標簽實現類
  2. 編寫 tld 標簽庫描述文件
  3. 在 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>

運行結果如圖所示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM