分頁功能(Pagenation類)
分頁功能的 封裝 + 實現:
分頁的SQL語句 + 分頁工具類Pagenation的細節 + 分頁原理
一、 分頁的SQL語句:
select * from (selectt.*,row_number() over(order by ROWNUM ASC) rn from goods t) where rn>=? andrn<=?
Ø goods :爲表名,數據從goods中查得
Ø 第一個? :起始行號
Ø 第二個? :終點行號
二、 分頁工具類Pagenation的細節:
Pagenation類:類似JavaBean的工具類,封裝了分頁後的細節,
主要作用:封裝後臺分頁細節,前臺調用分頁細節。
簡介:實例化時需要傳入3個參數,然後類內部計算得到所有分頁細節
注意:後期還需要調用setList()方法將分頁結果也存入其中。
用法:後臺用此類封裝分頁結果,request給前臺,前臺展示。
傳入參數:當前頁數(pageNum)+每頁大小(size)+記錄總行數(rowCount)
三、 分頁原理:
1. 後臺sevlet根據參數調用分頁service()方法,返回值一個Pagenation類的對象,封裝了當前要求的分頁信息;
2. service()方法處理過程:根據傳入的三個參數,初始化Pagenation類,然後調用dao包下的分頁查詢類,返回值爲一個List,將這個List也存入Pagenation對象中,返回返回該對象;
3. 返回的Pagenation對象包含了有關分頁所有內容,將此對象放在request中傳到前臺,跳轉到前臺;
4. 在前臺中取出Pagenation的相關信息,此時的Pagenation對象中存放着分頁信息,用EL和JSTL顯示分頁信息。
四、 代碼實現:
1. 分頁工具類(核心中的核心類):
2. 其他代碼:
(1)、前端展示代碼:
package com.test.util;
import java.util.List;
/**
* Pagenation分頁工具類:用於數據的分頁
* 根據傳入的pageNum參數來確定從哪頁開始分頁
* 根據傳入的size參數確定每頁分多少條記錄
* 根據傳入的rowCount參數來確定數據總條數
* @author Alvin Xing
*/
public class Pagenation {
/* 指定的參數 */
private int pageNum; //當前頁號
private int size; //頁面大小:每頁顯示多少條數據
/* DB中查找的數據 */
private long rowCount; //數據總條數:共有多少條數據
private List list; //數據內容
/* 由以上屬性計算得到的屬性 */
private int pageCount; //頁面總數
private int startRow; //當前頁面開始行,第一行爲第0行
private int first = 1; //第一頁 頁號
private int last; //最後一頁 頁號
private int prev; //前一頁 頁號
private int next; //後一頁 頁號
private int startNav; //導航欄 起始頁號
private int endNav; //導航欄 末尾頁號
private int navCount = 10; //導航欄長度 頁號顯示數量,最多顯示numCount+1條,這裏顯示11頁
/**
* 構造器:初始化基本的三個參數(pageNum, size, rowCount),其他參數由計算得到
*/
public Pagenation(int pageNum, int size, long rowCount) {
//初始化基本參數
this.pageNum = pageNum;
this.size = size;
this.rowCount = rowCount;
//計算得到其他參數
this.pageCount = (int)Math.ceil(this.rowCount/(double)size);
this.last = pageCount;
this.pageNum = Math.min(pageNum, pageCount); //一般情況下pageNum會等於傳入的pageNum,但當傳入的pageNum如果大於頁面總數,則pageNum就等於最大頁面數,即最後一頁的頁數
this.pageNum = Math.max(1, this.pageNum); //一般情況下pageNum會等於傳入的pageNum,但當傳入的pageNum如果小於1,則pageNum就等於1,即第一頁的頁數
this.startRow = pageNum*size - (size-1);
this.prev = (this.pageNum-1>1)?(this.pageNum-1):1; //如果<前一頁>爲第一頁,則顯示1,否則是{本頁頁數-1}
this.next = (this.pageNum+1<this.pageCount)?(this.pageNum+1):this.pageCount; //如果<後一頁>爲最後一頁,則返回{最後一頁頁數},否則返回{本頁數+1}
//導航處理
// this.startNav = (this.pageNum-5>1)?(this.pageNum-5):1; //導航來開始按鈕爲{當前頁數-5},如果當前頁數不足5,則導航欄開始按鈕爲{第1頁}按鈕
this.startNav = (this.pageNum-(this.navCount/2)>1)?(this.pageNum-(this.navCount/2)):1; //優化後的開始按鈕,使當前頁位於導航欄中間,開始按鈕已不是{當前頁數-5},而是{當前頁數-導航欄總長度的一半}
this.endNav = (this.startNav+navCount<this.last)?(this.startNav+navCount):this.last; //導航欄結束按鈕爲{開始頁數+導航欄長度},如果{開始頁數+導航欄長度}超過頁面總數,則結束按鈕爲{最後一頁}
}
public Pagenation(){ //空構造器
}
/**
* Setter() and Getter()
*/
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public long getRowCount() {
return rowCount;
}
public void setRowCount(long rowCount) {
this.rowCount = rowCount;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getFirst() {
return first;
}
public void setFirst(int first) {
this.first = first;
}
public int getLast() {
return last;
}
public void setLast(int last) {
this.last = last;
}
public int getPrev() {
return prev;
}
public void setPrev(int prev) {
this.prev = prev;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
public int getStartNav() {
return startNav;
}
public void setStartNav(int startNav) {
this.startNav = startNav;
}
public int getEndNav() {
return endNav;
}
public void setEndNav(int endNav) {
this.endNav = endNav;
}
public int getNavCount() {
return navCount;
}
public void setNavCount(int navCount) {
this.navCount = navCount;
}
}
(2)、後臺處理的servlet代碼:見網盤資料
(3)、處理分頁的service方法類:見網盤資料