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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

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?

@SuppressWarnings("serial")
class SomeAction extends ActionSupport{

public String execute() throws Exception{
return SUCCESS;
}


public Map<String, List<String[]>> getResults(){
return new SomeDAO().getGroupedRecords();
}

}


class SomeDAO extends TBaseDAO{

public SomeDAO(){
super();
}

@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[]>> 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;
}
}

@SuppressWarnings("serial")
class SomeAction extends ActionSupport{

public String execute() throws Exception{
return SUCCESS;
}


public Map<String, List<String[]>> getResults(){
return new SomeDAO().getGroupedRecords();
}

}


class SomeDAO extends TBaseDAO{

public SomeDAO(){
super();
}

@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[]>> 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>

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用postman做接口测试

1、get请求传参 只要是get请求都可以在浏览器中直接发&#xff1a; 在访问地址后面拼 ?keyvalue&keyvalue 例如&#xff1a;在浏览器中直接输入访问地址&#xff0c;后面直接拼需要传给服务器的参数http://api.nnzhp.cn/api/user/stu_info?stu_name小黑2、post请求&…

【狂神说】分析前后端分离开源项目?

文章目录1.如何分析开源项目项目简介项目源码2.观察开源项目3.开源项目下载4.跑起来是第一步5.前后端分离项目固定套路6.如何找到一个开源项目1.如何分析开源项目 学习的方式&#xff1a; 不知道这个代码怎么来的这个代码跑不起来这个项目对我们有什么帮助&#xff0c;不会模…

设计公共API的六个注意事项

摘要&#xff1a;俗话说&#xff1a;“好东西就要贡献出来和大家一起分享”&#xff0c;尤其是在互联网业务高度发达的今天&#xff0c;如果你的创业公司提供了一项很酷的技术或者服务&#xff0c;并且其他用户也非常喜欢该产品&#xff0c;在这种情况下&#xff0c;最好的解决…

go 交叉编译

golang中windows交叉编译 env GOOSlinux GOARCHamd64 go build .打包镜像 FROM alpineMAINTAINER "congge"ADD ./casino_niuniu /usr/local/casino_niuniu/bin/casino_niuniu ADD ./templates /usr/loca/lcasino_niuniu/bin/templates ADD ./public /usr/local/casin…

IntelliJ Idea 2017 免费激活方法

见&#xff1a;https://www.cnblogs.com/suiyueqiannian/p/6754091.html 1. 到网站 http://idea.lanyus.com/ 获取注册码。 2.填入下面的license server: http://intellij.mandroid.cn/   http://idea.imsxm.com/   http://idea.iteblog.com/key.php 以上方法验证均可以

P3193 [HNOI2008]GT考试

传送门 容易看出是道DP 考虑一位一位填数字 设 f [ i ] [ j ] 表示填到第 i 位&#xff0c;在不吉利串上匹配到第 j 位时不出现不吉利数字的方案数 设 g [ i ] [ j ] 表示不吉利串匹配到第 i 位&#xff0c;再添加一个数字&#xff0c;使串匹配到第 j 位的方案数 那么方程显然为…

LeetCode刷题攻略

目录 一、LeetCode简介 二、刷leetcode的主要目的 三、常用的数据结构 四、常用的算法思想 五、选择算法题 1、刷题选择 2、刷题方法 方法一&#xff1a;顺序法 方法二&#xff1a;标签法 方法三&#xff1a;随机法 方法四&#xff1a;必杀法 六、刷题攻略 TIP 1&…

SQLserver数据库反编译生成Hibernate实体类和映射文件

一、建立项目和sqlserver数据库 eclipse&#xff0c;我使用的版本是neon3 二、Data Source Explorer 选择OK 在data source Explorer的Database Connections 选择New 填写好General的连接信息 新建New Driver Definition 填写完选择OK 选择刚才的Drivers Test Connetion测试 N…

最受欢迎的5大Linux发行版

摘要&#xff1a;要统计有多少人在使用那款Linux发行版几乎是不可能的事情&#xff0c;但我们可以使用一些在线分析工具来大概地看看哪些Linux发行版更受欢迎。 Google Trends的数据显示&#xff0c;Ubuntu用户正在流向Mint&#xff0c;但依然在各方面都比其它Linux发行版更有优…

C#动态操作DataTable(新增行、列、查询行、列等)

public void CreateTable(){//创建表DataTable dt new DataTable();//1、添加列dt.Columns.Add("Name", typeof(string)); //数据类型为 文本//2、通过列架构添加列DataColumn age new DataColumn("Age", typeof(Int32)); //数据类型为 整形DataColumn…

使用IntelliJ IDEA 配置Maven(入门)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 下载Maven 官方地址&#xff1a;http://maven.apache.org/download.cgi 解压并新建一个本地仓库文件夹 2.配置本地仓库路径 3.配…

[算法]不使用*、/、+、-、%操作符求一个数的1/3

摘要&#xff1a;算法一直是程序员进阶的一道龙门&#xff0c;通常算法都是为了更高效地解决问题而创造的&#xff0c;但也有的只是出于学术性&#xff0c;并不在意其实际意义。这是近日在国外技术问答网站stackoverflow的一个热门问题&#xff0c;不知道你能给出几种解决方法&…

2022届互联网秋招备战

文章目录1、何为秋招&#xff1f;1.1应届生身份1.2秋招、春招、校招1.3、社招、海投2.秋招信息如何获取&#xff1f;3、如何备战秋招&#xff1f;3.1、简历&#xff08;ps做简历&#xff09;3.2、笔试准备3.3、面试准备4、日常实习和暑假实习&#xff1f;1、春招≠暑期实习2、什…

php 两变量值互换 方法

//方法一&#xff1a;$a "abc";$b"def";$a $a^$b;$b $b^$a;$a $a^$b;//方法二&#xff1a;list($a, $b) array($b, $a);//方法三&#xff1a;$a $a . $b;$b strlen( $b );$b substr( $a,0,(strlen($a)- $b ));$a substr( $a, strlen($b));//方法四&…

MySQL5.7 group by新特性,报错1055

项目中本来使用的是mysql5.6进行开发&#xff0c;切换到5.7之后&#xff0c;突然发现原来的一些sql运行都报错&#xff0c;错误编码1055&#xff0c;错误信息和sql_mode中的“only_full_group_by“关&#xff0c;到网上看了原因&#xff0c;说是mysql5.7中only_full_group_by这…

IDEA中多行注释及取消注释快捷键

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、一次性添加多行注释的快捷键 首先选中要注释区域&#xff0c;然后 ctrl/ 这个是多行代码分行注释&#xff0c;每行一个注释…

为什么程序员不擅长估算时间?

摘要&#xff1a;时间估算是困难的&#xff0c;每一个程序员都有一个现实的估计区间&#xff0c;低于这个区间的估计意味着&#xff08;构件&#xff0c;测试&#xff0c;检查代码的&#xff09;时间开销被低估了&#xff0c;超过这个区间的估计意味着这个任务太大而很难预估。…

red hat enterprise linux 7关闭防火墙的方法

2019独角兽企业重金招聘Python工程师标准>>> red hat enterprise linux 7发布后&#xff0c;发现防火墙也变了&#xff0c;如何关闭防火墙呢&#xff0c;下面是方法 1.查看firewall的状态 [rootsztech7 ~]# systemctl status firewalld firewalld.service - firewal…

IOS —— 网络那些事(上) - http协议

作为一名并不太合格的程序员&#xff0c;今天要分享学习的成果&#xff0c;竟然讲的是网络相关HTTP协议的事情。&#xff08;也算是复习了&#xff09; 乍看HTTP协议的内容着实是十分复杂的&#xff0c;涉及到十分多互联网"底层"框架的东西。今天就先撇开这部分详细内…

【最新版】Java速成路线(急于找工作!)

文章目录计算机网络分层结构TCP/UDPHTTP/HTTPS状态码Cookie 和 SessionURI和URL操作系统线程和进程数据结构和算法数据结构算法设计模式&#xff08;23种&#xff09;单例工厂代理适配器观察者模板实操工具Git/SVNMaven/GradleLinux基本操作NginxELKpostmanJAVA基础语言基础JVM…