import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 分页类
* @author doowan
*/
public class Paginator{
private int interval = 10; //在页面中显示的分页按钮数量(包含当前页)
private int currentPage = 1; //当前页数
private int totalPage = 0; //总页数
private String name = "page"; //参数名
private String url; //生成链接地址的url
private String pageSpaceHolder; //页数替换标示
private String urlSpaceHolder; //url替换标示
private String current; //选中分页的模板
private String other; //未选中分页的模板
//初始化一个默认的Paginator,其他值需自行绑定
public Paginator(int totalPage, int currentPage){
this.totalPage = totalPage;
this.currentPage = currentPage;
}
public Paginator(int totalPage, int currentPage, String url){
this(totalPage, currentPage, url, "{s}", "{u}");
}
public Paginator(int totalPage, int currentPage, String url, String pageSpaceHolder, String urlSpaceHolder){
this(totalPage, currentPage, url, pageSpaceHolder, urlSpaceHolder,
"<span class='paginator-current'>"+pageSpaceHolder+"</span>",
"<a href='"+ urlSpaceHolder + "' class='paginator-page'>" + pageSpaceHolder + "</a>");
}
public Paginator(int totalPage, int currentPage, String url, String pageSpaceHolder, String urlSpaceHolder, String current, String other){
this(totalPage, currentPage);
this.url = url;
this.setPageSpaceHolder(pageSpaceHolder);
this.setUrlSpaceHolder(urlSpaceHolder);
this.setCurrent(current);
this.setOther(other);
}
//生成模板
public StringBuffer generate(){
StringBuffer html = new StringBuffer();
int start = this.getBeginPoint();
int end = this.getEndPoint(start);
if(start > 1){
html.append(this.generateOther(1, "first"));
}
for(; start<=end; start++){
if(this.currentPage == start){
html.append(this.generateCurrent());
}else{
html.append(this.generateOther(start, String.valueOf(start)));
}
}
if(end < this.totalPage){
html.append(this.generateOther(this.totalPage, "last"));
}
return html;
}
public void setInterval(int interval){
this.interval = interval;
}
public int getInterval(){
return this.interval;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPageSpaceHolder() {
return pageSpaceHolder;
}
public void setPageSpaceHolder(String pageSpaceHolder) {
this.pageSpaceHolder = pageSpaceHolder;
}
public String getUrlSpaceHolder() {
return urlSpaceHolder;
}
public void setUrlSpaceHolder(String urlSpaceHolder) {
this.urlSpaceHolder = urlSpaceHolder;
}
public String getCurrent() {
return current;
}
public void setCurrent(String current) {
this.current = current;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
public String getUrl() {
return url;
}
//设置url
public void setUrl(String url){
this.url = url;
}
/**
* 替换url中的页数
* @param int page 指定的页数
* @return String 如果失败,返回原始url
* @autor doowan
*/
public String generateUrl(int page){
String reg = "([(?)|&]*"+this.getName()+"=)(\\d+)";
Matcher matcher = Pattern.compile(reg).matcher(this.getUrl());
if(!matcher.find()){
reg = "\\?(.*)$";
matcher = Pattern.compile(reg).matcher(this.getUrl());
if(this.getUrl().indexOf('?') > -1 && matcher.find()){
return this.getUrl() + "&" + this.name + "=" + page;
}
return this.getUrl() + "?" + this.name + "=" + page;
}
return matcher.replaceAll(matcher.group(1)+String.valueOf(page));
}
/**
* 返回分页按钮字符串
* @param int page 该页的页码
* @param String name 该页的文字描述
* @return String
* @author doowan
*/
protected String generateOther(int page, String name){
String other = "";
//替换指定页页数
other = this.getOther().replace(new StringBuffer(this.getPageSpaceHolder()),
new StringBuffer(String.valueOf(name)));
//替换指定页的url
other = other.replace(new StringBuffer(this.getUrlSpaceHolder()),
new StringBuffer(this.generateUrl(page)));
return other;
}
//返回当前页的内容
protected String generateCurrent(){
return this.getCurrent().replace(new StringBuffer(this.getPageSpaceHolder()),
new StringBuffer(String.valueOf(this.currentPage)));
}
//根据当前的页码返回页码的起始值
private int getBeginPoint(){
if(this.interval >= this.totalPage){
return 1;
}
//currentPage的页数为最后this.interval个页数的一页,所以直接返回totalPage-interval
if(this.totalPage - this.currentPage + 1 <= this.interval){
return this.totalPage - this.interval + 1;
}
int start = (int)Math.floor(this.interval/2);
int page = this.currentPage - start;
if(page < 1){
return 1;
}
return page;
}
//根据当前的页码返回页码的截止值 start:起始位置
private int getEndPoint(int start){
int end = start + this.interval - 1; //第start页已存在,所以减1取后几页
if(end > this.totalPage){
end = this.totalPage;
}
return end;
}
}