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:可选属性,用于指定是否转换特殊字符,如将
<
转换为<
,默认值为true,表示转换。- default:可选属性,用于指定当value属性值为null时,将要显示的默认值。当value属性值为null同时defalut属性值为null时,该标签将输出一个空的字符串。
特殊字符 | 字符实体码 | 特殊字符 | 字符实体码 |
---|---|---|---|
< |
< |
> |
> |
' |
' |
" |
" |
& |
& |
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} ${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 API和JSTL Implementation这两个JAR文件,并将这两个JAR文件复制到应用JSTL的每个应用程序的WEB-INF/lib
目录下。
参考资料
1、菜鸟教程
2、Java Web 从入门到精通
3、Servlet、JSP和Spring MVC初学指南