[背景] 最近学习Spring MVC,涉及到分页显示的问题,准备自己整理一个分页工具。由于以前使用Strus框架使用 NewPandaKing 的一个PageBean和Page方法,耦合性比较高,于是优化一下。
[优点] 耦合低,使用方便。
[缺点] 由于耦合低,不查数据库,所以每次使用List的sublist方法,效率降低。
代码如下:
分页工具类:PageUtil.java
/** * Java 分页工具类 */ package com.util; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author neuhxy * @version 2015-4-23 15:25:21 * */ public class PageUtil { private int page = 1; // 当前页 public int total = 0; // 总页数 private int size = 10; // 每页10条数据 private int totalRows = 0; // 总数据数 private int pageStartRow = 0;// 每页的起始数 private int pageEndRow = 0; // 每页显示数据的终止数 private boolean hasNextPage = false; // 是否有下一页 private boolean hasPreviousPage = false; // 是否有前一页 private List<?> list; // 分页组件包含的集合 private List<?> show; // 分页中需要显示的List private String action; // 设置跳转URL private String method = "GET"; // 使用POST或者GET请求 @SuppressWarnings("unused") private String code1; // 分页组件的现实代码 @SuppressWarnings("unused") private String code2; // 分页组件的现实代码 private Map<String, Object> map = new HashMap<String, Object>(); // 隐含条件 public int[] sizeArray = { 10, 20, 50, 100, 1000, 10000 }; //默认构造函数 public PageUtil () {} /** * @param list * @param size */ public PageUtil(List<?> list, int size) { this.size = size; this.list = list; totalRows = list.size(); hasPreviousPage = false; if ((totalRows % size) == 0) { total = totalRows / size; } else { total = totalRows / size + 1; } if (page >= total) { hasNextPage = false; } else { hasNextPage = true; } if (totalRows < size) { this.pageStartRow = 0; this.pageEndRow = totalRows; } else { this.pageStartRow = 0; this.pageEndRow = size; } } // 第一种样式 <ul> / <li> 格式 public String getCode1() { StringBuffer sb = new StringBuffer(); sb.append("<form action=\"" + getAction() + "\" method=\"" + getMethod() + "\">"); sb.append("<ul class=\"pagination text-center\">"); // 判断是否有上一页 if (this.isHasPreviousPage()) { sb.append("<li class=\"disabled\"><a href=\"#\">«</a></li>"); } else { sb.append("<li class=\"disabled\"><a href=\"#\">«</a></li>"); } // 中间显示 for (int i = 1; i <= this.getTotal(); i++) { String spanClzz = "<li><a href=\"" + getAction() + "?page=" + i + "\"> " + i + " <span class=\"sr-only\">(current)</span></a></li>"; if (this.page == i) { spanClzz = "<li class=\"active\"><a href=\"#\">" + i + " <span class=\"sr-only\">(current)</span></a></li>"; } sb.append(spanClzz); // 当大于9页数的时候才进行分页显示 if (this.getTotal() - 2 > 7) { if (i == 5) { i = this.getTotal() - 2; sb.append("<li><a href=\"#\"> ... <span class=\"sr-only\">(current)</span></a></li>"); } } } // 判断是否有下一页 if (this.isHasNextPage()) { sb.append("<li><a href=\"#\">»</a></li>"); } else { sb.append("<li class=\"disabled\"><a href=\"#\">»</a></li>"); } sb.append("</ul></form>"); return sb.toString(); } // 第二种分页样式 <a> 带分页现实多少条记录设置 public String getCode2() { StringBuffer sb = new StringBuffer(); String code = "<div class=\"pager clearfix text-center\">"; String scripts = "<script> " + "function subPage(p){" + "document.pageForm.elements['page'].value = p;" + "document.pageForm.submit();" + "} " + " function subPageSize(pageSize){ " + " document.pageForm.submit();" + "}</script>"; setMethod("POST"); code += "<form name=\"pageForm\" action=\"" + getAction() + "\" method=\"" + getMethod() + "\">"; String hidden = "<input type=\"hidden\" name=\"page\" value=\"" + page + "\">"; if (!map.isEmpty()) { for (String key : map.keySet()) { System.out.println("key= " + key + " and value= " + map.get(key)); hidden += "<input type=\"hidden\" name=\"" + key + "\" value=\"" + map.get(key) + "\" />"; } } code += hidden; code += scripts; // 底面样式 首页 上一页 if (this.getPage() != 1) { code += "<a href=\"javascript:subPage(1)\">首页</a> " + "<a href=\"javascript:subPage(" + (this.getPage() - 1) + ")\">上一页</a> "; } // 跳第几页 code += "第<select style=\"width:60px;\" onchange=\"javascript:subPage(this.value)\" class=\"numbox\">"; for (int i = 1; i <= this.getTotal(); i++) { if (i == this.getPage()) { code += "<option value=" + i + " selected='selected'>" + i + "</option>"; } else { code += "<option value=" + i + ">" + i + "</option>"; } } code += "</select>页,共" + this.getTotal() + "页 "; // 每页显示几个记录 code += "每页显示<select style=\"width:60px;\" name=\"size\" onchange=\"javascript:subPageSize(this.value)\" class=\"numbox\">"; for (int j = 0; j < sizeArray.length; j++) { if (sizeArray[j] == this.getSize()) { code += "<option value=" + sizeArray[j] + " selected='selected'>" + sizeArray[j] + "</option>"; } else { code += "<option value=" + sizeArray[j] + ">" + sizeArray[j] + "</option>"; } } code += "</select>条记录"; // 下一页 尾页 if (this.getPage() != this.getTotal()) { code += "<a href=\"javascript:subPage(" + (this.getPage() + 1) + ")\">下一页</a> " + "<a href=\"javascript:subPage(" + this.getTotal() + ")\">尾页</a>"; } code += "</div>"; sb.append(code); sb.append("</form>"); return sb.toString(); } // 判断要不要分页 public boolean isNext() { return list.size() > 5; } public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; } // 获取下一个内容 public List<?> getNextPage() { page = page + 1; disposePage(); return getShow(page); } // 处理分页 private void disposePage() { if (page == 0) { page = 1; } if ((page - 1) > 0) { hasPreviousPage = true; } else { hasPreviousPage = false; } if (page >= total) { hasNextPage = false; } else { hasNextPage = true; } } // 获取上一页内容 public List<?> getPreviousPage() { page = page - 1; if ((page - 1) > 0) { hasPreviousPage = true; } else { hasPreviousPage = false; } if (page >= total) { hasNextPage = false; } else { hasNextPage = true; } return getShow(page); } public List<?> getShow() { return show; } // 获取第 n 页内容 public List<?> getShow(int page) { if (page == 0) { this.setPage(1); page = 1; } else { this.setPage(page); } this.disposePage(); if (page * size < totalRows) {// 判断是否为最后一页 pageEndRow = page * size; pageStartRow = pageEndRow - size; } else { pageEndRow = totalRows; pageStartRow = size * (total - 1); } List<?> show = null; if (!list.isEmpty()) { show = list.subList(pageStartRow, pageEndRow); } return show; } // 获取第一页内容 public List<?> getFistPage() { if (this.isNext()) { return list.subList(0, size); } else { return list; } } //部分get set 方法自动补全即可 }
Spring-MVC Controller部分: UserController.java
@RequestMapping("view_user") public String view_user(PageUtil p, HttpServletRequest request) { //……仅提供部分关键代码 //分页组件用法:首先获取所有List List<User> users = userService.getUserList(); PageUtil pu = new PageUtil(users, p.getSize()); pu.setShow(pu.getShow(p.getPage())); //告诉分页跳转URL, 对应这个方法本身的路径 pu.setAction("../user/view_user"); request.setAttribute("pu", pu); return "admin/view_user"; }
在页面上显示部分:view_user.jsp
<c:if test="${!empty pu.show}"> <c:forEach items="${pu.show}" var="item"> <td>${item.id }</td> <!--显示具体内容--> </c:forEach> </c:if> <!-- 以下两种方式任选其一 --> <!--显示分页代码1 使用Bootstrap 库样式 需要额外引入bootstrap.css --> ${pu.code1} <!--显示分页代码1, 使用默认样式, 功能全 --> ${pu.code2}
参考资料:
[1] http://www.cnblogs.com/wenqiangwu/archive/2013/01/21/page_util.html
相关推荐
本代码是javaWeb中SSH框架,特别是struts中涉及到前后台对分页功能的实现,希望对您有帮助!
java web通用分页组件发布了! 超级强悍的java web通用分页组件,只要简单的一条sql语句就可以轻松的实现分页,目前对oracle,SQL Server2005,SQL server200,mysql都做了实现,程序通过接口来封装,你可以实现对其他...
本文通过使用场景分析给大家介绍了Java Web中常用的分页组件(Java端实现),非常不错,具有参考借鉴价值,需要的朋友参考下吧
Ajax分页组件--web-java,美观通用
在Java Web 技术中初学者一般会采用SQL 语句分页技术,并在这个基础的之上编写分页组件,页面传参数控制层(Servlet 或Action)调用分页组件的办法,往往会感觉非常麻烦。其实在实际开发中我们可采用一些第三方的...
java进行分页所用的分页组件工具类 使用方法: 第一步:将util文件夹复制到项目 的SRC文件下面 第二步:将mypage.tld文件复制到web-inf文件夹下面 第三步:打开需要分页的页面,在page指令下方添加导入标签库的代码...
java web应用分页组件,可适用于jsp+servlet或s2sh,配置非常简单,引入二行代码即可,内置详细的操作配置文档和jar包及实例文件,未考虑性能优化,对性能要求很高的高手请自行测试或绕行
V512工作室Java web的ppt 第1章 讲解本书中所使用的Java Web开发工具Eclipse 3.3、MyEclipse 6.0和Tomcat6的安装、配置和使用。 第2章 介绍Servlet技术的发展起源,还介绍了Web编程中需要了解的其他相关技术,例如...
《教育部实用型信息技术人才培养...第3篇Java Web技术应用分为5章,介绍具体场景下的应用案例,包括注册登录模块的应用、分页技术的实现、Java Mail的应用、jspSmartUpload上传下载组件的应用、保护受限制访问的资源。
1)该分页组件不依赖任何底层数据库实现,可以根据需要扩展子类进行动态替换;2)同时也不提供页面如何显示上页,下页等;内部提供了源代码实现,以及DEMO应用,实现分页非常简单; 需要做的工作有三个地方 ...
是java26通里边web开发的部分。代码就不发了。文档中都有。照着敲吧!!搬来饿代码不是自己的。 第19天 WEB开发环境搭建 |-第1节 WEB发展史 |-第2节 使用Tomcat搭建WEB开发环境 |-第3节 MyEclipse中配置Tomcat ...
SSH(Spring+Struts+Hibernate)轻量级论坛Forum演示系统(Java Web Edition): Spring+Struts+Hibernate框架、Pagination分页组件、JQuery、JSON、Ajax、DIV+CSS、JavaScript、HTML5。另建议使用相当于IE8.0以上的...
SSH(Spring+Struts+Hibernate)轻量级购物软件Shopping演示系统(Java Web Edition)技术要点:Spring+Struts+Hibernate三大框架整合,Jquery-treeview、DIV+CSS3、HTML5、JavaScript、分页组件pagination、MySQL。
针对Web 数据库系统中的数据分页问题,提出一种基于模型-视图-控制器(MVC)模式的三层分页组件。在数据层中引入Java 持久化API 和Spring 技术,在业务逻辑层中引入泛型DAO 模式和桥接模式,在显示层中引入JSP 和...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
1.1 java web应用概述 1.2 配置开发环境 1.3 基础技术简单简介 1.4 核心框架初步认识 1.5 小结 第2章 myedipse开发工具对各种框架的支持 2.1 使用jsp的两种模式 2.2 struts框架的实现 2.3...
Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...
分页技术: JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100页;好处:利于页面布局,且显示的效率高!... jsp+Servlet+c3p0+mySql+DbUtils组件+3层结构(web层+service层+dao层)
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...
GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...