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

JavaWeb项目分页功能讲解

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

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项目分页功能讲解” 的相关文章

Kali Linux渗透-DNS域名劫持与钓鱼

Kali Linux渗透-DNS域名劫持与钓鱼

前言严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。本文目的演示如何借助 Kali Linux 系统内置的一款基于ARP地址欺骗的网络嗅探工具Ettercap,对局域网内的 Win7 主机进行 DNS 域名劫持,从而使得受害主机访问新浪官网(或其他任意网站)的域名时跳转到 Kali 攻击机指定...

Python所有的库都在这里了!!强烈建议收藏

Python所有的库都在这里了!!强烈建议收藏

前言嗨喽,大家好呀~又到了学Python时刻~随着大数据和人工智能的发展,Python也与多种科技深深绑定。比如自动化测试,运维,爬虫,数据分析,机器学习,金融领域,后端开发,云计算,游戏开发都有涉及。万丈高楼平地起,Python这座大厦能够如此强大,就是拥有强大的成千上万的库的支持无数牛x的轮子在...

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

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

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

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

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

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

在mybatis中使用mysql存储过程-教学

在mybatis中使用mysql存储过程-教学

mysql  存储过程 ,教程来源:廖万里的CSDNMysql中的方法, 好处:安全,复用。缺点:不利于修改。1,将以下储存过程代码复制到mysql数据库中进行执行DELIMITER ;;CREATE DEFINER=`root`@`localhost`&nb...

使用Python制作电脑无限弹窗恶搞程序教程

使用Python制作电脑无限弹窗恶搞程序教程

 效果如下:编辑演示视频:python弹窗恶搞程序演示视频 教程:1,导入模块,下载模块的方法不过多说明了,可以看我其他的文章有说怎么下载第三方模块,或者Alt+Enter下载也可。# 弹窗恶搞import tkinter as tkimp...