在开发过程中 , 总会有地方需要用到分页. 我是最不喜欢写分页的 , 感觉分页写起来很麻烦.所以造了个轮子.
支持以下功能 :

  • 查询过程完整封装
  • 根据查询条件动态生成分页URL
  • 动态生成分页按钮(当前选中按钮处于最中间)

使用起来

  • 非常简单 …
  • 非常简单 …
  • 非常简单 …

直接贴代码
package com.utils.page;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 分页/查询工具类
 * @author lyinlong
 *
 */
public class PageBean<T> {

    //参数vo
    private T obj;
    /**
     * 地址URL
     */
    private String url;
    /**
     * 参数
     * &keyword=""&....
     */
    private String params;
    /**
     * 页码
     */
    private Integer pageNo;
    /**
     * 每页显示数量
     */
    private Integer pageSize;
    /**
     * 查询的结果
     */
    private List<T> results;
    /**
     * 不分页的总数
     */
    private Integer totalCount;
    /**
     * 总页数(最后一页的页面)
     */
    private Integer totalPageNo;
    /**
     * 在页面显示的5个页码
     */
    private List<Integer> showNums;
    /**
     * 实际的pageNO
     */
    private Integer actulPageNo;
    /**
     * 查询条件List
     */
    private List<Object> conList;
    /**
     * 查询条件 Map
     */
    private Map<String, Object> conMap;


    public T getObj() {
        return obj;
    }

    public void setObj(T obj) {
        this.obj = obj;
    }

    public PageBean() {}

    public PageBean(Integer pageNo, Integer pageSize) {
        setPageSize(pageSize);
        setPageNo(pageNo);
        setActulPageNo(pageNo == null ? 1 : pageNo );
    }

    public PageBean(Integer pageNo, Integer pageSize, List<Object> conList,
            Map<String, Object> conMap) {
        this.conList = conList;
        this.conMap = conMap;

        setPageSize(pageSize);
        setPageNo(pageNo);
        setActulPageNo(pageNo == null ? 1 : pageNo );
    }
    public PageBean(Map<String,Object> params,T vo,Integer pageNo, Integer pageSize) {
        setPageSize(pageSize);
        setPageNo(pageNo);
        setActulPageNo(pageNo == null ? 1 : pageNo );
        this.obj = vo;
        this.conMap = params;
    }
    public PageBean(Map<String,Object> params,Integer pageNo, Integer pageSize) {
        setPageSize(pageSize);
        setPageNo(pageNo);
        setActulPageNo(pageNo == null ? 1 : pageNo );
        this.conMap = params;
    }
    public PageBean(Integer pageNo, Integer pageSize, List<T> results,
            Integer totalCount, Integer totalPageNo, List<Object> conList,
            Map<String, Object> conMap) {
        super();
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.results = results;
        this.totalCount = totalCount;
        this.totalPageNo = totalPageNo;
        this.conList = conList;
        this.conMap = conMap;
        setActulPageNo(pageNo == null ? 1 : pageNo );
    }
    public Integer getPageNo() {
        return pageNo;
    }
    public void setPageNo(Integer pageNo) {
        pageNo = pageNo == null ? 0 : (pageNo - 1) * (pageSize == null ? 15 : pageSize) ;
        this.pageNo = pageNo;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public void setPageSize(Integer pageSize) {
        pageSize = pageSize == null || pageSize < 0 ? 15 : pageSize;
        this.pageSize = pageSize;
    }
    public List<T> getResults() {
        return results;
    }
    public void setResults(List<T> results) {
        this.results = results;
    }
    public Integer getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }
    // 获取总页数
    public Integer getTotalPageNo() {
        totalPageNo = totalPageNo != null ? totalPageNo : ((totalCount == null ? 0 : totalCount ) / pageSize) + (((totalCount == null ? 0 : totalCount ) % pageSize) > 0 ? 1 : 0);
        return totalPageNo;
    }
    public void setTotalPageNo(Integer totalPageNo) {
        this.totalPageNo = totalPageNo;
    }
    public List<Object> getConList() {
        return conList;
    }
    public void setConList(List<Object> conList) {
        this.conList = conList;
    }
    public Map<String, Object> getConMap() {
        return conMap;
    }
    public void setConMap(Map<String, Object> conMap) {
        this.conMap = conMap;
    }
    public Integer getActulPageNo() {
        return actulPageNo == null ? pageNo : actulPageNo;
    }

    public void setActulPageNo(Integer actulPageNo) {
        this.actulPageNo = actulPageNo ;
    }

     public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getParams() {
        return params;
    }

    /**
     * 生成分页需要的参数
     */
    public void setParams() {
        if(conMap != null){
            StringBuffer buffer = new StringBuffer();
            for (String key : conMap.keySet()) {
                buffer.append("&");
                buffer.append(key);
                buffer.append("=");
                buffer.append(conMap.get(key) == null ? "" : conMap.get(key));
            }
            this.params = buffer.toString();
        }
    }

    /**
     * 生成页面(当前页在最中间)
     * @return
     */
    public List<Integer> getShowNums() {
        actulPageNo = actulPageNo == null ? 1 : actulPageNo;

        //当前页码在所有页面中的下标
        int index = 1;
        //所有页码
        List<Integer> allNos = new ArrayList<Integer>();
        for (int i = 0 ; i <= getTotalPageNo(); i++) {
            if(i == actulPageNo)
                index = i;
            allNos.add(i);

        }
        // 默认页码
        Integer[] pageNos = new Integer[]{1,2,3,4,5};

        try {
            pageNos = new Integer[]{
                index - 2 < 0 ? null : index == totalPageNo ? allNos.get(index - 4) : allNos.get(index - 2)  ,

                index - 1 < 0 ? null : index == totalPageNo ? allNos.get(index - 3) : allNos.get(index - 1) ,

                index < 0 ? null : index == totalPageNo ? allNos.get(index - 2) : allNos.get(index ) ,

                index + 1 < 0 ? null : index == totalPageNo ? allNos.get(index - 1) : allNos.get(index + 1) ,

                index + 2 < 0 ? null : index == totalPageNo ? allNos.get(index) : allNos.get(index + 2)
                            };

        } catch (Exception e) {
            // TODO: handle exception
        }

        if(allNos.size() < 6){
            pageNos = new Integer[allNos.size()];
            for (int i = 0; i < allNos.size(); i++) {
                pageNos[i] = i + 1;
            }
        }
        else if(getTotalPageNo() >=5  ){
            if(pageNos[0] == null || pageNos[0] == 0 || allNos.size() == 6)
                pageNos = new Integer[]{1,2,3,4,5};
        }

        if(allNos.get(allNos.size() - 1) < pageNos[pageNos.length - 1])
            pageNos[pageNos.length - 1] = null;

        showNums = Arrays.asList(pageNos);

        return showNums;
    }

    /**
     * 获取首页页码
     * @return
     */
    public Integer getFirstPageNo() {
        return 1;
    }

    /**
     * 检测参数是否有空字符串
     */
    public void check(){
        if(conMap != null){
            for (String key : conMap.keySet()) {
                if (conMap.get(key) != null && (conMap.get(key).equals("") || conMap.get(key).equals("-1"))) {
                    conMap.put(key, null);
                }
            }
        }
    }
}

控制器的实现

@RequestMapping("list")
public String list(
        @RequestParam(value="pageNo" , required = false) Integer pageNo ,
        @RequestParam(value="userName" , required = false) String userName ,
        @RequestParam(value="telephone" , required = false) String telephone ,
        @RequestParam(value="status" , required = false) String status ,
        @RequestParam(value="type" , required = false) String type ,
        @RequestParam(value="sex" , required = false) String sex ,
        Model model){

    // 初始化PageBean , 默认每页15条数据 (Entity:实体对象 ,pageNo : 1 第一页 , 不是 0 )
    PageBean<Entity> pageBean = new PageBean<>(pageNo == null ? 1 : pageNo, 15);

    // 将查询条件放到 PageBean 的 comMap 中
    pageBean.setConMap(new HashMap<String , Object>(){{
        put("userName", userName);
        put("telephone", telephone);
        put("status", status);
        put("type", type);
        put("sex", sex);
    }});

    // 调用Service查询方法 , 将PageBean 传入
    iEntityService.indexData(pageBean);

    // 将PageBean 传递到页面
    model.addAttribute("page", pageBean);

    return "entity/list";
}

Service 的实现

@Override
public void indexInfo(PageBean<Entity> pageBean) {

    // 检查参数合法性 , 查询值为-1 , "" 将会被设置为null
    pageBean.check();

    // 获取查询列表
    pageBean.setResults(iEntityMapper.getByCons(pageBean));

    // 获取查询结果总记录数
    pageBean.setTotalCount(iEntityMapper.getTotalByCons(pageBean));

    // 设置要跳转Controller 方法
    pageBean.setUrl("entity/list");

    // 生成url翻页参数的查询条件
    pageBean.setParams();
}

页面分页的实现

在页面中取出查询条件

${page.conMap.查询条件名}

分页按钮(该内容不需要改动 , 直接粘贴或封装在页面调用就行.因为url的内容完全是在service中设置的)

<c:if test="${page.totalPageNo > 1 }">
            <div class="fanye_div">
                <ul class="fanye">
                    <li>共  ${page.totalCount }  条</li>
                    <li><a href='<%=basePath %>${page.url}?pageNo=1${page.params}'>首页</a></li>
                      <c:if test="${page.actulPageNo > 1 }">
                        <li><a href='<%=basePath %>${page.url}?pageNo=${page.actulPageNo -1 }${page.params}'>上一页</a></li>
                    </c:if>
                    <c:forEach var="pno" items="${page.showNums }">
                        <c:choose>
                            <c:when test="${pno == page.actulPageNo}">
                                <li class="current"><a href='<%=basePath %>${page.url}?pageNo=${pno }${page.params}'>${pno }</a></li>            
                            </c:when>
                            <c:otherwise>
                                <li><a href='<%=basePath %>${page.url}?pageNo=${pno  }${page.params}'>${pno }</a></li>        
                            </c:otherwise>
                        </c:choose>
                    </c:forEach>
                    <c:if test="${page.actulPageNo  < page.totalPageNo }">
                        <li><a href='<%=basePath %>${page.url}?pageNo=${page.actulPageNo+1 }${page.params}'>下一页</a></li>
                    </c:if>
                    <li><a href='<%=basePath %>${page.url}?pageNo=${page.totalPageNo }${page.params}'>尾页</a></li>
                </ul>
            </div>
        </c:if>

分页按钮的CSS

.fanye_div{overflow: hidden; margin:0 auto;margin-right: 20px;}
.fanye{-height: 150px; line-height: 30px; margin-top: 50px; float: right;}
.fanye li{float: left; margin-left: 19px; color: #6B6B6B; font-size: 16px; cursor: pointer;}
.fanye .current{width: 30px; height: 30px; line-height: 30px; text-align: center; border-radius: 5px; background: #3C8AA1; color: #fff;}
.fanye .current a{color: #fff;}

分页按钮处效果图
page_footer