java分页设计-支持海量数据分页

  目前在土豆实习,觉得和之前在盛大实习最大的不同,就是可以接触到真实的海量数据,在盛大做的都是应用级的产品—信用卡还款,手机充值,无商品交易,也就是对java的框架和Javascript等有了进一步的掌握,但是目前这个社会是信息大爆炸的时代,大系统都是会产生海量的数据,那么如何才能很好将海量的数据快速无负担地展现于页面呢?一下是一套很好的解决方案,与大家分享一下。


  其实这套方案思路很清晰简单,那就是根据一页展示的条数取出数据并展现在当前页,关键代码如下所示:

<%@ page language="java"
	import="java.util.*,java.sql.*,com.tudou.ers.base.*,com.tudou.ers.util.*"
	pageEncoding="UTF-8" contentType="text/html;charset=GBK"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>Error Report</title>

</head>

<body>
<center>

<h5><%=now%></h5>
<table id="error_table" cellspacing="1">
	<thead>
		<tr>
			<td>ID</td>
			<td>User Agent</td>
			<td>User IP</td>

		</tr>
	</thead>
	<tbody>
		<%
			String pNo = request.getParameter("pageNo");
			int pageNo = 1;
			if (null != pNo && !(Integer.parseInt(pNo) <= 0)) {
				pageNo = Integer.parseInt(pNo);
			}
			int pageSize = 30;
			int pageTotal = 1;
			String ErrorDBConnString = "jdbc:mysql://localhost:3306/error?user=root&password=root";
			Connection conn = DBUtil.error_pool.GetConnection();//new ConnectionPool("error_pool", ErrorDBConnString, 3, false).GetConnection();//ErrorDBPool.getInstance().getConnection();

			String from = String.valueOf((pageNo - 1) * pageSize);
			String pageNum = String.valueOf(pageSize);
			String sql = "select * from error_report limit " + from + ","
					+ pageNum;
			String totalsql = "select count(*) from error_report";
			String today = MyUtils.todayString();
			sql = String.format(sql,today);
			totalsql = String.format(totalsql,today);

			PreparedStatement pstmt = null;
			ResultSet rs = null;
			PreparedStatement pstmt1 = null;
			ResultSet rs1 = null;
			System.out.print("sql=" + sql);
			try {
				pstmt = conn.prepareStatement(sql);

				rs = pstmt.executeQuery();
				//获得各列的名称
				// ResultSetMetaData rsmd = rs.getMetaData();
				// int colNum = rsmd.getColumnCount();
				//List<String> colNames = new ArrayList<String>();
				//for(int i=1;i<=colNum;i++){
				// String name = rsmd.getColumnName(i);
				//	 colNames.add(name);
				// }

				while (rs.next()) {
		%>
		<tr>
			<td><%=rs.getInt("id")%></td>
			<td><%=rs.getString("user_agent")%></td>
			<td><%=rs.getString("user_ip")%></td>
		
		</tr>
		<%
			int all = 0;
					pstmt1 = conn.prepareStatement(totalsql);
					rs1 = pstmt1.executeQuery();
					if (rs1.next()) {
						all = rs1.getInt(1);
						pageTotal = (all % pageSize == 0)
								? (all / pageSize)
								: (all / pageSize + 1);
					}
				}

			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				rs.close();
				rs1.close();
				pstmt.close();
				pstmt1.close();
				conn.close();
			}
		%>
	</tbody>
</table>
<h2><a href="<%=path%>/ErrorReport.jsp?pageNo=1">首页</a> <a
	href="<%=path%>/ErrorReport.jsp?pageNo=<%=(pageNo - 1 < 1) ? pageNo : pageNo - 1%>">上一页</a>
第<%=pageNo%>页 共<%=pageTotal%>页 <a
	href="<%=path%>/ErrorReport.jsp?pageNo=<%=(pageNo > pageTotal) ? pageNo : pageNo + 1%>">下一页</a>
<a href="<%=path%>/ErrorReport.jsp?pageNo=<%=pageTotal%>">尾页</a> 第<input
	type="text" id="pageno" size="5">页<input type="button"
	name="GO" value="GO" οnclick="go();"></h2>
</center>
</body>
<script type="text/javascript">
  function go(){
  	var pageno = document.getElementById("pageno").value;
  	if(pageno==""){
  		alert("请输入页数");
  	}else{
  		if(pageno><%=pageTotal%>
	|| pageno < 1) {
				alert("请输入合理的页数");
			} else {
				self.location = "ErrorReport.jsp?pageNo=" + pageno;
			}
		}
	}
</script>
</html>

代码其实不难理解,也就是按照页数来计算该取数据库哪一段范围的数据,然后展现,页数则通过url带参数请求数据库相应并返回指定段的数据,有什么不明白的地方欢迎询问?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值