package com.zheng.common.util;
import javax.servlet.http.HttpServletRequest;
/**
* 分页实体类
* @author shuzheng
* @date 2016年7月6日 下午6:05:00
*/
public class Paginator {
private long total = 0l; // 总记录数
private int page = 1; // 当前页数
private long totalPage = 1; // 总页数
private int rows = 10; // 每页记录数
private int step = 5; // 最多显示分页页码数
private String param = "page"; // 分页参数名称,用于支持一个页面多个分页功能
private String url = ""; // 项目路径
private String query = ""; // 当前页所有参数
public Paginator() {
}
public Paginator(long total, int page, int rows, HttpServletRequest request) {
setTotal(total);
setPage(page);
setRows(rows);
setUrl(request.getRequestURI());
setQuery(request.getQueryString());
}
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
this.initTotalPage();
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public long getTotalPage() {
return totalPage;
}
public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
// 设置个最大记录数,限制单页记录过多
if (rows > 10000) {
rows = 10000;
}
this.rows = rows;
this.initTotalPage();
}
public int getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
/**
* 初始化分页信息
*/
public void initTotalPage() {
totalPage = (total % rows) == 0 ? (total / rows) : ((total / rows) + 1);
if (page > totalPage) {
page = (int) totalPage;
}
if (page < 1) {
page = 1;
}
}
/**
* 生成简单的分页页面内容
* @return
*/
public String getHtml() {
// 根据request获取当前url,包括参数,如果有已存在名称未paramname的参数,剔除掉,后面会追加新的参数
//String contextPath = request.getContextPath();
//String requestURI = request.getRequestURI();
//String url = contextPath + requestURI;
//String url = request.getRequestURI();
//String query = request.getQueryString();
if (query != null) {
String params = "";
String[] querys = query.split("&");
for (int i = 0; i < querys.length; i++) {
if (querys[i].startsWith(param))
continue;
if (params.equals(""))
params = querys[i];
else
params += "&" + querys[i];
}
if (!params.equals(""))
url += "?" + params;
}
// 结果html
String pages = "";
int pageCount = (int) Math.ceil((double) total / rows);// 求总页数
if (pageCount <= 1) {
return pages;
}
if (page > pageCount) {
page = pageCount;// 如果分页变量大总页数,则将分页变量设计为总页数
}
if (page <= 0) {
page = 1;// 如果分页变量小于1,则将分页变量设为1
}
// 显示上一页
if (page > 1) {
if (url.contains("?")) {
pages = pages.concat("<a class=\"prev\" href=\"" + url + "&" + param + "=" + (page - 1) + "\">上一页</a>\n");
} else {
pages = pages.concat("<a class=\"prev\" href=\"" + url + "?" + param + "=" + (page - 1) + "\">上一页</a>\n");
}
} else {
// 特定需求可隐藏
pages = pages.concat("<a class=\"prev\" href=\"javascript:;\" style=\"color:#ccc\">上一页</a>\n");
}
// 如果总页数大于要显示的个数,则拼接显示
if (pageCount > step) {
// 显示分页码
int listBegin = (page - (int) Math.floor((double) step / 2));// 从第几页开始显示分页信息
if (listBegin < 1) {
listBegin = 1;
}
// 显示第1页
if (listBegin >= 2) {
if (url.contains("?")) {
pages = pages.concat("<a href=\"" + url + "&" + param + "=1\">1</a> ... \n");
} else {
pages = pages.concat("<a href=\"" + url + "?" + param + "=1\">1</a> ... \n");
}
}
// 当前页数右侧还有未显示页码时
if (pageCount - page >= page - listBegin) {
for (int i = listBegin; i < (listBegin + step); i++) {
if (i != page) {
if (url.contains("?")) {
pages = pages.concat("<a href=\"" + url + "&" + param + "=" + i + "\">" + i + "</a>\n");
} else {
pages = pages.concat("<a href=\"" + url + "?" + param + "=" + i + "\">" + i + "</a>\n");
}
} else {
pages = pages.concat("<span class=\"current\">" + i + "</span>\n");
}
}
// 显示最后1页
if (listBegin + step <= pageCount) {
if (url.contains("?")) {
pages = pages.concat(" ... <a href=\"" + url + "&" + param + "=" + pageCount + "\">" + pageCount + "</a>\n");
} else {
pages = pages.concat(" ... <a href=\"" + url + "?" + param + "=" + pageCount + "\">" + pageCount + "</a>\n");
}
}
} else { // 显示最后剩余的几个页码
for (int i = (pageCount - step) + 1; i <= pageCount; i++) {
if (i != page) {
if (url.contains("?")) {
pages = pages.concat("<a href=\"" + url + "&" + param + "=" + i + "\">" + i + "</a>\n");
} else {
pages = pages.concat("<a href=\"" + url + "?" + param + "=" + i + "\">" + i + "</a>\n");
}
} else {
pages = pages.concat("<span class=\"current\">" + i + "</span>\n");
}
}
}
} else { // 总页数小于等于step时,直接显示
for (int i = 1; i <= pageCount; i++) {
if (i != page) {
if (url.contains("?")) {
pages = pages.concat("<a href=\"" + url + "&" + param + "=" + i + "\">" + i + "</a>\n");
} else {
pages = pages.concat("<a href=\"" + url + "?" + param + "=" + i + "\">" + i + "</a>\n");
}
} else {
pages = pages.concat("<span class=\"current\">" + i + "</span>\n");
}
}
}
// 显示下一页
if (page < pageCount) {
if (url.contains("?")) {
pages = pages.concat("<a class=\"next\" href=\"" + url + "&" + param + "=" + (page + 1) + "\">下一页</a>\n");
} else {
pages = pages.concat("<a class=\"next\" href=\"" + url + "?" + param + "=" + (page + 1) + "\">下一页</a>\n");
}
} else {
// 特定需求可隐藏
pages = pages.concat("<a class=\"next\" href=\"javascript:;\" style=\"color:#ccc\">下一页</a>\n");
}
return pages;
}
}