Struts2标签之<s:iterator/>标签详解

来源:互联网 发布:阿里云系统与安卓区别 编辑:程序博客网 时间:2024/05/21 06:21

       在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/

1 0