• 手把手带你写代码,完美实现Java分页功能


    小伙伴们应该都知道,我们在项目开发中经常要用到分页功能,现在我们一般都会使用各种分页插件来进行快速实现。不过在面试的时候,面试官有时会问我们分页的实现过程与原理,这就有点让人防不胜防了。所以为了防止大家在面试时手足无措,索尔就用最原始的技术来带各位实现一下分页效果,希望能够让大家弄清楚分页的底层原理!

    内容导读

    本文的核心内容主要分为如下几部分:

    • 程序结构

    • JSP页面设计

    • 分页主要编码

    • 效果展示

    程序结构

    本项目虽小,但也是遵循三层架构的。对啦,不要忘了在项目中导入tomcat、JRE、mysql的依赖库文件,我这里用的是Eclipse工具。

    因为项目中用到了JSP标签,所以我们需要在tomcat安装文件夹中的lib子文件夹下放好jstl-1.2.jar与standard.jar文件,如果有的话就不用管它了。项目的代码及依赖结构如下图所示:

    JSP页面设计

    接下来是本项目所用的jsp页面文件,主要有以下几个。

    1. 创建index.jsp网页文件

    1. <%@ page language="java" contentType="text/html;
    2. charset=utf-8" pageEncoding="utf-8"%>
    3. <%@taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
    4. <!DOCTYPE html PUBLIC "-//W3C//DTD
    5. HTML 4.01
    6. Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    7. <html>
    8. <head>
    9. <meta http-equiv="Content-Type" content="text/html;
    10. charset=utf-8">
    11. <title>我的信息查询</title>
    12. <link rel="stylesheet" 
    13. type="text/css" href="css/index.css"  rel="external nofollow">
    14. </head>
    15. <body>
    16. <h2>信息分页查询</h2>
    17. <div class="wrap">
    18. <table class="tab" border="2">
    19. <tr>
    20. <th>学号</th>
    21. <th>姓名</th>
    22. <th>成绩</th>
    23. </tr>
    24. <c:forEach items="${pg.list}" var="stu">
    25. <tr>
    26. <td><c:out value="${stu.sid}" /></td>
    27. <td><c:out value="${stu.sname}" /></td>
    28. <td><c:out value="${stu.score}" /></td>
    29. </tr>
    30. </c:forEach>
    31. </table>
    32. </div>
    33. <div class="set">
    34. <span id="currentPage">${pg.currentPage}</span>页 共<span
    35. id="totalPage"> ${pg.totalPage}
    36. </span>页 <a
    37. href="index?currentPage=${0}">首页</a>  <a
    38. href="index?currentPage=${pg.currentPage-1}">上一页</a>  <a
    39. href="index?currentPage=${pg.currentPage+1}">下一页</a>  <a
    40. href="index?currentPage=${pg.totalPage}">尾页</a>转到第:<input id="jump"
    41. type="text" />页 <input id="go" type="button" value="GO" />
    42. </div>
    43. </body>
    44. <script type="text/javascript" src="js/index.js"></script>
    45. </html>

    2. play.jsp文件

    1. <%@ page language="java" contentType="text/html;
    2. charset=utf-8"
    3. pageEncoding="utf-8"%>
    4. <!DOCTYPE html PUBLIC "-//W3C//DTD
    5. HTML 4.01
    6. Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    7. <html>
    8. <head>
    9. <meta http-equiv="Content-Type" content="text/html;
    10. charset=utf-8">
    11. <title>查询系统</title>
    12. </head>
    13. <body>
    14. <jsp:forward page="index"></jsp:forward>
    15. </body>
    16. </html>

    分页主要编码

    1. 创建分页文件Pagination

    1. public class Pagination<T> {
    2.     private int currentPage;
    3.     
    4.     // 总页号或总页数
    5.     private int totalPage;
    6.     // 每页记录数或行数
    7.     private int limitRows;
    8.     // 总的记录数或行数
    9.     private int totalRows;
    10.     // 每页开始的记录号
    11.     private int startRecord;
    12.     // 存每页中的记录
    13.     private List<T> list;
    14.     
    15.     //初始化操作
    16.     public void init() {
    17.         // 1.1 求总页数,通过总记录数与每页行数来计算,有几种情况
    18.         // (1)不够一页(2)有零头(3)刚好是整数页
    19.         int tp = totalRows / limitRows;
    20.         if (totalRows > limitRows) {
    21.         totalPage = (totalRows %
    22.         
    23.         limitRows) == 0 ? tp : tp + 1;
    24.         } else {
    25.         totalPage = 1;
    26.     }
    27.     
    28.     // 1.2 将当页保留在第一页或最后一页
    29.     if (currentPage > totalPage) {
    30.        currentPage = totalPage;
    31.     } else if (currentPage <1) {
    32.         currentPage = 1;
    33.     }
    34.     
    35.     // 1.3 初始化开始记录数,mysql应用的limit它不包括开始记录,所以不要加1;
    36.     // 还有limit传入的是开始记录号与查询的条数,此处是每页可显示数limitRows,
    37.     // 如果查到最后没有limitRows限制的行数,则显示剩余部分
    38.         this.startRecord = (currentPage -1* limitRows;
    39.     }
    40.     
    41.     public Pagination() {}
    42.     
    43.     // 当前页号,总记录数,每页行数;这些属性需要传入后初始化,其它的可以set设置
    44.     public Pagination(int currentPage,int totalRows, int limitRows) {
    45.         this.currentPage = currentPage;
    46.         this.totalRows = totalRows;
    47.         this.limitRows = limitRows;
    48.     }
    49.     
    50.     // 以下为简单的getset方法,我给省略了
    51.     ......

    2. 创建StuService类

    1. public class StuService {
    2.    //2.1 拿到记录条数
    3.    public static int getTotalRows() {
    4.         Dao dao = new DaoImpl();
    5.         return dao.getTotalRows();
    6.    }
    7.     
    8.     //2.2 拿到每个分页数据
    9.     public static List getList(int startRecord, int limitRows) {
    10.         Dao dao = new DaoImpl();
    11.         return dao.getList(startRecord, limitRows);
    12.     }
    13.     
    14. }

    当然啦,还有数据库与表、实体类等也是需要我们创建的,大家可以根据项目需求自己去完成。

    效果展示

    接下来就是本项目运行后的效果展示。

    今天的内容就写到这里,现在你知道分页是怎么实现的了吗?

  • 相关阅读:
    【ICLR 2017】端到端优化的图像压缩
    项目构建工具maven
    顺序栈的入栈出栈
    为什么C++11要搞出一个nullptr?nullptr存在的意义是是什么?
    OpenCV(十):图像缩放、翻转、拼接的介绍与使用
    python3.9正确安装paddle
    js每日十题
    图扑数字孪生北京故宫,推进旅游业元宇宙进程
    一致性哈希算法原理
    《Python进阶系列》二十八:mmap模块(处理大文本)
  • 原文地址:https://blog.csdn.net/finally_vince/article/details/127123419