`
lgx2351
  • 浏览: 171397 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

构造结果集实现类似grid显示

阅读更多

在做应用开发中,最经常的操作是到后台数据库去获取数据,在前台用自定义grid标签来显示数据。对自定义标签不是很了解的初学者可能对自定义grid的实现有些迷惑,不知道数据库取出来的数据是怎么显示在自定义grid里的。其实,实现的过程是:把从数据取出来的结果集放在request里,自定义标签里说白了就是对这个结果集进行构造成<table><tr><td></td></tr></table>的形式显示出来就可以了。

在这里,我们不考虑自定义标签的实现,就只是把整个从后台读数据到前台显示的过程说一下。

一、前台部份:

<table width="100%" border="1" bordercolor="#708090" cellspacing="0" cellpadding="0">   
	<tr style="background-color: #BDD3E7;">   
		<td>标题</td>   
		<td>内容</td>   
		<td>时间</td>   
		<td>操作</td>   
	</tr>   
	<logic:notEmpty name="GenBanRec">   
		<logic:iterate id="element" name="GenBanRec">   
			<tr>   
			<td style="color: #0B4A8D;width: 130px;">   
				<%=((Hashtable) element).get("GEN_BAN_TITLE")%>   
			</td>   
			<td style="color: #0B4A8D;">   
				<%=((Hashtable) element).get("GEN_BAN_CONT")%>   
			</td>   
			<td style="color: #778899;width: 100px;">   
				<%=((Hashtable) element).get("UPDATE_DATE")%>   
			</td>   
			<td style="width:40px;">   
				<input type="button" id="genBanLocate" value="定位"/>   
			</td>   
			</tr>   
		</logic:iterate>   
		<table align="right">   
		<tr>   
		<td>   
		 <input type="button" value="上一页" class="button" name="btnpre" disabled="true" onclick="basicOpr.toPage(1);"  
		</td>   
		<td>   
		 <input type="button" value="下一页" class="button" name="btnnext" onclick="basicOpr.toPage(2);"  
		</td>   
		</tr>   
		</table>   
	</logic:notEmpty>   
	<logic:empty name="GenBanRec">   
	<p>已到最后一页!</p>   
	<table align="right">   
		<tr>   
		<td>   
			<input type="button" value="上一页" class="button" name="btnpre" onclick="basicOpr.toPage(1);"  
		</td>   
		<td>   
			<input type="button" value="下一页" class="button" name="btnnext"disabled="true" onclick="basicOpr.toPage(2);" />   
		</td>   
		</tr>   
	</table>   
	</logic:empty>   
</table>   
<input type="hidden" id="CUR_PAGE" name="CUR_PAGE" />  

 

 以上代码有注意的地方如下:
1. 样式方面:用border="1" bordercolor="#708090"来做边线;用text-align: center来使得tr的标题居中。
2. 主要有到了struts的logic:empty和迭代标签logic:iterate标。logic:empty用于判断数据集是否为空,当不为空时迭代数据集。
3. 隐藏域CUR_PAGE用于时时记录翻的页数。

二、后台部份:

后台主要是获取数据,把得到的数据集放在request里。先说后台获取数据,主要是sql的写法,通过每页显示的数据量(iperpage)和当前所处的页数(icurpage)来得到要获取哪些数据:

 

if("1".equalsIgnoreCase(dir)){//上一页
	sql += " AND TT.ROWNO>"+(icurpage-2)+"*"+iperpage+" AND TT.ROWNO<="+(icurpage-1)+"*"+iperpage+"";
}else if("2".equalsIgnoreCase(dir)){//下一页
	sql += " AND TT.ROWNO>"+icurpage+"*"+iperpage+" AND TT.ROWNO<="+(icurpage+1)+"*"+iperpage+"";
}else if("0".equalsIgnoreCase(dir)){//第一页
	sql += " AND TT.ROWNO>0 AND TT.ROWNO<="+iperpage+"";
}

把数据放在list里,再把list放在request里的代码是重点,这段代码使得前台的table构造得以实现,代码如下:

	private List paramToList(param_bean param) throws Exception {
		List list = new ArrayList();
		try {
			RowSet rs = (RowSet) param.crs;
			ResultSetMetaData rsmd = rs.getMetaData();//得到ResultSetMetaData
			rs.beforeFirst();//把指针放到第一条记录的前面
			while (rs.next()) {//循环rowset集合
				Hashtable map = new Hashtable();
				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					Object val = rs.getObject(i);
					if (val == null) {
						val = new String();
					}
					map.put(rsmd.getColumnName(i), val);
				}
				list.add(map);
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			ex.printStackTrace();
		}
		return list;
	}
 
以上代码分析:
1. paramToList()主要 ejb 取得到的数据集的每一行列名和列值放到 hashtalbe 中,再把这个 hashtable 放到 list 里,返回 list
2.通过rowset.getMetaData()来得到ResultSetMetaData, ResultSetMetaData可以得到列名(rsmd.getColumnName(i))和列数(rsmd.getColumnCount())。
3. 通过 rs.getObject(i)得到单元格的值。
三:功能扩展
1. 在上一页下一页的基础上,需要增加定位到第几页,首页,尾页的功能,其实实现的方法大概差不多。
2. 增加一个隐藏域用于保存需要查询的所有数据集共有多少页,当到达最后一页时不能再让用户点击下一页了,也不用提示“最后一页”了。
四:最终的效果大概如下(测试数据):

  • 大小: 49.6 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics