【Struts2五】ValueStack以及ognl表达式三(iterator标签详解)

来源:互联网 发布:淘宝客服泄露买家信息 编辑:程序博客网 时间:2024/05/24 05:39
ognl表达式之使用iterator迭代ValueStack中的可迭代元素(集合,map,数组。。)

1.在ValueStack中放入数据:
public class IteratorAction extends ActionSupport{
     /**
      * 1.把一个list放入到map栈中迭代
      */
     public String putListToMap(){
          List<Person> personList = new ArrayList<Person>();
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          personList.add(p1);
          personList.add(p2);
          
          ActionContext. getContext().put("pList", personList);
          
           return "list_map" ;
     }
     
     /**
      * 2.把一个list放入到对象栈的栈顶
      */
     public String putListToObjStack(){
          List<Person> personList = new ArrayList<Person>();
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          personList.add(p1);
          personList.add(p2);
          
          ActionContext. getContext().getValueStack().push(personList);
          
           return "list_objstack" ;
     }
     
     /**
      * 3.把map存放在map栈中
      */
     public String putMapToMap(){
          Map<String, Person> map = new HashMap<String, Person>();
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          map.put( "m1", p1);
          map.put( "m2", p2);
          
          ActionContext. getContext().put("map", map);
           return "map_map" ;
     }
     
     /**
      * 4.map栈中迭代Object[]
      */
     public String putObjectsToMap(){
          
          Object[] objs = new Object[2];
          
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          objs[0] = p1;
          objs[1] = p2;
          ActionContext. getContext().put("objs", objs);
           return "objs_map" ;
     }
     
     /**
      * 5.将List<List<Person>>放于map栈中;
      */
     public String putListlistToMap(){
          List<List<Person>> lists = new ArrayList<List<Person>>();
          List<Person> personList1 = new ArrayList<Person>();
          List<Person> personList2 = new ArrayList<Person>();
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          personList1.add(p1);
          personList2.add(p2);
          
          lists.add(personList1);
          lists.add(personList2);
          
          ActionContext. getContext().put("lists", lists);
          
           return "listlist_map" ;
     }
     
     /**
      * 6.将Map<String,List<Person>>放于map栈中迭代
      */
     public String putMaplistToMap(){
          List<Person> personList1 = new ArrayList<Person>();
          List<Person> personList2 = new ArrayList<Person>();
          Person p1 = new Person();
          p1.setPid( "1");
          p1.setUsername( "p1");
          
          Person p2 = new Person();
          p2.setPid( "2");
          p2.setUsername( "p2");
          
          personList1.add(p1);
          personList2.add(p2);
          Map<String, List<Person>> map = new HashMap<String, List<Person>>();
          map.put( "list1", personList1);
          map.put( "list2", personList2);
          ActionContext. getContext().put("map", map);
          
           return "maplist_map" ;
     }
     
     /**
      * List<Map<String,Person>>
      * List<List<Map<String,Person>>>
      * List<Map<String,List<Preson>>>
      */
     
     /**
      * 7.将List<Map<String,Person>>放于map栈中;
      */
     
     public String putListmaptoMap(){
          List<Map<String, Person>> mapList= new ArrayList<Map<String,Person>>();
          Map<String, Person> map1= new HashMap<String, Person>();
          Map<String, Person> map2= new HashMap<String, Person>();
          
          map1.put( "p1", new Person("zhangsan" , "1" ));
          map1.put( "p2", new Person("lisi" ,"2" ));
          
          map2.put( "p3", new Person("zhangsan2" , "111" ));
          map2.put( "p4", new Person("lisi2" ,"211" ));
          
          mapList.add(map1);
          mapList.add(map2);
          
          ActionContext. getContext().put("maplist", mapList);
           return "listmap_map" ;
     }
     
}


2.在jsp页面使用标签获取集合中的数据:

     <table >
           <!--
              iterator是迭代标签
                 value 直接跟 ognl表达式
                 iterator当前正在迭代的元素在栈顶
                       如果当前正在迭代的元素已经迭代完毕,则该对象会从栈顶删除
                      如果value属性不写,默认迭代栈顶的元素
           -->
           <!--
               1. List<Person> list在 map栈
            -->
            
           <s:iterator value= "#pList">
               <s:property/>
               <tr>
                    <td>
                         <s:property value= "pid"/>
                    </td>
                    <td>
                         <s:property value= "username"/>
                    </td>
               </tr>
           </s:iterator>
          
           <!--
              2.List<Person>  list在对象栈
           -->
     
           <s:iterator>
               <tr>
                    <td>
                         <s:property value= "pid"/>
                    </td>
                    <td>
                         <s:property value= "username"/>
                    </td>
               </tr>
           </s:iterator>
          
           <!--
               3.把Map<String,Person>放到map栈中;
            -->
          
           <s:iterator value= "#map">
                <s:debug></ s:debug>
                <tr>
                    <td>
                         <s:property value="key" />, <s:property value= "value.pid"/>
                    </td>
                    <td>
                         <s:property value="key" />, <s:property value= "value.username"/>
                    </td>
               </tr>
           </s:iterator>
          
            <!--
                    4.将Object[]放于map栈中
             -->
            
             <s:iterator value= "#objs">
                     <tr>
                         <td>
                              <s:property value= "pid"/>
                         </td>
                         <td>
                              <s:property value="username" />
                         </td>
                    </tr>
             </s:iterator>
             
             <!--
                    5.迭代map栈中的List<List<Person>>
              -->
            
              <s:iterator value= "#lists">
                <!--
                    因为当前正在迭代的元素在栈顶,所以不需要写value的值
                -->
                
                <s:iterator>
                     <tr>
                         <td>
                              <s:property value= "pid"/>
                         </td>
                         <td>
                              <s:property value="username" />
                         </td>
                    </tr>
                </s:iterator>
              </s:iterator>
              
               <!--
                    6.迭代map栈中的Map<String,List<Person>>
                -->
               <s:iterator value= "#map">
                     <s:property value= "key"/>
                     <s:iterator value= "value">
                         <s:property value= "pid"/>
                         <s:property value= "username"/> 
                     </s:iterator>
               </s:iterator>
              
                 <!--
                    7.迭代map栈中的List<Map<String,Person>>
                -->
              <s:iterator value= "#maplist">
                <s:iterator>
                    key: <s:property value= "key"/>
                     pid:<s:property value="value.pid"/>
                    name: <s:property value="value.username" />
                     <br/>
                </s:iterator>
              </s:iterator>
              
     </table >




将List<User>放入map栈中,Person里有hobbies集合!
1.User:
     private String id;
     private String username;
     private String password;
     private String email;
     private String phone;
     private List<Hobby> hobbies;

2.Hobbies:
     private String id;
     private String name;

将集合放入map栈中:
ActionContext.getContext().put("userList", userList);

在页面迭代显示:
     <table border="1px">
           <tr>
               <th> 用户id</th >
               <th> 用户名</th >
               <th> 邮箱</th >
               <th> 手机</th >
               <th> 爱好</th >
           </tr>
          
           <s:iterator value= "#userList" >
               <tr>
                    <td>< s:property value ="id" /></td >               
                    <td>< s:property value ="username" /></td>            
                    <td>< s:property value ="phone"/></ td>
                    <td>< s:property value ="email"/></ td>               
                             
                    <td>
                         <s:iterator value= "hobbies">
                              <s:property value= "name"/>
                         </s:iterator>
                    </td>              
               </tr>
               <s:debug></ s:debug>
           </s:iterator>
     </table >

总结,当前正在迭代的元素在对象栈栈顶,使用<s:iterator > 标签时,不指定value,那么默认迭代的就是栈顶的集合,如果需要迭代的集合位于对象栈,但不是栈顶,使用value="xx"来指定;如果需要迭代的元素位于map'栈,使用value="#xx"来指定!



0 0