自己设计的网站,如何实现分页功能?(详细代码+注释)
目录
前言
实现分页功能
需求分析
客户端开发
服务器开发
前后端交互——两种前端得到 文章总页数 的方法,那种更合适?
前言
你在设计网站的时候是否有过这样的烦恼:“我设计的网站怎么就是从上到下一条线内容全部展开,一点都不好看!有没有什么好的办法呢?”,实现一个简单的分页功能就能帮你解决这样的烦恼,接下来我们就来看看如何实现一个简单的分页功能~
实现分页功能
需求分析
例如现在你有这样一个需求:对文章列表页面实现分页功能。
那么什么是分页功能呢?
简单来说就是实现以下四个按钮:
- 首页按钮:点击此按钮跳转到文章列表的首页。
- 上一页按钮:点击此按钮跳转到文章列表当前页的上一页。特殊处理:若当前文章列表在第一页,那么点击上一页则提醒用户“当前已在首页!”。
- 下一页按钮:点击此按钮跳转到文章列表当前页的下一页。特殊处理:若当前文章列表在最后一页,那么点击上一页则提醒用户“当前已在最后一页!”。
- 末页按钮:点击此按钮跳转到文章列表的最后一页。
最终实现效果如下:
接下来就来具体实现~
客户端开发
假设设计的文章版心如下
<!-- 版心 --><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">查看全文 >></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;}//公式计算得到 offsetint offset = (pindex - 1) * psize;List<ArticleInfo> list = articleService.getListByPage(psize, offset);//当前列表有多少也//a.总共有多少条数据int totalCount = articleService.getArtAllCount();//b.总条数 / psizedouble 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);}
前后端交互——两种前端得到 文章总页数 的方法,那种更合适?
两种方法分别如下
- 后端使用哈希表带上 文章总数和文章列表 传送给前端,前端进行一次 HTTP 请求完成分页功能的实现”。(刚刚所讲的分页功能就是这样实现的)
- 前后端使用两次 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">查看全文 >></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 建立连接时需要时间的,因此在效率上,第一种方式更优,并且企业中最常用的也是第一种方式。
相关文章:
自己设计的网站,如何实现分页功能?(详细代码+注释)
目录 前言 实现分页功能 需求分析 客户端开发 服务器开发 前后端交互——两种前端得到 文章总页数 的方法,那种更合适? 前言 你在设计网站的时候是否有过这样的烦恼:“我设计的网站怎么就是从上到下一条线内容全部展开,一点都…...
STM32F407控制微型推拉式电磁铁(通过继电器)
1、继电器 继电器相当于开关,单片机通过io口高低电平的控制来控制继电器的开闭。采用继电器的好处除了能够用低电压控制高电压(如32单片机控制220V的电压)外,还可以防止电流反冲,弄烧单片机。 本文采用3.3v的电磁铁&am…...
VS Code工作区用法
背景VS Code可以通过"文件/打开文件夹"来打开本地项目,但是想要打开多个项目便需要来回切换,比较费劲。此时就可以使用工作区功能,将不同的项目放置到同一个工作区中,这样切换项目的时候就会非常方便。操作方法打开其中…...
Mybatis-Plus SQLFeatureNotSupportedException: getObject with type问题解决
问题描述: Error attempting to get column modify_time from result set. Cause: java.sql.SQLFeatureNotSupportedException: getObject with type ; getObject with type; nested exception is java.sql.SQLFeatureNotSupportedException: getObject with type…...
Unity | 发布Android的那些事儿
1.使用UnityWebRequest获取StreamingAssets中的json文件(1)直接根据不同平台指定url路径IEnumerator AITalPredZhanHui(){string url;string fileName "girl.json"; #if UNITY_EDITOR || UNITY_STANDALONEurl "file://" Applicat…...
git为什么要先commit,然后pull,最后再push?而不是commit完直接push?
情况是这样的,现在远程有一个仓库,分支就一个,是master。然后我本地的仓库是从远程的master上clone下来的。大家都是clone下来,再在自己本地改好,再commit然后pull然后push,大家都是这么做的。那么现在问题…...
若依框架----源码分析(@RateLimiter)
若依作为最近非常火的脚手架,分析它的源码,不仅可以更好的使用它,在出错时及时定位,也可以在需要个性化功能时轻车熟路的修改它以满足我们自己的需求,同时也可以学习人家解决问题的思路,提升自己的技术水平…...
页面的重排和重绘?
思路: 网页渲染HTML文件到浏览器的过程->定义->如何优化网页渲染HTML文件到浏览器的过程HTML 文件通过HTML解析器解析生成DOM树;CSS文件通过CSS解析器生成CSSOM树;DOM树和CSSOM树生成渲染树(render tree)&#x…...
人脸检测-python和c++实现
人脸检测是计算机视觉领域中的一个重要应用,其目的是从图像或视频中自动检测出其中的人脸,并对其进行识别、跟踪等操作。人脸检测技术已经广泛应用于安防、人机交互、娱乐等领域,具有广泛的应用前景。 人脸检测的基本思路可以分为以下几个步骤: 图像预处理:首先需要对输入…...
PowerJob源码环境搭建
一、IEDA导入PowerJob源码 gitgithub.com:PowerJob/PowerJob.gitPowerJob 由调度服务器(powerjob-server)和执行器(powerjob-worker)两部分组成 powerjob-server 负责提供 Web 服务和完成任务的调度powerjob-worker 则负责执行用…...
天梯赛刷题小记 —— L2
最近在重刷 天梯赛,浅浅记录一下,进入L2阶段了 L2-001 紧急救援 解题思路:典型的dijkstra模板题,带路径记录与权重,方案数记录,解析出过 Dijkstra(兼路径) #include <bits/stdc.h> #define inf…...
Prometheus监控实战系列十九:监控Kubernetes集群(上)
Kuberentes是一款开源的容器编排产品,由Google开发后发布到社区,并在2015年将该项目捐献给了云原生基金会(Cloud Native Computing Foundation)。从2014年第一个版本发布以来,Kubernetes便迅速获得开源社区的追捧&…...
番茄学习法——亲测超级好用
今天给大家分享下我最近使用的学习方法,真的非常好用!大家用起来! 在日常的学习和工作中,我们经常会遇到一些难以克服的问题:分心、效率低下、焦虑等。为了帮助人们更好地学习和工作,一些学习方法和工具应运…...
vue 项目中使用高德地图
一、账号准备 首先,需要注册并登录高德地图开放平台,申请密钥。操作指引:高德地图开放平台 二、安装高德地图加载器 npm 安装: npm i amap/amap-jsapi-loader --save或者 yarn 安装: yarn add amap/amap-jsapi-loa…...
【每日一题】病人排队
题目描述小理是个热爱生活的孩子。病人登记看病,小理想编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:1. 老年人(年龄 ≥≥ 60岁)比非老年人优先看病。2. 老年人按年龄从大到小的顺序看病,年龄…...
【数据结构】链表OJ题
目录面试题 02.04 分割链表剑指 Offer II 027 回文链表160 相交链表141 环形链表142 环形链表 II138 复制带随机指针的链表面试题 02.04 分割链表 定义lesshead和greaterhead链接小于和大于等于k的值分别设置哨兵位和尾节点指针最后将两表去除哨兵位再链接 struct ListNode* p…...
冒泡 VS 插入 VS 选择——谁更胜一筹?(附排序源码)
文章目录什么样的“排序算法”更加优质?排序算法的执行效率排序算法的内存消耗排序算法的稳定性冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)最终的胜利者…...
[python tools] 今天看到另一个配置工具 YACS,所以做下笔记
YACS 实际上就只是把别人的readme翻译了一下 github: https://github.com/rbgirshick/yacs 样例代码: https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md 一、使用方法 1. 首先搞一个config的python文件,用来存一下基本的配置信息 比…...
Prometheus cadvisor容器监控和node-exporter节点监控
往期文章 Prometheus监控系统 https://blog.csdn.net/qq_39578545/article/details/108754585 Docker之compose介绍 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。下面介绍Docker官方产品,Docker Comp…...
机器学习|正则化|评估方法|分类模型性能评价指标|吴恩达学习笔记
前文回顾:逻辑回归 目录 📚正则化 🐇过拟合的问题 🐇代价函数 🐇正则化线性回归 🐇正则化的逻辑回归模型 📚模型评估方法 🐇留出法(hold-out) &#…...
python迭代器详解
不懂的问题:什么是协变、逆变?渐进式? _T_co TypeVar("_T_co", covariantTrue) # Any type covariant containers.作者:20岁爱吃必胜客(坤制作人),近十年开发经验, 跨域学习者&…...
关于Docker逃逸
关于Docker逃逸 文章目录关于Docker逃逸前言一、判断是否为docker容器?二、privileged特权模式启动容器逃逸三、 Docker Remote API未授权访问逃逸四、危险挂载导致Docker逃逸五、危险挂载Docker Socket逃逸六、 挂载宿主机procfs逃逸七、脏牛漏洞来进行docker逃逸八…...
@Autowired和@Resource区别
Autowired和Resource到底有什么区别 Autowired 和 Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同: 来源不同:Autowired 来自 Spring 框架,而 Resource 来自…...
动态内存管理详细讲解
目录 1.为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 今天要和大家分享的内容是的动态内存管理,我们先从他的定义入手学习。 1.为什么存在动态内存分配 我们到现在已经掌握了内存开辟的方式就是要么创建一个变量…...
Python和Excel的完美结合:常用操作汇总(案例详析)
在以前,商业分析对应的英文单词是Business Analysis,大家用的分析工具是Excel,后来数据量大了,Excel应付不过来了(Excel最大支持行数为1048576行),人们开始转向python和R这样的分析工具了&#…...
卡特兰数、斯特林数基础
卡特兰数 从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n),只能向右或向上走,不能穿过对角线,的路径的条数,称为卡特兰数HnH_nHn。 则有H01H_01H01。 通项公式: Hn(2nn)−(2nn−1)H_n\begin{pmatrix} 2n\\ n \en…...
STL——mapmultimap和setmultiset
一、关联式容器 与序列式容器相同,关联式容器也是用于存储数据的,不同的是,关联式容器里存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构,该…...
2023热门抖音权重查询小程序源码
2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样,小程序适配优化。接口免费。小程序不是网页 修改教程: 1,如果想修改或者去除水印,直接删除或修改“index.html”12~22行 2,如果想修改logo,直接…...
153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]
我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...
如何成为优秀的程序员
崔宝秋,现任小米首席架构师、小米云平台负责人。1995年赴美留学,纽约州立大学石溪分校计算机科学系博士毕业,曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师,2012年回国加入小米科技。 20…...
php网站建设与维护/正规seo排名多少钱
基数排序基本思想 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 这样说明,比较难理解,…...
佛山市住房和建设局网站首页/网络营销专业就业方向
简介: 一套简洁的绿色风格毛毛虫苹果cms模板,苹果CMSV10版本,自适应手机端。 模板包含影视、新闻、留言、专题模块,页面很多就不一一截图了。 修复了首页图片不显示的BUG,已测试,完美无错。 安装方法&am…...
做门窗投标网站/秦皇岛百度推广
国家示范性高职院校名单(109所) http://www.sina.com.cn 2011年07月15日 10:52 新浪教育 新浪教育讯 2006年11月,为了提升高职院校的办学水平,教育部启动了被称为“高职211”的“百所示范性高等职业院校建设工程”。根据规划,“十一五”期间…...
wordpress+重装教程/百度网页推广
SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁。再也不用为了组装协议而劳烦辛苦了!一、Spring注解ResponseBody,RequestBody和HttpMessageConverterSpring 3.X系列增加了新注解 ResponseBody , Req…...
成都优化网站哪家公司好/手机制作网站的软件
远程服务器返回错误: 404错误、远程服务器返回错误:500错误、 HttpWebResponse远程服务器返回错误:(404、500) 错误。 现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req (HttpWebRequest)WebRequest.Create(strUrl);req.Us…...
自己做网站写文章/搜索引擎网址有哪些
硕思logo设计师电脑版是一个很好用的logo创建应用。该应用只需置入相片并进行自定义设置,里面有图像渐变、文本效果、阴影、发光、斜角、倒影等各种各样的logo图片款式,令你能够轻易获得你创作的图片。硕思logo设计师电脑版软件特色1、操作简单的logo设计…...