`
oojdon
  • 浏览: 40764 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

我写分页类

阅读更多

分页,以JavaEye为例子,长得像这两幅图:



 

 

长了就用...隐藏一部分,我把这一串数字提取出来做一个数据容器,取名分页条PageBar,里面就是一串数字,比如存放上面图片中的1,2,3 545,546,...用-1代替,得到一个类

 

public class CssPageBar {

	private int [] linkNums;

	public int[] getLinkNums() {
		return linkNums;
	}

	public void setLinkNums(int[] linkNums) {
		this.linkNums = linkNums;
	}
	
}

 

分页只是滚动导航数据记录,但是用户真正想看到的记录内容必须用一个对象来表示,取名Page,泛化一下,运行时装入各种类型的待显示数据,同时把判断当前这个Page是否有下页和上页的责任付给它,因为各个Page在数据记录中的位置是可以确定的,所以这个很好计算,于是Page类代码如下

 

public class Page<T> {

	private int pageNo = 1;// 第几页

	private int pageSize = 3;// 每页显示的记录数

	private int totalCount;// 数据中记录的总条数

	private List<T> result = new ArrayList<T>();// 每页需要显示的真实数据记录

	private String orderBy = null;

	private boolean asc = true;

	private Map queryParams = new HashMap();// 封装页面的查询参数

	public Page() {

	}

	public Page(int pageNo) {
		this.pageNo = pageNo;
	}

	// 每页的第一条记录在结果集中的位置
	public int getPageFirst() {
		return ((pageNo - 1) * pageSize);
	}

	// 总页数,这个是根据totalcount和pageSize计算的
	public int getTotalPages() {
		if (totalCount == 0)
			return 0;

		int count = totalCount / pageSize;
		if (totalCount % pageSize > 0) {
			count++;
		}
		return count;
	}

	/**
	 * 是否还有下一页.
	 */
	public boolean isHasNext() {
		return (pageNo + 1 <= getTotalPages());
	}

	/**
	 * 返回下页的页号,序号从1开始.
	 */
	public int getNextPage() {
		if (isHasNext())
			return pageNo + 1;
		else
			return pageNo;
	}

	/**
	 * 是否还有上一页.
	 */
	public boolean isHasPre() {
		return (pageNo - 1 >= 1);
	}

	/**
	 * 返回上页的页号,序号从1开始.
	 */
	public int getPrePage() {
		if (isHasPre())
			return pageNo - 1;
		else
			return pageNo;
	}

	/**
	 * 设置查询参数
	 */
	public void setQueryParam(String paramName, String paramValue) {
		this.queryParams.put(paramName, paramValue);
	}

	/**
	 * 
	 * 多条件查询的URL参数
	 */
	public String getUrlParam() {
		StringBuilder urlParam = new StringBuilder();
		Map params = this.getQueryParams();
		Iterator<String> keys = params.keySet().iterator();
		if (params != null && keys.hasNext()) {
			String key = keys.next();
			urlParam.append(key).append("=").append(params.get(key));
			while (keys.hasNext()) {
				key = keys.next();
				urlParam.append("&").append(key).append("=").append(
						params.get(key));
			}
		}
		return urlParam.toString();
	}

	/**
	 * 单个的排序字段.
	 */
	public String getOrderBy() {
		return orderBy;
	}

	public void setOrderBy(String orderBy) {
		this.orderBy = orderBy;
	}

	public boolean isOrderBySetted() {
		return this.orderBy != null;
	}

	/**
	 * 是否升序,默认为true.
	 */
	public boolean isAsc() {
		return asc;
	}

	public void setAsc(boolean asc) {
		this.asc = asc;
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public List<T> getResult() {
		return result;
	}

	public void setResult(List<T> result) {
		this.result = result;
	}

	public Map getQueryParams() {
		return queryParams;
	}

}
 

 

把这两个对象放到页面的渲染上下文中就可以实现分页了,因为后台只提供数据,前端可用各种CSS来控制显示样式,改名刚才那个PageBar为CssPageBar,这个对象是通过分析Page对象得到的,所以另外需要一个工具类来做这个事情,代码如下

 

public class PageProcessor {

	public static int THRESHOLDFORELLIPSIS = 5;// 预设值,系统默认为5

	public <T> CssPageBar process(Page<T> page) {
		int totalPage = page.getTotalPages();
		int currentPage = page.getPageNo();
		CssPageBar cssPageBar = new CssPageBar();
		cssPageBar.setLinkNums(this.linkNums(totalPage, currentPage));
		return cssPageBar;
	}

	private int[] linkNums(int totalPage, int currentPage) {
		int[] pre = new int[0]; // 当前页的前组,包含当前页
		int[] next = new int[0];// 当前页的后组,不包含当前页

		if (totalPage > 0) {
			// 处理前组
			if (currentPage <= THRESHOLDFORELLIPSIS) {
				pre = new int[currentPage];
				for (int i = 0; i < pre.length; i++) {
					pre[i] = i + 1;
				}
			} else if (currentPage == totalPage) {
				pre = new int[THRESHOLDFORELLIPSIS + 1];
				pre[0] = 1;
				pre[1] = 2;
				pre[2] = -1;
				pre[3] = currentPage - 2;
				pre[4] = currentPage - 1;
				pre[5] = currentPage;
			} else {
				pre = new int[THRESHOLDFORELLIPSIS];
				pre[0] = 1;
				pre[1] = 2;
				pre[2] = -1;
				pre[3] = currentPage - 1;
				pre[4] = currentPage;
			}
			// 处理后组
			if ((totalPage - currentPage) <= (THRESHOLDFORELLIPSIS - 1)) {
				next = new int[totalPage - currentPage];
				for (int i = 0; i < next.length; i++) {
					next[i] = currentPage + i + 1;
				}
			} else if (currentPage == 1) {
				next = new int[THRESHOLDFORELLIPSIS];
				next[0] = 2;
				next[1] = 3;
				next[2] = -1;
				next[3] = totalPage - 1;
				next[4] = totalPage;
			} else {
				next = new int[THRESHOLDFORELLIPSIS - 1];
				next[0] = currentPage + 1;
				next[1] = -1;
				next[2] = totalPage - 1;
				next[3] = totalPage;
			}
		}

		// 合并
		int[] linkNums = new int[pre.length + next.length];

		int index = 0;
		for (int num : pre) {
			linkNums[index++] = num;
		}
		for (int num : next) {
			linkNums[index++] = num;
		}

		return linkNums;
	}

}
 

前端显示,可用jsp或者模板引擎,用CommonTemplate的代码如下

 

<div id="pagination" align="center" class="pagination">
${page.totalCount}条记录,每页显示${page.pageSize}条记录,一共${page.totalPages}页:
$if{page.hasPre == true}<a href="/jdonmvcdemo?page.pageNo=${page.prePage}">上一页</a>$end
$if{page.hasPre != true}<span class=disabled >上一页</span>$end

$for{number : cssPageBar.linkNums}
$if{number == -1}<span class="disabled">...</span>$end
$if{number == page.pageNo}<span class="current">${page.pageNo}</span>$end
$if{number != -1 && number != page.pageNo}<a href="/jdonmvcdemo?page.pageNo=${number}"/>${number}</a>$end
$end

$if{page.hasNext == true}<a href="/jdonmvcdemo?page.pageNo=${page.nextPage}">下一页</a>$end
$if{page.hasNext != true}<span class=disabled >下一页</span>$end
</div>

 用Jsp的代码如下

 

<div id="pagination" align="center" class="pagination">
${page.totalCount}条记录,每页显示${page.pageSize}条记录,一共${page.totalPages}页:
<c:if test="${page.hasPre}"><a href="/jdonmvcdemo?page.pageNo=${page.prePage}">上一页</a></c:if>
<c:if test="${!page.hasPre}"><span class=disabled >上一页</span></c:if>

<c:forEach var="number" items="${cssPageBar.linkNums}">
<c:if test="${number == -1}"><span class="disabled">...</span></c:if>
<c:if test="${number == page.pageNo}"><span class="current">${page.pageNo}</span></c:if>
<c:if test="${number != -1 && number != page.pageNo}"><a href="/jdonmvcdemo?page.pageNo=${number}"/>${number}</a></c:if>
</c:forEach>

<c:if test="${page.hasNext}"><a href="/jdonmvcdemo?page.pageNo=${page.nextPage}">下一页</a></c:if>
<c:if test="${!page.hasNext}"><span class=disabled >下一页</span></c:if>
</div>
 

用Velocity的代码如下

 

<div id="pagination" align="center" class="pagination">
$page.totalCount条记录,每页显示$page.pageSize条记录,一共$page.totalPages页:
#if($page.hasPre == true)<a href="/jdonmvcdemo?page.pageNo=$page.prePage">上一页</a>#end
#if($page.hasPre != true)<span class=disabled >上一页</span>#end

#foreach($number in $cssPageBar.linkNums)
#if($number == -1)<span class="disabled">...</span>#end
#if($number == $page.pageNo)<span class="current">$page.pageNo</span>#end
#if($number != -1 && $number != $page.pageNo)<a href="/jdonmvcdemo?page.pageNo=$number"/>$number</a>#end
#end

#if($page.hasNext == true)<a href="/jdonmvcdemo?page.pageNo=$page.nextPage">下一页</a>#end
#if($page.hasNext != true)<span class=disabled >下一页</span>#end
</div>

 

 

另外附上前端的CSS,你可以用你的想象力,或者找美工做这个样式,我们项目就是美工给我做

 

DIV.pagination {
padding:3px;
margin:3px;
font-size: 10px;
font-weight: bold;
font-family: Verdana;
}

DIV.pagination a {
padding: 2px 5px 2px 5px;
margin-right: 2px;
border: 1px solid #9aafe5;
text-decoration: none; 
color: #2e6ab1;
}
DIV.pagination a:hover, .pagination a:active {
border: 1px solid #dd6900;
color: #000;
background-color: lightyellow;
text-decoration: none;
}
DIV.pagination .current {
padding: 2px 5px 2px 5px;
margin-right: 2px;
border: 1px solid navy;
font-weight: bold;
background-color: #2e6ab1;
color: #FFF;
}
DIV.pagination .disabled {
padding: 2px 5px 2px 5px;
margin-right: 2px;
border: 1px solid #929292;
color: #929292;
}
 

我再Jdon也贴过代码,链接如下http://www.jdon.com/jivejdon/thread/36398

 

顺便提一下Jdon框架中的分页实现,Jdon框架有CQRS的味道,banq在查询端抽象了一个ModelListAction,用户继承这个类然后重写两个方法以提供数据,框架会在运行时先从缓存里读取数据,然后用一个分页标签显示分页条。

  • 大小: 5.1 KB
  • 大小: 5.4 KB
分享到:
评论

相关推荐

    jsp分页类 自己的写的

    jsp分页类 自己的写的 servletjsp分页类 自己的写的 servletjsp分页类 自己的写的 servletjsp分页类 自己的写的 servlet

    自己写的一个php的分页类

    标题中的"自己写的一个php的分页类"表明这是一个自定义的PHP类,用于实现数据库查询的分页功能。分页类通常包括计算页码、获取每页数据、显示导航链接等功能,以优雅地呈现数据库查询结果。 描述中提到的“select *...

    asp.net写的分页类

    本篇将深入探讨标题"asp.net写的分页类"所涉及的核心知识点,以及如何实现一个简单、高效的分页解决方案。 首先,我们需要理解ASP.NET分页的基本原理。在ASP.NET中,分页通常通过ADO.NET或Entity Framework等数据...

    自己写的C#分页类文件

    在这个场景中,"自己写的C#分页类文件"是作者为了实现数据分页功能而编写的自定义类。数据分页在大型数据集的展示中至关重要,因为它允许用户逐页浏览数据,提高用户体验并减轻服务器负载。 分页的基本概念是将大量...

    这是我个人写的一个分页类

    这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,

    自己写的PHP分页类

    自己写的PHP分页类,实现数据库查询分页。

    JAVA自己写的一个分页类 大家可以看看

    这里提到的"JAVA自己写的一个分页类"是一个自定义实现的分页解决方案,它包含一个辅助类、一个JSP页面、一个CSS文件以及作者编写的主类。下面我们将详细讨论这些知识点。 1. **分页类**:分页类通常包括以下几个...

    php pdo分页类

    php5推出的pdo统一数据接口,为了方便数据的分页写的pdo分页类。

    叶子asp分页类0.12

    名称: 叶子asp分页类 Name: ShowoPage(vbs class) RCSfile: ReadMe.txt Revision: 0.12.20051114.f Author: Yehe(叶子) Released: 2005-11-14 09:40:13 Descript: ASP分页类,支持access/mssql/mysql/sqlite ...

    我写的一个很详细的php分页类

    一个很详细的php分页类,非常方便,只用按注释输入参数就可以用了,非常简单方便,易用

    一个用PHP写的分页类

    用PHP实现了网站开发中常用的分页功能。并且实现了很好的封装哦!使用起来简单方便啦

    PHP分页类, 学习原理

    PHP分页类, 用PHP写的简单分页类, 具体描述原理.

    php面向对象分页类

    在分页类中,可能包含的属性有当前页数、总页数、每页显示条目数等;方法可能包括计算总页数、获取分页链接、跳转到指定页等。 下面是一个简单的PHP分页类的实现: ```php class Pagination { private $total_...

    struts写的分页

    当我们谈论“Struts写的分页”时,我们指的是在Struts框架下实现的分页功能,通常与Hibernate结合,以处理大量数据并提高Web应用程序的性能。 分页是一种常见的用户界面技术,用于将大量数据分割成较小、可管理的...

    mybatis 分页自己写的一个分页

    "mybatis 分页自己写的一个分页"这个项目正是针对这一需求,提供了一种自定义的分页解决方案。MyBatis作为一款轻量级的Java持久层框架,它允许开发者自由地编写SQL语句,同时也支持自定义分页策略。 在传统的物理...

    PHP完美分页类

    自己写的分页类,功能完整。可以自定义页面结构样式

    ci_分页类_pages

    **CI 分页类详解** 在CI(CodeIgniter)框架中,分页类是一个非常实用的工具,它帮助开发者在处理大量数据时实现高效的页面导航。CI 分页类提供了便捷的方式来分割查询结果,并且可以轻松地自定义样式,使得用户在...

    MFC分页控件/分页读取/分页写文件

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的分页控件、分页读取和分页写文件的概念,以及如何在实际应用中实现这些功能。MFC是微软提供的一套C++库,用于简化Windows应用程序的开发,它包含了...

    牛人写的分页程序 分页标签

    标题提到的“牛人写的分页程序,分页标签”很可能是指一个高效且易用的分页解决方案,可能是基于Java开发的,特别是利用了自定义标签(Custom Tags)这一特性。 Java自定义标签(Custom Tags)是JSP(JavaServer ...

    自己写的分页组件

    标题中的“自己写的分页组件”表明我们即将讨论的是一个自定义实现的用于数据分页的软件组件。在Web开发中,分页是常见的功能,它允许用户按页浏览大量数据,提高用户体验并减轻服务器负载。这个组件可能是用Java...

Global site tag (gtag.js) - Google Analytics