Java EE之分页器设计

由于数据库实训的课程设计,在做项目过程中,需要使项目更加规范的结构和各层间责任分离。无疑地,分页器是其中之一。

1. 本文仅陈述分页器如何实现,关于分页器的其他概念,请自行搜索其他网络资源。

2. 关于如何在各层使用使用PageBean,见本文引用文献3

一、设计实现

  

/**
 * 分页器
 * @author Zen Johnny
 * @date 2017年11月11日 下午1:19:32
 * @notice sql demo:SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15
 */
package com.cpms.entity.vo;

import java.util.Collections;
import java.util.List;

public class Pager<Entity> {
	
	/**
	 * 存放当前页的数据
	 */
	private List<Entity> entitys;
	
	/**
	 * 每页行数(记录数),默认为10
	 */
	private int pageSize;
	
	/**
	 * 默认的每页记录数为10(用于缺省构造器,无set方法)
	 */
	private static final int DEFAULT_PAGE_SIZE = 10;
	
	/**
	 * 总行数(总记录数)
	 */
	private int totalRows;
	
	/**
	 * 总页数 
	 */
	private int totalPage;
	
	/**
	 * 当前页数,默认为第一页
	 */
	private int curPage = 1;
	
	/**
	 * 前一页 
	 */
	private int prePage;
	
	/**
	 * 后一页
	 */
	private int nextPage;

	/**
	 * 数据库开始的指针
	 * limit begin,offset 中 的m
	 */
	private int beginCursor;
	
	/**
	 * 数据库查询记录时候的偏移量
	 * limit begin,offset 中 的 offset
	 */
	private int offsetCursor;
	
	/**
	 * constructor
	 */
	public Pager() {
		this(0, DEFAULT_PAGE_SIZE, 0, Collections.EMPTY_LIST);
	}

	/**
	 * constructor
	 */
	public Pager(int curPage, int pageSize, int totalRows,List<Entity> entitys) {
		this.entitys = entitys;
		//↓先得设置总记录和每个页面的记录数,才有办法知道【总页数】等属性
		this.totalRows = totalRows;
		setPageSize(pageSize);	
		
		//↓注意:1.条件:总记录数totalRows和每页记录数pageSize   2.此处计算非常容易产生精度损失
		setTotalPage();
		
		//↓条件:总页数totalPage
		setCurPage(curPage);
		
		//↓条件:当前页码curPage和每页记录数pageSize
		setBeginCursor();	
		//↓条件:每页记录数pageSize
		setOffsetCursor();	
		//↓条件:当前页页码curPage
		setPrePage();		
		//↓条件:当前页页码curPage和总页数totalPage
		setNextPage();
	}

	public List<Entity> getEntitys() {
		return entitys;
	}
	
	/**
	 * 设置当前页面数据对象,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setEntitys(List<Entity> entitys) {
		this.entitys = entitys;
	}

	public int getPageSize() {
		return pageSize;
	}

	/** 
	 * 设置页面大小,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setPageSize(int pageSize) {
		if(pageSize < 1) {
			pageSize = DEFAULT_PAGE_SIZE;
		}else {
			this.pageSize = pageSize;
		}
	}
	
	public static int getDefaultPageSize() {
		return DEFAULT_PAGE_SIZE;
	}

	public int getTotalRows() {
		return totalRows;
	}
	
	/** 
	 * 设置页总记录数,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setTotalRows(int totalRows) {
		if(totalRows < 1)
			this.totalRows = 0;
		else
			this.totalRows = totalRows;
	}

	public int getTotalPage() {
		return totalPage;
	}
	
	/** 
	 * 设置总页面数,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setTotalPage() {
		this.totalPage = (int) Math.ceil((double)totalRows/pageSize);
	}

	public int getCurPage() {
		return curPage;
	}

	public void setCurPage(int curPage) {
		if(curPage < 1)
			this.curPage = 1;
		else if(curPage > totalPage)
			this.curPage = totalPage;
		else
			this.curPage = curPage;
	}

	public int getPrePage() {
		return prePage;
	}

	private void setPrePage() {
		this.prePage = curPage - 1;
		if(this.prePage < 1) //注意:this.prePage[当前]
			this.prePage = 1;
	}

	public int getNextPage() {
		return nextPage;
	}
	
	/** 
	 * 设置下一页页码,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setNextPage() {
		this.nextPage = curPage + 1;
		if(this.nextPage > totalPage)//注意:this.nextPage[当前]
			this.nextPage = totalPage;
	}

	public int getBeginCursor() {
		return beginCursor;
	}

	/**
	 *	设置数据库查询记录时的起始游标,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setBeginCursor() {
		this.beginCursor = (curPage - 1) * pageSize;
	}

	public int getOffsetCursor() {
		return offsetCursor;
	}
	
	/**
	 *	设置数据库查询记录时的游标偏移量,私有,对外屏蔽,防止破坏分页器各属性的一致性
	 */
	private void setOffsetCursor() {
		this.offsetCursor = pageSize;
	}
	
	/**
	 * 是否还有上一页
	 */
	public boolean hasPrePage() {
		if(this.prePage == 1) {
			return false;
		}
			return true;
	}
	
	/**
	 * 是否还有下一页
	 */
	public boolean hasNextPage() {
		if(this.nextPage == this.totalPage) {
			return false;
		}
			return true;
	}
	
	@Override
	public String toString() {
		return "Pager [entitys=" + entitys + ", pageSize=" + pageSize + ", totalRows=" + totalRows + ", totalPage="
				+ totalPage + ", curPage=" + curPage + ", prePage=" + prePage + ", nextPage=" + nextPage
				+ ", beginCursor=" + beginCursor + ", offsetCursor=" + offsetCursor + "]";
	}
	
}

二、参考文献

  1.[强大的 java 分页器]http://blog.csdn.net/hcmdy/article/details/25251911

  2.[java--分页查询接口设计及分页器的实现]http://blog.csdn.net/u011659172/article/details/18231509

  3.[Java Web(十一) 分页功能的实现]https://www.cnblogs.com/whgk/p/6474396.html

原文地址:https://www.cnblogs.com/johnnyzen/p/7819257.html