s:iterator的多层迭代
struts2的s:iterator 可以遍历 数据栈里面的任何数组,集合等等 以下几个简单的demo:
s:iterator 标签有3个属性:
value:被迭代的集合
id :指定集合里面的元素的id,可以和var属性替换, var 集合对象
status :迭代元素的索引
实例:
外层list<实体>, 内层是hashtable<Long,List> ,外层的实体id 存放另一个list,注意:var 和 id ,因为这个我被愚弄了2H,
<s:iterator id="pro" value="#request.proList" status="index"> <s:iterator var="item" value="#request.itemsTable.get(#pro.id)" status="index2"> ${item.id}—${item.name} </s:iterator> </s:iterator>
具体说其用法:
1.数组或者list
<s:iterator value="{'1','2','3','4','5'}" id='n'> <s:property value='n'/>A </s:iterator> 打印结果为: 1A2A3A4A5A
2.索引用法
如果指定了status,每次的迭代数据都有IteratorStatus的实例,它有以下几个方法 int getCount()返回当前迭代了几个元素 int getIndex()返回当前元素索引 boolean isEven()当然的索引是否偶数 boolean isFirst()当前是否第一个元素 boolean isLast() boolean isOdd()当前元素索引是否奇数 <s:iterator value="{'a','b','c'}" id='char' status='st'> <s:if test="#st.Even"> 现在的索引是奇数为:<s:property value='#st.index'/> </s:if> 当前元素值:<s:property value='char'/> </s:iterator>
3.遍历map
value可以直接定义为: value="#{"1":"a","2":"b"}" 每个元素以都好隔开。元素之间的key和value 冒号隔开 value也可以是数据栈里面的java.util.Map对象 遍历写法如下: <s:iterator value="map" id="id" status="st"> key : <s:property value='key'/> value:<s:property vlaue='value'/> </s:iterator> 当然key 和value 都可以使java 的 Object
4.遍历简单的list实体类, 后台使用 request.setAttrbute("stuList",stuList), list<Student>
<s:iterator value="#request.stuList" var="student" status="st"> <tr align="center"> <td><s:property value="#student.id" /> 或者 ${student.id}</td> <td> <s:property value="#student.name" /></td> <td> <s:date name="#student.birth" fomart="yyyy/MM/dd hh:mm:ss"/> 或者 ${student.birth} </td> </tr> </s:iterator>
5.遍历两个list
第一个例子 List<AttrName> attrN {color,size,style} List<AttrValue> attrV {red,20,gay} 这2个list的元素是一一对应的,一个attrN对应一个attrV <s:iterator value="%{attrN }" id="id" status="status"> index is : <s:property value='status.index'/> attrName is : <s:property value='id'/> or <s:property value='%{id}'/> attrName is : <s:property value='%{attrV[#status.index]}'/> 第二个例子 <s:iterator value="data.datas" var="student" status="st"> <tr align="center"> <td><s:property value="#student.id" /></td> <td> <s:property value="#student.name" /></td> <td> <s:date value="#student.birth" fomart="yyyy/MM/dd hh:mm:ss"/></td> <td><s:date value="classlist[#st.index].classname"/></td> </tr> </s:iterator> </s:iterator>
6.总结
<html> <body> <ul> <li>访问Map:<s:property value="strMap"/></li> <li>访问Map中某个元素: <s:property value="strMap.first"/> | <s:property value="strMap['second']"/> | <s:property value="strMap[\'third\']"/> </li> <li>访问Map中所有的key:<s:property value="strMap.keys"/></li> <li>访问Map中所有的value:<s:property value="strMap.values"/></li> <li>访问容器的大小: <s:property value="strMap.size()"/> | <s:property value="strMap.size"/>//这是map特别的地方 </li> <li>迭代循环取值,最简单 <s:iterator value="strMap" id="entry"> <s:property value="#entry"/>{ key: <s:property value="key"/> value:<s:property value="value"/>}| </s:iterator> </li> <li>迭代循环取值 <s:iterator value="strMap.keySet()" id="key"> <s:property value="key"/>或<s:property value="#key"/>: <s:if test="strMap[#key]!=null"> <s:property value="strMap.get(#key)"/> | </s:if> </s:iterator> </li> <li>迭代循环取数组值 <s:iterator value="strMap" id="entry"> <s:property value="#entry"/>{ <s:property value="value[0]"/> <s:property value="value[1]"/> | <s:property value="value[2]"/> } </s:iterator> </li> <li>迭代循环取对象值,最直接: <ul> <s:iterator value="perMap" id="entry"> <li> <s:property value="#entry"/> { ID:<s:property value="value.ID"/> Name:<s:property value="value.name"/> Age:<s:property value="value.age"/> }| </li> </s:iterator> </ul> </li> <li>迭代循环取对象的属性值 <s:iterator value="perMap.keySet()" id="key"> <s:property value="#key"/>: <s:iterator value="perMap.get(#key)"> <s:property value="ID"/> <s:property value="name"/> <s:property value="phone.name"/> </s:iterator>| </s:iterator> </li> <li>稍复杂的迭代 <s:iterator value="perLstMap" id="entry"> <s:set name="total" value="#entry.value.size"/> <s:iterator value="#entry.value" status="s"> <s:if test="#s.first"> <s:property value="#entry.key"/>:共${total}条 </s:if> { <s:property value="ID"/> | <s:property value="name"/> | <s:property value="age"/> }; </s:iterator> </s:iterator> </li> </ul> </body> </html>