forEach>动作将其体反复计算固定次数,或者针对一个集合中的每个元素分别计算一次体。
当前元素(如果未指定集合则为当前索引)和迭代状态可以通过嵌套变量提供给体中的动作元素。
此动作接受属性表中所列的类型集合。
当前元素的类型即为底层集合的类型,仅有两个例外。
对于一个基本类型的数组,当前元素将作为相应包装类(Integer、Float等等)的一个实例提供。
对于一个java.util.Map,当前元素则作为一个java.util.Map.Entry提供。
语法:
语法1:
基于集合元素进行迭代
forEach items="collection" [var="var"] [varStatus="varStatus"][begin="startIndex"] [end="stopIndex"] [step="increment"]>
JSP elements
forEach>
语法2:
迭代固定次数
forEach [var="var"] [varStatus="varStatus"] begin="startIndex" end="stopIndex" [step="increment"]>
JSP elements
forEach>
属性:
属性名
描述
类型
是否接受动态值
是否支持EL
是否必须
默认值
说明
begin
开始位置
int
Y
Y
否
0
结合集合使用时的开始索引,从0计起。
对于集合来说默认为0
end
结束位置
int
Y
Y
否
最后一个成员
结合集合使用时的结束索引(元素引要小于等于此结束索引),从0计起。
默认为集合的最后一个元素。
如果end小于begin,则根本不计算体集合,迭代即要针对此集合进行。
items
被迭代的集合对象
Collection, Iterator, Enumeration,Map,数组
Y
Y
否
无
集合,迭代即要针对此集合进行。
step
步长
int
Y
Y
1
每次迭代时索引的递增值。
默认为1。
var
当前项目
String
N
N
否
无
保存当前元素的嵌套变量的名字。
varStatus
循环状态
String
N
N
否
无
保存LoopTagStatus对象的嵌套变量的名字。
Null 和 错误处理
.假若items为null时,则表示为一空的集合对象
.假若begin大于或等于items时,则迭代不运算
注意:
varName的范围只存在forEach>的本体中,如果超出了本题,则不能取得varName的值。
如:
forEach items="${atts}" var="item">
forEach>
${item}
${item}则不会显示item的内容。
forEach>除了支持数组之外,还有标准的J2SE的结合类型,例如:
ArrayList,List,LinkedList,Vector,Stack和Set等等;另外包括java.util.Map类的对象,例如:
HashMap,Hashtable,Properties,Provider和Attributes。
另外forEach>还提供了varStatus属性,主要用来存放现在指到成员的相关信息。
例如:
我们写成varStatus="s",那么就会把信息存放到名称为s的属性当中。
varStatus属性还提供另外四个属性:
index、count、fist和last,它们个自的意义如下:
属性 类型 意义
index number 现在指到成员的索引
count number 总共指到成员的总和
first boolean 现在指到成员是否为第一个
last boolean 现在指到成员是否为最后一个
实例:
-------------------------------------------------------------------------------------------------------------------Example1
<%@page contentType="text/html;charset=gb2312"%>
<%@taglib prefix="c" uri=">
<%
String atts[] = new String[5];
atts[0]="hello";
atts[1]="this";
atts[2]="is";
atts[3]="a";
atts[4]="girl";
request.setAttritue("atts",atts);
%>
forEach items="${atts}" var="item" varStatus="s">
out value="${item}"/>的四种属性>
index:
${s.index}
count:
${s.count}
first:
${s.first}
last:
${s.last}
forEach>
----------------------------------------------------------------------------------------------------------------------
Example2综合实例
forEach items="${model.options}"var="forum">
choose>
whentest="${forum.id == model.forumId}">
${forum.name}
when>
otherwise>
${forum.name}
otherwise>
choose>
forEach>
Example3奇偶行样式
forEach items="${model.page.list}" var="observer" varStatus="loop">
迭代observer |
迭代observer |
...
forEach>
Example4分页条1
setvar="page" value="${model.page}">
set>
page
(1)" class="gr_pages">首页
if test="${page.currentPage>1}">
page(outvalue="${page.currentPage-1}"/>)"class="gr_pages">上页
if>
iftest="${page.currentPage
page(outvalue="${page.currentPage+1}"/>)"class="gr_pages">下页
if>
page(outvalue="${page.totalPage}"default="1"/>)"class="gr_pages">末页
当前第outvalue="${page.currentPage}"/>/outvalue="${page.totalPage}"/>页
Example5分页条2
method=listVote¤tPage=1&subareaCode=${param.subareaCode}"class="gr_pages">首页
iftest="${page.currentPage>1}">
method=listVote¤tPage=${page.currentPage-1}&subareaCode=${param.subareaCode}"class="gr_pages">前页
if>
method=listVote¤tPage=${page.currentPage}&subareaCode=${param.subareaCode}">
outvalue="${page.currentPage}"/>
iftest="${page.currentPage+1<=page.totalPage}">
method=listVote¤tPage=${page.currentPage+1}&subareaCode=${param.subareaCode}">
outvalue="${page.currentPage+1}"/>
if>
iftest="${page.currentPage+2<=page.totalPage}">
method=listVote¤tPage=${page.currentPage+2}&subareaCode=${param.subareaCode}">
outvalue="${page.currentPage+2}"/>
if>
iftest="${page.currentPage+3<=page.totalPage}">
method=listVote¤tPage=${page.currentPage+3}&subareaCode=${param.subareaCode}">
outvalue="${page.currentPage+3}"/>
if>
iftest="${page.currentPage
method=listVote¤tPage=${page.currentPage+1}&subareaCode=${param.subareaCode}"class="gr_pages">后页
if>
method=listVote¤tPage=${page.totalPage}&subareaCode=${param.subareaCode}"class="gr_pages">末页
当前第outvalue="${page.currentPage}"/>/outvalue="${page.totalPage}"/>页
Example6综合实例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="c" uri=" %>
<%
Map map = new HashMap();
map.put("a", "12345");
map.put("b", "abcde");
out.println(map.get("a"));
request.setAttribute("map",map);
%>
-- 完全迭代 -->
forEach items="${map}" var="mymap" >
out value="${mymap.key}" />
out value="${mymap.value}" />
forEach>
-- 根据map的key来找到特定的值 -->
forEach items="${map}" var="mymap">
if test="${mymap.key=='a'}">
out value="${mymap.value}"/>
if>
forEach>
forTokens
库:
Core(核心库)
URI:
前缀:
c
描述:
标签可以根据某个分隔符分隔指定字符串,相当于 java.util.StringTokenizer类。
语法:
forTokens items="stringFoTokens" delims="delimmmmiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
...body内容....
forTokens>
属性:
属性名
描述
类型
是否接受动态值
是否支持EL
是否必须
默认值
说明
var
变量名
String
false
Y
否
无
用来存放现在指到的成员
items
被迭代的字符串
String
true
Y
是
无
被迭代的字符串
delims
分隔符
String
true
N
是
无
定义用来分割字符串的字符
varStatus
循环状态变量
String
false
N
否
无
用来存放现在指到的相关成员信息
begin
开始条件
int
true
Y
否
0
开始的位置
end
结束条件
int
true
Y
否
最后一