目前在土豆实习,觉得和之前在盛大实习最大的不同,就是可以接触到真实的海量数据,在盛大做的都是应用级的产品—信用卡还款,手机充值,无商品交易,也就是对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带参数请求数据库相应并返回指定段的数据,有什么不明白的地方欢迎询问?