分页的逻辑

分页最后要的效果是在某个具体页面上显示第M条记录到第N条记录。

怎么去达到这个效果呢,有物理分页和逻辑分页,具体区别我先不说,我想说的是其中的分页逻辑。

1,、确定初始条件

我觉得初始条件就是我要知道需要显示的是从M条记录到N条记录,但通常我们不会直接得到这个条件,而是通过三个参数来确定这个条件,

先姑且称这三个参数为初始参数,分别是当前页currentPage,一页需要显示的记录数pageSize(页面大小),总记录数rowsCount。

2、计算初始条件及页面需要显示的内容。

(1)计算总页数allSize

总页数=总记录数rowsCount/页面大小pageSize向上取整,若总记录数为0,则得到总页数也应为0,但在页面显示时应把总页数显示为1。参考代码

public static int computePageCount(int rowsCount, int pageSize) {
		int result = rowsCount / pageSize;
		if (rowsCount % pageSize != 0) {
			result++;
		}

		return result;
	}
(2)计算要显示的页面是从第M条记录开始即开始记录位置startRow

先判断当前页若为非法参数0或null,直接定义当前页为1。然后根据当前页和页面大小计算startRow,即startRow=(currentPage-1)*pageSize+1。

(3)计算结束记录位置endRow

endRow=startRow+pageSize-1。这里有个地方我开始有疑问,就是如果显示最后一页的记录时,一般实际结束记录位置通常会小于理论结束记录位置,简单的说,一个53条记录的表,一页显示10条,那最后一页只显示3条记录,但最后一页计算出的结束记录位置=51+10-1=60条,那不是会出问题吗?但后来我一想,在数据库中你查到53条是最后记录的时候,就不可能还有53以后的记录了,所以这个担忧是不存在的。


在这顺便说下我对物理分页和逻辑分页的一些理解。

共同点:我感觉都是将数据库中的数据进行分页逻辑处理。

不同点:不同就在于逻辑分页是将所有的记录先查出来,然后进行分页逻辑处理,逻辑上分出首行记录和末行记录,只需要访问一次数据库。

而物理分页需要先查出数据的总记录数,根据3个初始参数先进行逻辑处理,然后将首行记录参数和末行记录参数代入数据持久层,查出需要的分页数据,要访问两次数据库。

下面是逻辑分页的参考代码:

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 * 翻页类
 * @author Administrator
 *
 */
public class Paper
{

	private static ResourceBundle properties = null;

	private static String bundleName = "paper";

	private int PAGE_SIZE = 10;// 每个页面默认的记录数

	private int currentpage = 1;// 记录当前页号
	
	private int allSize=1;//共多少页
	private int curNum=0;//开始行号
	private int maxNum=0;//结束行号
	private List resultList=null;//结果集
	public Paper()
	{
		
		
		this.getPAGE_SIZE();
	}

	public Paper(int pageSize)
	{
		
		PAGE_SIZE=pageSize;
		
	}

	/**
	 * 获取当前页号
	 * 
	 * @param allList
	 * @param pageDirection 翻页操作下一页,上一页,第一页,最后一页
	 * @param _currentpage
	 */
	private void getCurrentPageNum(String pageDirection,String _currentpage)
	{

		if ("next".equals(pageDirection))
		{
			if ((Integer.parseInt(_currentpage) + 1) <=allSize)
			{
				currentpage = Integer.parseInt(_currentpage) + 1;
			}
			else
			{
				currentpage = Integer.parseInt(_currentpage);
			}

		}
		else if ("previous".equals(pageDirection))
		{

				if ((Integer.parseInt(_currentpage) - 1) <= 0)
				{
					currentpage = 0;
				}
				else
				{
					currentpage = Integer.parseInt(_currentpage) - 1;
				}

		}
		else if ("first".equals(pageDirection))
		{
			currentpage = 1;
		}
		else if ("last".equals(pageDirection))
		{
			if (allSize == 0)
			{
				currentpage = 0;
			}
			else
			{

				currentpage = allSize ;
	
			}
		}
		else
		{
			currentpage=Integer.parseInt(_currentpage);
		}
		if(currentpage==0)
		{
			currentpage=1;
		}
	}
	
	/**
	 * 获取总页数
	 * @param ListSize
	 */
	private void getPageAllSizeNum(int ListSize)
	{

		try {
			if (ListSize > PAGE_SIZE) {
				if ((ListSize / PAGE_SIZE) * PAGE_SIZE < ListSize) {
					allSize = (ListSize / PAGE_SIZE) + 1;
				} else {
					allSize = (ListSize / PAGE_SIZE);
				}
			} else if (ListSize / PAGE_SIZE == 1) {
				allSize = 1;
			} else {
				allSize = 1;
			}
		} catch (Exception e) {
			allSize = 0;
		}
	}

	/**
	 * 取得分页的List
	 * 
	 * @param allList
	 * @param pageDirection
	 * @param _currentpage
	 * @return
	 */

	public List getPaperList(List allList, String pageDirection,
			String _currentpage)
	{
		this.getPageAllSizeNum(allList.size());
//		 设置当前页号
		this.getCurrentPageNum(pageDirection, _currentpage);
		List rsList = new ArrayList();
		for (int i = currentpage * PAGE_SIZE; i < (currentpage + 1) * PAGE_SIZE; i++)
		{
			if (i == allList.size())
			{
				break;
			}
			rsList.add(allList.get(i));
		}
		return rsList;

	}

	/**
	 * 读取配置文件每页多少条信息
	 *
	 */
	private void getPAGE_SIZE()
	{
		try
		{
			if (properties == null)
			{
				loadProperties();
			}

			this.PAGE_SIZE = Integer
					.parseInt(properties.getString("PAGE_SIZE"));
			// System.out.println("系统分页:"+properties.getString("PAGE_SIZE")+"条/页");
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}

	}
	
	/**
	 * 取得分页的List,自定义条/页
	 * 
	 * @param allList
	 * @param pageDirection
	 * @param _currentpage
	 * @param pageSize
	 * @return
	 */

	public List getPaperList(List allList, String pageDirection,
			String _currentpage, int pageSize)
	{
		// 设置当前页号
		PAGE_SIZE=pageSize;
		List rsList=this.getPaperList(allList, pageDirection, _currentpage);
		return rsList;
	}
	
	/**
	 * 计算总页数和启示游标
	 * @param count 总记录条数
	 * @param currentpage 页号
	 * @param pageSize 每页多少条数据
	 */
	public void FillSeat(String pageDirection,int count,int currentpage,int pageSize)
	{
		PAGE_SIZE=pageSize;
		this.FillSeat(pageDirection, count, currentpage);
		
	}
	
	/**
	 * 计算总页数和启示游标
	 * @param count 总记录条数
	 * @param currentpage 页号
	 */
	public void FillSeat(String pageDirection,int count,int currentpage)
	{
		this.getPageAllSizeNum(count);//总页数
		this.getCurrentPageNum(pageDirection, String.valueOf(currentpage));//下一页的页码
//		curNum = (this.getCurrentpage() - 1) * PAGE_SIZE + 1; // 当前页的数据开始号
		curNum = (this.getCurrentpage() - 1) * PAGE_SIZE ; // 当前页的数据开始号
		maxNum = this.getCurrentpage() * PAGE_SIZE; // 当前页的结束时的数据号
		if (maxNum > count) {
			maxNum = count;
		}
		if (maxNum < 1) {
//			curNum = 1;
			curNum = 0;
		} 
	}
	
	/**
	 * 获取开始行号
	 * @return
	 */
	public int getCurNum() {
		return curNum;
	}
	/**
	 * 获取结束行号
	 * @return
	 */
	public int getMaxNum() {
		return maxNum;
	}

	/**
	 * 获取总页数
	 * @return
	 */
	public int  getAllSize()
	{
		return allSize;
	}
	
	/**
	 * 获取下一次操作的页码
	 * @return
	 */
	public int getCurrentpage()
	{
		return currentpage;
	}
	/**
	 * 获取结果集
	 * @return
	 */
	public List getResultList() {
		return resultList;
	}
	
	/**
	 * 给结果集赋值
	 * @param resultList
	 */
	public void setResultList(List resultList) {
		this.resultList = resultList;
	}
	
	/**
	 * 获取每页的数据条数
	 * @return
	 */
	public int getPageSize() {
		return PAGE_SIZE;
	}
	
	private synchronized static void loadProperties()
	{
		properties = ResourceBundle.getBundle(bundleName);
	}

}

下面是物理分页

分页bean

import java.io.Serializable;

/**
 * 分页Bean
 * 
 * @author 
 * @version 
 */
public class Page implements Serializable {

	private static final long serialVersionUID = 6532040187801295203L;

	/** 页码 */
	private Integer page = 1;

	/** 页面大小 */
	private Integer pageSize = 10;

	/** 总页数 */
	private Integer pageCount;

	/** 首行记录 */
	private Integer firstRow = 1;

	/** 末行记录 */
	private Integer lastRow = 2147483647;

	/** 总记录数 */
	private Integer rowsCount;

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	public Integer getPageCount() {
		return pageCount;
	}

	public void setPageCount(Integer pageCount) {
		this.pageCount = pageCount;
	}

	public Integer getFirstRow() {
		return firstRow;
	}

	public void setFirstRow(Integer firstRow) {
		this.firstRow = firstRow;
	}

	public Integer getLastRow() {
		return lastRow;
	}

	public void setLastRow(Integer lastRow) {
		this.lastRow = lastRow;
	}

	public Integer getRowsCount() {
		return rowsCount;
	}

	public void setRowsCount(Integer rowsCount) {
		this.rowsCount = rowsCount;
	}
}

分页逻辑

import com.tjhq.common.bean.Page;

/**
 * iBatis分页计算器
 * 
 * @author 
 * @version 
 */
public class Pagination {

	/**
	 * 计算分页
	 * 
	 * @param page
	 *            page
	 */
	public static void compute(Page page) {
		if (page.getPage() == null || page.getPage() < 1) {
			page.setPage(1);
		}
		int pageCount = computePageCount(page.getRowsCount(), page.getPageSize());
		if (page.getPage() > pageCount) {
			page.setPage(pageCount);
		}
		if(pageCount==0){
			pageCount=1;
		}
		page.setPageCount(pageCount);
		int firstRow = computeFirstRow(page.getPage(), page.getPageSize());
		int lastRow = firstRow + page.getPageSize() - 1;
		page.setFirstRow(firstRow);
		page.setLastRow(lastRow);
	}

	/**
	 * 计算总页数
	 * 
	 * @param rowsCount
	 *            记录数
	 * @param pageSize
	 *            页面大小
	 * @return 总页数
	 */
	public static int computePageCount(int rowsCount, int pageSize) {
		int result = rowsCount / pageSize;
		if (rowsCount % pageSize != 0) {
			result++;
		}

		return result;
	}

	/**
	 * 计算首条记录定位
	 * 
	 * @param curPage
	 *            当前页
	 * @param pageSize
	 *            页面大小
	 * @return 首条记录位置
	 */
	public static int computeFirstRow(int curPage, int pageSize) {
		return (curPage - 1) * pageSize + 1;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值