Java 分页工具

[背景] 最近学习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; // 每页5条数据
    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  

效果预览:

时间: 2024-12-13 11:10:43

Java 分页工具的相关文章

java 分页工具类

//13年写的,今天(17)拷贝到博客园 package com.sicdt.sicsign.web.utils; import java.io.Serializable; import java.util.List; /** * @author shizhenwei * * @param <T>用于向前台返还List所用 */ public class PageInfo<T> implements Serializable { private static final long

分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

[博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]https://www.cnblogs.com/m-yb/p/9986309.html分页功能的实现可以使用各种插件, 笔者今日闲来无事, 写了 分页工具类 前后台代码 Java JavaScript 的 实现及思路梳理.供大家参考.分页功能的需求一般有: 当前页/每页条数/总页数/总记录数/起始记录数/数

Java Web的分页工具类

最近写一个java web项目,以前分页的工具类,都是基础架构的人写好了的.也没有去细看,现在遇到这个状况. 就整理一下思路,自己写了一个分页的工具类.写的不好之处,还望斧正. 下面是我的代码: PageUtil.java 1 package util; 2 3 import java.util.Map; 4 5 /** 6 * 分页工具类 7 * @author lyh 8 * 9 */ 10 public class PageUtil { 11 private int total; //总数

Java内存分页工具类

前言 工作过程中,经常会遇到基于内存数据进行分页处理的情况,例如批量更新数据库时,集合过大需要分批更新的情况,还有例如对缓存中的集合数据进行分页获取这种情况. 本文提供了通用的内存分页工具,参考了网络上的一些代码,主要基于 subList() 方法实现,希望对你有所帮助!工具类源码在本文底部. 本文原文链接地址:http://nullpointer.pw/Java%E5%86%85%E5%AD%98%E5%88%86%E9%A1%B5%E5%B7%A5%E5%85%B7%E7%B1%BB.htm

数据量你造吗-JAVA分页

数据量你造吗-JAVA分页 原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks 学习的心态第一,解行要相应.其实<弟子规>在"余力学文"当中,一开头就强调了这一个重点."不力行,但学文,长浮华,成何人",这个没有侥幸的,只要学了不去做,无形当中就会增长傲慢,自己不知道.-<弟子规> Written In The Font JAVA-Web 基础那块,我自己也

项目经验分享——Java常用工具类集合 转

http://blog.csdn.net/xyw591238/article/details/51678525 写在前面 本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类——仅仅获得连接对象 ConnDB.java [java] package com.util; import java.sql.Connection; import java.sql.DriverM

java报表工具参数强化

参数的强化通常是指定义数据集SQL语句如SELECT * FROM [TableName] WHERE [ColName] = ${para},其中${}中的内容为变量,报表工具会将${}中的内容计算后形成字符串拼接至SQL中形成最终的可执行查询语句,发送到数据库端进行执行.${}中可以使用报表中的函数对参数进行处理,此即为参数的强化. 用户在使用Java报表工具进行部署时,常会需要用到参数强化,下面以FineReport报表工具为例,简单介绍下参数与日期参数的格式化处理. 日期的表示形式有很多

java 开发工具IntelliJ IDEA 安装步骤

1.下载地址 http://pan.baidu.com/s/1mhn5k60 2安装流程 intellij idea 15虽然不是最新版本,但却是目前工作中使用最多的java集成开发环境,也被认为是当前Java开发效率最快的IDE工具.它整合了开发过程中实用的众多功能,包括智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等,几乎可以不用鼠标可以方便的完成你要做的任何事情,最大程度的加快开发的速度.intellij idea 15主要对b

Java常用工具类集合

数据库连接工具类 仅仅获得连接对象 ConnDB.java package com.util; import java.sql.Connection; import java.sql.DriverManager; /** * 数据库连接工具类——仅仅获得连接对象 * */ public class ConnDB { private static Connection conn = null; private static final String DRIVER_NAME = "com.mysql