真正的通用分页工具类

曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的。现在好了,经本人总结与提炼:
无论你是否自己手动分页,还是借助了框架进行分页。此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下:

Java code
 
  
package cn.asiatelecom.wlan.dao; import java.util.List; /** * 用于分页的工具类 * @author 莫取网名 */ public class Pager < T > { private List < T > list; // 对象记录结果集 private int total = 0 ; // 总记录数 private int limit = 20 ; // 每页显示记录数 private int pages = 1 ; // 总页数 private int pageNumber = 1 ; // 当前页 private boolean isFirstPage = false ; // 是否为第一页 private boolean isLastPage = false ; // 是否为最后一页 private boolean hasPreviousPage = false ; // 是否有前一页 private boolean hasNextPage = false ; // 是否有下一页 private int navigatePages = 8 ; // 导航页码数 private int [] navigatePageNumbers; // 所有导航页号 public Pager( int total, int pageNumber) { init(total, pageNumber, limit); } public Pager( int total, int pageNumber, int limit) { init(total, pageNumber, limit); } private void init( int total, int pageNumber, int limit){ // 设置基本参数 this .total = total; this .limit = limit; this .pages = ( this .total - 1 ) / this .limit + 1 ; // 根据输入可能错误的当前号码进行自动纠正 if (pageNumber < 1 ){ this .pageNumber = 1 ; } else if (pageNumber > this .pages){ this .pageNumber = this .pages; } else { this .pageNumber = pageNumber; } // 基本参数设定之后进行导航页面的计算 calcNavigatePageNumbers(); // 以及页面边界的判定 judgePageBoudary(); } /** * 计算导航页 */ private void calcNavigatePageNumbers(){ // 当总页数小于或等于导航页码数时 if (pages <= navigatePages){ navigatePageNumbers = new int [pages]; for ( int i = 0 ;i < pages;i ++ ){ navigatePageNumbers[i] = i + 1 ; } } else { // 当总页数大于导航页码数时 navigatePageNumbers = new int [navigatePages]; int startNum = pageNumber - navigatePages / 2 ; int endNum = pageNumber + navigatePages / 2 ; if (startNum < 1 ){ startNum = 1 ; // (最前navPageCount页 for ( int i = 0 ;i < navigatePages;i ++ ){ navigatePageNumbers[i] = startNum ++ ; } } else if (endNum > pages){ endNum = pages; // 最后navPageCount页 for ( int i = navigatePages - 1 ;i >= 0 ;i -- ){ navigatePageNumbers[i] = endNum -- ; } } else { // 所有中间页 for ( int i = 0 ;i < navigatePages;i ++ ){ navigatePageNumbers[i] = startNum ++ ; } } } } /** * 判定页面边界 */ private void judgePageBoudary(){ isFirstPage = pageNumber == 1 ; isLastPage = pageNumber == pages && pageNumber != 1 ; hasPreviousPage = pageNumber != 1 ; hasNextPage = pageNumber != pages; } public void setList(List < T > list) { this .list = list; } /** * 得到当前页的内容 * @return {List} */ public List < T > getList() { return list; } /** * 得到记录总数 * @return {int} */ public int getTotal() { return total; } /** * 得到每页显示多少条记录 * @return {int} */ public int getLimit() { return limit; } /** * 得到页面总数 * @return {int} */ public int getPages() { return pages; } /** * 得到当前页号 * @return {int} */ public int getPageNumber() { return pageNumber; } /** * 得到所有导航页号 * @return {int[]} */ public int [] getNavigatePageNumbers() { return navigatePageNumbers; } public boolean isFirstPage() { return isFirstPage; } public boolean isLastPage() { return isLastPage; } public boolean hasPreviousPage() { return hasPreviousPage; } public boolean hasNextPage() { return hasNextPage; } public String toString(){ String str = new String(); str = " [ " + " total= " + total + " ,pages= " + pages + " ,pageNumber= " + pageNumber + " ,limit= " + limit + // ",navigatePages="+navigatePages+ " ,isFirstPage= " + isFirstPage + " ,isLastPage= " + isLastPage + " ,hasPreviousPage= " + hasPreviousPage + " ,hasNextPage= " + hasNextPage + " ,navigatePageNumbers= " ; int len = navigatePageNumbers.length; if (len > 0 )str += (navigatePageNumbers[ 0 ]); for ( int i = 1 ;i < len;i ++ ){ str += ( " " + navigatePageNumbers[i]); } // sb+=",list="+list; str += " ] " ; return str; } }




PS: 此类在构造时最多只要3个参数。由于容错需要,list的setter得进行后继处理。
假设你使用了Hibernate,核心代码如下:

Java code
 
  
int totalCount = Integer.valueOf(queryCount.uniqueResult().toString()); Pager pager = new Pager < T > (totalCount, pageNumber,limit); queryList.setFirstResult((pager.getPageNumber() - 1 ) * limit); // 容错处理 queryList.setMaxResults(limit); pager.setList(queryList.list()); return pager;



对于用其他方式分页的人,同样可以复用Pager类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值