抽象类
==========================================================
import java.util.arraylist;
import java.sql.connection;
import java.sql.resultset;
import com.xxx.util.dbtool;
/**
* <pre>
* 分页类.默认页面大小为20
* 这是一个抽象类。子类需要重构方法selresult()
* </pre>
*/
public abstract class pagelist {
/** 以下成员变量在子类中可视 */
protected final static int min_page_size = 20; //默认页面大小
protected int pagesize; //页面大小
protected int curpage; //当前页页码
protected int prepage; //上一页页码
protected int nxtpage; //下一页页码
protected int totalpage; //总页码数
protected int totalitem; //总条目数
protected string sql; //选择条件
protected arraylist result; //结果集
protected int from; //开始的游标位置
/** 私有变量 */
private boolean hasfindresult = false; //标志是否已经查找了结果
//保证loadresult只进行一次
/**
* 构造器.默认页面大小为20
* @param sql
* @param pageno
*/
public pagelist(string sql, int pageno) {
init(sql, min_page_size, pageno);
}
/**
* 构造器
* @param sql 条件sql
* @param pagesize 页面大小
* @param pageno 页码
*/
public pagelist(string sql, int pagesize, int pageno) {
init(sql, pagesize, pageno);
}
protected void init(string sql, int pagesize, int pageno) {
this.sql = sql;
this.pagesize = (pagesize<=0?min_page_size:pagesize);
this.curpage = (pageno<=0?1:pageno);
}
/**
* 获取页面大小
*/
public int getpagesize() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.pagesize;
}
/**
* 获取当前页码
*/
public int getcurpage() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.curpage;
}
/**
* 获取前一页的页码
*/
public int getprepage() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.prepage;
}
/**
* 获取后一页的页码
*/
public int getnxtpage() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.nxtpage;
}
/**
* 获取页码总数
*/
public int gettotalpage() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.totalpage;
}
/**
* 获取总条数
*/
public int gettotalitem() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.totalitem;
}
/**
* 判断是否有页面
* @return 如果总页面数为0,那么返回false;否则true
*/
public boolean haspages() {
if (!this.hasfindresult) {
this.loadresult();
}
return (this.totalpage != 0);
}
/**
* 获取指定页面的结果集
*
* @return 指定页面结果集;如果没有则返回空集
*/
public arraylist getresult() {
if (!this.hasfindresult) {
this.loadresult();
}
return this.result;
}
/**
* 选出结果
*/
protected abstract arraylist selresult();
/**
* 计算页码信息并且得到结果集.
* 是calculatepagenoinfo和selresult的组合
*/
private void loadresult() {
//1.计算页码相关信息
this.calculatepagenoinfo();
//2.选出结果
this.result = this.selresult();
if (this.result == null) {
this.result = new arraylist();
}
//3. 保证loadresult()只进行一次
hasfindresult = true;
}
/**
* 计算页码相关信息 calculate
*/
private void calculatepagenoinfo() {
//1. 获取总条目数量
this.totalitem = totalitem();
//2. 计算页码信息
//2.1 总页数
if (this.totalitem == 0) {
this.totalpage = 0;
} else {
this.totalpage = (this.totalitem-1) / this.pagesize + 1;
}
//2.2 当前页,前页,后页
if (this.totalpage == 0) {
this.curpage = 0;
this.prepage = 0;
this.nxtpage = 0;
this.from = 0;
} else {
this.curpage = (this.curpage>this.totalpage?this.totalpage:this.curpage);
this.prepage = ((this.curpage-1<1)?1:(this.curpage-1));
this.nxtpage = ((this.curpage==this.totalpage)?this.curpage:(this.curpage+1));
this.from = (this.curpage-1)*this.pagesize;
}
}
/**
* 获取总条目数量
*/
private int totalitem() {
//access db
int count = 0;
dbtooldb = new dbtool();
resultset rs = null;
db.conndb();
rs = db.advquery(this.sql);
try {
while (rs.next()) {
count++;
}
} catch (exception e) {
}
db.closedb();
return count;
}
}
//~
使用
===========================================================
假设我有一个news实体对象,现在要构造一个news相关的分页类
如下:
import java.sql.connection;
import java.sql.resultset;
import java.sql.sqlexception;
import com.xxx.util.dbtool;
import com.bokesoft.util.pagelist;
import com.bokesoft.util.dateutil;
/**
* 新闻分页类
*/
public class newspagelist extends pagelist {
public newspagelist(string sql, int pageno) {
super(sql, pageno);
}
public newspagelist(string sql, int pagesize, int pageno) {
super(sql, pagesize, pageno);
}
protected java.util.arraylist selresult() {
java.util.arraylist result = new java.util.arraylist(this.pagesize);
if (this.totalitem == 0) {
return result;
}
news news = null;
dbtool db = new dbtool();
resultset rs = null;
db.conndb();
rs = db.advquery(this.sql);
if (rs != null) {
try { //一旦有异常被捕捉就结束循环
int count = 1;
if (this.curpage > 1) {
rs.absolute(this.from); //跳转到开始行
}
while (rs.next() && count<=pagesize) {
//循环构造news对象,然后加入列表中
news = new news();
news.setid(rs.getstring("code")==null?"":rs.getstring("code"));
……
result.add(news);
count++;
}
} catch (exception e) {
} finally {
try { if (rs != null) rs.close();} catch (sqlexception sqle) {}
}
}
db.closedb();
return result;
}
}
//~
客户程序的使用(jsp中)
========================================================
<%
//获得跳转的页码和显示条目数量以及选择条件
//…
//int ipageno
//int ipagesize
//string sqlcond
//这里是具体使用分页类的部分,非常简单
newspagelist npl = new newspagelist(sqlcond, ipagesize, ipageno);
java.util.arraylist resultlist = npl.getresult();
int totalpage = npl.gettotalpage();
news news = null;
int size = resultlist.size();
for (int i=0; i<size; i++) {
news = (news)resultlist.get(i);
//…..
}
%>
