`

PaginationSupport加强版的分页代码

阅读更多
PaginationSupport.java,这个类网上有,我把它加强了一下,看下面
import java.util.ArrayList;
import java.util.List;

public class PaginationSupport {
	public static int PAGESIZE = 10;

	private int pageSize = PAGESIZE;

	private List items;

	private int totalCount;

	private int[] indexes = new int[0];

	private int startIndex = 0;
	
	private int lastStartIndex;
	
	public PaginationSupport(){
	}

	public PaginationSupport(List items, int totalCount) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(0);
	}

	public PaginationSupport(List items, int totalCount, int startIndex) {
		setPageSize(PAGESIZE);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);
	}

	public PaginationSupport(List items, int totalCount, int pageSize,
			int startIndex) {
		setPageSize(pageSize);
		setTotalCount(totalCount);
		setItems(items);
		setStartIndex(startIndex);
	}

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}

	public int getPageSize() {
		return pageSize;
	}

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

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		if (totalCount > 0) {
			this.totalCount = totalCount;
			int count = totalCount / pageSize;
			if (totalCount % pageSize > 0)
				count++;
			indexes = new int[count];
			for (int i = 0; i < count; i++) {
				indexes[i] = pageSize * i;
			}
		} else {
			this.totalCount = 0;
		}
	}

	public int[] getIndexes() {
		return indexes;
	}

	public void setIndexes(int[] indexes) {
		this.indexes = indexes;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		if (totalCount <= 0)
			this.startIndex = 0;
		else if (startIndex >= totalCount)
			this.startIndex = indexes[indexes.length - 1];
		else if (startIndex < 0)
			this.startIndex = 0;
		else {
			this.startIndex = indexes[startIndex / pageSize];
		}
	}

	public int getNextIndex() {
		int nextIndex = getStartIndex() + pageSize;
		if (nextIndex >= totalCount)
			return getStartIndex();
		else
			return nextIndex;
	}

	public int getPreviousIndex() {
		int previousIndex = getStartIndex() - pageSize;
		if (previousIndex < 0)
			return 0;
		else
			return previousIndex;
	}
	
	public int getLastIndex(){
		int[] indexes = this.getIndexes();
		if(indexes != null && indexes.length >0){
			lastStartIndex = indexes[indexes.length-1];
		}
		return lastStartIndex;
		
	}
	
//	一共多少页
	public int getPages(){
		if(getTotalCount()%pageSize==0){
			return getTotalCount()/pageSize;
		}
		return (getTotalCount()/pageSize)+1;
	}
	//当前第几页
	public int getCurrentPage(){
		return (getStartIndex()/pageSize)+1;
	}
	
//感谢dengyin2000提供如下算法
	/**
	 * 记录显示的页码组
	 * @param totalPages
	 * @param currentPage
	 * @return
	 */
	public ArrayList<Integer> page(int totalPages, int currentPage) {  
		int adjacents = 3;//这个参数可以调ArrayList的长度,试试就知道了
		ArrayList<Integer> result = new ArrayList<Integer>();  
		if (totalPages < (5 + (adjacents * 2))){ // not enough links to make it worth breaking up  
		    writeNumberedLinks(1, totalPages, result);  
		    }else{
			  if ((totalPages - (adjacents * 2) > currentPage) && (currentPage > (adjacents * 2))){ // in the middle  
				  writeNumberedLinks(1, 1, result);  
				  writeElipsis(result);  
				  writeNumberedLinks(currentPage - adjacents - 1, currentPage + adjacents, result);  
				  writeElipsis(result);  
				  writeNumberedLinks(totalPages, totalPages, result);  
			  }else if (currentPage < (totalPages / 2)){
				  writeNumberedLinks(1, 3 + (adjacents * 2), result);  
				  writeElipsis(result);  
				  writeNumberedLinks(totalPages, totalPages, result);  
			  }else{ // at the end  
		            writeNumberedLinks(1, 1, result);  
		            writeElipsis(result);  
		            writeNumberedLinks(totalPages - (2 + (adjacents * 2)), totalPages, result);  
			      }  
			  }  
		 return result;  
	}  
		  
	  /** 
	  * @param result  
	  *  
	  */  
	  private void writeElipsis(ArrayList<Integer> result) {  
		  result.add(-1);//-1是用来打点的
	  }
		   
	  /** 
	  * @param i 
	  * @param lastIndex 
	  * @param result  
	  */  
	private void writeNumberedLinks(int i, int lastIndex, ArrayList<Integer> result) {  
		for (int d=i; d <= lastIndex; d++) {  
		  result.add(d);  
		}
	}    

}

在jsp中的用法:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
 <html:hidden property="startIndex"/>
<table width="100%" border="0" cellpadding="2" cellspacing="0" bordercolor="#4DB0E7" class="TableMain">
  <tr bgcolor="#FFFFFF">
    <td width="17%">总记录 ${ requestScope.pagination.totalCount } 条 
   	<input title="首页" class="menuList" name="1" type="submit" onClick="this.document.forms[0].startIndex.value='0';" value="首  页">
   	<input title="上一页" class="menuList" name="1" type="submit" onClick="this.document.forms[0].startIndex.value=${ requestScope.pagination.previousIndex };" value="上一页">
   	<c:forEach var="i" items="${requestScope.pages}">
   		<c:choose>
   			<c:when test="${i==-1}" >
   				...
   			</c:when>
   			<c:when test="${i==requestScope.pagination.currentPage}" >
   				<a href="userManage.portal?action=listUser&page=${ i }"  target="mainFrame" style="color:red;">${ i }</a>
   			</c:when>
   			<c:otherwise>
   				<a href="userManage.portal?action=listUser&page=${ i }"  target="mainFrame" >${ i }</a>
   			</c:otherwise>
   		</c:choose>
   	</c:forEach>
   	<input title="下一页" class="menuList" name="1" type="submit" onClick="this.document.forms[0].startIndex.value=${ requestScope.pagination.nextIndex };" value="下一页">
   	<input title="尾页" class="menuList" name="1" type="submit" onClick="this.document.forms[0].startIndex.value=${ requestScope.pagination.lastIndex };" value="尾页">
   	共有${ requestScope.pagination.pages }页,当前是第${ requestScope.pagination.currentPage }页
    </td>
  </tr>
</table>


上面的首页,上一页,下一页,尾页我使用了submit提交,其实也可以用<a href="...">
只是我一开始做的时候只有首页,上一页,下一页,尾页四个button,没有考虑中间的1,2,3,4,5,6....所以有些混乱,勉强看吧。
下面的是在action中用法:
String action=request.getParameter("action");
if("listUser".equals(action)){
String page=request.getParameter("page");			
	if(page!=null){
		int p=Integer.parseInt(page);
		form.setStartIndex((p-1)*Constant.PAGESIZE);//p总是从1开始,但记录从0开始,所以p-1
	}
	PaginationSupport pagination=this.getBaseService().findPageByCriteria(detachedCriteria, Constant.PAGESIZE, form.getStartIndex());//该方法网上有,查一下
	List list = pagination.getItems();
	request.setAttribute("list", list);
	request.setAttribute("pagination", pagination);
	request.setAttribute("pages", pagination.page(pagination.getPages(), pagination.getCurrentPage()));
	return mapping.findForward("listUser");
}

这里要传递的是startIndex的值,所以form中需要定义int startIndex的getter,setter

这个分页我个人认为比较好了,代码比较优美。
类似如下效果:
总记录 108 条 首页 上一页  1 2 3 4 5 ...10 下一页 尾页   共有10页,当前是第1页
分享到:
评论

相关推荐

    分页代码 分页代码 分页代码

    分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码分页代码...

    PHP内容分页.新闻内容分页代码,分页代码

    PHP内容分页,新闻内容分页代码,分页代码

    分页代码 重分页代码

    在这个场景中,"分页代码 重分页代码" 指的是在SSH框架下实现分页功能的代码,并且强调了代码的复用性,即在一个工程中只需要一个公共的分页类。 分页的目的是为了提高用户体验,避免一次性加载大量数据导致页面...

    js分页代码,分页代码

    除了基本的分页功能外,还可以考虑增加以下功能来增强用户体验: - **自动跳转到指定页**:根据URL中的参数自动跳转到相应的页码。 - **加载更多按钮**:通过滚动到底部触发加载更多内容,而非传统的翻页方式。 - **...

    PHP的分页源代码 分页代码

    在提供的代码片段中并未看到具体的分页导航实现,但在实际应用中,这部分是非常重要的,它允许用户通过点击不同的页码来查看不同的数据。 #### 四、代码优化建议 1. **安全性考虑**:使用`mysql_*`函数存在安全...

    JS+HTML分页代码

    本示例提供的"JS+HTML分页代码"是一个利用JavaScript(JS)和超文本标记语言(HTML)实现的分页功能,主要包含了首页、前页、后页、尾页以及自定义分页页号的功能。 **HTML基础**: HTML是网页的基础,用于构建页面...

    asp论坛分页数字分页代码

    这个"asp论坛分页数字分页代码"是一个实用的小工具,可以帮助开发者快速实现论坛内容的分页显示。 首先,我们来理解一下分页的基本概念。分页是将大量数据分割成若干小块,每次只显示一部分,用户可以通过点击页码...

    非常实用ASP通用分页代码

    ASP通用分页代码是网页开发中的一个重要组成部分,特别是在处理大量数据需要分页显示的场景下。这个代码模块的目的是为了提高开发效率,实现代码的复用,并确保用户在浏览多页内容时能轻松导航。以下将详细介绍这个...

    请求加分页代码

    请求加分页代码

    经典的10种JS分页代码

    这篇内容将详细介绍10种经典的JS分页代码实现方法,帮助开发者理解和应用这些技术。 1. **基础HTML和CSS分页**:最简单的分页实现,通常结合HTML链接和CSS样式来创建分页条目。开发者需要计算总页数,然后创建相应...

    java万能分页代码

    Java万能分页代码是Java开发中常用的工具,尤其在处理大数据量的Web应用时,分页技术能够显著提升用户体验并优化服务器性能。这个3.0版本的分页代码库通常包含了一些经过优化的分页算法和接口,适用于各种场景,如...

    asp.net AJAX分页 分页代码

    本教程将深入探讨ASP.NET AJAX分页的相关知识点,以及如何编写分页代码。 1. **什么是ASP.NET AJAX分页?** ASP.NET AJAX分页是一种通过使用ASP.NET AJAX库(以前称为Atlas)实现的客户端分页方法。它利用...

    非常优秀的Java分页代码

    本资源提供了一套非常优秀的Java分页代码,它旨在简化开发过程,使得开发者能够轻松地在应用程序中实现分页功能。 分页的基本原理是将大量的数据集分割成较小的部分,每次只加载一部分数据到内存中,用户可以逐页...

    纯JS长文章分页代码

    ### 纯JS长文章分页代码解析 在网页开发中,为了提高用户体验及加载速度,经常需要将过长的文章内容进行分页处理。本文基于提供的文件内容,深入解析一个用纯JavaScript实现的文章分页代码。 #### 核心概念与功能 ...

    asp数字分页代码

    ### ASP数字分页代码解析与应用 #### 一、引言 在Web开发中,当数据量较大时,为了提高用户体验并减轻服务器负担,通常会采用分页技术来展示数据。ASP(Active Server Pages)是一种早期的服务器端脚本环境,可以...

    java分页代码下载

    根据提供的文件信息,我们可以分析出该段代码是用于实现基于Java技术的Web应用程序中的分页功能。虽然这里的代码示例采用的是ASP.NET的语法结构,但我们可以从中抽取出与Java分页相关的概念和技术要点,并结合Java...

    仿百度分页代码 谷歌分页代码

    标题与描述中的“仿百度分页代码 谷歌分页代码”主要涉及的是网站开发中常见的分页功能实现。在大数据量的处理场景下,为了提升用户体验和服务器性能,分页显示数据成为了一种常见且必要的技术手段。本文将详细解析...

    ASP.NET分页代码

    在这个“ASP.NET分页代码”的主题中,我们将深入探讨如何在ASP.NET中实现分页功能。 1. 分页的基本原理 分页主要是通过限制在页面上显示的数据量来实现的。当用户请求一个页面时,服务器只返回当前页所需的数据,而...

    24款超实用的WEB分页代码

    本文将深入探讨24款超实用的WEB分页代码,这些代码可以帮助开发者快速实现高效、美观的分页功能。 1. 分页的基本原理:分页主要是通过JavaScript、CSS和HTML三者结合来实现的。JavaScript处理数据逻辑,CSS负责样式...

    asp分页代码,通用代码

    本文将深入讲解ASP分页通用代码的工作原理和使用方法,以及如何通过提供的`function.asp`和`调用实例.txt`文件进行实际应用。 首先,我们要理解分页的基本概念。分页是将一个大列表的数据分割成多个小部分,每次只...

Global site tag (gtag.js) - Google Analytics