当前位置:首页 > 学习笔记 > 正文内容

JavaWeb项目分页功能讲解

廖万里2年前 (2022-09-09)学习笔记111082

JavaWeb项目分页功能讲解

分页简介

分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示。

  • 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割。


当我们不使用分页功能的时候,会面临许多的问题:

  • 客户端的问题: 如果数据量太多,都显示在同一个页面的话,会因为页面太长严重影响到用户的体验,也不便于操作,也会出现加载太慢的问题。

  • 服务端的问题: 如果数据量太多,可能会造成内存溢出,而且一次请求携带的数据太多,对服务器的性能也是一个考验。


分页的分类

分页的实现分为真分页和假分页两种,也就是物理分页和逻辑分页。

1.真分页(物理分页):

  • 实现原理: SELECT * FROM xxx [WHERE...] LIMIT #{param1}, #{param2}
    第一个参数是开始数据的索引位置
    第二个参数是要查询多少条数据

  • 优点: 不会造成内存溢出

  • 缺点: 翻页的速度比较慢


2.假分页(逻辑分页):

  • 实现原理: 一次性将所有的数据查询出来放在内存之中,每次需要查询的时候就直接从内存之中去取出相应索引区间的数据

  • 优点: 分页的速度比较快

  • 缺点: 可能造成内存溢出


传统的分页方式

对于假分页的实现方式很简单,只需要准备一个集合保存从数据库中取出的所有数据,然后根据当前页面的码数,取出对应范围的数据显示就好了,我们这里基于物理分页来实现。

分页的原理

JavaWeb项目分页功能讲解

  •     页面中的数据有:

  •     结果集:通过 SQL 语句查询得来的——List<Student>

  •     分页条中的数据有:

  •     当前页:用户传递到后台——currentPage

  •     总页数:计算的来——totalPage

  •     上一页:计算的来——prePage

  •     下一页:计算的来——nextPage

  •     尾页:计算的来(总页数)——lastPage

  •     页面大小(即每一页显示的条数):用户传递到后台——count

  •     总条数:通过 SQL 语句查询得来的——totalCount



可以发现页面功能中需要用到的数据有两个是需要通过 SQL 语句查询得来的:一个是页面中显示的数据 List<Student> ,另一个是数据的总条数 totalCount,分别对应以下两条 SQL 语句:

  • SELECT * FROM student LIMIT #{param1}, #{param2}

  • SELECT COUNT(*) FROM student


通过计算得到的数据有:

  • 总页数:totalPage

  • 总页数 = 总条数 % 页面大小 == 0 ? 总条数 / 页面大小 : 总条数 / 页面大小 + 1

  • 上一页:prePage

  • 上一页 = 当前页 - 1 > = 1 ? 当前页 - 1 : 1

  • 下一页:nextPage

  • 下一页 = 当前页 + 1 <= totalPage ? 当前页 + 1 : totalPage

  • 尾页:lastPage

  • 尾页 = 总条数 % 页面大小 == 0 ? 总条数 - 页面大小 : 总条数 - 总条数 % 页面大小



用户传递的数据:

  • 当前页:currentPage

  • 页面大小:count



所以我们可以创建一个 Page 工具类备用:

public class Page {
 
    int start;      // 开始数据的索引
    int count;      // 每一页的数量
    int total;      // 总共的数据量
 
    /**
     * 提供一个构造方法
     * @param start
     * @param count
     */ 
    public Page(int start, int count) {
        super();
        this.start = start;
        this.count = count;
    }
 
    /**
     * 判断是否有上一页
     * @return
     */
    public boolean isHasPreviouse(){
        if(start==0)
            return false;
        return true;
 
    }
    
    /**
     * 判断是否有下一页
     * @return
     */
    public boolean isHasNext(){
        if(start==getLast())
            return false;
        return true;
    }
 
    /**
     * 计算得到总页数
     * @return
     */
    public int getTotalPage(){
        int totalPage;
        // 假设总数是50,是能够被5整除的,那么就有10页
        if (0 == total % count)
            totalPage = total /count;
            // 假设总数是51,不能够被5整除的,那么就有11页
        else
            totalPage = total / count + 1;
 
        if(0==totalPage)
            totalPage = 1;
        return totalPage;
    }
 
    /**
     * 计算得到尾页
     * @return
     */
    public int getLast(){
        int last;
        // 假设总数是50,是能够被5整除的,那么最后一页的开始就是45
        if (0 == total % count)
            last = total - count;
            // 假设总数是51,不能够被5整除的,那么最后一页的开始就是50
        else
            last = total - total % count;
 
        last = last<0?0:last;
        return last;
    }
 
    /* getter and setter */
}

前台实现分页设计

首先我们在前台需要完成我们分页条的设计,这里可以直接引入 Bootstrap 来完成:

JavaWeb项目分页功能讲解

  • 上面是使用 Bootstrap 实现一个分页条的简单例子,如果不熟悉的童鞋可以去菜鸟教程中查看:点这里


简单版本的分页条

为了便于理解,我们先来实现一个简单版本的分页条吧:

  • 首页超链:指向了 start 为 0 的首页

<li>
    <a href="?page.start=0">
        <span>«</span>
    </a>
</li>
  • 上一页超链:

<li >
    <a  href="?page.start=${page.start-page.count}">
        <span>‹</span>
    </a>
</li>
  • 下一页超链:

<li >
    <a href="?page.start=${page.start+page.count}">
        <span>›</span>
    </a>
</li>
  • 最后一页超链:指向了最后一页

<li ><a href="?page.start=${page.last}"><span>»</span></a></li>
  • 中间页:

<c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">
    <li>
        <a href="?page.start=${status.index*page.count}" class="current">${status.count}</a>
    </li>
</c:forEach>

所以写完看起来会是这样子的:

<nav>
    <ul class="pagination">
        <li>
            <a  href="?page.start=0">
                <span>«</span>
            </a>
        </li>
 
        <li >
            <a  href="?page.start=${page.start-page.count}">
                <span>‹</span>
            </a>
        </li>
 
        <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">
            <li>
                <a href="?page.start=${status.index*page.count}" class="current">${status.count}</a>
            </li>
        </c:forEach>
 
        <li >
            <a href="?page.start=${page.start+page.count}">
                <span>›</span>
            </a>
        </li>
        <li >
            <a href="?page.start=${page.last}">
                <span>»</span>
            </a>
        </li>
    </ul>
</nav>
  • 存在的问题:
    ① 没有边界判断,即在首页仍然可以点击前一页,不符合逻辑也影响用户体验
    ② 会显示完所有的分页,即如果 totalPage 有50页,那么分页栏将会显得特别长,影响体验


本文链接:https://www.kkkliao.cn/?id=22 转载需授权!

分享到:

添加博主微信共同交流探讨信息差网赚项目: 19528888767 , 请猛戳这里→点我添加

版权声明:本文由廖万里的博客发布,如需转载请注明出处。

“JavaWeb项目分页功能讲解” 的相关文章

PHP环境搭建(推荐宝塔面板)

PHP环境搭建(推荐宝塔面板)

初学者推荐安装集成环境,不建议分别安装,集成环境包含php、mysql、apache、其他php、mysql、apache分别安装的需要相互之间配置,对初学者不友好,一般开发也不需要,特殊生产环境才需要;Windows:宝塔面板(推荐)、phpstudy(https://www.xp.cn/)Mac...

【新手建站教学】如何使用成本更低的虚拟主机实现快速建站?手把手教你搭建一个属于自己的网站。

【新手建站教学】如何使用成本更低的虚拟主机实现快速建站?手把手教你搭建一个属于自己的网站。

本篇文章教大家如何使用成本更低的虚拟主机去搭建一个网站。虚拟主机价格远低于服务器,所以选择虚拟主机建站是个非常不错的选择。虚拟主机就是一台服务器分出来的小空间,一台虚拟机只能建一个网站,一台服务器理论上可以无限搭建网站。需要准备:1.一台虚拟主机       ...

万策云网络工作室旗下高性能服务器,保证用户数据安全

万策云网络工作室旗下高性能服务器,保证用户数据安全

万策云工作室旗下所有业务均使用1T高防高性能服务器,数据定时备份,多台服务器实时同步数据,保障用户数据安全!多台服务器定时备份,企业级安全,50m独享,大带宽抗cc文件实时同步备份,数据库定时备份。主服务器采用T级群防,150G单机防御的国内高性能服务器。秒解机器!真实可测客户数据丢了都可以找回来...

如何配置mybatis并且自动生成实体类pojo和mapper

如何配置mybatis并且自动生成实体类pojo和mapper

1如何配置mybatis1.1 复制jar 点击下载mybatis和mysql的jar包:mybatis和mysql的jar包 - 万策云盘编辑1.2 复制配置文件 resources配置文件下载: resources配置文件 - 万策云盘编辑1.3...

MyBatis-写分页的几种方法,怎么写分页最简单

MyBatis-写分页的几种方法,怎么写分页最简单

1、就是直接使用我们的SQL语句进行分页,也就是在Mapper里面加上分页的语句就好了。比如MySQL添加一个limit 2,4。这种方式弊端很大,比如我们不用MySQL了,所有的代码都要修改。2、MyBatis中的分页的插件PageHelper,3、自己手写分页框架。这种用的比较少,不是说写不出来...

pyton打包成exe程序简易教程

我们知道,Python程序需要有python环境才能够运行的,但当我们开发出一个程序之后,给到用户 那么用户是不会去添加这个python环境的。 所以为了用户也能够正常使用,我们就需要将这个程序打包成exe程序。 location.href="https://blog.csd...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。