核心sql
i是第几页,itemnum是每页显示的数据条数
select * from (
select e.*,rownum rn from (
select * from employee where 1=1 order by empno) e where rownum
where rn >(i-1)*itemnum
大体思路
使用page类封装(page当做dao类中某个方法的参数,dao类中需要有个方法来获得获得满足条件的记录总数
每次点击查询,重新获得总记录数
首次进入某个需要显示分页的jsp页面,先创建一个page对象,设置页号为第一页,并同时使用当前的这个page,从dao类中查询,得到第一页的list数据,使用session.setattribute()方法,把page对象和list数据存入到session中
第二次则是将pageno的请求参数获得,把session中的page对象取出,设置pageno,之后再使用这个page,从dao类中获得新的一页的list数据,把page对象和list数据再次存入session中
之后,为分页按钮设置好href链接(上一页,下一页,最后一页,a标签定义herf,带上页号的参数 query.jsp?pageno=?
//使用el表达式读取page对象中的数据
当前第${employeepage.pageno}页/总共${employeepage.totalpage}页
page类代码
/**
* 分页控制类,封装了相关分页时所需的信息,包括:
*
* pageno - 页号
* pagesize - 每页显示记录数
* totalrow - 总行数
* totalpage - 总页数
* previous - 是否有上一页
* next - 是否有下一页
* first - 是否是每一页
* last - 是否是最后一页
* firstindex -当前页号的开头索引 如页号为2,每页显示记录数为5,当前的页号的开头索引为6
* lastindex -当前页号的末尾索引 如页号为2,每页显示记录数为5,当前的页号的末尾索引为10
*
*
* @param 查询条件对象。map 或者 pojo
* @author starsone
*
* pagesize=10;
* 1页: 第1~10条记录
* 2页: 第11~20第记录
* .....
* 【第一页】【上一页】【下一页】【最后一页】
* page page = new page();
*/
public class page {
//预定常量:每页的行数
public static final int r5 = 5;
public static final int r10 = 10;
public static final int r20 = 20;
public static final int r50 = 50;
public static final int r100 = 100;
public static final int default_size = r10;
//总行数
private int totalrow = 0;
//当前页号
private int pageno = 1;
//每页的记录数
public int pagesize = default_size;
//总页数
private int totalpage = 0;
//是否有上一页
private boolean previous;
//是否有下一页
private boolean next;
//是否是第一页
private boolean first;
//是否是最后一页
private boolean last;
//当前页数据首条记录索引 每页10, 当前2页:11~20
private int firstindex;
//当前页数据最后条记录索引
private int lastindex;
//查询条件对象
private t queryobject;
public page() {
this(0);
}
/**
* @param totalrow 总记录数
*/
public page(int totalrow) { // 101
this(totalrow, default_size);
}
/**
* @param totalrow 总记录数
* @param pagesize 每页记录数
*/
public page(int totalrow, int pagesize) {
this.totalrow = totalrow;
this.pagesize = pagesize;
//根据记录数自动算出总页数
if (totalrow % pagesize == 0) {
this.totalpage = totalrow / pagesize;
} else {
this.totalpage = totalrow / pagesize + 1;
}
}
/**
* @param queryobject 查询条件
*/
public page(t queryobject, int pagesize, int totalrow) {
this.queryobject = queryobject;
this.totalrow = totalrow;
this.pagesize = pagesize;
//根据记录数自动算出总页数
if (totalrow % pagesize == 0) {
this.totalpage = totalrow / pagesize;
} else {
this.totalpage = totalrow / pagesize + 1;
}
}
/**
* @param totalrow 总记录数
* @param queryobject 查询条件
*/
public page(int totalrow, t queryobject) {
settotalrow(totalrow);
this.queryobject = queryobject;
}
/**
* 得到总记录数
*
* @return
*/
public int gettotalrow() {
return totalrow;
}
/**
* @param totalrow
*/
public void settotalrow(int totalrow) {
this.totalrow = totalrow;
}
/**
* 得到当前的页号
*
* @return
*/
public int getpageno() {
return pageno;
}
/**
* 得到下一页的页号
*
* @return
*/
public int getnextno() {
if (this.getnext()) {
return pageno + 1;
} else {
return totalpage;
}
}
/**
* 得到上一页的页号
*
* @return
*/
public int getprevno() {
if (this.getprevious()) {
return pageno - 1;
} else {
return pageno;
}
}
public void setpageno(int pageno) {
this.pageno = pageno;
}
/**
* 得到每页显示的记录数
*
* @return
*/
public int getpagesize() {
return pagesize;
}
public void setpagesize(int pagesize) {
this.pagesize = pagesize;
}
/**
* 得到总页数
*
* @return
*/
public int gettotalpage() {
if (totalrow % pagesize == 0) {
this.totalpage = totalrow / pagesize;
} else {
this.totalpage = totalrow / pagesize + 1;
}
return totalpage;
}
public void settotalpage(int totalpage) {
this.totalpage = totalpage;
}
/**
* 是否有下一页
*
* @return
*/
public boolean getnext() {
if (pageno == 1 && pageno < gettotalpage()) {
return true;
}
if (pageno > 1 && pageno < gettotalpage()) {
return true;
} else {
return false;
}
}
/**
* 是否有上一页
*
* @return
*/
public boolean getprevious() {
if (getpageno() > 1) {
return true;
} else {
return false;
}
}
/**
* 是否是第一页
*
* @return
*/
public boolean getfirst() {
return (getpageno() > 1 ? false : true);
}
/**
* 是否是最后一页
*
* @return
*/
public boolean getlast() {
return (getpageno() == gettotalpage() ? true : false);
}
/**
* 得到本页数据首条记录索引
*
* @return
*/
public int getfirstindex() {
int i = getpageno(); //pageno = 3
return ((i < 1 ? 1 : i) - 1) * getpagesize() + 1;
}
/**
* 得到本页数据最后一条记录索引
*
* @return
*/
public int getlastindex() {
return getfirstindex() + this.getpagesize() - 1;
}
/**
* 得到查询分页的条件
*
* @return
*/
public t getqueryobject() {
return queryobject;
}
/**
* 设置查询分页的条件
*
* @return
*/
public void setqueryobject(t queryobject) {
this.queryobject = queryobject;
//this.totalrow = new employeedao().countforquery(((employee) queryobject));
//根据记录数自动算出总页数
if (totalrow % pagesize == 0) {
this.totalpage = totalrow / pagesize;
} else {
this.totalpage = totalrow / pagesize + 1;
}
}
// 便于调试
@override
public string tostring() {
return "page [是否是第一页:" + getfirst()
+ ", 是否是最后页:" + getlast()
+ ", 是否有上一页:" + getprevious()
+ ", 是否有下一页:" + getnext()
+ ", 当前的页号:" + getpageno()
+ ", 每页记录数:" + getpagesize()
+ ",开始索引:" + getfirstindex()
+ ",末尾索引:" + getlastindex()
+ ", 总页数=" + gettotalpage()
+ ", 总记录数=" + gettotalrow() + "]";
}
}
使用范例
/* public static void main(string[] args) {
// 模拟页页提交的查询条件
employee emp = new employee();
page page = new page(13);
// 设置(保存)查询条件
page.setqueryobject(emp);
//设置 默认每页显示的记录数
page.setpagesize(page.r5);
// 设置当前页号
page.setpageno(3);
system.out.println(page);
// session.setattribute("emppage", page);
}*/
select * from (select e.*,rownum rn from (select * from emploee where order by empno) where rownum <= (i*itemnum) ) where rn >(i-1)*itemnum
希望与广大网友互动??
点此进行留言吧!