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 下导入坐标

jstl

jstl

1.2

taglibs

standard

1.1.2

在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 文件中添加以下配置:可以根据需求增删

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">

http://java.sun.com/jsp/jstl/fmt

/WEB-INF/fmt.tld

http://java.sun.com/jsp/jstl/fmt-rt

/WEB-INF/fmt-rt.tld

http://java.sun.com/jsp/jstl/core

/WEB-INF/c.tld

http://java.sun.com/jsp/jstl/core-rt

/WEB-INF/c-rt.tld

http://java.sun.com/jsp/jstl/sql

/WEB-INF/sql.tld

http://java.sun.com/jsp/jstl/sql-rt

/WEB-INF/sql-rt.tld

http://java.sun.com/jsp/jstl/x

/WEB-INF/x.tld

http://java.sun.com/jsp/jstl/x-rt

/WEB-INF/x-rt.tld

使用任何库,你必须在每个 JSP 文件中的头部包含 标签。

核心标签

JSTL 核心(core)标签是最常用的 JSTL 标签,导入核心标签库的语法如下:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

标签

说明

将表达式的结果输出到页面中,类似于 <%= ...%>

在指定范围内设置变量或属性值

类似于 Java if 语句,用于条件判断

类似于 Java switch 关键字,为 的父标签

的子标签,用来判断条件是否成立

的子标签,当所有的 标签判断为 false 时被执行

类似于 Java for,用于迭代集合中的信息

类似于 Java split,用于分隔字符串

用于删除数据

用于捕获异常

用来导入静态或动态文件

用来传入参数

用于将当前页面重定向至另一个 URL

用于将 URL 格式化为一个字符串

格式化标签

JSTL 格式化(fmt)标签可以通过很简单的方式转换数字、日期,导入格式化标签库的语法如下。

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

标签

说明

设置请求数据的字符编码

用于设置用户本地化环境

绑定资源

用来从指定的资源文件中调用信息

绑定资源

用于格式化数字、百分比和货币

用于解析数字、货币和百分比

用于使用不同的方式格式化日期

用于把字符串类型的日期转换成日期数据类型

用于指定时区

用于设定默认时区

SQL标签

JSTL SQL 标签提供了许多操作数据库(MySQL、Oracle、SQL Server 等)的标签。虽然在大型的网站中不建议使用这种标签库,但在小型网站中经常会用到。导入 SQL 标签库的语法如下。

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

标签

说明

用来在 JSP 页面中配置数据源

查询数据库中的数据

更新数据库中的数据

提供日期和时间的动态值

事务管理

设置 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 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。

简单示例

下面创建一个简单的自定义标签

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 代码如下:

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

1.0

2.0

Example TLD

Hello

com.riotian.tag.HelloTag

empty

输出内容

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" %>

Tag.jsp

运行结果如下:

tld标签库描述文件

tld 文件中常用的标签有 taglib、tag、attribute 和 variable。下面以 custom.tld 文件为例介绍其含义。

1. 标签

标签用来设置整个标签库信息,其说明如下表所示。

属 性

说 明

tlib-version

标签库版本号

jsp-version

JSP版本号

short-name

当前标签库的前缀

uri

页面引用的自定义标签的 uri 地址

name

自定义标签名称

tag-class

自定义标签实现类路径

description

自定义标签的功能描述

attribute

自定义标签的指定属性,可以有多个

2. 标签

标签用来定义标签具体的内容,其说明如下表所示。

属 性

说 明

name

自定义标签名称

tag-class

自定义标签实现类

body-content

有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理)

description

自定义标签的功能描述

attribute

自定义标签功能的指定属性,可以有多个

variable

自定义标签的变量属性

3. 标签

标签用来定义 标签中的属性,其说明如下表所示。

属 性

说 明

name

属性名称

description

属性描述

required

指定属性是否是必须的,默认值:false

rtexprvalue

属性值是否支持 JSP 表达式

type

定义该属性的 Java 类型,默认值:String

fragment

如果声明了该属性,属性值将被视为一个 JspFragment

使用 的属性时要注意元素顺序。

4. 标签

标签用来定义 标签中的变量属性,其说明如下表所示。

属 性

说 明

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());

}

}

}

下面使用 标签为 标签添加 message 属性:

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

1.0

2.0

Example TLD

Hello

com.riotian.tag.HelloTag

tagdependent

message

这时就可以在 JSP 页面中使用 message 属性了,如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" %>

<%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>

Tag.jsp

自定义标签的标签体

可以像 JSTL 标签库一样在标签中包含消息内容,如在 Hello 标签中包含内容,JSP 使用格式如下:

Demo Demo Hello JSP Tap....

修改 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 文件,如下:

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

1.0

2.0

Example TLD

Hello

com.riotian.tag.HelloTag

tagdependent

运行结果如图所示。