javaweb 分頁基本構造(分頁封裝)

前端需要傳遞的參數:pageNumber(頁碼,必填默認爲1),pageSize(每頁顯示的記錄數)

後臺的封裝Page類爲以下代碼:

public class Pager<T> {
	private List<T> list; // 對象記錄結果集
	private int total = 0; // 總記錄數
	private int limit = 10; // 每頁顯示記錄數
	private int start = 0;// 起始點
	private int pages = 1; // 總頁數
	private int pageNumber = 1; // 當前頁

	private boolean isFirstPage = false; // 是否爲第一頁
	private boolean isLastPage = false; // 是否爲最後一頁
	private boolean hasPreviousPage = false; // 是否有前一頁
	private boolean hasNextPage = false; // 是否有下一頁

	private int navigatePages = 8; // 導航頁碼數
	private int[] navigatePageNumbers; // 所有導航頁號

	public Pager() {

	}

	public Pager(int total, int pageNumber) {
		init(total, pageNumber, limit);
	}

	public Pager(int total, int pageNumber, int limit) {
		init(total, pageNumber, limit);
	}

	private void init(int total, int pageNumber, int limit) {
		// 設置基本參數
		this.total = total;
		this.limit = limit;
		this.pages = (this.total - 1) / this.limit + 1;
		// 根據輸入可能錯誤的當前號碼進行自動糾正
		if (pageNumber < 1) {
			this.pageNumber = 1;
		} else if (pageNumber > this.pages) {
			this.pageNumber = this.pages;
		} else {
			this.pageNumber = pageNumber;
		}

		this.start = (this.pageNumber - 1) * this.limit;

		// 基本參數設定之後進行導航頁面的計算
		calcNavigatePageNumbers();

		// 以及頁面邊界的判定
		judgePageBoudary();
	}

	/**
	 * 計算導航頁
	 */
	private void calcNavigatePageNumbers() {
		// 當總頁數小於或等於導航頁碼數時
		if (pages <= navigatePages) {
			navigatePageNumbers = new int[pages];
			for (int i = 0; i < pages; i++) {
				navigatePageNumbers[i] = i + 1;
			}
		} else { // 當總頁數大於導航頁碼數時
			navigatePageNumbers = new int[navigatePages];
			int startNum = pageNumber - navigatePages / 2;
			int endNum = pageNumber + navigatePages / 2;

			if (startNum < 1) {
				startNum = 1;
				// (最前navPageCount頁
				for (int i = 0; i < navigatePages; i++) {
					navigatePageNumbers[i] = startNum++;
				}
			} else if (endNum > pages) {
				endNum = pages;
				// 最後navPageCount頁
				for (int i = navigatePages - 1; i >= 0; i--) {
					navigatePageNumbers[i] = endNum--;
				}
			} else {
				// 所有中間頁
				for (int i = 0; i < navigatePages; i++) {
					navigatePageNumbers[i] = startNum++;
				}
			}
		}
	}

	/**
	 * 判定頁面邊界
	 */
	private void judgePageBoudary() {
		isFirstPage = pageNumber == 1;
		isLastPage = pageNumber == pages && pageNumber != 1;
		hasPreviousPage = pageNumber != 1;
		hasNextPage = pageNumber != pages;
	}
<span style="white-space:pre">	</span>//省去get()set()方法
}


後臺先統計要被展示的總記錄條數,total,例如:

// 總記錄數(根據不同框架代碼樣式有所不同,總之就是要獲取需要查詢的記錄總數)
int total = XXXDAO.getXXXTotal(params);

獲取總記錄數後即可通過以下代碼生成page類
//total(記錄總數),page(查詢頁碼,前端傳遞獲得),pageSize(每頁顯示記錄數,前端獲取亦可,後端定義亦可),XXX表示展示需要封裝的類(例如:需要展示User信息,XXX即U//SER類)
Pager<XXX> pager = new Pager<XXX>(total,page,pageSize);

在sql語句中加入查詢的開始條數以及結束條數字段,這兩個字段可以從以下代碼獲取

 pager.getStart();//開始記錄數
 pager.getLimit();//結束記錄數


通過sql獲取記錄集,記住一定要限制條數語句
select * from xxx limit #{start},#{limit}

將結果集放入page中

pager.setList(list);
return pager;


前端JSP代碼:(忽略樣式)

<span style="white-space:pre">	</span><div class="am-cf">
<span style="white-space:pre">	</span>共 ${pager.total} 條記錄,當前${pager.pageNumber}頁
	<span style="white-space:pre">	</span><div class="am-fr">
			<ul class="am-pagination">
				<c:if test="${pager.hasPreviousPage}">
					<li><a οnclick="pageDataCountForCUser('${pager.pageNumber-1}')">«</a></li>
				</c:if>
				<c:if test="${!pager.hasPreviousPage} ">
					<li><a href="javascript:">«</a></li>
				</c:if>
				<c:forEach items="${pager.navigatePageNumbers}" var="num">
					<li><a οnclick="pageDataCountForCUser('${num}') " ${pager.pageNumber == num ? "style='background-color: #4086CB;co<span style="white-space:pre">	</span>lor: white;font-weight: bold'" : "" }>${num}</a></li>
				</c:forEach>
				<c:if test="${pager.hasNextPage}">
					<li><a οnclick="pageDataCountForCUser('${pager.pageNumber+1}')">»</a></li>
				</c:if>
				<c:if test="${!pager.hasNextPage}">
					<li><a href="javascript:void(0)">»</a></li>
				</c:if>
			</ul>
		</div>
	</div>





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章