JSTL
一、JSTL简介
JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合、条件测试、XML处理,甚至数据库访问和数据操作等常见问题。
JSTL下载:https://pan.baidu.com/s/1az54R_a8GkG0mwHDIjHjNg
然后将lib下的两个jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
二、JSTL库
JSTL 1.2 中的标签可以分为5类区域,如下表:
区域 | 子函数 | URI | 前缀 |
核心 | 变量支持 | http://java.sun.com/jsp/jstl/core | c |
流控制 | |||
URL管理 | |||
其他 | |||
XML | 核心 | http://java.sun.com/jsp/jstl/xml | x |
流控制 | |||
转换 | |||
国际化 | 语言区域 | http://java.sun.com/jsp/jstl/fmt | fmt |
消息格式化 | |||
数字和日期格式化 | |||
数据库 | SQL | http://java.sun.com/jsp/jstl/sql | sql |
函数 | 集合长度 | http://java.sun.com/jsp/jstl/functions | fn |
字符换操作 |
在JSP页面使用JSTL库,必须通过以下格式使用taglib指令:
<%@ taglib uri="uri" prefix="prefix" %>
例如,要使用Core库,必须在JSP页面的开头处做以下声明:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
三、一般行为
下面介绍Core库中用来操作有界变量的三个一般行为:out、set、remove。
注意:在标签的语法中,[ ]表示可选的属性。如果值带下划线,则表示为默认值。
1. out标签
out标签在运算表达式时,是将结果输出到当前的JSPWriter。out语法有两种,即有body content和没有body content:
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] /> <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] > body content </c:out>
属性 | 类型 | 描述 |
value | 对象 | 要计算的表达式 |
escapeXml | 布尔 | 表示结果中的字符<、>、&、’和”将被转换成相应的实体码 |
default | 对象 | 默认值 |
例如,在下面的out标签中,如果在HttpSession中没有找到myVar变量,就会显示应用程序范围的变量myVar值。如果没有找到,则输出一个空字符串。
<c:out value="${sessionScope.myVar }" default="${applicationScope.myVar }" />
2. set标签
利用set标签,可以完成以下工作:
(1)创建一个字符串和一个引用该字符串的有界变量。
(2)创建一个引用现存有界对象的有界变量。
(3)设置有界对象的属性。
set标签的语法有四种形式:
//第一种创建有界变量,并用value属性在其中定义一个要创建的字符串或者现有对象 <c:set value="value" var="varName" [scope="{page|request|session|application}"] /> //第二种与第一种相似,只是赋值在body content中完成 <c:set var="varName" [scope="{page|request|session|application}"] /> body content </c:set> //第三种是设置有界对象的属性值。 <c:set target="target" property="propertyName" value="value" /> //例:将字符串Tokyo赋予有界对象address的city属性 <c:set target="${address}" property="city" value="Tokyo" /> //注:必须在target中用EL表达式来引用这个有界对象 //第四种与第三种相似,只是赋值在body content中完成 <c:set target="target" property="propertyName" > body content </c:set> //例:将字符串Beijing赋予有界对象address的city属性 <c:set target="${address}" property="city">Beijing</c:set>
3. remove标签
remove标签用于删除有界变量,语法如下:
<c:remove var="varName" [scope="{page|request|session|application}"] />
注意,有界变量引用的对象不能删除。
四、条件行为
条件行为用于处理页面输出取决于特定输出值的情况,这在Java中是利用if、if...else和switch声明解决的。
JSTL中执行条件行为的有4个标签,即if、choose、when和otherwise标签。
1. if 标签
if 标签是对一个条件进行测试,如果结果为TRUE,则处理它的body content。测试结果保存在Boolean对象中,并创建有界变量来引用这个Boolean对象。
if 的语法有两种:
//没有body content <c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] /> //有body content <c:if test="testCondition" [var="varName"] [scope="{page|request|session|application"] > body content </c:if>
例如,下面测试user和password参数值是否分别为ken和blackcomb,并将结果保存在页面范围的变量loggedIn中。
<c:if var="loggedIn" test="${param.user=='ken'&¶m.password=='blackcomb'}" /> ${(loggedIn) ? "You logged in successfully" : "Login failed" }
2. choose、when和otherwise标签
choose和when标签的作用与Java中的switch和case类似。choose标签中必须嵌有一个或多个when标签,并且每个when标签都表示一种可以计算和处理的情况。otherwise标签用于默认的条件块,假如没有任何一个when标签测试条件结果为TRUE,它就会得到处理。
choose和otherwise标签没有属性。when标签必须带有定义测试条件的test属性。
<c:choose> <c:when test="${param.status=='full'}"> You are a full member </c:when> <c:when test="${param.status=='student'}"> You are a student member </c:when> <c:otherwise> Please register </c:otherwise> </c:choose>
五、遍历行为
当需要无数次地遍历一个对象集合时,遍历行为就是十分重要。JSTL提供了 forEach 和 forTokens 两个执行遍历行为的标签。
1. forEach 标签
forEach 可以遍历的对象包括java.util.Collection 和 java.util.Map 的所有实现,以及对象数组或者主类型。也可以遍历java.util.Iterator 和 java.util.Enumration,但不应该在多个行为中使用Iterator 或者 Enumeration,因为无法重置Iterator 和 Enumeration。
forEach 标签的语法有两种形式。
//第一种形式是固定次数地重复body content <c:forEach [var="varName"] begin="begin" end="end" step="step"> body content </c:forEach> //第二种形式用于遍历对象集合 <c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forEach>
forEach 标签的属性如下表:
属性 | 类型 | 描述 |
var | 字符串 | 引用遍历的当前项目的有界变量名称 |
items | 支持的任意类型 | 遍历的对象集合 |
varStatus | 字符串 | 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus |
begin | 整数 |
如果指定items,遍历将从指定索引处的项目开始,例如,集合中第一个项目的索引为0。 如果没有指定items,遍历将从设定的索引值开始。如果指定,begin的值必须大于或者等于0 |
end | 整数 |
如果指定items,遍历将在(含)指定索引处的项目结束。 如果没有指定items,遍历将在索引到达指定值时结束。 |
step | 整数 |
遍历将只处理间隔指定step的项目,从第一个项目开始。在这种情况下,step的值必须大于或者等于1 |
forEach 标签有一个类型为javax.servlet.jsp.jstl.core.LoopTagStatus 的变量 varStatus。LoopTagStatus 接口带有count属性,它返回当前遍历的“次数”。
2. forTokens 标签
forTokens 标签用于遍历以特定分隔符隔开的令牌,其语法如下:
<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]> body content </c:forTokens>
属性 | 类型 | 描述 |
var | 字符串 | 引用遍历的当前项目的有界变量名称 |
items | 支持的任意类型 | 要遍历的tokens字符串 |
varStatus | 字符串 | 保存遍历状态的有界变量名称。类型值为javax.servlet.jsp.jstl.core.LoopTagStatus |
begin | 整数 | 遍历的起始索引,此处索引是从0开始的。如有指定,begin的值必须大于等于0 |
end | 整数 | 遍历的终止索引,此处索引是从0开始的 |
step | 整数 | 遍历将只处理间隔指定step的token,从第一个token开始。如有指定,step的值必须大于等于1 |
delims | 字符串 | 一组分隔符 |
六、格式化行为
1. formatNumber 标签
用于格式化数字。
<fmt: formatNumber value="numericValue" />
2. formatDate标签
用于格式化日期。
<fmt: formatDate value="date" />
3. timeZone标签
用于定义时区,使其body content中的时间信息按指定时区进行格式化。
<fmt: timeZone value="timeZone"> body content </fmt: timeZone>
4. setTimeZone标签
用于将指定时区保存在一个有界变量或者时间配置变量中。
<fmt: setTimeZone value="timeZne" />
5. parseNumber标签
用于将字符串表示的数字、货币或者百分比解析成数字。
//第一种 <fmt: parseNumber value="numericValue" /> //第二种 <fmt: parseNumber> numeric value to parsed </fmt: parseNumber>
6. parseDate标签
以区分地域的格式解析以字符串表示的日期和时间。
//第一种 <fmt: parseDate value="dateString" /> //第二种 <fmt: parseDate> date value to be parsed </fmt: parseDate>
注:具体的可选属性请上网查阅。
七、函数
JSTL还定义了一套可以在EL表达式中使用的标准函数,这些函数都集中在function标签库中。
指令:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
调用:
${ fn: functionName }
函数 | 描述 | 语法 | 范例 |
contains | 测试一个字符串中是否包含指定子字符串 | contains(string, substring) | ${fn:contains("Marry Steven", "Steven")} |
containsIngoreCase | 与contains相似,但是区分大小写 | containsIngoreCase(string, substring) | ${fn:containsIgnoreCase("Marry","MARRY")} |
endsWith | 测试一个字符串是否以指定的后缀结尾 | endsWith(string, suffix) | ${fn:endsWith("HelloWorld","World")} |
escapeXml | 用于给String编码 | escapeXml(string) | ${fn:escapeXml("Use <br/> to change lines")} |
indexOf | 返回子字符串在某个字符串第一次出现时的索引 | indexOf(string, substring) | ${fn:indexOf("carry on","on")} |
join |
将一个String数组中的所有元素合并成一个字符串, 并用指定分隔符分开 |
join(array,separator) | ${fn:join(myArray,",")} |
length | 用于返回集合中的项目数,或者字符串的字符数 | length(input) | ${fn:length("HelloWorld")} |
replace | 将字符串中出现的所有beforeString用afterString替换 | replace(string,beforeSubString,afterSubString) | ${fn:replace("HelloWorld","o","e")} |
split | 用于将一个字符串分离成一个子字符串数组 | split(string, seperater) | ${fn:split("my,world")} |
startsWith | 测试一个字符串是否以指定前缀开头 | startsWith(string, prefix) | ${fn:startsWith("hello","h")} |
substring | 截取指定索引开始的子字符串 | substring(string,beginIndex,endIndex) | ${fn:substring("Steven",0,3)} |
substringAfter | 返回指定子字符串第一次出现后的字符串部分 | substringAfter(string, substring) | ${fn:substringAfter("Steven","ev")} |
substringBefore | 返回指定子字符串第一次穿线前的字符串部分 | substringBefore(string, substring) | ${fn:substringBefore("Steven","ev")} |
toLowerCase | 将一个字符串转换成它的小写版本 | toLowerCase(string) | |
toUpperCase | 将一个字符串转换成大写版本 | toUpperCase(string) | |
trim | 删除一个字符串开头和结尾的空白 | trim(string) |
--- 天若有情天亦老,人间正道是沧桑 ---