分页问题很普遍,开发者几乎都要用到,有关分页的原理可以参考前面的文章: 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);   } }
  
   
 
  |