贴一个偶写的分页类

分页

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

%>

时间: 2025-01-30 22:21:08

贴一个偶写的分页类的相关文章

一个通用的JSP分页类,具有显示多组页码功能

最近几天学习jsp觉得很好,写了个分页类,给大家分享一下,同时也请高手指点. 第一部分:db.MysqlConn 数据库链接类 /********************************************************** 路径:zon.db.MysqlConn 文件:MysqlConn.java 用途:数据库连接 package db; import java.sql.*; import javax.xml.parsers.*; import org.w3c.dom.*

刚开始学.Net时写的分页类

共享的分页类,使用非常简单,试合初学者使用,但效率较低,使用的是PagedDataSource分页 public PagedDataSource GetPagedDataSource(DataSet MyDataSet,int PageSize,int PageNum,string AspxName,Label PageLable) { PagedDataSource PDS=new PagedDataSource(); PDS.AllowPaging=true; PDS.PageSize=Pa

今天写的分页类......分享

分页 由于是上班时候写的,所以如果全部由部贴出来恐怕对不起公司,所以我把其中的表单跳转删去了.别见怪哦... 格式写法是比较标准的了 PHP代码:--------------------------------------------------------------------------------/**********| +---------------------------------------------------| CLASS NAME: PageBar| +--------

一个分页类

分页 抽象类==========================================================import java.util.ArrayList;import java.sql.Connection;import java.sql.ResultSet; import com.xxx.util.DBTool; /** * <pre> * 分页类.默认页面大小为20 * 这是一个抽象类.子类需要重构方法selResult() * </pre> */p

PHP分页类分享

分享一个常用的php分页类.有三种表现形式,具体效果图如下: (1) (2) (3) 该php分页类的具体代码以及使用方法如下: /** *PHP分页类 * *show(2) 1 ... 62 63 64 65 66 67 68 ... 150 *分页样式 *#page{font:12px/16px arial} *#page span{float:left;margin:0px 3px;} *#page a{float:left;margin:0 3px;border:1px solid #d

php 分页类 扩展代码_php实例

原来发表过一个脱离数据库的分页类,最近使用的时候发现有些时候搜索的东西过于大的时候,采用url传递参数的方式,可能会有一定的影响或者叫已知的bug,这次做了一些扩展,同时兼容了以前的模式,使用上面很简单的,只需要多设置一个参数就可以了代码如下: 复制代码 代码如下: <?php /** * 功能: 分页类,根据提供的数据总量和页面大小 * 创建日期:Fri Apr 20 16:45:21 CST 2007 * 最后更新: * 作者: sanshi <sanshi0815@tom.com>

PHP中常用的分页类总结

php基本分页  代码如下 复制代码 <?php // database connection info $conn = mysql_connect('localhost','dbusername','dbpass') or trigger_error("SQL", E_USER_ERROR); $db = mysql_select_db('dbname',$conn) or trigger_error("SQL", E_USER_ERROR); // fin

创建一个ASP通用分页类

创建|分页 转自"蓝色理想" http://www.blueidea.com/tech/program/2004/1989.asp.ASP分页一直是一个众说纷坛的话题,而且也没有一个太有效的方法.今天在CSDN的BLOG里看到了这个ASP分页类,(http://blog.csdn.net/xiangbo520/archive/2004/09/22/113539.aspx),只是提供了源码,而且源码中部分标签已被作为HTML显示了,想复制下来也不太容易,所有到蓝色理想找到了一篇全面一点的

创建一个ASP分页类(一)文章部分

创建|分页 创建一个ASP通用分页类 平波 从开始学习到使用ASP到现在也写了不少程序了,最令人头痛的是写数据分页,每次都是由于几个变量名或几个参数的不同,因而需要每次都写哪一段冗长而又繁杂的分页代码,代码长了使得程序的可读性变差,容易出差,调试半天也找不出错在哪里,所以慢慢的我开始使用一些网上的提供的分页函数或分页类.的确省事不少,但是通常的函数和类的做法都是就数据显示部分也封装了起来,每次为了达到自己需要的显求效果要去改动函数或者类的本身,所以使用起来也不是怎么方便,自己写的分页改起来已经够