ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 分页实现 ## 为什么要分页 在 Web 应用中,从数据库中查询数据然后在页面显示是一个非常常见的场景,在这个场景中,数据会经历这样的一个过程,从数据库查询 → 通过 JDBC 加载到 Java 集合对象中 → 通过 request 对象转发给 JSP 页面 → JSP页面遍历显示。 如果一次性把所有的数据都加载出来(对于数据量大的查询),由上面的描述可以知道,对于数据库服务器、Web 服务器、客户端的数据处理压力都是很大的。而且往往用户不会一次性的浏览那么多的数据。 在目前的分页实现中,一般使用固定页码和逐步加载的方式完成。 这里,我们主要解释下固定页码实现方式的原理。 ## 如何分页 作为一个分页的实体,一般要具备的属性包括: - 每页显示数据条数、当前页码、一共多少条记录 - 一共多少页:该字段可以通过一共多少条记录和每页显示数据量求得 - 数据集合实体 前端的一个请求,一般会传递两个重要参数:当前页码和每页显示条数 一共多少条记录,通过数据库中 count() 函数完成,在 MySQL 中查询部分数据通过 LIMIT 关键字完成。 **代码实现:** Pager 实体类: ~~~ package cn.utils; import java.util.List; public class Pager { /** * 当前页 */ private int currentPage; /** * 每页显示多少条 */ private int pageSize; /** * 总记录数 */ private int total; /** * 一共多少页 */ private int totalPage; /** * 查询出的数据集合 */ private List rs; public List getRs() { return rs; } public void setRs(List rs) { this.rs = rs; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getTotalPage() { return (int)Math.ceil(this.total*1.0/this.pageSize); } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public static void main(String[] args) { System.out.println((int)Math.ceil(16*1.0/5)); } public Pager(int currentPage, int pageSize) { super(); this.currentPage = currentPage; this.pageSize = pageSize; } public Pager() { super(); } public Pager(String currentPage) { super(); try { this.currentPage = Integer.valueOf(currentPage); } catch(Exception ex) { this.currentPage = 1; } this.pageSize = 5; } } ~~~ Dao 层的实现代码 ~~~ /** * 分页查询学生 * @return */ public void findByPage(Pager pager) { List<Student> stus = new ArrayList<Student>(); // 获取用户数据列表 try { Class.forName(DbHelp.JDBC_DRIVER); Connection conn = DriverManager.getConnection(DbHelp.JDBC_URL, DbHelp.JDBC_USERNAME, DbHelp.JDBC_PASSWORD); PreparedStatement ps = conn.prepareStatement("SELECT * FROM student LIMIT ?,?"); ps.setInt(1, (pager.getCurrentPage()-1)*pager.getPageSize()); ps.setInt(2, pager.getPageSize()); ResultSet rs = ps.executeQuery(); while (rs.next()) { Student stu = new Student(); int id = rs.getInt("id"); String name = rs.getString("name"); String code = rs.getString("code"); stu.setId(id); stu.setName(name); stu.setCode(code); stus.add(stu); } ps.close(); ps = conn.prepareStatement("SELECT count(*) FROM student"); rs = ps.executeQuery(); if (rs.next()) { pager.setTotal(rs.getInt(1)); } ps.close(); conn.close(); } catch (Exception ex) { ex.printStackTrace(); } pager.setRs(stus); } ~~~ JSP 部分代码 ~~~ <div> 共${pager.total }记录&nbsp;&nbsp;共${pager.totalPage }页 &nbsp;&nbsp; <c:forEach var="i" begin="1" end="${pager.totalPage }"> <c:if test="${i==pager.currentPage }"> ${i }&nbsp; </c:if> <c:if test="${i!=pager.currentPage }"> <a href="IndexServlet?currentPage=${i }">${i }</a>&nbsp; </c:if> </c:forEach> </div> ~~~ 以上两段代码重点要关注: - 对于 pager 对象的属性构造过程和对象传递; - JSP 部分对于 pager 对象的解析。