1. 程式人生 > >Java EE之分頁器設計

Java EE之分頁器設計

net ons 下午 概念 div details mit 產生 log

由於數據庫實訓的課程設計,在做項目過程中,需要使項目更加規範的結構和各層間責任分離。無疑地,分頁器是其中之一。

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

Java EE之分頁器設計