基于控件的分页组件
分页效果截图(由于后台数据和前台展示独立,开发者可进行自己的展示美化)
由于此分页空间返回的是虚拟表,所以同样支持迭代操作,在这里例子使用了简单的模拟结果集操作方式
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> <%=dt1.getValue(0)%></td>
<td> <%=dt1.getValue(1)%></td>
<td> <%=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 += " <a style= 'cursor:hand' onClick= 'location.href=\""
+ replaceURLPageIndex(pageUrl, first)
+ "\"' title=首页>首页</a>";
pager_html += " <a style= 'cursor:hand' onClick= 'location.href=\""
+ replaceURLPageIndex(pageUrl, pre)
+"\"' title=上一页>上一页</a>";
pager_html += " <a style= 'cursor:hand' onClick= 'location.href=\""
+ replaceURLPageIndex(pageUrl, next)
+ "\"' title=下一页>下一页</a>";
pager_html += " <a style= 'cursor:hand' onClick= 'location.href=\""
+ replaceURLPageIndex(pageUrl, last)
+ "\"' title=尾页>尾页</a> ";
pager_html += " 当前页:" + pageIndex
+ " 总行数:" + pageCnt + " 记录总数:" + cnt + " 总页数:"+pageCount+" ";
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;
}
}