结合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>