一、源码(后附使用说明)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
if (start>1) start--;
if(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类的职责: 根据pageNo、total、pageSize、showPageNos计算pageCount、start、end
这些数据用来支持在页面上显示分页信息和页码:
如下所示:
共123条数据,第3页/共13页1 234 5 6 7 8 9
区分哪些数据时传过来的,哪些数据是算出来的
将传过来的数据当做构造方法的参数
根据参数的变化频率调整参数的位置(Eclipse重构功能支持)
将变化频率高的参数放
四、数据分页的必要性
1.一次性把所有数据(如果很多的话)从数据库中查出来回给数据带来很大的IO开销,而IO是最慢的操作,结果是数据库并发了大大降低!
2.一次性把大量的数据从数据库传到应用服务器,再从应用服务器传到用户浏览器会大大占用服务器宝贵的带宽资源,导致服务器能够处理请求大大减少!
3.查询和传送大量数据需要时间必然很长,结果导致页面反应速度变慢
用户体验变差
4.人类可读的数据不超过几十条,传送成百上千条数据没有意义
分页数据的查询
pageNo 页码(从1开始)
pageSize 每页条数(默认10条)
能够计算出来任意pageNo对应的数据的起始索引位置
start =(pageNo-1)*pageSize -----起始索引位置
count = pageSize -----数据条数