`
neuhxy
  • 浏览: 7149 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Java web 分页组件

阅读更多

[背景] 最近学习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  

 

 

0
0
分享到:
评论

相关推荐

    java分页组件(直接复用,简单方便)

    Java分页组件是一种在开发Java Web应用程序时非常实用的工具,它可以帮助开发者高效地处理大量数据的展示,尤其是在用户需要浏览或操作大量记录时。在Web应用中,通常不建议一次性加载所有数据到客户端,因为这可能...

    java的分页组件

    Java的分页组件是Java开发中的重要工具,主要用于处理大数据量的展示问题,避免一次性加载所有数据导致内存压力过大和用户界面响应缓慢。在Web应用中,尤其在数据查询、报表展示等场景,分页是必不可少的功能。Java...

    java分页组件和poolman demo

    这个"java分页组件和poolman demo"的学习和研究,可以帮助Java开发者更好地理解和运用数据库分页以及连接池技术,提升项目性能和稳定性,尤其对于处理大数据量的Web应用来说,具有很高的实用价值。

    java web中的struts分页组件

    总的来说,理解并掌握Struts中的分页机制对于Java Web开发者来说至关重要,这不仅可以提升应用的用户体验,还能有效提高服务器的运行效率。通过阅读`javaweb分页.txt`文件,您可以更深入地学习和理解这个主题。

    java 分页组件

    Java 分页组件是Java开发中常见的一种工具,用于在Web应用程序中实现数据的分页显示。在大型系统中,由于数据量庞大,一次性加载所有数据不仅会影响页面加载速度,也会消耗大量的服务器资源。因此,分页技术应运而生...

    java 分页组件,已经抽象出来了

    综上所述,这个分页组件是Java Web开发中一个实用的工具,它将分页的复杂逻辑封装起来,使开发者能更专注于业务逻辑,同时提供了良好的用户体验。文件"fenyeExam_01"可能是该项目的一个示例或源代码包,用于演示如何...

    java web Pager通用分页组件(源码)

    java web通用分页组件发布了! 超级强悍的java web通用分页组件,只要简单的一条sql语句就可以轻松的实现分页,目前对oracle,SQL Server2005,SQL server200,mysql都做了实现,程序通过接口来封装,你可以实现对其他...

    java 通用分页组件 实例 源码

    总之,这个Java通用分页组件通过提供便捷的API和对Struts及JSP的良好支持,简化了Web应用中的数据分页处理,提高了代码的可复用性和可维护性。开发者只需要按照规定的步骤进行配置和调用,即可实现高效、易用的分页...

    java web项目分页通用实现

    通过封装分页组件,我们可以将这些复杂逻辑模块化,便于在不同的项目中复用,从而提升开发质量和效率。这个DEMO正是为了帮助开发者理解并实践这一过程,无论你是初学者还是经验丰富的开发者,都能从中受益。

    JAVA Web分页实例代码

    在JAVA Web开发中,分页功能是常见...总的来说,JAVA Web分页实例代码提供了实际操作的参考,有助于开发者掌握分页的实现原理,提升开发效率。通过学习和实践这个例子,你可以更好地理解如何在实际项目中应用分页技术。

    最好最好的java万能分页标签

    "最好最好的java万能分页标签"可能是一个开源的Java分页组件,它的特点是简单易用。只需要导入对应的Jar包,然后在代码的五个关键位置进行配置,即可快速实现分页功能。这五个位置可能包括: 1. **配置文件**:在...

    Java Web中分页标签的使用说明

    JSP的自定义标签库,如Struts2的displaytag或Spring MVC的spring-tag,提供了方便的分页组件。例如,displaytag是一个功能强大的开源分页和排序库,它可以轻松地在JSP页面上展示表格,并提供分页和排序功能。要使用...

    java web分页项目

    【Java Web分页项目】是基于Java和JSP技术实现的一个Web应用程序,主要目标是解决在Web应用中处理大量数据时的效率问题。在数据库驱动的Web应用中,一次性加载所有数据可能导致页面加载慢,用户体验下降,甚至服务器...

    java web 分页管理器

    Java Web分页管理器是一种用于处理大量数据分页显示的技术,尤其在与微软数据库如SQL Server配合使用时,能够高效地提升用户体验。在Web应用程序中,分页是必不可少的功能,尤其是在展示诸如用户列表、订单历史或者...

    Java Web中常用的分页组件(Java端实现)

    Java Web中常用的分页组件(Java端实现) Java Web中常用的分页组件是指在Java Web应用程序中使用的分页查询组件。分页查询是指在Web程序中将大量数据分割成多个页面,以便用户更方便地浏览和操作数据。Java端实现...

    JSF分页组件2

    JSF分页组件2是构建高效、用户友好的Web应用的关键工具。通过理解其工作原理,结合现有的库或自定义组件,我们可以为用户提供更好的数据浏览体验。在实际项目中,结合性能优化策略,确保分页组件不仅功能完善,而且...

    自己写的分页组件

    `templatepaginationmodule.jsp`文件可能是一个JSP(Java Server Pages)模板,用于在网页上呈现分页组件。JSP是Java的一种动态网页技术,它允许将Java代码嵌入HTML或XML文档中,以便在服务器端处理数据并返回给...

    Java web 分页技术

    Java Web分页技术是Web应用程序中常用的一种数据展示方式,它允许用户逐步浏览大量的数据集合,而不会一次性加载所有数据,从而提高页面加载速度和用户体验。Struts2作为一款流行的MVC框架,提供了实现分页功能的...

    改进后的Java分页组件

    在Java开发中,分页是数据展示不可或缺的一部分,特别是在处理大量数据时,为了提高用户体验和系统性能,分页组件显得尤为重要。"改进后的Java分页组件"是一个优化过的解决方案,旨在简化开发流程,提高代码的可读性...

    比较好用的分页组件

    在Web应用开发中,由于一次性加载所有数据可能会导致性能问题,因此分页组件是必不可少的。这类组件能帮助开发者高效地管理数据库查询,只加载用户当前需要查看的数据部分。 在描述中提到的“NULL 博文链接:...

Global site tag (gtag.js) - Google Analytics