分页工具类——PageInfo

使用方式

前端需要提交参数当前页数currentPage,后台从数据库中查询出数据并将数据封装到PageInfo类中,把封装好的pageInfo对象传递给前端并解析。

      //根据查询结果返回list集合的数据
	  List<Goods> data = userService.findAll();
	  //创建一个PageInfo对象,传入泛型类
      PageInfo<Goods> pageInfo = new PageInfo<Goods>();
      /* 
      封装pageInfo数据 :
     	 第一个参数为list集合的数据
     	 第二个参数为当前页
     	 第三个参数为每页显示数据条数
      */
      pageInfo.setPageInfo(data,currentPage,12);

前端代码

 <!-- 显示分页信息 -->
    <div class="col-md-12" style="text-align: center;">
        <div class="col-md-6 col-sm-offset-3" id="page_nav_area">

            <nav aria-label="Page navigation ">
                <ul class="pagination">
                 <!-- 跳转的后台方法,当前页currentPage=1 -->
                    <li><a href="${Path}/UserController/mainUI?currentPage=1">首页</a></li>
                     <!-- 判断是否有上一页 -->
                    <c:if test="${pageInfo.hasPrePage}">
                        <li>
                        <!-- 如果有上页,currentPage=上一页 -->
                            <a href="${Path}/UserController/mainUI?currentPage=${pageInfo.prePage}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                    </c:if>
					<!-- 循环显示页码 -->
                    <c:forEach var="array" items="${pageInfo.pageArray}">
                        <c:choose>
                       		<!-- 如果等于当前页,则选中 -->
                            <c:when test="${pageInfo.currentPage == array}">
                                <li class="active"><a href="#">${array}</a></li>
                            </c:when>
                            <c:otherwise>
                            <!-- 如果不等于当前页,则正常显示 -->
                                <li><a href="${Path}/UserController/mainUI?currentPage=${array}">${array}</a></li>
                            </c:otherwise>
                        </c:choose>
                    </c:forEach>
                    <!-- 判断是否有下一页 -->
                    <c:if test="${pageInfo.hasNextPage}">
                        <li>
                        <!-- 如果有上页,currentPage=下一页 -->
                            <a href="${Path}/UserController/mainUI?currentPage=${pageInfo.nextPage}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    </c:if>
                    <!-- 跳转尾页,当前页currentPage=最大页数 -->
                    <li><a href="${Path}/UserController/mainUI?currentPage=${pageInfo.pageCount}">尾页</a></li>
                </ul>

                <ul class="pagination">
                <!-- 显示总条数,总页数 -->
                    <li>
                        <span class="label label-info" style="font-size: 15px;">总${pageInfo.totalRecord}条,共${pageInfo.pageCount}页</span>
                    </li>
                </ul>
            </nav>
        </div>
    </div>

效果

PageInfo中的属性

	//当前页
    private int currentPage;
    //总页数
    private int pageCount;
    //总条数
    private int totalRecord;
    //页面大小
    private int pageSize;
    //是否有下一页
    private boolean hasNextPage;
    //是否有上一页
    private boolean hasPrePage;
    //当前页码数组
    private int[] pageArray;
    //当前页数据
    private List<T> list;
    //下一页
    private int nextPage;
    //上一页
    private int prePage;
    //是否是第一页
    private boolean isFirstPage;
    //是否是最后一页
    private boolean isLastPage;
    //开始行数
    private int startRow;
    //结束行数
    private int endRow;
    //需要显示多少页
    private int navigatePages;
    
	public PageInfo() {
        this.navigatePages = 5;		//默认显示5页
        this.hasPrePage = true;
        this.hasNextPage = true;
        this.isFirstPage = false;
        this.isLastPage = true;
    }

设置分页参数和数据

 	//计算页码逻辑
    public void setPageInfo(List<T> list,int currentPage,int pageSize){
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.totalRecord = list.size();
        this.pageCount = (int)Math.ceil((totalRecord*1.0) / pageSize);

        //判断是否有无前页或后页
        if (currentPage == 1){
            this.hasPrePage = false;
            this.prePage = -1;
            this.isFirstPage = true;
        }else {
            this.prePage = currentPage - 1;
        }
        if (currentPage == pageCount){
            this.hasNextPage = false;
            this.nextPage = -1;
            this.isLastPage = true;
        }else {
            this.nextPage = currentPage + 1;
        }

        this.pageArray = this.culArray(currentPage,pageSize,totalRecord,pageCount);
        this.startRow = (currentPage-1)*pageSize + 1;
        this.endRow = startRow+pageSize-1;
        if (endRow>totalRecord){
            endRow = totalRecord;
        }

        this.list = new ArrayList<>();
        for (int i=0;i<(endRow-startRow+1);i++){
            this.list.add(list.get(startRow-1+i));
        }
    }

    //计算显示的页数
    private int[] culArray(int currentPage,int pageSize,int totalRecord,int pageCount){
        int[] array;
        if (pageCount<=navigatePages){
            array = new int[pageCount];
            for (int i=0;i<pageCount;i++){
                array[i] = i + 1;
            }
        }else {
            array = new int[navigatePages];
            if (currentPage <= (navigatePages/2)){
                for (int i=0;i<navigatePages;i++){
                    array[i] = i + 1;
                }
            }
            else {
                int x = pageCount-(navigatePages/2);
                if (currentPage>x){
                    int start = pageCount - navigatePages + 1;
                    for (int i=0;i<navigatePages;i++){
                        array[i] = start + i;
                    }
                }else {
                    int start = currentPage - (navigatePages/2);
                    for (int i=0;i<navigatePages;i++){
                        array[i] = start + i;
                    }
                }
            }
        }
        return array;
    }

完整代码

码云地址:分页工具类PageInfo

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值