自己设计的网站,如何实现分页功能?(详细代码+注释)

目录

前言

实现分页功能

需求分析

客户端开发

服务器开发

前后端交互——两种前端得到 文章总页数 的方法,那种更合适?


前言


你在设计网站的时候是否有过这样的烦恼:“我设计的网站怎么就是从上到下一条线内容全部展开,一点都不好看!有没有什么好的办法呢?”,实现一个简单的分页功能就能帮你解决这样的烦恼,接下来我们就来看看如何实现一个简单的分页功能~

实现分页功能


需求分析

例如现在你有这样一个需求:对文章列表页面实现分页功能。

那么什么是分页功能呢?

简单来说就是实现以下四个按钮:

  • 首页按钮:点击此按钮跳转到文章列表的首页。
  • 上一页按钮:点击此按钮跳转到文章列表当前页的上一页。特殊处理:若当前文章列表在第一页,那么点击上一页则提醒用户“当前已在首页!”。
  • 下一页按钮:点击此按钮跳转到文章列表当前页的下一页。特殊处理:若当前文章列表在最后一页,那么点击上一页则提醒用户“当前已在最后一页!”。
  • 末页按钮:点击此按钮跳转到文章列表的最后一页。

最终实现效果如下:

 接下来就来具体实现~

客户端开发

假设设计的文章版心如下

    <!-- 版心 -->
    <div class="container">
        <!-- 右侧内容详情 -->
        <div class="container-right" style="width: 100%;">
            <!-- 每一篇博客包含标题, 摘要, 时间 (这里使用 ajax 请求到的文章数据进行填充)-->
            <div id="artDiv">

            </div>

            <hr>
            <div class="blog-pagnation-wrapper">
                <button onclick="homePage()" class="blog-pagnation-item">首页</button>
                <button onclick="prevPage()" class="blog-pagnation-item">上一页</button>
                <span id="page"></span>
                <button onclick="nextPage()" class="blog-pagnation-item">下一页</button>
                <button onclick="lastPage()" class="blog-pagnation-item">末页</button>
            </div>
        </div>
    </div>

编写 js 代码

创建三个全局变量,分别是 当前页数、每页显示最大文章数、文章总页数,通过这三个全局变量就可以实现4个按钮的分页功能。

  • 首页按钮:将当前页数设置为1,再请求服务器获取当前博客列表,请求中的参数为当前页数。
  • 上一页按钮:如果当前页数为1,则提示“当前已在首页”,若不在,则将请求服务器获取当前博客列表,请求中的参数为当前页数 + 1。
  • 下一页按钮:和上一页按钮同理
  • 末页按钮:将当前页设置为最后一页,并请求后端获取文章列表。
    <script>

        //当前页数
        var curpage = 1;
        //每页显示的最大文章数
        var psize = 3;
        //文章总页数       
        var pcount = 1;

// -----------------------这里以下“获取博客列表”可以部分忽略----------------------------------
        //获取博客列表
        function getArtList(pindex, psize) {
            jQuery.ajax({
                type: "GET",
                url: "/art/listbypage",
                data: {
                    "pindex": pindex,
                    "psize": psize
                },
                success: function (result) {
                    if (result != null && result.code == 200) {
                        //这里有两种情况,一种是有文章,一种是没有用户发表文章
                        if (result.data != null && result.data.list.length > 0) {
                            //有文章
                            var artListDiv = "";
                            for (var i = 0; i < result.data.list.length; i++) {
                                var artItem = result.data.list[i];
                                artListDiv += '<div class="blog">';
                                artListDiv += '<div class="title">' + artItem.title + '</div>';
                                artListDiv += '<div class="date">' + artItem.createtime + '</div>';
                                artListDiv += '<div class="desc">' + artItem.content + '</div>';
                                artListDiv += '<a href="blog_content.html?id=' + artItem.id + '" class="detail">查看全文 &gt;&gt;</a>'
                                artListDiv += '</div>';
                            }
                            //将 html 填充进去
                            jQuery("#artDiv").html(artListDiv);
                            //显示当前页数
                            jQuery("#page").text(" 第 " + curpage + " 页 ");
                            //总页数
                            pcount = result.data.pcount;
                        } else {
                            //无文章
                            jQuery("#artDiv").html("<h2>暂无文章</h2>");
                        }
                    } else {
                        alert("博客列表获取失败!");
                    }
                }
            });
        }
        //初始化文章列表首页
        getArtList(curpage, psize);
// -----------------------这里以上“获取博客列表”可以部分忽略----------------------------------

        //分页功能处理
        //首页按钮
        function homePage() {
            curpage = 1;
            getArtList(curpage, psize);
        }

        //上一页按钮
        function prevPage() {
            if (curpage == 1) {
                alert("当前已在首页!");
                return;
            } else {
                getArtList(--curpage, psize);
            }
        }

        //下一页按钮
        function nextPage() {
            if (curpage == pcount) {
                alert("当前已在最后一页!");
                return;
            } else {
                getArtList(++curpage, psize);
            }
        }

        //末页按钮
        function lastPage() {
            curpage = pcount;
            getArtList(curpage, psize);
        }

    </script>

服务器开发

服务器传入两个参数,反别是当前页码(pindex)、每页显示条数(psize),通过这两个参数如何实现分页查询呢(为什么要设计这两个参数)?

我们的服务器最后是要使用 MyBatis 对数据库进行修改的,那么分页的 sql 因该为 "select * from articleinfo limit #{psize} offset #{offset}",psize 我们以及约定好了(假设约定为3,也就是每页最多显示三条文章信息),那么 offset 的值怎么得来呢?

offset 是偏移量,也就是分页的起始下标(从0下标开始),就可以通过 当前页码(pindex)和 每页显示条数(psize) 计算得来!

这里需要一点数学推理,首先给出公式(方便后面理解): offset = (pindex - 1) * psize ,推理过程如下:

  • 假设当前页码(pindex)为 1,每页显示(psize) 3 条,那么 offset 就是 0,因为从第 0 条开始显示。
  • 假设当前页码(pindex)为 2,每页显示(psize) 3 条,那么 offset 就是 3,因为前三条数据(下标分别为:0、1、2)刚刚已经在第一页显示了,因此下一页就因该从下标为 3 的数据开始显示。
  • 往后以此类推...


    /**
     * 博客列表分页功能
     * @param pindex 当前页码
     * @param psize 每页显示条数(约定每页显示 3 条)
     * @return
     */
    //limit 3 offset 0
    //limit 3 offset 3
    //        offset 6
    //offset = (pindex - 1) * psize
    @RequestMapping("/listbypage")
    public AjaxResult getlistByPage(Integer pindex, Integer psize) {
        //非空校验
        if(pindex == null || pindex < 1) {
            pindex = 1;
        }
        if(psize == null || psize < 3) {
            psize = 3;
        }
        //公式计算得到 offset
        int offset = (pindex - 1) * psize;
        List<ArticleInfo> list = articleService.getListByPage(psize, offset);

        //当前列表有多少也
        //a.总共有多少条数据
        int totalCount = articleService.getArtAllCount();
        //b.总条数 / psize
        double pcountdb = totalCount / (psize * 1.0);
        //c.使用进1法得到总页数
        int pcount = (int) Math.ceil(pcountdb);
        HashMap<String, Object> result = new HashMap<>();
        result.put("list", list);
        result.put("pcount", pcount);
        return AjaxResult.success(result);
    }

前后端交互——两种前端得到 文章总页数 的方法,那种更合适?

两种方法分别如下

  1. 后端使用哈希表带上 文章总数和文章列表 传送给前端,前端进行一次 HTTP 请求完成分页功能的实现”。(刚刚所讲的分页功能就是这样实现的)
  2. 前后端使用两次  HTTP 请求完成分页功能,也就是前端发送两次 ajax 请求后端,一次是请求文章列表,一次是请求总页数。

第二种方法前端代码如下:

    <script>

        //当前页数
        var curpage = 1;
        //每页显示的最大文章数
        var psize = 3;
        //文章总页数       
        var pcount = 1;
        //文章总数
        var allCount = 1;
        function getAllCount() {
            jQuery.ajax({
                url: "/art/allcount" ,
                type: "GET",
                async: false, //async 是设置状态的(同步执行和异步执行),默认为 true 异步执行,有可能会出现"抢占执行"
                success: function (result) {
                    if (result != null && result.code == 200) {
                        allCount = result.data;
                    }
                }
            });
        }
         getAllCount();

        //获取博客列表
        function getArtList(pindex, psize) {
            jQuery.ajax({
                type: "GET",
                url: "/art/listbypage",
                data: {
                    "pindex": pindex,
                    "psize": psize
                },
                success: function (result) {
                    if (result != null && result.code == 200) {
                        //这里有两种情况,一种是有文章,一种是没有用户发表文章
                        if (result.data != null && result.data.length > 0) {
                            //有文章
                            var artListDiv = "";
                            for (var i = 0; i < result.data.length; i++) {
                                var artItem = result.data[i];
                                artListDiv += '<div class="blog">';
                                artListDiv += '<div class="title">' + artItem.title + '</div>';
                                artListDiv += '<div class="date">' + artItem.createtime + '</div>';
                                artListDiv += '<div class="desc">' + artItem.content + '</div>';
                                artListDiv += '<a href="blog_content.html?id=' + artItem.id + '" class="detail">查看全文 &gt;&gt;</a>'
                                artListDiv += '</div>';
                            }
                            //将 html 填充进去
                            jQuery("#artDiv").html(artListDiv);
                            //显示当前页数
                            jQuery("#page").text(" 第 " + curpage + " 页 ");
                        } else {
                            //无文章
                            jQuery("#artDiv").html("<h2>暂无文章</h2>");
                        }
                    } else {
                        alert("博客列表获取失败!");
                    }
                }
            });
        }
        //初始化首页
        getArtList(curpage, psize);

        //分页功能处理
        //首页按钮
        function homePage() {
            curpage = 1;
            getArtList(curpage, psize);
        }

        //上一页按钮
        function prevPage() {
            if (curpage == 1) {
                alert("当前已在首页!");
                return;
            } else {
                getArtList(--curpage, psize);
            }
        }

        //下一页按钮
        function nextPage() {
            if (curpage == pcount) {
                alert("当前已在最后一页!");
                return;
            } else {
                getArtList(++curpage, psize);
            }
        }

        //末页按钮
        function lastPage() {
            curpage = pcount;
            getArtList(curpage, psize);
        }

    </script>

那种方法更好呢?

两种方法都可以,没有明确的好坏之分,要说有的话,方法二需要进行两次 HTTP 请求,而 HTTP 建立连接时需要时间的,因此在效率上,第一种方式更优,并且企业中最常用的也是第一种方式。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 热部署,修改代码不用重启项目

热部署指在修改项目代码的时候不重启服务器让修改生效。安装JRebel and XRebelFile->Settings&#xff0c;然后Plugins-> Marketplace&#xff0c;输入JRebel&#xff0c;安装如下插件——JRebel and XRebel &#xff0c;重启idea激活JRebel and XRebel第一行输入网址&am…

linux入门---环境变量

目录标题指令的本质如何不加./方法一方法二环境变量的重置在命令行上查看环境变量为什么会存在环境变量在程序中查看环境变量本地变量和环境变量环境变量的继承指令的本质 在使用linux的时候我们经常会使用很多指令比如说&#xff1a;ll指令&#xff0c;pwd指令&#xff0c;wh…

Java JDK详细安装配置(详细备忘版本)

目录概览一、下载安装二、环境配置三、常见问题一、下载安装 官方下载地址&#xff1a;点我去官网 java20 、java17如下&#xff1a; java8、java11如下 jre8 如下 以 java8 下载为例&#xff1a; 按步骤输入账号密码 之后就会跳出下载显示框 得到了文件名为 jdk-8u361-win…

单机分布式一体化是什么?真的是数据库的未来吗,OceanBase或将开启新的里程碑

一. 数据 我们先说说数据这个东西&#xff0c;这段时间的ChatGPT在全世界的爆火说明了一件事&#xff0c;数据是有用的&#xff0c;并且大量的数据如果有一个合适的LLM大规模语言模型训练之后&#xff0c;可以很高程度的完成很多意想不到的事情。 我们大多数的时候的注意力只…

class03:MVVM模型与响应式原理

目录一、MVVM模型二、内在1. 深入响应式原理2. Object.entries3. 底层搭建一、MVVM模型 MVVM&#xff0c;即Model 、View、ViewModel。 Model > data数据 view > 视图&#xff08;vue模板&#xff09; ViewModel > vm > vue 返回的实例 > 控制中心, 负责监听…

ChatGPT使用介绍、ChatGPT+编程、相关组件和插件记录

文章目录介绍认识ChatGPT是通过英汉互译来实现中文回答的吗同一个问题&#xff0c;为什么中英文回答不同ChatGPT的使用对话组OpenAI APIAI智能绘图DALLE 2ChatGPT for Google插件ChatGPT编程编写代码代码错误修正与功能解读代码评审与优化推荐技术方案编写和优化SQL语句在代码编…

Spring Boot集成RocketMQ实现普通、延时、事务消息发送接收、PULL消费模式及开启ACL | Spring Cloud 30

一、前言 在前面我们通过以下章节对RocketMQ有了基础的了解&#xff1a; docker-compose 搭建RocketMQ 5.1.0 集群&#xff08;双主双从模式&#xff09; | Spring Cloud 28 docker-compose 搭建RocketMQ 5.1.0 集群开启ACL权限控制 | Spring Cloud 29 现在开始我们正式学习…

蓝桥杯 - 求组合数【C(a,b)】+ 卡特兰数

文章目录&#x1f4ac;前言885. 求组合数 I C(m,n) 【dp】886 求组合数 II 【数据大小10万级别】 【费马小定理快速幂逆元】887. 求组合数 III 【le18级别】 【卢卡斯定理 逆元 快速幂 】888.求组合数 IV 【没有%p -- 高精度算出准确结果】 【分解质因数 高精度乘法 --只用一…

5.5G产业再提速!高通5GAdvanced-ready芯片商用终端下半年面世

MWC2023大会召开在即&#xff0c;5GAdvanced产业再添重磅消息&#xff01;2月15日&#xff0c;高通宣布推出全球首个5GAdvanced-ready基带芯片——骁龙X755G调制解调器及射频系统&#xff0c;支持毫米波和Sub-6GHz频段&#xff0c;带来网络覆盖、时延、能效和移动性等全方位的提…

【C语言】深度理解指针(下)

一. 前言&#x1f48e;昨晚整理博客时突然发现指针还少了一篇没写&#xff0c;今天就顺便来补一补。上回书说到&#xff0c;emmm忘记了&#xff0c;没事&#xff0c;我们直接进入本期的内容:本期我们带来了几道指针相关笔试题的解析&#xff0c;还算是相对比较轻松的。话不多说…

RTL8201 以太网PHY芯片 调试记录

一、概述 为了尽量给甲方降低成本&#xff0c;决定使用较低成本的PHY芯片RTL8201F-VB-CG芯片。移植官网的以太网demo程序&#xff0c;git上下载了一份很好看的rtl8201F的驱动程序&#xff0c;用来替换官方demo的lan8742程序。并没有直接通&#xff0c;于是开始了调试之路。 二…

mysql索引类型有哪些?

在Mysql数据库当中&#xff0c;我们经常会谈到Sql语句&#xff0c;当然也会谈到索引优化&#xff0c;那么在数据库当中有哪些索引类型呢&#xff0c;博主在这里进行分享&#xff0c;希望对大家能有所帮助。 目录 1、B-Tree索引&#xff1a; 2、Hash索引&#xff1a; 3、Full…

SpringBoot 将PDF转成图片或World

SpringBoot 将PDF转成图片或World 准备工作Apache PDFBox将PDF转成一张图片将PDF转成多张图片将PDF转成其他文件格式总结SpringBoot 是一款非常流行的 Java Web 开发框架,可以用来构建各种 Web 应用程序。在本篇博客中,我们将介绍如何使用 SpringBoot 将 PDF 转换成图片或其他…

Elasticsearch 学习+SpringBoot实战教程(三)

需要学习基础的可参照这两文章 Elasticsearch 学习SpringBoot实战教程&#xff08;一&#xff09; Elasticsearch 学习SpringBoot实战教程&#xff08;一&#xff09;_桂亭亭的博客-CSDN博客 Elasticsearch 学习SpringBoot实战教程&#xff08;二&#xff09; Elasticsearch …

第十四届蓝桥杯三月真题刷题训练——第 23 天

目录 第 1 题&#xff1a;长草 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&#xff1a; 第 2 题&#xff1a;蓝肽子序列_LCS_最长公共子序列dp问题 题目描述 输入描述 输出描述 输入输出样例 运行限制 代码&#xff1a; 思路&am…

Spring源码面试最难问题——循环依赖

前言 问&#xff1a;Spring 如何解决循环依赖&#xff1f; 答&#xff1a;Spring 通过提前曝光机制&#xff0c;利用三级缓存解决循环依赖&#xff08;这原理还是挺简单的&#xff0c;参考&#xff1a;三级缓存、图解循环依赖原理&#xff09; 再问&#xff1a;Spring 通过提前…

【前沿技术】问答pk【ChatGPT Vs Notion AI Vs BAT AI 】

目录 写在前面 问题&#xff1a; 1 ChatGPT 1.1 截图 ​1.2 文字版 2 Notion AI 2.1 截图 2.2 文字版 3 BAT AI 3.1 截图 3.2 文字版 总结 序言 所有幸运和巧合的事&#xff0c;要么是上天注定&#xff0c;要么是一个人偷偷的在努力。 突发奇想&#xff0c;问三个…

③【Java组】蓝桥杯省赛真题 持续更新中...

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 蓝桥杯真题--持续更新中...一、错误票据题目描…

CCF-CSP认证 202303 500分题解

202303-1 田地丈量&#xff08;矩阵面积交&#xff09; 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度&#xff0c;相交的时候是min右端点-max左端点&#xff0c;不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…

用CSS3画了一只猫

感觉我写得技术含量不高&#xff0c;全都是用绝对定位写的&#xff0c;一定会有更好的&#xff0c;代码量更少的做法吧 <!DOCTYPE html> <html> <head><title>Cute Cat</title><style type"text/css">*{box-sizing: border-box…