一个简洁的分页实现(一)

原创 2004年10月01日 13:53:00

分页问题很普遍,开发者几乎都要用到,有关分页的原理可以参考前面的文章:
http://blog.csdn.net/treeroot/archive/2004/09/29/121071.aspx

很多人在分页问题上处理的不够好,往往导致整个程序混乱,代码可读性差,不过有经验的一般都会做一个JavaBean来实现分页功能,但是就是这个JavaBean如何设计又带来一大堆问题,有的甚至使程序逻辑更加混乱。这里推荐一篇文章:
http://blog.csdn.net/treeroot/articles/122802.aspx

设计这个分页功能要达到的目标:
1.和实现无关,这样才可以复用。
2.符合开闭原则,也就是说可以新增功能,但不需要修改。
3.简洁明了,容易看懂。

下面的设计每次只获取一页数据,每次都要重新设置查询总数,具体如何获得自己实现,这是一个比较通用的分页实现。

这里设计一个接口:
package treeroot.util;
import java.util.List;
/**
* 该接口用来实现分页功能,注意这里没有提供修改的功能。
* @author treerot
* @version 1.0
* @since 2004-9-30
*/
public interface Pageable
{
  /**
  * 获得数据结果
  * @return
  */
  public List getResult();
  /**
  * 获得查询总数
  * @return
  */
  public int getCount();
  /**
  * 获得每页纪录数
  * @return
  */
  public int getPageSize();
  /**
  * 获得当前页编号
  * @return
  */
  public int getCurrentPage();
  /**
  * 获得总页数
  * @return
  */
  public int getPages();
  /**
  * 每页默认显示纪录数
  */
  public final static int DEFAULT_PAGESIZE=20;

}
这个接口非常简单,就是包括一个结果列表和一些分页的必要信息,这里注意几点:
1.这个接口的实现表示的是某一次查询的某一页数据,和上次查询无关
2.这个接口的实现应该是只读的,也就是说不可以修改的。
3.getPages()方法是冗余的,但是这里仍然提供这个方法。

下面给出一个抽象实现:
package treeroot.util;
import java.util.List;
/**
* @author treerot
* @version 1.0
* @since 2004-9-30
*/
public abstract class AbstractPage implements Pageable
{
  private int currentPage;
  private int pageSize;
  private int pages; 
 
  protected int count;
  protected List result;

  /**
  * 指定当前页 
  * @param currentPage
  * @throws PageException
  */
  public AbstractPage(int currentPage){
    this(currentPage,Pageable.DEFAULT_PAGESIZE);
  }

  /**
  * 指定当前页和页大小
  * @param currentPage
  * @param pageSize
  * @throws PageException
  */
  public AbstractPage(int currentPage,int pageSize) {
    this.currentPage=currentPage;
    this.pageSize=pageSize;
  }

  protected void checkPage(int currentPage) throws PageException{
    if((currentPage<1)||(currentPage>this.getPages()))
       throw new PageException("页超出范围:总页数为"+this.getPages()+",当前页为"+currentPage);
  }
  /**
  * 这个方法被子类重写用来初始化,也就是计算count值和result结果,在子类 的构造函数中调用。
  */
  abstract protected void init() throws PageException;
  
  public List getResult()
  {
    return result;
  }
 
  public int getCount()
  {
    return count;
  }

  public int getPageSize()
  {
    return pageSize;
  }

  public int getCurrentPage()
  {
    return currentPage; 
  }
 
  public int getPages()
  {
    if(pages==0) this.pages=(count+pageSize-1)/pageSize;
    return pages;
  }
}

这个抽象类实现了接口中的所有方法,但是定义了一个抽象方法init(),在子类中必须实现这个方法。上面的一个接口和一个抽象类看起来比较简单,你可能会觉得好像什么都没有做,实现上确实没有做什么,但是却可以给开发带来很大的帮助。我们可以根据自己的需要要继承这个抽象类,而数据可以通过各种方式获得,比如直接通过一个List获得,或者通过JDBC,Hibernate等等,不过我们都需要把结果封装到一个List里面,通过Hibernate就显得特别方便了。

PageException是自定义的一个异常
package treeroot.util   
/**
* @author treeroot
* @version 1.0
* @since 2004-9-30
*/
public class PageException extends Exception
{
  public PageException(){
    super();
  }
  public PageException(String message){
    super(message);
  }
}

简单分页插件,kkpager

后台用习惯了框架分页,到做网页的时候就不自己去写分页了,并且需要的分页也是比较简单的,然后就在网上找了个简单的分页插件:kkpager 需要导入的js 和cs:       kkpager.js ...
  • mingtianhaiyouwo
  • mingtianhaiyouwo
  • 2016年04月14日 16:25
  • 961

一个简洁的分页实现(三)

我开始就是为了在Hibernate中使用分页才设计这个分页实现的,因为使用Hibernate时,查询后的结果被自动封装到一个List中了,所以使用起来特别方便,这里我做了一个比较庸俗的实现,就是查询参...
  • treeroot
  • treeroot
  • 2004年10月01日 15:22
  • 1483

一个简洁的分页实现(二)

这里构建一个最简单的分页实现,也就是说通过查询结果的列表来构建页对象,这种情况是存在的:比如本次要显示的结果不是直接从数据库查询得到的,而是通过过滤某次数据库查询得到的,总之就是一个包含所有数据的结果...
  • treeroot
  • treeroot
  • 2004年10月01日 14:45
  • 1635

thinkphp简洁、美观、靠谱的分页类

废话不多说先上图预览下;即本博客的分页; 这个分页类是在thinkphp框架内置的分页类的基础上修改而来; 原分页类的一些设计,在实际运用中感觉不是很方便; 1:只有一页内容时不显示分页...
  • bai9474500755
  • bai9474500755
  • 2016年03月06日 21:20
  • 2296

jquery插件--简单的分页插件

jquery插件开发--简单的分页插件          jquery提供很方法的js插件开发函数,关于jquery插件的开发教程,可以参考博主的上一篇博文《jQuery插件开发精品教程》,这里就不...
  • cb2474600377
  • cb2474600377
  • 2016年09月30日 10:38
  • 1306

tp5分页简单

1 找到文件:/thinkphp/library/think/paginator/driver/Bootstrap.php php // +-------------------------...
  • wuzengman
  • wuzengman
  • 2017年09月30日 11:10
  • 776

pc端表格分页的简单实现

(function ($) { var obj = obj || {}; // 分页开始 var currentPage = 1;//默认第一页 var pageSize ...
  • jsonma
  • jsonma
  • 2017年05月30日 20:21
  • 180

Web页面分页打印小结-简单实现

最近开发单位内部系统中的档案管理时,档案管理员提出需求,希望在打印档案盒中卷内目录,分页打印,因为目前的打印针对超过一页的档案记录,在第二页中无法显 示表头,还会出现表格断开不连续如图: ...
  • gukehui2012
  • gukehui2012
  • 2016年11月30日 14:42
  • 780

JS之页面实现多个分页

JS之页面实现多个分页
  • netuser1937
  • netuser1937
  • 2017年02月08日 08:35
  • 1548

一个完全独立的、简洁的jquery前端分页组件,用到动态添加页内样式的方法哦。

以前一直没有动态往页面添加过可被调用样式类,今天为了封装的独立性(只有js文件),尝试了一下,竟然能行,因此记录下来,已备后用...
  • foren_whb
  • foren_whb
  • 2015年11月27日 12:50
  • 1464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简洁的分页实现(一)
举报原因:
原因补充:

(最多只允许输入30个字)