9.3.8 <c:forTokens>标签
<c:forTokens>标签用于迭代指定分隔符分隔的字符串。分隔符号必须是单个字符,但<c:forTokens>支持包含多个分隔符的字符串。假设“,;?”为三个分隔符,那么<c:forTokens>标签对“a,b;c?d”字符串迭代后,可以获得四个迭代元素(a,b,c,d)。
虽然<c:forEach>标签也可以对用分隔符分隔的字符串进行迭代,但<c:forEach>标签只支持逗号分隔符,而<c:forTokens>标签支持更多的分隔符,而且还支持多个分隔符。
<c:forTokens>标签的语法格式如下:
<c:forTokens items="stringOfTokens" delims="delimiters"
[var="varName"] [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forTokens>
<c:forTokens>标签的属性说明如表9.8所示。
表9.8 <c:forTokens>标签的属性
属性名 | 是否支持动态属性值 | 属性类型 | 属性描述 |
var | false | String | 指定将当前迭代的子字符串保存在page域中的属性名。 |
items | true | String | 指定将要迭代的字符串。 |
delims | true | String | 指定一个或多个分隔符。 |
varStatus | false | String | 指定将当前迭代元素的状态信息对象保存在page域中的属性名。该状态信息对象的类型是javax.servlet.jsp.jstl.core.LoopTagStatus。读者可以从JSTL规范或JSTL源代码中查看这个接口的信息。 |
begin | true | int | 指定从第begin个子字符串开始迭代。begin的值从0开始。 |
end | true | int | 指定迭代到第end个子字符串。 |
step | true | int | 指定迭代的步长,即每次迭代后的索引的增量。 |
<c:forTokens>标签实际上是通过java.util.StringTokenizer类来迭代有分隔符的字符串的,如下面的代码所示:
java.util.StringTokenizer st = new java.util.StringTokenizer("a,b;c", ",;", true);
while(st.hasMoreElements())
{
System.out.println(st.nextElement());
}
上面的代码使用了两个分隔符:“,”和“;”,来迭代“a,b;c”。因此会分别输出a,b,c三个子字符串。下面的代码使用了<c:forTokens>标签实现了和上面的代码相同的功能:
<c:forTokens var="s" items="a,b;c" delims=",;">
${s}<br>
</c:forTokens>
在使用<c:forTokens>标签时应注意如下几点:
1 如果指定begin属性,该属性值必须大于或等于0,否则会抛出javax.servlet.jsp.JspTagException异常。
2 如果指定end属性,该属性值不能小于begin属性的值,否则不会进行迭代操作。
3 如果begin属性值在有效的范围内,但end属性值大于或等于字符串中子字符串的个数,则迭代到最后一个子字符串为止。
4 如果指定step属性,该属性的值必须大于或等于1,否则会抛出javax.servlet.jsp.JspTagException异常。
5 如果items属性值为null,或通过items属性的动态属性值指定的字符串不存在,items属性值将被作为一个空集合对待。<c:forTokens>标签不会进行迭代操作。
6 如果delims属性值为null或空串,items属性的值会被当作没有分隔符的字符串。也就是说,<c:forTokens>标签只会迭代一次,迭代的子字符串就是items属性值本身。
7 如果某个迭代子字符串是空串,<s:forTokens>标签会自动忽略这个空串。
forTokens.jsp页面是一个使用<c:forTokens>标签迭代字符串的例子,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
使用"^"作为分隔符<br>
要迭代的字符串:"one^two^three^four"<br>
迭代结果:
<c:forTokens var="s" items="one^two^three^four" delims="^" >
${s}
</c:forTokens>
<hr>
使用"^"、"*"和"%"作为分隔符<br>
要迭代的字符串:"汽车:火箭*轮船:飞机%自行车"<br>
迭代结果:
<c:forTokens var="s" items="汽车^火箭*轮船^飞机%自行车" delims="^*%">
${s}
</c:forTokens>
<hr>
使用"^"、"*"和"%"作为分隔符,某些子字符串是空串,会被自动忽略<br>
要迭代的字符串:"汽车^火箭*轮船^%自行车%%^*"<br>
迭代结果:
<c:forTokens var="s" items="汽车^火箭*轮船^%自行车%%^*"
delims="^*%" varStatus="status">
${s}(${status.index})
</c:forTokens>
<hr>
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter9/forTokens.jsp
浏览器的输出结果如图9.16所示。
图9.16 使用<c:forTokens>标签迭代字符串