JSTL 入门教程

JSTL标签库简介

JSTL(JavaServer Pages Standard Tag Library)是一个JSP标准标签库,用来解决像遍历Map或集合、条件测试、XML处理,数据库访问和数据库操作等常见问题。它由五个功能不同的标签库组成:核心标签库、格式标签库、SQL标签库、XML标签库和函数标签库,其具体信息如下表所示。

标签库 子函数 URI 前缀
核心标签库 变量支持 http://java.sun.com/jsp/jstl/core c
流控制
URL管理
其它
格式标签库 语言区域 http://java.sun.com/jsp/jstl/fmt fmt
消息格式化
数字和日期格式化
SQL标签库 SQL http://java.sun.com/jsp/jstl/sql sql
XML标签库 核心 http://java.sun.com/jsp/jstl/xml x
流控制
转换
函数标签库 集合长度 http://java.sun.com/jsp/jstl/functions fn
字符串操作

在JSP页面中使用JSTL库,必须通过以下格式使用taglib指令:

1
<%@ taglib uri="uri" prefix="prefix"%>

如要使用核心标签库,必须在JSP页面的开头处做以下声明:

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

核心标签库

核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签和遍历标签。

核心标签库
表达式标签 out
set
remove
catch
URL标签 import
redirect
url
param
流程控制标签 if
choose
when
otherwise
遍历标签 forEach
forTokens

表达式标签

在JSTL的核心标签库中,包含了<c:out><c:set><c:remove><c:catch>等四个表达式标签。

out 输出标签

<c:out>标签用于在运算表达式时,将结果输出到当前的JspWriter,类似于JSP表达式<%=expression%>或EL表达式${expression}<c:out>标签有两种语法格式,即有标签体和没有没有标签体的。

1
2
3
4
5
6
<%--第一种语法格式:有标签体--%>
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]>
default value
</c:out>
<%--第二种语法格式:没有标签体--%>
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>

参数说明:

  • value:用于指定要输出的变量或表达式,可使用EL表达式,如value="${expression}"
  • escapeXml:可选属性,用于指定是否转换特殊字符,如将<转换为&lt;,默认值为true,表示转换。
  • default:可选属性,用于指定当value属性值为null时,将要显示的默认值。当value属性值为null同时defalut属性值为null时,该标签将输出一个空的字符串。
特殊字符 字符实体码 特殊字符 字符实体码
< &lt; > &gt;
' &#039; " &#034;
& &amp;

set 变量设置标签

<c:set>标签的作用有以下三个方面:

  • 创建一个字符串和一个引用该字符串的有界变量
  • 创建一个引用现存有界对象的有界变量
  • 设置有界变量的属性

说明:有界变量是指在指定范围内(page、request、seesion和application)有效的变量。

相比使用声明标识插入java代码来进行变量的声明,如<%! 声明变量 %><c:set>标签会更方便快捷。<c:set>标签有四种语法格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%--第一种语法格式:创建一个有界变量,并用value属性指定一个字符串或现存的有界对象--%>
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
<%--例1.1:创建字符串“http://gongchuangsu.github.io”,并将它赋给新创建的页面范围变量domain--%>
<c:set var="domain" value="http://gongchuangsu.github.io"/>
<%--例1.2:创建一个引用请求范围的对象position的页面范围变量job--%>
<c:set var="job" value="${requestScope.position}" scope="page"/>

<%--第二种语法格式:创建一个有界变量,并用标签体指定一个字符串或现存的有界对象--%>
<c:set var="varName" [scope="{page|request|session|application}"]>
标签体
</c:set>

<%--第三种语法格式:设置有界对象的属性值,并通过value属性进行赋值--%>
<c:set target="target" property="propertyName" value="value"/>
<%--例3:将字符串“Beijing”赋予有界对象address的city属性-%>
<c:set target="${address}" property="city" value="Beijing"/>

<%--第四种语法格式:设置有界对象的属性值,并通过标签体进行赋值--%>
<c:set target="target" property="propertyName">
标签体
</c:set>

参数说明:

  • var:要创建的有界变量名。
  • value:用于指定一个字符串或现存的有界对象,可以使用EL。
  • scope:用于指定变量的作用域,默认为page。
  • target:用于指定储存变量值或标签体的目标对象,必须是JavaBean或Map集合对象。
  • property:用于指定目标对象存储数据的属性名。

注意target属性必须通过EL表达式或JSP表达式来指定JavaBean或Map集合对象,而不能直接指定。

remove 变量移除标签

<c:remove>标签用于删除有界变量,其语法格式如下;

1
<c:remove var="varName" [scope="{page|request|session|application}"]/>

参数说明:

  • var:要删除的有界变量的名称
  • scope:指定要删除的有界变量的范围。如果没有指定有界变量的范围,将分别在page、request、session和application的范围内查找要移除的变量,并移除。

注意:当指定的要移除的变量不存在时,并不会抛出异常。

catch 捕获异常标签

<c:catch>标签用于捕获程序中出现的异常,其语法格式如下:

1
2
3
<c:catch [var="exception"]>
// 可能存在异常的代码
</c:catch>

参数说明:
var:可选属性,用于指定存储异常信息的变量。

URL标签

import 导入标签

<c:import>标签用于导入站内或其他网站的静态或动态文件到Web页面中。与JSP动作标识<jsp:include>相似,但不同的是,<jsp:include>只能导入站内资源。其语法格式有以下两种:

1
2
3
4
5
6
7
8
9
<%--第一种语法格式--%>
<c:import url="url" [context="context"] [var="name"] [scope="scope"] [charEncoding]="encoding">
标签体
</c:import>

<%--第二种语法格式--%>
<c:import url="url" varReader="name" [context="context"] [scope="scope"] [charEncoding]="encoding">
标签体
</c:import>

参数说明:

  • url:用于指定被导入的文件资源的URL地址。
  • context:上下文路径。
  • var:用于指定存储所引入文本的变量。
  • scope:用于指定var属性的作用域。
  • varReader:用于指定一个变量名,该变量用于以Reader类型存储被包含文件内容。
  • charEncoding:用于指定被导入文件的编码格式,默认为ISO-8859-1。

注意:如果指定的url属性为null、空或者无效,将抛出javax.servlet.ServletException异常。

url 动态生成URL标签

<c:url>标签用于将URL格式化一个字符串,并存储在一个变量中,可以与<c:param>标签相结合动态添加URL的参数信息。其语法格式有以下两种:

1
2
3
4
5
6
7
<%--第一种语法格式--%>
<c:url value="url" [var="varName"] [scope="scope"] [context="context"]/>

<%--第二种语法格式--%>
<c:url value="url" [var="varName"] [scope="scope"] [context="context"]>
<c:param />
</c:url>

参数说明:

  • value:用于指定将要格式化的URL地址,可以使用EL。
  • var:用于指定变量名称,该变量用于保存新生成的URL字符串。
  • scope:用指定变量的作用域。
  • context:上下文路径。

redirect 重定向标签

<c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL。其语法格式有以下两种:

1
2
3
4
5
6
7
<%--第一种语法格式--%>
<c:redirect url="url" [context="context"]/>

<%--第二种语法格式--%>
<c:redirect url="url" [context="context"]>
<c:param/>
</c:redirect>

参数说明:

  • url:用于指定待定向资源的URL,可以使用EL。
  • context:上下文路径。

param 传递参数标签

<c:param>标签用于与其他标签组合,以提供参数信息。其语法格式如下:

1
<c:param name="paramName" value="paramValue"/>

参数说明:

  • name:用于指定参数名,可以使用EL。
  • value:用于指定参数值,可以使用EL。

流程控制标签

if 条件判断标签

<c:if>标签用于根据不同的条件处理不同的业务。其语法格式有以下两种:

1
2
3
4
5
6
7
<%--第一种语法格式--%>
<c:if test="condition" var="name" [scope=page|request|session|application]/>

<%--第二种语法格式--%>
<c:if test="condition" var="name" [scope="scope"]/>
标签体
</c:if>

参数说明:

  • test:用于指定条件表达式,可以使用EL。
  • var:可选属性,用于指定变量名,用于保存test属性的判断结果。
  • scope:用于指定变量的作用域,默认为page。

choose、when、otherwise 条件选择标签

<c:choose>标签可以根据不同的条件完成指定的业务逻辑,如果没有符合的条件就执行默认条件的业务逻辑。<c:choose>标签中必须嵌套一个或多个<c:when>标签,并且每一个<c:when>标签都表示一种可以计算和处理的情况。<c:otherwise>标签用于默认的标签块,而且必须放在最后一个<c:when>标签之后。其语法格式如下所示:

1
2
3
<c:choose>
标签体 <%--由`<c:when>`标签和`<c:otherwise>`标签组成--%>
</c:choose>

说明:<c:otherwise>标签体只有在其他的<c:when>标签的条件都不成立时才会被执行;同时,若前面的<c:when>标签的条件成立,则执行该标签体,并退出,而不会去判断下一个<c:when>标签条件。

<c:when>标签的语法格式如下:

1
2
3
<c:when test="condition">
标签体
</c:when>

<c:otherwise>标签的语法格式如下:

1
2
3
<c:otherwise>
标签体
</c:otherwise>

遍历标签

forEach 循环标签

<c:forEach>标签可以根据循环条件遍历数组和集合类中所有或部分数据。其语法格式有以下两种:

1
2
3
4
5
6
7
8
9
10
<%--第一种语法格式:固定次数的重复执行标签体--%>
<c:forEach [var="varName"] begin="begin" end="end" step="step">
标签体
</c:forEach>

<%--第二种语法格式:用于遍历对象集合--%>
<c:forEach items="collection" [var="varName"] varStatus="varStatusName"
begin="begin" end="end" step="step">
标签体
</c:forEach>

参数说明:

  • items:用于指定被循环遍历的对象,多用于数组与集合类,可以通过EL进行指定。
  • var:用于指定循环体的变量名,用于存储items属性指定的对象的成员。
  • begin:用于指定循环的起始位置,可以使用EL。
  • end:用于指定循环的终止位置,可以使用EL。
  • step:用于指定循环的步长,可以使用EL。
  • verStatus:用于指定循环的状态变量,该属性有四个状态变量,如下表所示。
状态变量 类型 描述
index Int 当前循环的索引值,从0开始
count Int 当前循环的循环计数,从1开始
first Boolean 是否为第一次循环
last Boolean 是否为最后一次循环

例:通过<c:forEach>循环标签显示“1,2,3,4,5,”

1
2
3
<c:forEach var="x" begin="1" end="5">
<c:out value="${x}"/>,
</c:forEach>

例:遍历list集合

1
2
3
4
5
6
7
8
9
10
11
12
13
<%
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
request.setAttribute("list",list);
%>
<c:forEach items="${requestScope.list}" var="keyword" varStatus="id">
${id.index}&nbsp;${keyword}
</c:forEach>
<%--
输出:A B C
--%>

注意:在使用<c:forEach>循环标签时,var属性指定的变量只在循环体内有效,可通过EL直接使用。

forTokens 迭代标签

<c:forTokens>迭代标签用于根据指定的分隔符来分割字符串并迭代输出。其语法格式如下所示:

1
2
3
4
<c:forTokens items="Sring" delims="char" [var="name"]
[begin="begin"] [end="end"] [step="step"] [varStatus="statusName"]>
标签体
</c:forTokens>

参数说明:

  • items:用于指定要迭代的String对象。
  • delims:用于指定分割字符串的分隔符,可以同时有多个分隔符。
  • var:用于指定变量名,该变量中保存了分隔后的字符串。
  • begin:用于指定迭代开始的位置,索引值从0开始。
  • end:用于指定迭代结束的位置。
  • step:用于指定迭代的步长,默认步长为1。
  • verStatus:用于指定循环的状态变量。

函数标签库

函数标签库提供了通用的字符串处理函数。

函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首位的空白符

格式标签库

格式化标签库用来格式化并输出文本、日期、时间、数字等,处理和解决国际化相关的问题。

标签 描述
formatNumber 用于格式化数字
parseNumber 用来解析数字,百分数,货币
formatDate 用于格式化日期
parseDate 用于解析日期
timeZone 用于指定时区,以供其他标签使用
setTimeZone 用来复制一个时区对象至指定的作用域

SQL标签库

SQL标签库提供了基本的访问关系型数据的能力。

标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

XML标签库

XML标签库提供了创建和操作XML文档的标签。

标签描述
<x:out>与<%= … >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when>和<x:otherwise>的父标签
<x:when><x:choose>的子标签,用来进行条件判断
<x:otherwise><x:choose>的子标签,当<x:when>判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform>共同使用,用于设置XSL样式表

JSTL的配置

在Oracle官方网站下载JSTL APIJSTL Implementation这两个JAR文件,并将这两个JAR文件复制到应用JSTL的每个应用程序的WEB-INF/lib目录下。

参考资料

1、菜鸟教程
2、Java Web 从入门到精通
3、Servlet、JSP和Spring MVC初学指南