像插件一样的struts2框架的分页实现(一个类就实现一个分页功能)

   对于大多初学者来说,分页功能可能是大家都头疼的一件事。有些人,可能为了实现分页效果,而在页面上写了很多让自己都感觉头晕的一大堆代码。虽然最后可以实现分页效果,但是确不具备着可移植,可重用的效果。这样导致页面上的代码增多,而到其他地方用到分页时,只能复制粘贴重复的代码。这样就造成页面代码的混乱。而怎样实现分页的可移植,可重用的效果呢?这就是我要介绍的。
    ---------Pagination(类)-------
属性:get,set方法省了,自己生成,别说不会,不然我敲死你…
/** 当前页 */
private int pageNo;
/** 每页数据量 */
private int pageSize;
/** 总数据量 */
private int allCount;
/** 总页数 */
private int allPage;
/** 每页开始 */
private int recordStart;
/** 每页结束 */
private int recordEnd;
/** 显示页数 */
private int showCount;
/** 显示开始 */
private int showStart;
/** 显示结束 */
private int showEnd;
/** RUL地址*/
private String url;//页面传过来的URL(具体有什么用等下会解释,上面的应该都很容易理解了吧)
/** 样式名字*/
private String styleClass;

构造方法:

/**
* 构造方法,缺省每页记录数为12、显示页码数为9、样式名字为空
* @param pageNo     当前页
* @param allCount   总记录数
* @param url        分页URL
*/
public Pagination(int pageNo, int allCount,String url) {
this(pageNo,12,allCount,9,url,"");
}
/**
* 构造方法,缺省显示页码数为9、样式名字为空
* @param pageNo     当前页
* @param pageSize   每页记录数
* @param allCount   总记录数
* @param url        分页URL
*/
public Pagination(int pageNo, int pageSize, int allCount,String url) {
this(pageNo,pageSize,allCount,9,url,"");
}
/**
* 构造方法,缺省样式名字为空
* @param pageNo     当前页
* @param pageSize   每页记录数
* @param allCount   总记录数
* @param showCount  显示页码数
* @param url        分页URL
*/
public Pagination(int pageNo, int pageSize, int allCount, int showCount ,String url) {
this(pageNo,pageSize,allCount,showCount,url,"");
}
/**
* 构造方法
* @param pageNo     当前页
* @param pageSize   每页记录数
* @param allCount   总记录数
* @param showCount  显示页码数
* @param url        分页URL
* @param styleClass 样式名字
*/
public Pagination(int pageNo, int pageSize, int allCount, int showCount,String url,String styleClass) {
this.pageNo = pageNo;
this.pageSize = pageSize;
this.allCount = allCount;
this.showCount = showCount ;
this.url = url ;
this.styleClass = styleClass ;
init();
}

初始化:
/**
* 初始化分页各种参数
*/
private void init() {
allPage = allCount%pageSize==0 ? allCount/pageSize : allCount/pageSize+1 ;
if(pageNo>allPage){
pageNo = allPage ;
}
if (pageNo < 1) {
pageNo = 1;
}
recordStart = (pageNo-1) * pageSize ;
recordEnd = Math.min(recordStart+pageSize, allCount);
showCount = Math.min(showCount, allPage);
if (showCount>=allPage) {
showStart = 1;
showEnd = allPage;
} else {
if (pageNo <= (showCount+1)/2) {
showStart = 1;
showEnd = showCount ;
} else if(pageNo > allPage-(showCount+1)/2 ) {
showStart = allPage - showCount + 1 ;
showEnd = allPage ;
} else{
showStart = pageNo - showCount/2;
showEnd = showStart+showCount-1 ;
}
}
}
--------------------------------------

/**
* 获取分页数据
* @param <T>  范型参数
* @param list 需要分页的总数据集合
* @return
*/
public <T> List<T> getPageDate(List<T> list) {
return list.subList(recordStart,recordEnd);
}

toString方法:(这个就是分页的灵魂了,里边实现了为网页动态加入的HTML代码,这种编程方式可以实现网页代码后台生成机制,这样你只要在页面用$(Pagination)这个表达式实现就行了,这样利用toString()这个方法,在后台构造出页面的html的代码,这样你就可以像插件一样,随时的在页面上放置到任何你想要放置的位置了。)

/**
* 生成页面的分页元素(分页html页面标签)
*/
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("<div class='"+styleClass+"'>");
if(pageNo<2){
sb.append("<a>首  页</a>&nbsp;");
sb.append("<a>上一页</a>&nbsp;");
}else{
sb.append("<a href='"+url+"?pageNo=1'>首  页</a>&nbsp;");
sb.append("<a href='"+url+"?pageNo="+(pageNo-1)+"'>上一页</a>&nbsp;");
}
for (int i = showStart; i < pageNo; i++) {
sb.append("<a href='"+url+"?pageNo="+i+"'>" + i + "</a>&nbsp;");
}
sb.append("<span>" + pageNo + "</span>&nbsp;");
for (int i = pageNo + 1; i <= showEnd; i++) {
sb.append("<a href='"+url+"?pageNo="+i+"'>" + i + "</a>&nbsp;");
}
if(pageNo>=allPage){
sb.append("<a>下一页</a>&nbsp;");
sb.append("<a>尾  页</a>&nbsp;");
}else{
sb.append("<a href='"+url+"?pageNo="+(pageNo+1)+"'>下一页</a>&nbsp;");
sb.append("<a href='"+url+"?pageNo="+allPage+"'>尾  页</a>&nbsp;");
}
sb.append("</div>");
return sb.toString();
}

------------------Action-----------------
在你想要实现分页的那个Action类里面,get\set他们,那么你就可以在页面上通过$(Pagination)来显示出来。
private Pagination pagination;
private Integer pageNo = 1;   //这个一定要有,不然会出错的


     其实这个分页的功能,为什么能在页面上实现可重用,可移植,可随意显示,都是利用toString()这个方法,在后台构造好你要在html页面的现实效果,然后在这个方法类里面实现这些业务功能,这样再通过Action来get/set这个类,就可能在页面上随意的显示了...这样就可以独立出来,像一个插件一样,几时用到,就几时调用就行了...呵呵,这个就是toString()的好处。
     希望大家能体会到toString带来的好处,如果大家有什么好例子,也可以相互分享下。喜欢并觉得不错的,希望支持下,这是我发表的第二篇文章,给点动力。

猜你喜欢

转载自jianghengqiu.iteye.com/blog/1104693