分頁(yè)功能(Pagenation類(lèi))
分頁(yè)功能的 封裝 + 實(shí)現(xiàn):
分頁(yè)的SQL語(yǔ)句 + 分頁(yè)工具類(lèi)Pagenation的細(xì)節(jié) + 分頁(yè)原理
1、 分頁(yè)的SQL語(yǔ)句:
select * from (selectt.*,row_number() over(order by ROWNUM ASC) rn from goods t) where rn>=? andrn<=?
? goods :為表名,數(shù)據(jù)從goods中查得
? 第1個(gè)? :起始行號(hào)
? 第2個(gè)? :終點(diǎn)行號(hào)
2、 分頁(yè)工具類(lèi)Pagenation的細(xì)節(jié):
Pagenation類(lèi):類(lèi)似JavaBean的工具類(lèi),封裝了分頁(yè)后的細(xì)節(jié),
主要作用:封裝后臺(tái)分頁(yè)細(xì)節(jié),前臺(tái)調(diào)用分頁(yè)細(xì)節(jié)。
簡(jiǎn)介:實(shí)例化時(shí)需要傳入3個(gè)參數(shù),然后類(lèi)內(nèi)部計(jì)算得到所有分頁(yè)細(xì)節(jié)
注意:后期還需要調(diào)用setList()方法將分頁(yè)結(jié)果也存入其中。
用法:后臺(tái)用此類(lèi)封裝分頁(yè)結(jié)果,request給前臺(tái),前臺(tái)展現(xiàn)。
傳入?yún)?shù):當(dāng)前頁(yè)數(shù)(pageNum)+每頁(yè)大小(size)+記錄總行數(shù)(rowCount)
3、 分頁(yè)原理:
1. 后臺(tái)sevlet根據(jù)參數(shù)調(diào)用分頁(yè)service()方法,返回值1個(gè)Pagenation類(lèi)的對(duì)象,封裝了當(dāng)前要求的分頁(yè)信息;
2. service()方法處理進(jìn)程:根據(jù)傳入的3個(gè)參數(shù),初始化Pagenation類(lèi),然后調(diào)用dao包下的分頁(yè)查詢類(lèi),返回值為1個(gè)List,將這個(gè)List也存入Pagenation對(duì)象中,返回返回該對(duì)象;
3. 返回的Pagenation對(duì)象包括了有關(guān)分頁(yè)所有內(nèi)容,將此對(duì)象放在request中傳到前臺(tái),跳轉(zhuǎn)到前臺(tái);
4. 在前臺(tái)中取出Pagenation的相干信息,此時(shí)的Pagenation對(duì)象中寄存著分頁(yè)信息,用EL和JSTL顯示分頁(yè)信息。
4、 代碼實(shí)現(xiàn):
1. 分頁(yè)工具類(lèi)(核心中的核心類(lèi)):
2. 其他代碼:
(1)、前端展現(xiàn)代碼:
package com.test.util;
import java.util.List;
/**
* Pagenation分頁(yè)工具類(lèi):用于數(shù)據(jù)的分頁(yè)
* 根據(jù)傳入的pageNum參數(shù)來(lái)肯定從哪頁(yè)開(kāi)始分頁(yè)
* 根據(jù)傳入的size參數(shù)肯定每頁(yè)分多少條記錄
* 根據(jù)傳入的rowCount參數(shù)來(lái)肯定數(shù)據(jù)總條數(shù)
* @author Alvin Xing
*/
public class Pagenation {
/* 指定的參數(shù) */
private int pageNum; //當(dāng)前頁(yè)號(hào)
private int size; //頁(yè)面大小:每頁(yè)顯示多少條數(shù)據(jù)
/* DB中查找的數(shù)據(jù) */
private long rowCount; //數(shù)據(jù)總條數(shù):共有多少條數(shù)據(jù)
private List list; //數(shù)據(jù)內(nèi)容
/* 由以上屬性計(jì)算得到的屬性 */
private int pageCount; //頁(yè)面總數(shù)
private int startRow; //當(dāng)前頁(yè)面開(kāi)始行,第1行動(dòng)第0行
private int first = 1; //第1頁(yè) 頁(yè)號(hào)
private int last; //最后1頁(yè) 頁(yè)號(hào)
private int prev; //前1頁(yè) 頁(yè)號(hào)
private int next; //后1頁(yè) 頁(yè)號(hào)
private int startNav; //導(dǎo)航欄 起始頁(yè)號(hào)
private int endNav; //導(dǎo)航欄 末尾頁(yè)號(hào)
private int navCount = 10; //導(dǎo)航欄長(zhǎng)度 頁(yè)號(hào)顯示數(shù)量,最多顯示numCount+1條,這里顯示11頁(yè)
/**
* 構(gòu)造器:初始化基本的3個(gè)參數(shù)(pageNum, size, rowCount),其他參數(shù)由計(jì)算得到
*/
public Pagenation(int pageNum, int size, long rowCount) {
//初始化基本參數(shù)
this.pageNum = pageNum;
this.size = size;
this.rowCount = rowCount;
//計(jì)算得到其他參數(shù)
this.pageCount = (int)Math.ceil(this.rowCount/(double)size);
this.last = pageCount;
this.pageNum = Math.min(pageNum, pageCount); //1般情況下pageNum會(huì)等于傳入的pageNum,但當(dāng)傳入的pageNum如果大于頁(yè)面總數(shù),則pageNum就等于最大頁(yè)面數(shù),即最后1頁(yè)的頁(yè)數(shù)
this.pageNum = Math.max(1, this.pageNum); //1般情況下pageNum會(huì)等于傳入的pageNum,但當(dāng)傳入的pageNum如果小于1,則pageNum就等于1,即第1頁(yè)的頁(yè)數(shù)
this.startRow = pageNum*size - (size⑴);
this.prev = (this.pageNum⑴>1)?(this.pageNum⑴):1; //如果<前1頁(yè)>為第1頁(yè),則顯示1,否則是{本頁(yè)頁(yè)數(shù)⑴}
this.next = (this.pageNum+1<this.pageCount)?(this.pageNum+1):this.pageCount; //如果<后1頁(yè)>為最后1頁(yè),則返回{最后1頁(yè)頁(yè)數(shù)},否則返回{本頁(yè)數(shù)+1}
//導(dǎo)航處理
// this.startNav = (this.pageNum⑸>1)?(this.pageNum⑸):1; //導(dǎo)航來(lái)開(kāi)始按鈕為{當(dāng)前頁(yè)數(shù)⑸},如果當(dāng)前頁(yè)數(shù)不足5,則導(dǎo)航欄開(kāi)始按鈕為{第1頁(yè)}按鈕
this.startNav = (this.pageNum-(this.navCount/2)>1)?(this.pageNum-(this.navCount/2)):1; //優(yōu)化后的開(kāi)始按鈕,使當(dāng)前頁(yè)位于導(dǎo)航欄中間,開(kāi)始按鈕已不是{當(dāng)前頁(yè)數(shù)⑸},而是{當(dāng)前頁(yè)數(shù)-導(dǎo)航欄總長(zhǎng)度的1半}
this.endNav = (this.startNav+navCount<this.last)?(this.startNav+navCount):this.last; //導(dǎo)航欄結(jié)束按鈕為{開(kāi)始頁(yè)數(shù)+導(dǎo)航欄長(zhǎng)度},如果{開(kāi)始頁(yè)數(shù)+導(dǎo)航欄長(zhǎng)度}超過(guò)頁(yè)面總數(shù),則結(jié)束按鈕為{最后1頁(yè)}
}
public Pagenation(){ //空構(gòu)造器
}
/**
* 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)、后臺(tái)處理的servlet代碼:見(jiàn)網(wǎng)盤(pán)資料
(3)、處理分頁(yè)的service方法類(lèi):見(jiàn)網(wǎng)盤(pán)資料