动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Jsp → 阅读文章

 一个分页类

作者来源: 
阅读 1240 人次 , 2006-3-29 4:23:00 


抽象类
==========================================================
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);
//.....
}

%>

 本文Tags分页  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:对象与像素的选用JSP下载word文件(不会直接用IE打开)
· 下一篇:jsp+servlet路径状态的测试
· JSP由浅入深(5-1)
· 十三、JSP动作
· 安装resin+mysql+IIS+JDK的总结
· 用缓冲技术提高JSP应用的性能和稳定性
· JSP中的TagLib应用(3-4)


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077