分页接口

  结合pager分页标记库的使用应用于页面分页,能高效速度分页自定义

public interface Pagination_Interface {
 
 public  boolean isFirst();//是否第一页
 public  boolean isLast();//是否最后一页
 public  boolean hasNext();//是否还有下一页
 public boolean hasPrevious();//是否还有前一页
 
 public int getMaxElement();//获取最大记录数
 public int getMaxPages();//获取最大页数
 public int getNext();//获取下一页
 public int getprevious();//获取上一页
 public int getPageSize();//获取分页大小(每页显示多少条记录)
 public int getPageNumber();//获取当前页码
 
 public void setPageNumber(int pageNumber);//显示当前页码
 public void setPageSize(int pageSize);//设置分页大小
 public void setMaxElement();//计算最大记录数
 public void setMaxPages();//计算最大页数
 public List<Object> getList();//返回当前页所包含的记录数以集合形式返回
}

-------------------------------------------------


public class OraclePagination_Utils implements Pagination_Interface {
 
 private int pageSize=20;//分页大小
 private int pageNumber=1;//当前页号
 private int maxElement;//最大记录
 private int maxPages;//最大页数
 private DBUtils dbu;
 private String sql;
 private String driver="oracle.jdbc.OracleDriver";
 private String url="jdbc:oracle:thin:@localhost:1521:ora9";
 private String name="tocm";
 private String password="tocm";
 
 //构造方法传递参数启动
 public OraclePagination_Utils(String sql){
  this.sql=sql;
  this.init();
 }
 //通过构造方法方便外面可以直接设置最大分页大小
 public OraclePagination_Utils(String sql,int pageSize,int pageNumber){
  this.sql=sql;
  this.pageNumber=pageNumber;
  this.pageSize=pageSize;
  this.init();
 }
 
 //启动数据库操作
 private  void init(){
  //启动数据库工具类
  dbu=DBUtils.getDb();
  dbu.setDataSource(driver, url, name, password);
  dbu.init();
  //调用方法
  this.setMaxElement();
  this.setMaxPages();
 }
 
 //计算出数据库中的全部记录数
 public void setMaxElement() {

  //思路:因为传进来的SQL语句是:SELECT * FROM DB;
  //要计算总记录必须要转为SQL语句:SELECT COUNT(*) FROM DB;
  String regex="select ((.)+) from";
  Pattern p=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
  String [] s=p.split(this.sql);
  String newSql="select count(1) as total from"+ s[1];
  
  //接口直接实现该类方法()
  ResultSetHandler rsh=new ResultSetHandler(){

   public Object handle(ResultSet rs) throws SQLException {
    if(!rs.next()){
     return null;
    }
    return new Integer(rs.getInt("total"));
   }
  };
  this.maxElement=(Integer)dbu.query(newSql, null, rsh);
 };
 //计算最大页数
 public void setMaxPages() {
  maxPages=(this.maxElement+this.pageSize-1)/this.pageSize;
 }
 
 //设置分页大小(每页显示多少条记录)
 public void setPageSize(int pageSize) {
  if(pageSize>this.maxElement){
   this.pageSize=this.maxElement;
  }else if(this.pageSize<1){
   this.pageSize=1;
  }else{
   this.pageSize=pageSize;
  }
 }
 
 //设置当前显示页码
 public void setPageNumber(int pageNumber) {
  if(this.pageNumber>this.maxPages){
   this.pageNumber=this.maxElement;
  }else if(this.pageNumber<1){
   this.pageNumber=1;
  }else{
   this.pageNumber=pageNumber;
  }
 }
 //实现高效查询,修改原有的SQL方法,通过ORACLE自有的ROWNUM语句实现效查询

 private String modifySql(String sourceSql,int begin,int end){
  StringBuffer target=new StringBuffer();
  target.append("select * from (select a.*,rownum num from(");
  target.append(this.sql);
  target.append(") a where rownum<=");
  target.append(end);
  target.append(")where num>=");
  target.append(begin);
  return target.toString(); 
 }

 //计算传进来参数的查询段的结束位置,因为当点击下一页时,页数的变化必须要同时要传递该页码参数来计算
 private int getEndElement(){
  int endElement=this.pageSize*this.pageNumber;
  if(endElement>=this.maxElement){
   return this.maxElement;
  }else{
  return endElement;
  }
 }
 //计算传进来的起始位置
 private int getBeginElement(){
  return (this.pageNumber-1)*this.pageSize+1;
 }
 
 //返回每页的记录数(以集合返回,直接查询出数据库中记录,相当于在类中写查询语句查出所有记录一样,只不过这里分页是分段安要求查询,高效)
 public List<Object> getList() {
  String newModifySql=this.modifySql(this.sql, this.getBeginElement(),this.getEndElement());
  
  return (List)dbu.selectData(newModifySql, null, new MapListHandler());
 }

 //返回最大记录数
 public int getMaxElement() {
  return this.maxElement;
 }

 //返回最大页数
 public int getMaxPages() {
  return this.maxPages;
 }
 
 //返回下一页
 public int getNext() {
  if(this.pageNumber>=this.maxPages){
   return this.maxPages;
  }
  return this.maxPages+1;
 }
 
 //返回当前页码
 public int getPageNumber() {
  return this.pageNumber;
 }

 //返回分页大小(每页显示多少条记录)
 public int getPageSize() {
  return this.pageSize;
 }

 //返回上一页
 public int getprevious() {
  if(this.pageNumber<=1){
   return this.pageNumber=1;
  }
  return this.pageNumber-1;
 }

 //是否还有下一页
 public boolean hasNext() {
  if(this.pageNumber>=this.maxPages){
   return false;
  }
  return true;
 }

 //是否还有上一页
 public boolean hasPrevious() {
  if(this.pageNumber<=1){
   return false;
  }
  return true;
 }

 //是否在第一页
 public boolean isFirst() {
  if(this.pageNumber<=1){
   return true;
  }
  return false;
 }

 //是否最后一页
 public boolean isLast() {
  if(this.pageNumber>=this.maxElement){
   return true;
  }
  return false;
 }
}

 

 

-----------------------------------------------

 


(1)通过Jsptags-pager_tag组件配合使用:首先引入该标记库:
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>

(2)获取分页域中属性方法:

 <c:set var="list" value="${requestScope.pager.list}"></c:set> 
 
(3)循环输出集合记录内容:

    <c:forEach items="${list}"  var="rs">//注意${list}对应上面的var变量值
     <tr>
     <td width="133"><input type="checkbox" id="selectFlag" name="selectFlag" value="${rs.userid }" /></td>
     <td><a href="List.do" onClick="window.open('DealDispatchAction.do?method=openInfo&userid=${rs.userid}','详细信息','width=500,height=500,toolbar=no')" >${rs.userid}</a></td>
     <td>${rs.username }</td>
     <td>${rs.userpassword }</td>
     </tr>
    </c:forEach>

(4)分页标记输出:

<pg:pager url="List.do" items="${requestScope.pager.maxElement}"  maxPageItems="${requestScope.pager.pageSize}"  maxIndexPages="5">
 //注意不能在url=""中后加参数,只能写请求地址,有参数只能通过:<pg:param name=""/>来赋值
  <pg:index>
   <pg:first unless="current">
    <a href="${pageUrl}&p=${pageNumber}">首页</a>
   </pg:first>
   <pg:prev>
    <a href="${pageUrl}&p=${pageNumber}">上一页(${pageNumber})</a>
   </pg:prev>
   <pg:pages>
    <a href="${pageUrl}&p=${pageNumber}">${pageNumber}</a>    
   </pg:pages>
   <pg:next>
    <a href="${pageUrl}&p=${pageNumber}">下一页(${pageNumber})</a>
   </pg:next>
   <pg:last unless="current">
    <a href="${pageUrl}&p=${pageNumber}">尾页</a>
   </pg:last>
  </pg:index>
 </pg:pager>
 <font color="#008000">总记录数:<c:out value="${requestScope['pager'].maxElement}"></c:out></font>

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值