在web工程的页面表单中显示数据时,我们可以使用JSTL标签中的<c:forEach>标签通过迭代取出数据,而在应用了Struts2框架的web应用中,我们可以用Struts2支持的标签库同样可以实现同样的功能
在struts2标签中,为了实现与JSTL标签库中的<c:forEach>标签同样的效果,struts2标签库提供了<s:iterrtor>标签,可以实现从值栈中迭代取出数据,
<s:iterator> 标签有3个属性:
value:被迭代的集合
id :指定集合里面的元素的id
status 迭代元素的索引
我们知道,通常我们在使用<s:property value=“”/>标签从值栈中取数据时,VS(也就是值栈)的栈顶元素一般是当前页面对应的Action对象,通过在value属性中直接填写OGNL表达式,可以取出当前栈顶的Action对象中OGNL表达式所对应的属性值,此处的value属性中填写的OGNL表达式应该是当前Action对象中的属性名,
比如:当前Action类中有 name 属性,我们可以通过 <s:property value="name"/> 这样写直接从VS中取出name的属性值
而当我们使用 <s:iterator>标签从VS中迭代取值时(这里我们只讲使用value属性的iterator标签):
1.首先,我们迭代的对象一般是一个集合,在此标签之前当前的VS栈顶元素仍然是当前页面对应的Action对象,也就是说当Action中有集合属性时,我们一般可以使用该标签通过迭代取出数据值,所以这里的value属性对应的OGNL表达式应该写的是该集合属性的属性名,所以我们可以这样写<s:iterator value="集合名">
2.当写完 这句标签后开始迭代取值时,此时的VS栈顶元素已经不是当前页面对应的Action对象了,iterator标签会将该Action中与OGNL表达式对应的那个集合中的元素依次拿出来放到VS的栈顶,也就是说在第一次迭代的时候,VS的栈顶元素并不是Action对象,而是集合中的第一个对象元素,以此类推,第二次迭代的时候便是集合中第二个对象元素,直到集合被迭代完,所以此时迭代的时候我们可以这样写: <s:property value="集合中第一个对象所拥有的属性名">
3.这样写完之后,集合中的对象属性值便会自动被迭代完结束,当集合中所有对象被迭代完之后,也就是说在iterator标签结束之后,VS的栈顶元素便会自动恢复为迭代之前的Action对象。
小技巧: 在测试的时候可以使用struts标签库中的 <s:debug/> 在页面上查看当前VS的栈顶元素
下面我们举一个例子简单演示一下:
1.先写一个java类Emp如下:
package jeason.action;
public class Emp {
private String name;
private double salary;
public Emp() {
super();
}
public Emp(String name, double salary) {
super();
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
2.Action类如下:
package jeason.action;
import java.util.ArrayList;
import java.util.List;
public class ListAction { //Action类中有一个集合对象empList
private List<Emp> empList;
public List<String> getNameList() {
return nameList;
}
public void setNameList(List<String> nameList) {
this.nameList = nameList;
}
public List<Emp> getEmpList() {
return empList;
}
public void setEmpList(List<Emp> empList) {
this.empList = empList;
}
public String execute(){
empList = new ArrayList<Emp>();
empList.add(new Emp("abc",10000));
empList.add(new Emp("bcd",15000));
empList.add(new Emp("cde",13000));
return "success";
}
}
3.写一个简单地JSP页面 list.jsp 如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:debug/>
<s:iterator value="empList">
<h1>
<s:debug/>
<s:property value="name + '---' + salary"/>
</h1>
</s:iterator>
</body>
</html>
4.struts.xml配置文件如下:
<package name="iterator" namespace="/iterator" extends="struts-default">
<action name="list" class="jeason.action.ListAction" >
<result name="success">/WEB-INF/list/list.jsp</result> <!-- 此处的页面路径注意要写正确 -->
</action>
</package>
5.该项目名称为Struts01,所以访问路径为:http://localhost:8080/Struts01/iterator/list.action/