基于控件的分页组件

分页效果截图(由于后台数据和前台展示独立,开发者可进行自己的展示美化)

基于控件的分页组件 

 

 

 

 

 

Sort.java下载

 

 

 

由于此分页空间返回的是虚拟表,所以同样支持迭代操作,在这里例子使用了简单的模拟结果集操作方式

 

sort.jsp

 

 

<%@ page language="java" import="com.qsdata.tools.Sort,com.qs.data.DbTable" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>sort</title>
  </head>
 
  <body>
    <%
    String sql="select * from question";
    Sort mysort=new Sort();
    DbTable dt1=mysort.getDbTable(pageContext,sql,20);//得到分页的虚拟表
    %>
   
    <div><%=mysort.getScript() %></div><!-- 分页脚本 -->
    <table border="1">
    <%  while(dt1.next()){ %>
     <tr>
      <td>&nbsp;<%=dt1.getValue(0)%></td>
      <td>&nbsp;<%=dt1.getValue(1)%></td>
      <td>&nbsp;<%=dt1.getValue(2)%></td>
     </tr>
    <%} %>
    </table>
    <div><%=mysort.getScript() %></div><!-- 分页脚本 -->
  </body>
</html>

 

 

 

 

 

 

 

sort.java

 

 package com.qsdata.tools;

import com.qs.data.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.PageContext;
/**
 * 分页组件
 * @author 谭青松
 *
 */
public class Sort {
 private String sort="";//分页String
 private int pageSize = 0; // 每页显示记录数
 private int pageIndex = 1; // 当前页,从1开始
 private int pageCount = 0; // 总页数
 private int cnt = 0; // 总记录数
 private int pageCnt=0; //当前页记录数
 private String dbSql="";//取得数据的SQL
 private String pageUrl="";//页面URL地址
 private String dbType="";//数据库类型
 private DbBase dbconn;//控件的Dbbase数据库控制
 private PageContext pageContext;
 
 
 /**
  * 构造指定连接池名的分页
  */
 public Sort(String dbPoolName){
  dbconn=new DbBase(dbPoolName);
 }
 
 /**
  * 使用默认连接池构造分页
  */
 public Sort(){
  dbconn=new DbBase();
 }
 
 /**
  * 返回分页脚本
  */
 public String getScript(){
  return sort;
 }
 
 /**
  * 执行分页操作,返回一个虚拟表DbTable,自动支持oracle、mysql分页封装
  */
 public DbTable getDbTable(PageContext pgc , String sqls  , int maxRow ){
  
  this.pageContext=pgc;//设置PageContext
  this.dbSql=sqls;//设置查询数据SQL
  String index=pgc.getRequest().getParameter("page20110826");
  if(index!=null&&!index.equals("")){//设置当前页数
   this.pageIndex=Integer.parseInt(index);
  }
  this.pageSize=maxRow;//设置分页显示最大行数
  
  //得到request URL
  HttpServletRequest req=(HttpServletRequest)(pageContext.getRequest());
  pageUrl=req.getRequestURL().toString();
  if(req.getQueryString()!=null && !req.getQueryString().equals("")) {
   pageUrl+="?"+req.getQueryString();
  }
  
  //产生分页脚本
  this.sort=getPager();
  
  int minNum=(this.pageIndex-1)*pageSize;
  int maxNum=this.pageIndex*pageSize;
  
  if(dbType.equals("mysql")){//产生分myqslq页数据
   String sql="select * from ("+dbSql+") t10002 limit "+minNum+","+pageSize;
   return dbconn.executeQuery(sql);
  }else if(dbType.equals("oracle")){//产生oracle分页数据
   String sql="select * from ( select row_.*, rownum rownum_ from ("+dbSql+") row_ where rownum <= "+maxNum+") where rownum_ > "+minNum;
   return dbconn.executeQuery(sql);
  }else{
   System.out.println("其他数据库类型,无法获得分页虚拟表,请根据实际情况在Sort.getDbTable()中修改或增加");
  }
  
  return null;
 } 
 
 
 /**
  * 得到分页脚本
  */
 private String getPager() {
  String pager_html="";
  String countSql="";
  
  //得到当前使用的数据库类型
  if(dbconn.getPoolDriverName().indexOf("mysql")>=0){
   dbType="mysql";
  }else if(dbconn.getPoolDriverName().indexOf("oracle")>=0){
   dbType="oracle";
  }else{
   System.out.println("其他数据库类型,请根据实际情况在Sort.getPager()中修改或增加");
  }
  
  
  // 得到总记录数
  if(dbType.equals("mysql")||dbType.equals("oracle")){
   cnt=Integer.parseInt(dbconn.executeScalar("select count(*) from ("+dbSql+") t").toString());
  }else{
   System.out.println("其他数据库类型,无法获得总记录数,请根据实际情况在Sort.getPager()中修改或增加");
  }
  
  
  // 如果pagesize<=0,则设置pageSize为30
  if (pageSize <= 0){
   pageSize=30;
  }
  // 得到总页数
  pageCount = cnt / pageSize;
  if (cnt % pageSize != 0){
   pageCount++;
  }
  // 如果当前页大于最后一页,则设置当前页为最后一页
  if (pageIndex > pageCount){
   pageIndex = pageCount;
  }
  // 如果当前页小于0,则设置当前页为0
  if (pageIndex < 1){
   pageIndex = 1;
  }
  //得到当前页记录数
  if(pageIndex>=pageCount && cnt % pageSize !=0) {
   pageCnt=cnt % pageSize;
  }else {
   pageCnt=pageSize;
  }
  
  int first=1;
  int pre=pageIndex-1;
  if(pre<1)
   pre=1;
  int next=pageIndex+1;
  if(next>pageCount)
   next=pageCount;
  int last=pageCount;
  
  if(cnt == 0){
   pageCnt = 0;
  }
  
  //构造分页脚本,请在此处修改样式
  pager_html="<div style='text-align:right;' id='sort_pager'>";
  pager_html += "&nbsp;<a style= 'cursor:hand' onClick= 'location.href=\""
  + replaceURLPageIndex(pageUrl, first)
  + "\"' title=首页>首页</a>";
  
  pager_html += "&nbsp;<a style= 'cursor:hand' onClick= 'location.href=\""
   + replaceURLPageIndex(pageUrl, pre)
   +"\"' title=上一页>上一页</a>";
  
  pager_html += "&nbsp;<a style= 'cursor:hand' onClick= 'location.href=\""
   + replaceURLPageIndex(pageUrl, next)
   + "\"' title=下一页>下一页</a>";

  pager_html += "&nbsp;<a style= 'cursor:hand' onClick= 'location.href=\""
   + replaceURLPageIndex(pageUrl, last)
   + "\"' title=尾页>尾页</a>&nbsp;&nbsp;&nbsp;&nbsp;";
  
  pager_html += "&nbsp;当前页:" + pageIndex
   + "&nbsp;总行数:" + pageCnt + "&nbsp;记录总数:" + cnt + "&nbsp总页数:"+pageCount+"&nbsp";
  pager_html+="</div>";
  //构造脚本结束
  
  return pager_html;

 }
 
 
 /**
  * 产生URL
  */
 private String replaceURLPageIndex(String url, int pageIndex) {
  int i = url.indexOf("page20110826=");
  if (i != -1)
   url = url.substring(0, i - 1);
  if (url.indexOf("?") != -1)
   url += "&page20110826=" + pageIndex;
  else
   url += "?page20110826=" + pageIndex;
  return url;
 }
 
}