自己写的真正的通用分页工具类
说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入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;}
[解决办法]
[解决办法]
支持原创
[解决办法]
真的这么神奇?收藏一下 有时间看看
[解决办法]
你能不能把用法写下,就更方便了
你的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~