Struts2中<s:iterator>基本用法及示例

Iterator用于遍历集合(java.util.Collection)或枚举值(java.util.Iterator)。

参数:

名称   必需 默认  类型 描述
status 否  String 如果设置此参数,一个IteratorStatus的实例将会压入每个遍历的堆栈
value  否  Object/String 要遍历的可枚举的(iteratable)数据源,或者将放入新列表(List)的对象
id     否  Object/String 用来标识元素的id。在UI和表单中为HTML的id属性

例子:

<%@ page contentType=”text/html; charset=UTF-8″ %>
<%@ page import=”java.util.List” %>
<%@ page import=”java.util.ArrayList” %>
<%@ taglib prefix=”s” uri=”/struts-tags” %>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<%
 List list = new ArrayList();
 list.add(“Max”);
 list.add(“Scott”);
 list.add(“Jeffry”);
 list.add(“Joe”);
 list.add(“Kelvin”);
 request.setAttribute(“names”, list);
%>
<html>
<head>
<title>Iterator</title>
</head>
<body>
<h3>Names: </h3>
<!–
1、此处的空property元素用于获得当前iterator的值
2、status被设成stuts,在iterator的里面就可以通过#stuts取得IteratorStatus的对象。 IteratorStatus类包含当前序号信息,如是否第一个或最后一个,是否为奇数序号。这些信息在我们做格式化的时候,显得非常有用。
–>
<ol>
<s:iterator value=”#request.names” status=”stuts”>
<s:if test=”#stuts.odd == true”>
<li>White <s:property /></li>
</s:if>
<s:else>
<li style=”background-color:gray”><s:property /></li>
</s:else>
</s:iterator>
</ol>
</body>
</html>


在struts2中,iterator标签是很好用的,但也要注意一下.举个例子,
如果要在每行中只显示两条记录,这个经常用到的例子来的了,可以这样用:
<table width=”800px” align=”center”>
<tr>
<s:iterator value=”songs” status=”st”>
<td>
<input type=”checkbox” name=”songIds” id=”<s:property value=’id’/>” value=”<s:property value=’id’/>”><label for=”<s:property value=’id’/>”>

<s:property value=”name”/>
</td>
<s:if test=”#st.modulus(2)==0″>
<s:if test=”#st.last”>
</tr></s:if>
<s:else>
</tr><tr></s:else>
</s:if>
</s:iterator>
</table>
这里无非就是要注意   <s:if test=”#st.modulus(2)==0″>
来判断整除2是否为0,(也可以用<s:if test=”#st.getIndex()%2==0)
并且注意如下的使用 #st.last,判断是否到了最后一条记录,并且注意:
iterator标签有如下方法:
boolean isEven() 当前迭代元素索引是否为偶数;
boolean isOdd() 当前迭代元素索引是否为奇数;
boolean isLast() 是否为最后一条元素;
boolean isFirst() 是否为第一条元素。
有以上元素,那么判断何时加入tr就非常方便。

= =====另附参考文章:http://blog.csdn.net/chirui/archive/2009/02/26/3940762.aspx =============

今天同事写程序时恰好遇到这个Struts2+Hibernate开发时比较典型的问题:

(1)Hibernate使用SQLQuery查询部分字段提高效率;

(2)Struts2使用迭代标签s:iterate显示嵌套的Map和List以及数组这样比较复杂的分组一类问题中常棘手的数据结构

所以晚上写下这个程序供大家参考。

一、服务端Action和DAO类:

 view plaincopy to clipboardprint?
/**Struts2 Action, 在struts.xml中配置返回类型success为results.jsp **/ 
@SuppressWarnings("serial")  
class SomeAction extends ActionSupport{  
      
    public String execute() throws Exception{  
        return SUCCESS;  
    }  
      
    /*进行分组统计查询,并将Map<String, List<String[]>>绑定到页面*/ 
    public Map<String, List<String[]>> getResults(){  
       return new SomeDAO().getGroupedRecords();  
    }  
 
}  
      
/**  
 * 表格table_1中含两个字段:类型type, 号码code 
 */ 
class SomeDAO extends TBaseDAO{  
      
    public SomeDAO(){  
        super();  
    }         
    /** 依据table_1的类型type和号码code做分组查询,并统计每个分组的记录数 
     */ 
    @SuppressWarnings("unchecked")  
    public Map<String, List<String[]>> getGroupedRecords(){  
        //在表中基于type和code字段分组  
        String sql = "select type, code, count(*) count from table_1 group by type, code";  
        //使用SQLQuery, 只取出必要的列:code、type和基于此code和type的分组的记录数  
        SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(sql);  
        query.addScalar("type", new org.hibernate.type.StringType());  
        query.addScalar("code", new org.hibernate.type.StringType());  
        query.addScalar("count", new org.hibernate.type.StringType());  
        //查出记录  
        List<Object[]> rs = query.list();           
        /*以下将对查寻结果以Map<String, List<String[]>>的方式重新组织 
          Map<String, List<String[]>>以类型作为键值,存放同一类型下的所有记录到List做值*/ 
        Map<String, List<String[]>> categorys = new HashMap<String, List<String[]>>(10);  
        for (Object[] objects : rs) {  
            String type= (String)objects[0];  
            List<String[]> list = categorys.get(type);  
            if (list == null){  
                list = new ArrayList<String[]>();  
                categorys.put(type, list);  
            }  
            list.add(new String[]{type, (String)objects[1], (String)objects[2]});  
        }  
        return categorys;  
    }         

/**Struts2 Action, 在struts.xml中配置返回类型success为results.jsp **/
@SuppressWarnings("serial")
class SomeAction extends ActionSupport{
 
    public String execute() throws Exception{
     return SUCCESS;
    }
   
    /*进行分组统计查询,并将Map<String, List<String[]>>绑定到页面*/
    public Map<String, List<String[]>> getResults(){
       return new SomeDAO().getGroupedRecords();
    }

}
 
/**
 * 表格table_1中含两个字段:类型type, 号码code
 */
class SomeDAO extends TBaseDAO{
 
 public SomeDAO(){
  super();
 }  
 /** 依据table_1的类型type和号码code做分组查询,并统计每个分组的记录数
  */
 @SuppressWarnings("unchecked")
 public Map<String, List<String[]>> getGroupedRecords(){
  //在表中基于type和code字段分组
  String sql = "select type, code, count(*) count from table_1 group by type, code";
  //使用SQLQuery, 只取出必要的列:code、type和基于此code和type的分组的记录数
  SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(sql);
  query.addScalar("type", new org.hibernate.type.StringType());
  query.addScalar("code", new org.hibernate.type.StringType());
  query.addScalar("count", new org.hibernate.type.StringType());
  //查出记录
  List<Object[]> rs = query.list();   
  /*以下将对查寻结果以Map<String, List<String[]>>的方式重新组织
    Map<String, List<String[]>>以类型作为键值,存放同一类型下的所有记录到List做值*/
  Map<String, List<String[]>> categorys = new HashMap<String, List<String[]>>(10);
  for (Object[] objects : rs) {
   String type= (String)objects[0];
   List<String[]> list = categorys.get(type);
   if (list == null){
    list = new ArrayList<String[]>();
    categorys.put(type, list);
   }
   list.add(new String[]{type, (String)objects[1], (String)objects[2]});
  }
  return categorys;
 }  
}

      

二、页面端Output.jsp

< contentType="text/html; charset=GBK"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<% int count = 0;  // 用于计算换行的变量 %> 
<s:iterator value="results" >     
     <!--  第一层迭代getResults()的顶层HashMap, 并为HashMap<String, List<String[]>> 
                             中的每一个类型对应的列表List生成一个表格 --> 
     <s:label value="key" /> <!--  显示HashMap的key值--> 
     <table>   
     <% count = 0; %>   
     <!-- 通过value取HashMap的每一个List, 开始迭代List --> 
     <s:iterator value="value" status="status">       
         <!--  每5条记录一行显示-->   
         <%  if( count % 5 == 0) {  %>   <tr>  <% }  %> 
              <td>   
                  <!-- 每一个单元格中打印号码及基于类型和此号码的查询分组的记录数量 --> 
                  <s:property value="value[#status.index][1]" /> 
                  (<s:property value="value[#status.index][2]" />)  
              </td> 
         <%  if( count % 5 == 0) { %>   </tr>  <% }  %> 
         <%  count ++; %> 
     </s:iterator> 
     </table> 
</s:iterator> 

---------------------------------------------------------------------------------------------------------------------

本文是从网上看到的  我只做收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值