关键词:Java 标准标签库( Java Standard Tag Libraries, JSTL)
1 JSTL概述
JSTL是著名开源项目Jakarta Taglibs Project(http://jakarta.apache.org/taglibs/index.html)的研究成果,JSTL为JSP页面开发者提供了最通用的标签。功能主要包括通用编程逻辑封装、数据库相关操作、XML相关操作、国际化相关操作以及其他内容,并随着越来越多的人的开发和使用,将进一步提供更多的功能。目前,JSTL主要包含在两个包中:stl.jar和standard.jar,其中在standard.jar包的/META-INF子目录下包含了相应的所有TLD文件,根据功能分为c*.tld、fmt*.tld、x*.tld、sql*.tld、permittedTaglibs.tld和scriptfree.tld,JSTL1.1版本中由于增加了常用函数库标签,所有还包括一个fn.tld。这些TLD文件是根据标签功能来划分的,各自对应的功能很明显。需要补充说明的是permittedTaglibs.tld和scriptfree.tld:permittedTaglibs.tld对应的是标签验证功能的,即定义了JSP页面可以使用哪些标签;而scriptfree.tld对应的是JSP页面验证功能的,它实现了更严格的JSP页面内容验证,可以验证页面是否可以包含形如“<%! declarations %>”的java声明、形如“<% scriptlets %>”的Java代码段以及形如<% =expressions %>的Java表达式。
2 JSTL使用步骤
JSTL1.0的使用要求JSP1.2或以上Web容器,JSTL1.1的使用要求JSP2.0Web容器,目前Tomcat5.x支持JSP2.0。
以1.0版本为例,JSTL的使用应该遵循以下步骤(假如只使用核心库,要使用其他部分可以依此类推):
1、 将c-1_0.tld和c-1_0-rt.tld拷到"WEB-INF子目录下,将jstl.jar和standard.jar拷贝到"WEB-INF "lib子目录
2、 在web.xml中加入如下语句:
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c-1_0.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-1_0-rt.tld</taglib-location>
</taglib>
3、 根据是否需要EL支持(关于EL的详细内容,可以参考《taglib技术指导书-入门篇》和JSTL规范)在需要使用标签的页面上加入<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>或<%@ taglib prefix="c-rt" uri="http://java.sun.com/jstl/core-rt" %>。如果需要同时使用,在页面上把上述两条指令都加上就可以了。
(根据试验,使用JSTL时,在JSP2.0容器中好像不需要在web.xml中定义taglib了)
3 JSTL核心库标签详解
JSTL核心库主要包括以下几类:实现变量定义、内容输出等功能的一般标签、实现分支结构的标签、实现迭代功能的标签和实现其他一些通用功能的标签。本文重点描述前三类的使用方法,同时在描述时约定:[]表示可选,下划线表示默认值;属性列表中的Dyn字段表示该属性值是否允许动态指定。
3.1 一般标签
一般标签包括:<c:out>、<c:set>、<c:remove>和<c:catch>。
<c:out>:
实现类似于<%=expr%>的功能。
语法:
<c:out value=”value” [escapeXml=”{true|false}”]>
[default=”defaultValue”] />
或
<c:out value=”value” [escapeXml=”{true|false}”]>
default value
</c:out>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
value
|
true
|
Object
|
指定被求值的表达式字符串。如果指定的是静态字符串则原样输出;如果指定的是一个表达式,而且求值结果为null或者表达式求值失败则输出default中指定的字符串;如果表达式求值失败,而且没有指定default,则抛出异常。
|
escapeXml
|
true
|
boolean
|
是否将求值结果中的诸如<,>,&,’,”之类的特殊字符转换为其对应的字符编码输出。
|
default
|
true
|
Object
|
表达式求值的结果为null时或者表达式求值失败时的默认输出
|
<c:set>
实现在指定范围内的变量定义功能。
语法:
<c:set value=”value”
var=”varName” [scope=”{page|request|session|application}”]/>
或
<c:set var=”varName” [scope=”{page|request|session|application}”]>
body content
</c:set>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
value
|
true
|
Object
|
指定被求值的表达式字符串,如果求值结果为null,则自动清除在指定的scope范围内由var定义的变量,否则将求值结果赋给var属性定义的变量名,如果没有指定value属性,则将body content的内容赋给var属性定义的变量名。
|
var
|
false
|
String
|
变量名
|
scope
|
false
|
String
|
所定义变量的有效范围:page|request|session|application中的一个
|
<c:remove>
清除指定范围内的变量定义
语法:
<c:remove var=”varName”
[scope=”{page|request|session|application}”]/>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
var
|
false
|
String
|
指定要去除的变量名,如果没有指定scope,调用PageContext.removeAttribute(varName)清除变量,如果指定了,则调用PageContext.removeAttribute(varName, scope)清除。
|
scope
|
false
|
String
|
指定查找范围:page|request|session|application中的一个
|
<c:catch>
用于捕获其内嵌自定义标签抛出的异常。使用
语法:
<c:catch [var=”varName”]>
nested actions
</c:catch>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
var
|
false
|
String
|
将出错异常保留在一个变量中,该变量范围只能是page,如果不定义该属性,则<c:catch>不保留异常信息
|
3.2 分支标签
分支标签包括:<c:if>、<c:choose>、<c:when>和<c:othewise>。
<c:if>
实现单分支结构。
语法:
<c:if test=”testCondition”
var=”varName” [scope=”{page|request|session|application}”]/>
或
<c:if test=”testCondition”
[var=”varName”] [scope=”{page|request|session|application}”]>
body content
</c:if>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
test
|
true
|
c: boolean or Boolean
c_rt: boolean
|
条件表达式。为真才对body content求值
|
var
|
false
|
String
|
可以将表达式求值的结果(Boolean型)保存到指定的变量中
|
scope
|
false
|
String
|
定义变量名的范围,var和scope属性必须同时指定
|
<c:choose>
和<c:otherwise>以及<c:when>联合起来实现多分支结构,相当于switch,其中包含空白、一个或多个<c:choose> 标签、0个或1个<c:otherwise>标志。
语法:
<c:choose>
body content (<when> and <otherwise> subtags)
</c:choose>
属性列表:无
<c:when>
和<c:otherwise>以及<c:choose>联合起来实现多分支结构,必须是<c:choose>的子标签
语法:
<c:when test=”testCondition”>
body content
</c:when>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
test
|
true
|
boolean or Boolean (c)
boolean (c_rt)
|
条件表达式
|
<c:otherwise>
和<c:when>以及<c:choose>联合起来实现多分支结构,必须是<c:choose>的子标签,必须是整个分支中最后一个。
语法:
<c:otherwise>
conditional block
</c:otherwise>
属性列表:无
<c:choose>、<c:when>和<c:otherwise>三者经常采用如下方式联合使用:
<c:choose>
<c:when test="testCondition">
body content1
</c:when>
<c:when test="testCondition">
body content2
</c:when>
<c:otherwise>
body content3
</c:otherwise>
</c:choose>
相当于实现
switch(choic)
{
case 1:
...
break;
case 2:
...
break;
default:
...
break;
}
3.3 迭代标签
分支标签包括:<c:forEach>和<c:forToken>。
<c:forEach>
实现循环功能。
语法:
<c:forEach [var=”varName”] items=”collection”
[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]>
body content
</c:forEach>
或
<c:forEach [var=”varName”]
[varStatus=”varStatusName”]
begin=”begin” end=”end” [step=”step”]>
body content
</c:forEach>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
var
|
false
|
String
|
用于保存当前迭代item的变量,其可见范围仅限于该标签主体中,其类型取决于所迭代对象的类型
|
items
|
true
|
Arrays
Collection
Iterator
Enumeration
Map
String
|
迭代对象
|
varStatus
|
false
|
String
|
用于保存当前迭代状态的变量,该变量保存的对象是
javax.servlet.jsp.jstl.core.LoopTagS
tatus. 其可见范围同样仅限于该标签主体中
|
begin
|
true
|
int
|
如果指定了items属性,则begin代表items的起始位置,默认起始位置是0,如果没有指定items属性,begin就代表当前的起始迭代值。必须>=0
|
end
|
true
|
int
|
如果指定了items属性,则end代表items的结束位置,默认起始位置是0,如果没有指定items属性,end就代表当前的结束迭代值。必须>=begin
|
step
|
true
|
int
|
迭代步长。必须>1
|
<c:forTokens>
专门针对String列表的迭代标志,可以自定义字符串间的分隔符。
语法:
<c:forTokens items=”stringOfTokens” delims=”delimiters”
[var=”varName”]
[varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]>
body content
</c:forEach>
属性列表:
Name
|
Dyn
|
Type
|
Description
|
var
|
false
|
String
|
用于保存当前迭代item的变量,其可见范围仅限于该标签主体中,其类型取决于所迭代对象的类型
|
items
|
true
|
String
|
迭代对象:用delims属性指定的分隔符字符串分隔的StringTokenizer 实例
|
delims
|
true
|
String
|
分隔符
|
varStatus
|
false
|
String
|
用于保存当前迭代状态的变量,该变量保存的对象是
javax.servlet.jsp.jstl.core.LoopTagS
tatus. 其可见范围同样仅限于该标签主体中
|
begin
|
true
|
int
|
代表当前的起始迭代值。必须>=0
|
end
|
true
|
int
|
当前的结束迭代值。必须>=begin
|
step
|
true
|
int
|
迭代步长。必须>1
|