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"来指定!