Java中分页功能源码实例

一、源码(后附使用说明)
package com.zhiyou100.crm.util;
/**
 * 分页功能
 * @author YangXianSheng
 *
 */
public class Pager {
	
	//当前页码
	int pageNo;      //传过来
	//每页数据条数
	int pageSize;    //传过来
	//总数据条数 
	int total;       //传出来
	//总页数
	int pageCount;   //算过来
	//最多页码数
	int showPageNos;  //传出来
	//起始页码
	int start;     //算出来
	//结束页码
	int end;       //算出来
	
	/**
	 * 分页类
	 * @param pageNo  当前页码
	 * @param total   总数据条数
	 * @param pageSize  每页数据条数
	 * @param showPageNos  最多显示的页码数
	 */
	public Pager(int pageNo, int total, int pageSize, int showPageNos) {
		this.pageNo = pageNo;
		this.total = total;
		this.pageSize = pageSize;
		this.showPageNos = showPageNos;
		valid();
		calc();
	}
	
	/**
	 * 分页类
	 * @param pageNo 当前页码
	 * @param total  总数据条数
	 */
	public Pager(int pageNo, int total) {
		//在构造方法中通过this()调用其他构造方法
		this(pageNo,total,5,3);
	}
   

	
	/**
	 * 实现计算的方法
	 */
	private void calc() {
		
		pageCount=total%pageSize==0 ? total/pageSize : total/pageSize+1;
	
		//检查pageNo
		if(pageNo>pageCount) pageNo = pageCount;

		//计算start、end
		start = end =pageNo;
		while (end-start+1 < showPageNos && (start >1 || end <pageCount) ) {
			if (start>1) start--;
			if(end <pageCount) end++; 
		}
	
	}



	@Override
	public String toString() {
		return "Pager [pageNo=" + pageNo + ", pageSize=" + pageSize + ", total=" + total + ", pageCount=" + pageCount
				+ ", showPageNos=" + showPageNos + ", start=" + start + ", end=" + end + "]";
	}


	public static void main(String[] args) {
		
		Pager pager =new Pager(16, 1000);
		System.out.println(pager);
		
		Pager pager2 =new Pager(3, 1003);
		System.out.println(pager2);
		
	}
	

	private void valid() {
	    	if(pageNo<1) throw new PagerException("pageNo",1);
	    	if(pageSize<1) throw new PagerException("pageSize",1);
	    	if(total<0) throw new PagerException("total",1);
	    	if(showPageNos<1) throw new PagerException("showPageNos",1);
	    	
	    	if(total ==0)System.err.println("警告:数据总条数为0!");
			
		}

	public class PagerException extends RuntimeException{
		
		private static final long serialVersionUID = 1L;

		public PagerException(String property,int minValue) {
			super(String.format("分页参数%S不能小于%d。", property,minValue));
		}
	}
	
	/**
	 * 获取当前页码
	 * @return  当前页码
	 */
	 public int getPageNo() {
		return pageNo;
	}

	 /**
	  * 获取每页数据条数
	  * @return 每页数据条数
	  */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 获取数据总条数
	 * @return  数据总条数
	 */
	public int getTotal() {
		return total;
	}

	/**
	 * 获取数据总页数
	 * @return  数据总页数
	 */
	public int getPageCount() {
		return pageCount;
	}

	/**
	 * 获取最多显示页码数
	 * @return  最多显示页码数
	 */
	public int getShowPageNos() {
		return showPageNos;
	}

	/**
	 * 获取起始页码
	 * @return 起始页码
	 */
	public int getStart() {
		return start;
	}

	/**
	 * 获取结束页码
	 * @return 结束页码
	 */
	public int getEnd() {
		return end;
	}


}



二、使用说明:本案例是在Eclipse环境中测试运行,首先将包名进行修改成自己的包名,其次建立的时候将类命名为Pager

三、Pager类的设计

   Pager类的职责: 根据pageNototalpageSizeshowPageNos计算pageCountstartend

   这些数据用来支持在页面上显示分页信息和页码:

如下所示:

   123条数据,第3/13页                   1  2  3  4  5  6  7  8  9

 

区分哪些数据时传过来的,哪些数据是算出来的

将传过来的数据当做构造方法的参数

根据参数的变化频率调整参数的位置(Eclipse重构功能支持)

将变化频率高的参数放

四、数据分页的必要性

1.一次性把所有数据(如果很多的话)从数据库中查出来回给数据带来很大的IO开销,而IO是最慢的操作,结果是数据库并发了大大降低!

 

2.一次性把大量的数据从数据库传到应用服务器,再从应用服务器传到用户浏览器会大大占用服务器宝贵的带宽资源,导致服务器能够处理请求大大减少!

 

3.查询和传送大量数据需要时间必然很长,结果导致页面反应速度变慢

用户体验变差

 

4.人类可读的数据不超过几十条,传送成百上千条数据没有意义

 

分页数据的查询

     pageNo  页码(从1开始)

     pageSize 每页条数(默认10条)

 

     能够计算出来任意pageNo对应的数据的起始索引位置

     start =(pageNo-1)*pageSize    -----起始索引位置

     count = pageSize             -----数据条数




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值