- 浏览: 40764 次
- 性别:
文章分类
最新评论
-
sunheavenvan:
我觉得不存在提炼出有所谓的本质,提炼的目的是获取较为准确的心智 ...
Jdon007四象图坐标表示 -
yangyi:
好像没有提及Seam给测试和OO设计上带来的便宜,不好意思,还 ...
Seam生命周期 -
buptwhisper:
性能一直是个问题
Seam生命周期 -
sulong:
oojdon 写道如果大家站在Gavin King的角度,包括 ...
Seam生命周期 -
may_cauc:
扬长避短吧,任何一种技术的出现都有其初衷。不要轻易否定,在否定 ...
Seam生命周期
分页,以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,用户继承这个类然后重写两个方法以提供数据,框架会在运行时先从缓存里读取数据,然后用一个分页标签显示分页条。
发表评论
-
Java 嵌套类(Nested Classes)
2011-09-06 00:08 212官方定义: A class defined within a ... -
Java Primitive Types
2011-08-24 13:10 1039Introduction Not everythi ... -
性能遭遇可伸缩性 多线程
2011-02-26 16:34 1070记住一句名言:出 ... -
并发编程的JAVA抽象
2011-02-26 11:14 938各种程序员都工作在各自的程序抽象维度,如果我们发现解 ... -
高级数据结构
2011-02-14 22:10 128关于高级数据结构的一个英文文档 -
Actor并发
2011-02-14 22:07 78基于Action并发模型相关英文文档 -
The Problem with Threads
2011-02-14 22:04 51线程存在的问题 -
Akka
2011-02-14 22:00 79Akka框架的PPT介绍 -
Software Transactional Memory
2011-02-14 21:57 43软件事务内存相关的英文文档 -
Abstract Queued Synchronizer
2011-02-14 21:55 48The java.util.concurrent Synchr ... -
Seam的事务管理
2011-02-12 20:16 1209分析Seam的事务管理之前 ... -
Seam生命周期
2011-02-12 19:38 1931Seam,Gavin King发明的JavaEE框架,Gavi ... -
Java.util.concurrent 包
2011-02-11 12:49 237java.util.concurrent这个包是在jdk1.5 ... -
正则表达式
2011-02-11 00:32 678用一张图片来概括一下正则表达式的各个元素 例如锚点,量词,捕 ... -
JMM和Happen Before
2011-02-11 00:20 1102线程是操作系统的最小调度单位,也是执行单位,为了追求高性 ... -
借形解数
2011-02-10 23:51 280看到论坛上有一个余弦定理的威力的帖子,所以也有此感想,所以作一 ... -
各种排序算法之Java实现
2011-02-10 21:55 125排序算法有一个基本的 ... -
算法之数学
2011-02-10 21:33 626算法的分析是我们计算 ... -
再读数据结构教材的绪论
2011-02-10 12:45 149泡BBS,争论,纠结,顿悟,糊涂等,这些感受应该很多人都有过, ... -
类加载器
2011-02-09 20:49 863Java是程序设计语言 java也是一个shell命令,我们 ...
相关推荐
jsp分页类 自己的写的 servletjsp分页类 自己的写的 servletjsp分页类 自己的写的 servletjsp分页类 自己的写的 servlet
标题中的"自己写的一个php的分页类"表明这是一个自定义的PHP类,用于实现数据库查询的分页功能。分页类通常包括计算页码、获取每页数据、显示导航链接等功能,以优雅地呈现数据库查询结果。 描述中提到的“select *...
本篇将深入探讨标题"asp.net写的分页类"所涉及的核心知识点,以及如何实现一个简单、高效的分页解决方案。 首先,我们需要理解ASP.NET分页的基本原理。在ASP.NET中,分页通常通过ADO.NET或Entity Framework等数据...
在这个场景中,"自己写的C#分页类文件"是作者为了实现数据分页功能而编写的自定义类。数据分页在大型数据集的展示中至关重要,因为它允许用户逐页浏览数据,提高用户体验并减轻服务器负载。 分页的基本概念是将大量...
这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,这是我人做的一个分页类,
自己写的PHP分页类,实现数据库查询分页。
这里提到的"JAVA自己写的一个分页类"是一个自定义实现的分页解决方案,它包含一个辅助类、一个JSP页面、一个CSS文件以及作者编写的主类。下面我们将详细讨论这些知识点。 1. **分页类**:分页类通常包括以下几个...
php5推出的pdo统一数据接口,为了方便数据的分页写的pdo分页类。
名称: 叶子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 class Pagination { private $total_...
当我们谈论“Struts写的分页”时,我们指的是在Struts框架下实现的分页功能,通常与Hibernate结合,以处理大量数据并提高Web应用程序的性能。 分页是一种常见的用户界面技术,用于将大量数据分割成较小、可管理的...
"mybatis 分页自己写的一个分页"这个项目正是针对这一需求,提供了一种自定义的分页解决方案。MyBatis作为一款轻量级的Java持久层框架,它允许开发者自由地编写SQL语句,同时也支持自定义分页策略。 在传统的物理...
自己写的分页类,功能完整。可以自定义页面结构样式
**CI 分页类详解** 在CI(CodeIgniter)框架中,分页类是一个非常实用的工具,它帮助开发者在处理大量数据时实现高效的页面导航。CI 分页类提供了便捷的方式来分割查询结果,并且可以轻松地自定义样式,使得用户在...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的分页控件、分页读取和分页写文件的概念,以及如何在实际应用中实现这些功能。MFC是微软提供的一套C++库,用于简化Windows应用程序的开发,它包含了...
标题提到的“牛人写的分页程序,分页标签”很可能是指一个高效且易用的分页解决方案,可能是基于Java开发的,特别是利用了自定义标签(Custom Tags)这一特性。 Java自定义标签(Custom Tags)是JSP(JavaServer ...
标题中的“自己写的分页组件”表明我们即将讨论的是一个自定义实现的用于数据分页的软件组件。在Web开发中,分页是常见的功能,它允许用户按页浏览大量数据,提高用户体验并减轻服务器负载。这个组件可能是用Java...