在制作数据表格的时候有一个这样的属性, pagination是否显示分页列表, 分页显示的时候需要分别从数据库中取数据, 每页显示几行, 即只从数据库取出几行数据来显示, 具体代码如下
1, 显示页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>数据表格</title> <script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.4/themes/default/easyui.css"></link> <link rel="stylesheet" type="text/css" href="jquery-easyui-1.4.4/themes/icon.css"></link> <script type="text/javascript" src="jquery-easyui-1.4.4/jquery.easyui.min.js"></script> <script type="text/javascript" src="jquery-easyui-1.4.4/locale/easyui-lang-zh_CN.js"></script> <script> $(function() { $("#tab1").datagrid({ title:"地区列表二", url:"MembersList?parentid=90", idField:"id", //指明哪个字段是标识字段 singleSelect:false, //指定是否只可以单选 frozenColumns:[[{field:"",title:"",checkbox:true},{field:"id",80,title:"ID"}]], //冻结某一列不随滚动条滚动 columns:[[ {field:"parentId",80,title:"parentId"}, {field:"name",80,title:"name"}, {field:"postCode",80,title:"postCode"} ]], collapsible:true, //是否折叠 500, //整个表宽 fitColumns:true, //是否适应表的宽度 striped:true, //斑马线 rownumbers:true, //每一列的序列号 pagination:true, //是否出现分页工具栏 pageNumber:3, //打开页面首先显示哪一页 pageSize:10, //页面打开时显示的每页显示的数据条数 pageList:[10,20,30,40,50], //分页列表选项, 按每页显示多少内容 sortName:"id", //按哪一列进行排序 sortOrder:"asc", //定义是顺序排列还是倒序 remoteSort:false, //取消从服务器排序, 如果要让数据这这里排序这个属性必须设置为false loadMsg:"正在加载啊......" }); }); </script> </head> <body> <br> <table id="tab1"> </table> </body> </html>
2, Servlet控制层
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); String pagenum = request.getParameter("page"); String rows = request.getParameter("rows"); int ipagenum = Integer.parseInt(pagenum); int irows = Integer.parseInt(rows); String str1 = ""; try { MemberDal m = new MemberDal(); ArrayList<Memberclass> array = m.getList(ipagenum,irows); //返回所显示数据的方法 if(array!=null) {int x = m.getCount(); //取出返回几行数据的方法 str1 = "{"total":"+x+","rows":" + JSON.toJSONString(array) + "}"; } } catch (Exception e) { } response.getWriter().append(str1); }
3, 类方法体
public ArrayList<Memberclass> getList(int page,int rows) throws Exception { ArrayList<Memberclass> rst = null; Connection con = Dbhelper.getConnection(); PreparedStatement p = null; ResultSet rs = null; if(con!=null) { try { int maxrows = page * rows; //oracle查询语句 String sql = "select * from (select t.*, rownum as rnum from member t where ROWNUM <= ?) where rnum > ?"; p = con.prepareStatement(sql); p.setInt(1, maxrows); p.setInt(2, maxrows-rows); //只固定的取出rows行数据, maxrows-rows在数据库中代表的都是行号,是第几行, 并不是取出几行数据, 理解了这一点就简单了 rs = p.executeQuery(); rst = new ArrayList<Memberclass>(); if(rs!=null) { while(rs.next()) { Memberclass place = new Memberclass(); place.setId(rs.getInt("id")); place.setParentId(rs.getInt("parentid")); place.setName(rs.getString("name")); place.setPostCode(rs.getString("postcode")); rst.add(place); } } } catch(Exception e) { System.out.println(e); } finally { try { p.close(); } catch(Exception e1) { System.out.println(e1); } finally { try { con.close(); } catch(Exception e2) { } finally { rs.close(); } } } } return rst; } public int getCount() throws Exception{ int rtn = 0; Connection conn = Dbhelper.getConnection(); PreparedStatement pst = null; ResultSet rs = null; if(conn!=null) { try { String sql = "select count(1) as c from member"; pst = conn.prepareStatement(sql); rs = pst.executeQuery(); if(rs!=null&&rs.next()) { rtn = rs.getInt("c"); //只要一个字段的值, 就是count(1) } } catch(Exception ex) { throw ex; } finally { try { pst.close(); //如果出现异常也要确保资源能够正常释放 } catch(Exception ex1) { throw ex1; } conn.close(); } } return rtn; }
数据库的语句和代码的原理是这么来的:
String sql = "select * from (select t.*, rownum as rnum from member t where ROWNUM <= ?) where rnum > ?";
p = con.prepareStatement(sql);
p.setInt(1, maxrows);
p.setInt(2, maxrows-rows);
占位符的原理, 比如说, 最大行数maxrows是page页面数乘以每页显示的行数rows, 这个很好理解, 当显示第一页的时候, 他的最大行数就是1乘以5, 5减去每行显示的行数5等于0, 这时候加条件判断where rnum >这个数字, 意思就是取第(大于0且小于等于5)的数据, 显示的就是前五行的内容, 以此类推显示第二页的时候最大行数就是2乘以5, 最大行数变成了10, 减去每页显示的行数5等于5, 再加判断条件就是显示6到10行的内容, 第三页的时候就是3乘以5等于15减去每页的行数5等于10, 就是数据库里面第三个五行显示的内容, 就是第三页的内容
这里就是每页取显示5行内容, 那就只从数据库里面的取出5行数据, 从而做到分也显示