读书人

自个儿写的真正的通用分页工具类

发布时间: 2012-11-08 08:48:12 作者: rapoo

自己写的真正的通用分页工具类
说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的。现在好了,经本人总结与提炼:
无论你是否自己手动分页,还是借助了框架进行分页。此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下:

Java code
package cn.asiatelecom.wlan.dao;import java.util.List;/** * 用于分页的工具类 * @author 莫取网名 */public class Pager<T> {    private List<T> list; //对象记录结果集    private int total = 0; // 总记录数    private int limit = 20; // 每页显示记录数    private int pages = 1; // 总页数    private int pageNumber = 1; // 当前页        private boolean isFirstPage=false;        //是否为第一页    private boolean isLastPage=false;         //是否为最后一页    private boolean hasPreviousPage=false;   //是否有前一页    private boolean hasNextPage=false;       //是否有下一页        private int navigatePages=8; //导航页码数    private int[] navigatePageNumbers;  //所有导航页号        public Pager(int total, int pageNumber) {        init(total, pageNumber, limit);    }        public Pager(int total, int pageNumber, int limit) {        init(total, pageNumber, limit);    }        private void init(int total, int pageNumber, int limit){        //设置基本参数        this.total=total;        this.limit=limit;        this.pages=(this.total-1)/this.limit+1;                //根据输入可能错误的当前号码进行自动纠正        if(pageNumber<1){            this.pageNumber=1;        }else if(pageNumber>this.pages){            this.pageNumber=this.pages;        }else{            this.pageNumber=pageNumber;        }                //基本参数设定之后进行导航页面的计算        calcNavigatePageNumbers();                //以及页面边界的判定        judgePageBoudary();    }        /**     * 计算导航页     */    private void calcNavigatePageNumbers(){        //当总页数小于或等于导航页码数时        if(pages<=navigatePages){            navigatePageNumbers=new int[pages];            for(int i=0;i<pages;i++){                navigatePageNumbers[i]=i+1;            }        }else{ //当总页数大于导航页码数时            navigatePageNumbers=new int[navigatePages];            int startNum=pageNumber-navigatePages/2;            int endNum=pageNumber+navigatePages/2;                        if(startNum<1){                startNum=1;                //(最前navPageCount页                for(int i=0;i<navigatePages;i++){                    navigatePageNumbers[i]=startNum++;                }            }else if(endNum>pages){                endNum=pages;                //最后navPageCount页                for(int i=navigatePages-1;i>=0;i--){                    navigatePageNumbers[i]=endNum--;                }            }else{                //所有中间页                for(int i=0;i<navigatePages;i++){                    navigatePageNumbers[i]=startNum++;                }            }        }    }    /**     * 判定页面边界     */    private void judgePageBoudary(){        isFirstPage = pageNumber == 1;        isLastPage = pageNumber == pages && pageNumber!=1;        hasPreviousPage = pageNumber!=1;        hasNextPage = pageNumber!=pages;    }            public void setList(List<T> list) {        this.list = list;    }    /**     * 得到当前页的内容     * @return {List}     */    public List<T> getList() {        return list;    }    /**     * 得到记录总数     * @return {int}     */    public int getTotal() {        return total;    }    /**     * 得到每页显示多少条记录     * @return {int}     */    public int getLimit() {        return limit;    }    /**     * 得到页面总数     * @return {int}     */    public int getPages() {        return pages;    }    /**     * 得到当前页号     * @return {int}     */    public int getPageNumber() {        return pageNumber;    }    /**     * 得到所有导航页号      * @return {int[]}     */    public int[] getNavigatePageNumbers() {        return navigatePageNumbers;    }    public boolean isFirstPage() {        return isFirstPage;    }    public boolean isLastPage() {        return isLastPage;    }    public boolean hasPreviousPage() {        return hasPreviousPage;    }    public boolean hasNextPage() {        return hasNextPage;    }    public String toString(){        String str=new String();        str= "[" +            "total="+total+            ",pages="+pages+            ",pageNumber="+pageNumber+            ",limit="+limit+            //",navigatePages="+navigatePages+            ",isFirstPage="+isFirstPage+            ",isLastPage="+isLastPage+            ",hasPreviousPage="+hasPreviousPage+            ",hasNextPage="+hasNextPage+            ",navigatePageNumbers=";        int len=navigatePageNumbers.length;        if(len>0)str+=(navigatePageNumbers[0]);        for(int i=1;i<len;i++){            str+=(" "+navigatePageNumbers[i]);        }        //sb+=",list="+list;        str+="]";        return str;    }} 




PS: 此类在构造时最多只要3个参数。由于容错需要,list的setter得进行后继处理。
假设你使用了Hibernate,核心代码如下:
Java code
int totalCount=Integer.valueOf(queryCount.uniqueResult().toString());Pager pager=new Pager<T>(totalCount, pageNumber,limit);queryList.setFirstResult((pager.getPageNumber()-1)*limit); //容错处理queryList.setMaxResults(limit);pager.setList(queryList.list());return pager;


对于用其他方式分页的人,同样可以复用Pager类。


最后,欢迎大家拍砖!

[解决办法]
(⊙o⊙)…
toString()方法用new个String() 拼接那么多字符串 效率差呀
[解决办法]
实用,顶起。。 还有像楼上所说String的性能问题可以改进。。
[解决办法]
省事了
Pager中添加个方法
Java code
public int getFirstResultCount(){      return  (getPageNumber()-1)*limit;}
[解决办法]
探讨
(⊙o⊙)…
toString()方法用new个String() 拼接那么多字符串 效率差呀

[解决办法]
支持原创
[解决办法]
真的这么神奇?收藏一下 有时间看看
[解决办法]
你能不能把用法写下,就更方便了

你的toString没有拼html标签

我用的那个工具类直接就可以在jsp页面用pageTool了
不过我还是觉得不好用

[解决办法]
可以实现 Iterator 接口,这样可以在页面上直接使用 c:forEach 进行迭代了。
[解决办法]
private boolean isFirstPage=false; //是否为第一页
private boolean isLastPage=false; //是否为最后一页
private boolean hasPreviousPage=false; //是否有前一页
private boolean hasNextPage=false; //是否有下一页

放这四个属性的意义是什么?
[解决办法]
/**
* yx_java@163.com
* @desc 分页通用Bean
*/
public class PaginationBean {
public static final String PREVIOUS = "previous ";
public static final String NEXT = "next ";
public static final String FIRST = "first ";
public static final String LAST = "last ";
private int maxinum;
private int perCount = 10;
private int pageNum;
private int pageCount;
private String operate;
/**
* 计算一共多少页并为当前多少页赋值
*最大记录数
*/
public void countPageCount(int maxinum) {
this.maxinum = maxinum;
// 计算一共多少页
pageNum = maxinum % perCount == 0 ? maxinum / perCount : maxinum
/ perCount + 1;
// 为当前页数赋值
if (PREVIOUS.equals(operate)) {
pageCount--;
} else if (NEXT.equals(operate)) {
pageCount++;
} else if (FIRST.equals(operate)) {
pageCount = 1;
} else if (LAST.equals(operate)) {
pageCount = pageNum;
}
if (pageCount < 1)
pageCount = 1;
if (pageCount > this.pageNum)
pageCount = this.pageNum;
}

public String getOperate() {
return operate;
}

public void setOperate(String operate) {
this.operate = operate;
}

public int getMaxinum() {
return maxinum;
}

public int getPageCount() {
return pageCount;
}

public int getPageNum() {
return pageNum;
}

public int getPerCount() {


return perCount;
}

public void setMaxinum(int maxinum) {
this.maxinum = maxinum;
}

public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}

public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}

public void setPerCount(int perCount) {
this.perCount = perCount;
}
}
------------------------------------------------
运用自定义标签的机制写的分页类,这样无需在每个jsp页面需要重复的写分页标签:
package com.accp.common.taglib;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.accp.common.util.PageResult;
import com.accp.common.web.form.BaseForm;

public class PaginationTag extends TagSupport {
private static final long serialVersionUID = -5904339614208817088L;
private String form = null;

public int doEndTag() {
try {
BaseForm oForm = null;

//通过参数获得对应的form对象,并从form对象中获得PageResult对象
//生成分页标签的html代码,返回给页面显示
if (form!=null && ! " ".equals(form.trim())){
oForm = (BaseForm) pageContext.getRequest().getAttribute(form);
if (null==oForm){
oForm = (BaseForm) pageContext.getSession().getAttribute(form);
}
if (oForm!=null){
PageResult pageResult = oForm.getPageResult();
StringBuffer sb = new StringBuffer();

sb.append( " <div style= 'float:left;color:#03515d; '> ")
.append( "共有 "+pageResult.getRecTotal()+ " 条记录,当前第 "+pageResult.getPageNo()+ "/ "+pageResult.getPageTotal()+ " 页 ")
.append( " </div> ")
.append( " <div style= 'float:right;color:#03515d;clear:both; '> ")
.append( " <input type= 'hidden ' name=\ "pageResult.pageSize\ " value=\ " "+pageResult.getPageSize()+ "\ " size=\ "3\ " />  \r\n ")
.append( " <a href=\ 'javascript:page_first();\ '> <img src= 'images/first.gif ' alt= ' ' width= '37 ' height= '15 ' title= '首页 ' style= 'border: 0px;cursor:pointer; ' /> </a> ")
.append( " <a href=\ 'javascript:page_pre();\ '> <img src= 'images/back.gif ' alt= ' ' width= '43 ' height= '15 ' title= '上一页 ' style= 'border: 0px;cursor:pointer; ' /> </a> ")
.append( " <a href=\ 'javascript:page_next();\ '> <img src= 'images/next.gif ' alt= ' ' width= '43 ' height= '15 ' title= '下一页 ' style= 'border: 0px;cursor:pointer; ' /> </a> ")
.append( " <a href=\ 'javascript:page_last();\ '> <img src= 'images/last.gif ' alt= ' ' width= '37 ' height= '15 ' title= '尾页 ' style= 'border: 0px;cursor:pointer; ' /> </a> ")
.append( "转到第 <input type= 'text ' name=\ "pageResult.pageNo\ " maxlength= '4 ' style= 'height:16px; width:32px; border:1px solid #999999 ' value=\ " "+pageResult.getPageNo()+ "\ " size=\ "3\ "/> 页 ")
.append( " <a href=\ "javascript:page_go();\ "> <img src= 'images/go.gif ' alt= ' ' width= '37 ' height= '15 ' title= '跳转 ' style= 'border: 0px;cursor:pointer; ' /> </a> ")
.append( " </div> ")
.append( " <input type=\ "hidden\ " name=\ "pageResult.orderBy\ " value=\ " "+pageResult.getOrderBy()+ "\ " /> \r\n ")


.append( " <input type=\ "hidden\ " name=\ "pageResult.sort\ " value=\ " "+pageResult.getSort()+ "\ " /> \r\n ")
.append( " <script> \r\n ")
.append( "var pageTotal = "+pageResult.getPageTotal()+ ";\r\n ")
.append( "var recTotal = "+pageResult.getRecTotal()+ ";\r\n ")
.append( " </script> \r\n ");
sb.append( " <script> \r\n ");
sb.append( "function page_go()\r\n ")
.append( "{\r\n ")
.append( "page_validate();\r\n ")
.append( "document.forms[0].submit();\r\n ")
.append( "}\r\n ")
.append( "function page_first()\r\n ")
.append( "{\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageNo\ "].value = 1;\r\n ")
.append( "document.forms[0].submit();\r\n ")
.append( "}\r\n ")
.append( "function page_pre()\r\n ")
.append( "{\r\n ")
.append( "var pageNo = document.forms[0].elements[\ "pageResult.pageNo\ "].value;\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageNo\ "].value = parseInt(pageNo) - 1;\r\n ")
.append( "page_validate();\r\n ")
.append( "document.forms[0].submit();\r\n ")
.append( "}\r\n ")
.append( "function page_next()\r\n ")
.append( "{\r\n ")
.append( "var pageNo = document.forms[0].elements[\ "pageResult.pageNo\ "].value;\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageNo\ "].value = parseInt(pageNo) + 1;\r\n ")
.append( "page_validate();\r\n ")
.append( "document.forms[0].submit();\r\n ")
.append( "}\r\n ")
.append( "function page_last()\r\n ")
.append( "{\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageNo\ "].value = pageTotal;\r\n ")
.append( "document.forms[0].submit();\r\n ")
.append( "}\r\n ")
.append( "function page_validate()\r\n ")
.append( "{\r\n ")
.append( "var pageNo = document.forms[0].elements[\ "pageResult.pageNo\ "].value;\r\n ")
.append( "if (pageNo <1)pageNo=1;\r\n ")
.append( "if (pageNo> pageTotal)pageNo=pageTotal;\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageNo\ "].value = pageNo;\r\n ")
.append( "var pageSize = document.forms[0].elements[\ "pageResult.pageSize\ "].value;\r\n ")
.append( "if (pageSize <1)pageSize=1;\r\n ")
.append( "document.forms[0].elements[\ "pageResult.pageSize\ "].value = pageSize;\r\n ")
.append( "}\r\n ")
.append( "function order_by(field){\r\n ")
.append( "document.forms[0].elements[\ "pageResult.orderBy\ "].value = field;\r\n ")
.append( "page_first();\r\n ")
.append( "}\r\n ");
sb.append( " </script> \r\n ");
JspWriter out = pageContext.getOut();
out.println(sb.toString());
}
}
} catch (Exception e) {
}
return EVAL_PAGE;
}

public String getForm() {
return form;
}

public void setForm(String form) {
this.form = form;
}
}

------解决方案--------------------


恩 很不错 ! 收藏了 O(∩_∩)O~

读书人网 >J2EE开发

热点推荐