应用场景
开发过程中,出现需要对两个list同时遍历的情况。
代码实例
<s:iterator value="userList" var="au" status="st">
<label class="checkbox-inline">
<s:if test="taskLists[#st.index].receiveUserId==#au.id" >
<input type="checkbox" name="receiveUserIds"
value="<s:property value="#au.id"/><s:property value="#au.nickName" />" checked />
<s:property value="#au.nickName" />
</s:if>
<s:else>
<input type="checkbox" name="receiveUserIds" value="<s:property value="#au.id"/>" />
<s:property value="#au.nickName" />
</s:else>
</label>
</s:iterator>
<s:if test="userList == null || userList.size()<=0">
<label>该区下无经办人</label>
</s:if>
原理浅析
这里使用的是struts2中s:iterator
完成list数据的解析。
上述代码为任务修改时,任务经办人复选框的显示处理,其中:
- userList 为经办人列表
- taskLists 为任务列表(receiveUserId为任务经办人id)
#st.index
用于获得list索引。 注意:想要使用此功能需要s:iterator
定义status属性
Strutss:iterator
标签中有如下属性:
属性名 | 默认值 | 描述 |
---|---|---|
begin | 0 | 设置此值,则迭代从这个值开始 |
end | 该’values’ List或array的大小, 或若’step’为负则为0 | 设置此值,则迭代到这个值结束(包含此值) |
status | false | 设置此值,则每次迭代都会生成对应的IteratorStatus实例 |
step | 1 | 设置此值,则每次以此值为步长迭代,可以为负值 |
value | 指一个被迭代的集合,使用ognl表达式指定,如果为空,则默认取ValueStack栈顶的集合 | |
var | 设置此值,名字用于将引用的值推入值栈 |
s:iterator
定义status属性时,会产生IteratorStatus实例对象,该实例对象可以判断当前元素的位置等信息,包含了以下属性方法:
- int getCount(); 迭代元素个数
- int getIndex(); 迭代元素当前索引
- boolean getFirst(); 是否为第一个
- boolean getEven(); 是否为偶
- boolean getLast(); 是否最后一个
- bolean getOdd(); 是否为奇
此外其有以下几个属性可以使用:
- #status.even判断是否偶数行
- #status.odd 是否奇数行
- #status.count 当前行数
- #status.index 当前行的序号,从0开始[#status.count=#status.index+1]
- #status.first 是否第一行
- #status.last 是否最后一行
- #status.modules(int) 当前行数取模
效果展示
参考
Struts API – iterator
页面使用struts2标签获取List中的对象属性值,Struts2常用标签总结
s:iterator遍历两个list——平行,非嵌套
Struts2中s:iterator标签的使用详解