ognl表达式之使用iterator迭代ValueStack中的可迭代元素(集合,map,数组。。)
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"来指定!