前言

好久没写Web程序了,这一段时间看了看原来师弟们做的一些程序,感觉还是有很多不足,一个比较典型的例子就是分页查询的实现,正好借着这个机会简单记录一下。
分析
使用场景
“分页”在Web程序里非常常见,比如我们在页面上经常要展示一些列表信息,通常情况下,如果数据过多,我们在一屏上难以罗列出所有的记录,而且很多时候我们可能只是看看比较Top的一些记录,因此,在这种情况下使用“分页”查询只展示部分数据是比较合适的。
实现原理
从数据库角度上来说,分页查询实现的难度并不是很大,当然不同的数据库实现是有一些差异的。以MySQL为例,我们通常会写出如下的SQL语句:
# 简单的单表查询 select [fields] from [table_name] where [expression] order by [field] [asc|desc] limit [offset], [size]
其中有几处地方我们比较关注,第一个就是order by后的字段field和排顺规则,第二个就是limit之后的数据偏移量offset和大小size。
所以,以上几个参数是我们实现分页查询一个关键。
实现
这里的实现主要是指Java后台的实现,关于如何编写一个前端分页插件不在此文的讨论之列。我们来简单梳理一下整个业务逻辑的交互过程,就是”前端查询参数”->”后台业务逻辑查询”->”返回结果集到前端”。
那么问题来了,前端一般要传递哪些参数到服务器后台呢?
回到上面的实现原理上,我们发现,这4个参数我们都是需要的,而且它们不是固定的。从开发角度上来讲,我们首先需要的参数是sortField,sortOrder,即排一定的计算序字段和排序方式,offset我们通常会根据一定的计算规则进行计算,一般在页面上我们使用的是pageCurrent,即用户需要查询的页数,另外页面还必须传递一个参数即pageSize,即每页要显示的数据总量,这样,我们就可以根据pageCurrent和pageSize来计算出offset和size,计算公式如下所示:
offset=(pageCurrent−1)∗pageSize size=pageSize
OK,我们梳理出来了4个字段,即sortField,sorOrder,pageCurrent和pageSize。这些参数是前台应该传递给后台服务的,当然,从程序的健壮性来说,如果用户不传递这些字段,我们也应该有一些默认的实现,比如说如果不传递当前页数,我们默认就是第一页,如果不传递pageSize,我们可以默认其大小为每页30条……那么,第一个Java Bean就出来了,我们称为PageParam类。
public class PageParam {
private static final Integer DEFAULT_PAGE_CURRENT = 1;
private static final Integer DEFAULT_PAGE_SIZE = 30;
/**
* 排序字段
*/
private String sortField;
/**
* 排序方式
* asc | desc
*/
private String sortOrder;
/**
* 查询的当前页
*/
private Integer pageCurrent = DEFAULT_PAGE_CURRENT;
/**
* 查询的数据条目
*/
private Integer pageSize = DEFAULT_PAGE_SIZE;
......
}
现在,我们先忽略服务器端的具体处理流程,来思考一下服务器端需要返回哪些信息到前端页面上进行展示。
下面是我从网上截取的一个典型分页界面(如不能引用请私信我):
通过分析,可以看到,当前页pageCurrent是需要的,且通常会特殊展示。另外如果页数过多,在前端界面里通常只会展示部分页值,那么我们也需要来进行判断,通常情况下我们通过判断总页数即可,那么总页数totalPage是需要的。当然,还有一些隐含的参数我们通常也是要传递给前端进行相关的业务处理的,比如说数据的总条目totalSize和一页显示的数量pageSize,这些通常都会在页面进行展示。第二个Java Bean我们成为PageResult类:
public class PageResult<T> {
/**
* 返回的数据结果集
*/
private List<T> resultList;
/**
* 总数据条目
*/
private Integer totalSize;
/**
* 总页数
*/
private Integer totalPage;
/**
* 当前页
*/
private Integer pageCurrent;
/**
* 显示的数据条目
*/
private Integer pageSize;
......
}
这里totalPage其实是可以根据pageSize和totalSize进行计算出来的,计算公式如下:
totalPage=totalSize%pageSize==0?totalSize/pageSize:(totalSize/pageSize+1)
在实现里,我们对结果集使用了泛型,主要是为了通用处理。还差最后一点,就是服务器端的处理逻辑,这里不太好说的原因在于现在服务器端的框架太多,如MyBatis,spring JDBC,hibernate等等。不同的框架使用上是有较大差别的,不过有一些比较通用的做法这里简单记录一下。
对任何前端传递过来的参数都必须进行校验。这里主要是pageCurrent和pageSize,因为用户很可能传递过来一些无效值,比如负值-1以及一些不合适值如pageSize取100000000等。
排序字段不是必须的。要根据业务来处理,因为很多时候通过id或者其它字段默认实现就可以了,不需要进行重新排序。
pageSize的值要合适。如果太小会造成页面过于空洞,页数过多;而取值过大则会使页面内容繁杂,通常在一屏比较合适,不需要用户拉动滑动条。
以上所述是小编给大家介绍的Java Web中常用的分页组件(Java端实现),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java
# web
# 分页组件
# JavaWeb分页的实现代码实例
# java web实现分页查询实例方法
# javaweb分页原理详解
# JavaWeb 简单分页实现代码
# JavaWeb中的简单分页完整代码(推荐)
# Java Web 简单的分页显示实例代码
# 举例详解用Java实现web分页功能的方法
# Java web velocity分页宏示例
# java web手写实现分页功能
# 分页
# 通常会
# 第一个
# 是有
# 不需要
# 每页
# 第二个
# 在一
# 小编
# 当前页
# 就可以
# 比较合适
# 计算公式
# 的是
# 都是
# 情况下
# 几个
# 来了
# 出来了
# 太多
相关文章:
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
南平网站制作公司,2025年南平市事业单位报名时间?
b2c电商网站制作流程,b2c水平综合的电商平台?
建站之星如何实现PC+手机+微信网站五合一建站?
相册网站制作软件,图片上的网址怎么复制?
如何在云主机上快速搭建多站点网站?
如何快速生成可下载的建站源码工具?
建站之星会员如何解锁更多建站功能?
如何在万网开始建站?分步指南解析
建站主机是什么?如何选择适合的建站主机?
建站主机SSH密钥生成步骤及常见问题解答?
建站之星导航菜单设置与功能模块配置全攻略
网站设计制作公司地址,网站建设比较好的公司都有哪些?
网站代码制作软件有哪些,如何生成自己网站的代码?
如何在橙子建站中快速调整背景颜色?
详解jQuery中基本的动画方法
建站之星免费版是否永久可用?
建站主机功能解析:服务器选择与快速搭建指南
如何实现建站之星域名转发设置?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何通过虚拟主机快速完成网站搭建?
建站主机系统SEO优化与智能配置核心关键词操作指南
如何使用Golang安装API文档生成工具_快速生成接口文档
做企业网站制作流程,企业网站制作基本流程有哪些?
如何零基础在云服务器搭建WordPress站点?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
大连 网站制作,大连天途有线官网?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
宝塔建站无法访问?如何排查配置与端口问题?
宝塔建站助手安装配置与建站模板使用全流程解析
建站主机如何安装配置?新手必看操作指南
营销式网站制作方案,销售哪个网站招聘效果最好?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
定制建站哪家更专业可靠?推荐榜单揭晓
如何自定义建站之星网站的导航菜单样式?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何在建站宝盒中设置产品搜索功能?
如何选择服务器才能高效搭建专属网站?
制作表格网站有哪些,线上表格怎么弄?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
网站制作报价单模板图片,小松挖机官方网站报价?
IOS倒计时设置UIButton标题title的抖动问题
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
香港服务器选型指南:免备案配置与高效建站方案解析
如何在万网ECS上快速搭建专属网站?
为什么Go需要go mod文件_Go go mod文件作用说明
如何快速搭建高效WAP手机网站吸引移动用户?
如何批量查询域名的建站时间记录?
*请认真填写需求信息,我们会在24小时内与您取得联系。