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