【问题背景】
最近写了一个新闻资讯的小demo,里面涉及到对获取到的新闻列表进行分页显示。这种当初看繁琐又费解的业务,现在写起来顺手多了。回想到当年那个懵懂又好奇的自己,为了写一个分页,到处翻看网页,找资料,折腾半天下来还是不知道怎么该怎么入手,网上找到一些比较像的代码,一通复制粘后贴勉强把老师要求的分页功能实现。想起来又可怜又可笑。或许成长就是充满着很多无奈吧。
【问题描述】
本次我要分享的是javaWeb中的分页处理思想。
【探讨分析】
1.使用面向对象的思想来分析我们手里的问题。
我们要做的是什么?是分页显示,分的是“页”,那么我们所面临的问题核心就是“页”。因此,我们可以创建一个名为PageBean的javabean来描述我们要处理的对象。显然,在我们分页的时候,需要知道当前页码,需要知道被分页的数据本身,被分页数据的总记录数(总条数),每页显示的数据条数和总页数。
即:分页类{ 当前页码,单页数据条数,分页数据总条数,总页数,被分页数据}
2.通过分页对象传递分页数据。
对于每次分页请求,需要获取分页必要信息的信息,如当前页码,单页数据条数,分页数据总条数,用这些信息初始化一个分页请求对象A,这些信息就被封装在A对象里了。进入业务处理时,根据分页请求的种类,如首页,末页,上一页,下一页等不同分页请求读取分页对象A具有的信息进行业务处理。业务正确处理完成后得到的数据信息封装在一个新的分页对象B中,使用分页结果对象B对刚才的分页请求进行响应。
3.分页对象封装业务处理后的分页结果数据。
分页请求的业务处理必然会获取被分页的数据集,正是这些大量的数据集一次性展示出来会很冗杂且容易让人产生视觉疲劳,为了页面美观和观看者良好的体验感,才有了分页需求。既然我们处理的核心是我们视线范围的“页”,那么这个“页”中包含它本身应该显示的数据集信息的一部分是再正常不过的了。故分页业务处理过程中应该把即将返回的这个“页”应该具有的数据集信息封装进这个“页”对象,这一部分数据集信息就是分页结果,也是分页请求想要获取的显示数据。即分页业务结束后,返回的是一个分页对象,这个对象封装了正确的信息,这些信息是即将响应给相应分页请求的,这些信息里包含了当前页码,单页数据条数,分页数据总条数,总页数和分页结果数据。
4.使用泛型,代码复用。
这是一个非常普适的分页分析过程,分页类应该能够根据不受被分页数据的类型的影响,因此应该使用泛型,让这个分页类能够重用,满足绿色编码规范。
【代码描述分页类】
1.分页类的属性展示(可自定义指定默认值,已经省略展示常规的getter()和setter()方法):
//分页类
public class PageBean<T>{
private int currentPageNum=1;//当前页码
private int displayCount=5;//每页显示的数据条数
private int allCount;//总数据条数
private int allPageCount;//总页数
private List<T> dateList;//分页结果数据集合
}
2.当前页码的细节处理:分页类的实例化对象应该满足在设置其页码时能够保证页码的正确性,如:必须大于0,但不大于总页数。当前页数最大时便和总页数相等,最小时是1:(注意,使用时一定要先初始化分页对象的总页数,再初始化当前页码)。
public void setCurrentPageNum(int pageNum){
if(pageNum>0 && pageNum < this.allPageCount){
this.currentPageNum=pageNum;
}else if(pageNum >= this.allPageCount){
this.currentPageNum = this.allPageCount;
}else{
this.currentPageNum = 1;
}
}
3.每页显示数据条数的细节处理:必须是大于0且小于总数据条数的整数。最大时与数据总条数相等,最小时为5(自定义)(注意,使用时初始化总数据条数在前,显示条数初始化在后)。
public void setDisplayCount(int displayCount){
if(displayCount > 0 && displayCount < this.allCount){
this.displayCount = displayCount;
}else if(displayCount >= this.allCount){
this.displayCount = this.allCount;
}else{
this.displayCount=5;
}
}
【使用说明】
1.用于封装分页请求中的旧页面信息。封装分页业务处理后的新页面信息。
2.初始化时,总页数和总数据条数初始化在前,其他属性初始化随后。
3.假若新闻类News是被分页的数据类型,那么需要News类提供查询总记录数的方法,提供查询从某一索引开始的n条新闻的方法。并将这些方法返回的结果用于初始化新的分页对象。
【结语】
这是一次比较繁琐的记录,用来表达并祭奠曾经那些懵懂又可爱的时光!