首页 > 开发 > Java > 正文

举例详解用Java实现web分页功能的方法

2024-07-13 09:55:53
字体:
来源:转载
供稿:网友

这篇文章主要介绍了举例详解用Java实现web分页功能的方法,这种基本功能现一般通过Hibernate框架来完成,需要的朋友可以参考下

分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理。首先是查询获得一个结果集(表现为查询数据库获得的结果),如果结果比较多我们一般都不会一下显示所有的数据,那么就会用分页的方式来显示某些数据(比如20条)。因为Http的无状态性,每一次提交都是当作一个新的请求来处理,即使是换页,上一次的结果对下一次是没有影响的。

这里总结三种实现分页的方式,不知道还有没有别的!

1.每次取查询结果的所有数据,然后根据页码显示指定的纪录。

2.根据页面只取一页数据,然后显示这一页,这里要构造sql语句。

3.取一定页数的数据,就是前面两种的折中。

这里还要注意的是这些数据是放在request还是session中,这里一一讨论

1.一般不会放在session中,因为会占用大量内存,所以要放在request里面。

优点:实现比较简单,查询速度比较快。

缺点:占用内存多一些,网络传输数据多。

对于数据量比较少的查询这种方法比较合适。这里有人把数据放在session中,这样换页的时候就不用重新查询,但是这样是极其不好的,强烈建议不要这样使用。

2.肯定不会放在session中,因为放在session中没有意义。

优点:占用内存少。

缺点:比较麻烦,必须先获得查询结果的总数,因为要知道有多少纪录才知道有多少页。另外要构造分页查询语句,对于不同的数据库是不一样的。

3.这种情况是肯定放在session中了,要不然我干吗取好几页呀,这样的实现是为了减少数据库查询的次数,比如我保存第1到10的纪录,那么换页的时候如果在1到10之间就可以直接从session获取。如果换到11页,我可以重新设置缓存11到

20页的数据(或者5到15页的数据),这样的话换10次才需要一次数据库查询操作。

优点:占用内存相对不多,提高平均查询速度。

缺点:实现起来更加复杂,可能存在脏数据,需要自己定义一个缓存集合。如果查询的数据量比较大,可以考虑采用这样方式。

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

这里设计一个接口:

 

 
  1. package treeroot.util; 
  2. import java.util.List; 
  3. /** 
  4. * 该接口用来实现分页功能,注意这里没有提供修改的功能。 
  5. * @author treerot 
  6. * @version 1.0 
  7. * @since 2004-9-30 
  8. */ 
  9. public interface Pageable 
  10.   /** 
  11.   * 获得数据结果 
  12.   * @return 
  13.   */ 
  14.   public List getResult(); 
  15.   /** 
  16.   * 获得查询总数 
  17.   * @return 
  18.   */ 
  19.   public int getCount(); 
  20.   /** 
  21.   * 获得每页纪录数 
  22.   * @return 
  23.   */ 
  24.   public int getPageSize(); 
  25.   /** 
  26.   * 获得当前页编号 
  27.   * @return 
  28.   */ 
  29.   public int getCurrentPage(); 
  30.   /** 
  31.   * 获得总页数 
  32.   * @return 
  33.   */ 
  34.   public int getPages(); 
  35.   /** 
  36.   * 每页默认显示纪录数 
  37.   */ 
  38.   public final static int DEFAULT_PAGESIZE=20; 
  39.  

这个接口非常简单,就是包括一个结果列表和一些分页的必要信息,这里注意几点:

1.这个接口的实现表示的是某一次查询的某一页数据,和上次查询无关

2.这个接口的实现应该是只读的,也就是说不可以修改的。

3.getPages()方法是冗余的,但是这里仍然提供这个方法。

下面给出一个抽象实现:

 

 
  1. package treeroot.util; 
  2. import java.util.List; 
  3. /** 
  4. * @author treerot 
  5. * @version 1.0 
  6. * @since 2004-9-30 
  7. */ 
  8. public abstract class AbstractPage implements Pageable 
  9.   private int currentPage; 
  10.   private int pageSize; 
  11.   private int pages;  
  12.    
  13.   protected int count; 
  14.   protected List result; 
  15.  
  16.   /** 
  17.   * 指定当前页  
  18.   * @param currentPage 
  19.   * @throws PageException 
  20.   */ 
  21.   public AbstractPage(int currentPage){ 
  22.     this(currentPage,Pageable.DEFAULT_PAGESIZE); 
  23.   } 
  24.  
  25.   /** 
  26.   * 指定当前页和页大小 
  27.   * @param currentPage 
  28.   * @param pageSize 
  29.   * @throws PageException 
  30.   */ 
  31.   public AbstractPage(int currentPage,int pageSize) { 
  32.     this.currentPage=currentPage; 
  33.     this.pageSize=pageSize; 
  34.   } 
  35.  
  36.   protected void checkPage(int currentPage) throws PageException{ 
  37.     if((currentPage<1)||(currentPage>this.getPages())) 
  38.        throw new PageException("页超出范围:总页数为"+this.getPages()+",当前页为"+currentPage); 
  39.   } 
  40.   /** 
  41.   * 这个方法被子类重写用来初始化,也就是计算count值和result结果,在子类 的构造函数中调用。 
  42.   */ 
  43.   abstract protected void init() throws PageException; 
  44.    
  45.   public List getResult() 
  46.   { 
  47.     return result; 
  48.   } 
  49.   
  50.   public int getCount() 
  51.   { 
  52.     return count; 
  53.   } 
  54.  
  55.   public int getPageSize() 
  56.   { 
  57.     return pageSize; 
  58.   } 
  59.  
  60.   public int getCurrentPage() 
  61.   { 
  62.     return currentPage;  
  63.   } 
  64.   
  65.   public int getPages() 
  66.   { 
  67.     if(pages==0) this.pages=(count+pageSize-1)/pageSize; 
  68.     return pages; 
  69.   } 

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

PageException是自定义的一个异常

 

 
  1. package treeroot.util    
  2. /** 
  3. * @author treeroot 
  4. * @version 1.0 
  5. * @since 2004-9-30 
  6. */ 
  7. public class PageException extends Exception 
  8.   public PageException(){ 
  9.     super(); 
  10.   } 
  11.   public PageException(String message){ 
  12.     super(message); 
  13.   } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表