`
neuhxy
  • 浏览: 7070 次
  • 性别: 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 web中的struts分页组件

    本代码是javaWeb中SSH框架,特别是struts中涉及到前后台对分页功能的实现,希望对您有帮助!

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

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

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

    本文通过使用场景分析给大家介绍了Java Web中常用的分页组件(Java端实现),非常不错,具有参考借鉴价值,需要的朋友参考下吧

    Ajax分页组件--web-java

    Ajax分页组件--web-java,美观通用

    Java分页处理

    在Java Web 技术中初学者一般会采用SQL 语句分页技术,并在这个基础的之上编写分页组件,页面传参数控制层(Servlet 或Action)调用分页组件的办法,往往会感觉非常麻烦。其实在实际开发中我们可采用一些第三方的...

    分页组件工具

    java进行分页所用的分页组件工具类 使用方法: 第一步:将util文件夹复制到项目 的SRC文件下面 第二步:将mypage.tld文件复制到web-inf文件夹下面 第三步:打开需要分页的页面,在page指令下方添加导入标签库的代码...

    封装好直接使用的jsp分页插件

    java web应用分页组件,可适用于jsp+servlet或s2sh,配置非常简单,引入二行代码即可,内置详细的操作配置文档和jar包及实例文件,未考虑性能优化,对性能要求很高的高手请自行测试或绕行

    V512工作室Java web的ppt

    V512工作室Java web的ppt 第1章 讲解本书中所使用的Java Web开发工具Eclipse 3.3、MyEclipse 6.0和Tomcat6的安装、配置和使用。 第2章 介绍Servlet技术的发展起源,还介绍了Web编程中需要了解的其他相关技术,例如...

    《Java_Web应用开发实用教程》练习答案

    《教育部实用型信息技术人才培养...第3篇Java Web技术应用分为5章,介绍具体场景下的应用案例,包括注册登录模块的应用、分页技术的实现、Java Mail的应用、jspSmartUpload上传下载组件的应用、保护受限制访问的资源。

    通用分页组件

    1)该分页组件不依赖任何底层数据库实现,可以根据需要扩展子类进行动态替换;2)同时也不提供页面如何显示上页,下页等;内部提供了源代码实现,以及DEMO应用,实现分页非常简单; 需要做的工作有三个地方 ...

    MLDN李兴华JAVA_WEB笔记pdf文档

    是java26通里边web开发的部分。代码就不发了。文档中都有。照着敲吧!!搬来饿代码不是自己的。 第19天 WEB开发环境搭建 |-第1节 WEB发展史 |-第2节 使用Tomcat搭建WEB开发环境 |-第3节 MyEclipse中配置Tomcat ...

    SSH(Spring+Struts+Hibernate)轻量级论坛Forum演示系统(Java Web Edition)

    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)

    SSH(Spring+Struts+Hibernate)轻量级购物软件Shopping演示系统(Java Web Edition)技术要点:Spring+Struts+Hibernate三大框架整合,Jquery-treeview、DIV+CSS3、HTML5、JavaScript、分页组件pagination、MySQL。

    基于MVC 模式的分页组件应用 (2011年)

    针对Web 数据库系统中的数据分页问题,提出一种基于模型-视图-控制器(MVC)模式的三层分页组件。在数据层中引入Java 持久化API 和Spring 技术,在业务逻辑层中引入泛型DAO 模式和桥接模式,在显示层中引入JSP 和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA WEB典型模块与项目实战大全

    1.1 java web应用概述  1.2 配置开发环境  1.3 基础技术简单简介  1.4 核心框架初步认识  1.5 小结  第2章 myedipse开发工具对各种框架的支持  2.1 使用jsp的两种模式  2.2 struts框架的实现  2.3...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    分页技术源码

    分页技术: JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100页;好处:利于页面布局,且显示的效率高!... jsp+Servlet+c3p0+mySql+DbUtils组件+3层结构(web层+service层+dao层)

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包101

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics