java分页技术

本文详细介绍了分页工具类Pager的实现过程,包括如何计算总页数、导航页码、判断页面边界等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test.dao;

 

import java.util.List;

 

/**

 * 用于分页的工具类

 * @author bin

 */

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 voidcalcNavigatePageNumbers(){

       //当总页数小于或等于导航页码数时

       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;

                //(最前navigatePages页

                for(inti=0;i<navigatePages;i++){

                    navigatePageNumbers[i]=startNum++;

                }

           }else if(endNum>pages){

                endNum=pages;

                //最后navigatePages页

                for(inti=navigatePages-1;i>=0;i--){

                   navigatePageNumbers[i]=endNum--;

               }

           }else{

                //所有中间页

                for(inti=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 voidsetList(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(){

       StringBuffer sb=new StringBuffer();

       sb.append("[")

           .append("total=").append(total)

           .append(",pages=").append(pages)

           .append(",pageNumber=").append(pageNumber)

           .append(",limit=").append(limit)

           .append(",isFirstPage=").append(isFirstPage)

           .append(",isLastPage=").append(isLastPage)

           .append(",hasPreviousPage=").append(hasPreviousPage)

           .append(",hasNextPage=").append(hasNextPage)

       .append(",navigatePageNumbers=");

       int len=navigatePageNumbers.length;

       if(len>0)sb.append(navigatePageNumbers[0]);

       for(int i=1;i<len;i++){

           sb.append(" "+navigatePageNumbers[i]);

       }

       sb.append(",list.size="+list.size());

       sb.append("]");

       return sb.toString();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值