[背景] 最近学习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
相关推荐
Java分页组件是一种在开发Java Web应用程序时非常实用的工具,它可以帮助开发者高效地处理大量数据的展示,尤其是在用户需要浏览或操作大量记录时。在Web应用中,通常不建议一次性加载所有数据到客户端,因为这可能...
Java的分页组件是Java开发中的重要工具,主要用于处理大数据量的展示问题,避免一次性加载所有数据导致内存压力过大和用户界面响应缓慢。在Web应用中,尤其在数据查询、报表展示等场景,分页是必不可少的功能。Java...
这个"java分页组件和poolman demo"的学习和研究,可以帮助Java开发者更好地理解和运用数据库分页以及连接池技术,提升项目性能和稳定性,尤其对于处理大数据量的Web应用来说,具有很高的实用价值。
总的来说,理解并掌握Struts中的分页机制对于Java Web开发者来说至关重要,这不仅可以提升应用的用户体验,还能有效提高服务器的运行效率。通过阅读`javaweb分页.txt`文件,您可以更深入地学习和理解这个主题。
Java 分页组件是Java开发中常见的一种工具,用于在Web应用程序中实现数据的分页显示。在大型系统中,由于数据量庞大,一次性加载所有数据不仅会影响页面加载速度,也会消耗大量的服务器资源。因此,分页技术应运而生...
综上所述,这个分页组件是Java Web开发中一个实用的工具,它将分页的复杂逻辑封装起来,使开发者能更专注于业务逻辑,同时提供了良好的用户体验。文件"fenyeExam_01"可能是该项目的一个示例或源代码包,用于演示如何...
java web通用分页组件发布了! 超级强悍的java web通用分页组件,只要简单的一条sql语句就可以轻松的实现分页,目前对oracle,SQL Server2005,SQL server200,mysql都做了实现,程序通过接口来封装,你可以实现对其他...
总之,这个Java通用分页组件通过提供便捷的API和对Struts及JSP的良好支持,简化了Web应用中的数据分页处理,提高了代码的可复用性和可维护性。开发者只需要按照规定的步骤进行配置和调用,即可实现高效、易用的分页...
通过封装分页组件,我们可以将这些复杂逻辑模块化,便于在不同的项目中复用,从而提升开发质量和效率。这个DEMO正是为了帮助开发者理解并实践这一过程,无论你是初学者还是经验丰富的开发者,都能从中受益。
在JAVA Web开发中,分页功能是常见...总的来说,JAVA Web分页实例代码提供了实际操作的参考,有助于开发者掌握分页的实现原理,提升开发效率。通过学习和实践这个例子,你可以更好地理解如何在实际项目中应用分页技术。
"最好最好的java万能分页标签"可能是一个开源的Java分页组件,它的特点是简单易用。只需要导入对应的Jar包,然后在代码的五个关键位置进行配置,即可快速实现分页功能。这五个位置可能包括: 1. **配置文件**:在...
JSP的自定义标签库,如Struts2的displaytag或Spring MVC的spring-tag,提供了方便的分页组件。例如,displaytag是一个功能强大的开源分页和排序库,它可以轻松地在JSP页面上展示表格,并提供分页和排序功能。要使用...
【Java Web分页项目】是基于Java和JSP技术实现的一个Web应用程序,主要目标是解决在Web应用中处理大量数据时的效率问题。在数据库驱动的Web应用中,一次性加载所有数据可能导致页面加载慢,用户体验下降,甚至服务器...
Java Web分页管理器是一种用于处理大量数据分页显示的技术,尤其在与微软数据库如SQL Server配合使用时,能够高效地提升用户体验。在Web应用程序中,分页是必不可少的功能,尤其是在展示诸如用户列表、订单历史或者...
Java Web中常用的分页组件(Java端实现) Java Web中常用的分页组件是指在Java Web应用程序中使用的分页查询组件。分页查询是指在Web程序中将大量数据分割成多个页面,以便用户更方便地浏览和操作数据。Java端实现...
JSF分页组件2是构建高效、用户友好的Web应用的关键工具。通过理解其工作原理,结合现有的库或自定义组件,我们可以为用户提供更好的数据浏览体验。在实际项目中,结合性能优化策略,确保分页组件不仅功能完善,而且...
`templatepaginationmodule.jsp`文件可能是一个JSP(Java Server Pages)模板,用于在网页上呈现分页组件。JSP是Java的一种动态网页技术,它允许将Java代码嵌入HTML或XML文档中,以便在服务器端处理数据并返回给...
Java Web分页技术是Web应用程序中常用的一种数据展示方式,它允许用户逐步浏览大量的数据集合,而不会一次性加载所有数据,从而提高页面加载速度和用户体验。Struts2作为一款流行的MVC框架,提供了实现分页功能的...
在Java开发中,分页是数据展示不可或缺的一部分,特别是在处理大量数据时,为了提高用户体验和系统性能,分页组件显得尤为重要。"改进后的Java分页组件"是一个优化过的解决方案,旨在简化开发流程,提高代码的可读性...
在Web应用开发中,由于一次性加载所有数据可能会导致性能问题,因此分页组件是必不可少的。这类组件能帮助开发者高效地管理数据库查询,只加载用户当前需要查看的数据部分。 在描述中提到的“NULL 博文链接:...