9.3.8 <c:forTokens>标签

优质
小牛编辑
129浏览
2023-12-01

<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}&nbsp;&nbsp;

</c:forTokens>

<hr>

使用"^"、"*"和"%"作为分隔符<br>

要迭代的字符串:"汽车:火箭*轮船:飞机%自行车"<br>

迭代结果:

<c:forTokens var="s" items="汽车^火箭*轮船^飞机%自行车" delims="^*%">

${s}&nbsp;&nbsp;

</c:forTokens> 

<hr>

使用"^"、"*"和"%"作为分隔符,某些子字符串是空串,会被自动忽略<br>

要迭代的字符串:"汽车^火箭*轮船^%自行车%%^*"<br>

迭代结果:

<c:forTokens var="s" items="汽车^火箭*轮船^%自行车%%^*"

   delims="^*%" varStatus="status">

${s}(${status.index})&nbsp;&nbsp;

</c:forTokens> 

<hr>

在浏览器地址栏中输入如下的URL:

http://localhost:8080/demo/chapter9/forTokens.jsp

浏览器的输出结果如图9.16所示。

16

图9.16 使用<c:forTokens>标签迭代字符串