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>

  

  

 

  

  

posted @ 2015-10-23 15:22  雨中飞鹭  阅读(1300)  评论(0编辑  收藏  举报