Java Web-分页功能详解

分页简介

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

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

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

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

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

分页的分类

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

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

实现原理:

第一个参数是开始数据的索引位置

第二个参数是要查询多少条数据

优点:不会造成内存溢出

缺点:翻页的速度比较慢

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

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

优点:分页的速度比较快

缺点:可能造成内存溢出

传统的分页方式

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

分页的原理

页面中的数据有:

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

分页条中的数据有:

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

总页数:计算的来——totalPage

上一页:计算的来——prePage

下一页:计算的来——nextPage

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

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

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

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

通过计算得到的数据有:

总页数:totalPage

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

上一页:prePage

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

下一页:nextPage

下一页 = 当前页 + 1

尾页:lastPage

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

用户传递的数据:

当前页:currentPage

页面大小:count

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

前台实现分页设计

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

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

简单版本的分页条

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

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

上一页超链:

下一页超链:

最后一页超链:指向了最后一页

中间页:

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

存在的问题:

① 没有边界判断,即在首页仍然可以点击前一页,不符合逻辑也影响用户体验

② 会显示完所有的分页,即如果 totalPage 有50页,那么分页栏将会显得特别长,影响体验

改良版本的分页条

1.写好头和尾

2.写好 这两个功能按钮

使用 标签来增加边界判断,如果没有前面的页码了则设置为disable状态

再通过 JavaScrip 代码来完成禁用功能:

3.完成中间页码的编写

从 循环到 , 相当于是循环变量

status.count 是从1开始遍历

status.index 是从0开始遍历

要求:显示当前页码的前两个和后两个就可,例如当前页码为3的时候,就显示 1 2 3(当前页) 4 5 的页码

理解测试条件:

-10

只要理解了这个判断条件,其他的就都好理解了

注意:测试条件是需要根据项目的需求动态改变的,不是万能的!

后台中的分页

首页在项目中引入上面提到的 Page 工具类,然后我们在 DAO 类中使用 LIMIT 关键字来查询数据库中的信息:

在 Servlet 中获取分页参数并使首页显示的 StudentList 用 page 的参数来获取:

以上即可完成分页功能,但这是基于 Servlet 的版本,在之前写过的项目(学生管理系统(简易版))中实际的使用了这种方法,感兴趣的可以去看一下。

SSM 中的分页

在 SSM 项目中,我们可以使用 MyBatis 的一款分页插件: PageHelper 来帮助我们更加简单的完成分页的需求,官网在这里: PageHelper

在这里,我们演示一下如何使用上面的工具重构我们之前写过的 SSM 项目 —— 学生管理系统-SSM 版

第一步:添加相关 jar 依赖包

PageHelper 需要依赖两个 jar 包,我们直接在 pom.xml 中增加两个 jar 包依赖:

第二步:配置相关环境

在 MyBatis 的 SessionFactory 配置中新增加一个属性名 plugins 的配置:

第三步:重构项目

首先我们把 LIMIT 关键字从映射文件中干掉:

然后注释掉查询数据总条数的 SQL 语句:

在 Dao 类和 Service 类中修改相应的地方:

然后修改掉 StudentController 中的方法:

重启服务器,能看到也能够正确的使用分页功能。

总结

其实我自己对于这个工具比较无感..因为只是弱化了少一部分的功能,并没有我想象中的那样 “智能” ,也没有看到什么好的博文能够点通我的认知,希望了解的大大们能无私分享一下,谢谢!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180614G16I7300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券