分页功能(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为最后一页,则返回{最后一页页数},否则返回{本页数+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
}
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方法类:见网盘资料