针对 https://www.oschina.net/code/snippet_176115_14393 删了不让新提交,源码放这儿。
package com.myweb.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import com.myweb.web.util.Page;
public class PageTag extends TagSupport {
private static final long serialVersionUID = 611674863217822614L;
/**
* 显示的页码个数
*/
private static final Long SHOW_PAGE_NO = 5L;
/**
* 默认的跳转地址
*/
private static final String DEF_URL = "javascript:";
/**
* 不可用Class时样式后缀
*/
private static final String GRAY = "_gray";
/**
* 当前页的class样式后缀
*/
private static final String NOW = "_now";
/**
* 页码标记:这样的标记会被替换成正在合适的数字页码
*/
private static final String PAGE_NO_FLAG = "{page}";
private static final String LOCATION_HREF = "window.location.href =\"";
private static final String WINDOW_EVENT = "\";if (window.event)window.event.returnValue = false";
/**
* page对象
*/
private Page page;
/**
* 翻页时的地址
*/
private String url;
/**
* 是否显示通告
*/
private Boolean notice = Boolean.TRUE;
/**
* 是否显示快速跳页输入框
*/
private Boolean fastJump = Boolean.FALSE;
/**
* 显示的页数
*/
private Long showNO = SHOW_PAGE_NO;
private Long totalNO;// 设置page时自动计算的总页数
private String autoUrl;// 经过结算后得出的翻页地址
private Boolean isFunction;// 是否是js方法
@Override
public int doStartTag() throws JspException {
StringBuilder sb = new StringBuilder();
sb.append("<div class='page'>");
// 通告
if (notice) {
sb.append("<div class='page_notice'>共<span class='page_notice_total'> ");
sb.append(page.getTotal());
sb.append("</span>条记录,每页 <span class='page_notice_size'>");
sb.append(page.getPageSize());
sb.append("</span>条</div>");
}
// 翻页
sb.append("<div class='page_number'><ul>");
sb.append(getLi(PageType.FIRST, Page.DEF_PAGE_NUM));
if (page.getPageNO() > 1) {
sb.append(getLi(PageType.OVER, page.getPageNO() - 1));
}
sb.append(getLi(PageType.BEFORE_OMIT, null));
if (page.getPageNO() <= showNO / 2) {// 在可分页的开头
Long subNO = (showNO > totalNO ? totalNO : showNO);
addLi(sb, subNO, subNO);
} else if (totalNO <= showNO / 2 + page.getPageNO()) {// 在可分页的结尾
Long subNO = (showNO > totalNO ? totalNO : showNO);
addLi(sb, totalNO, subNO);
} else {// 在可分页的中部
addLi(sb, page.getPageNO() + showNO / 2, showNO);
}
sb.append(getLi(PageType.AFTER_OMIT, null));
if (page.getPageNO() < totalNO) {
sb.append(getLi(PageType.NEXT, page.getPageNO() + 1));
}
sb.append(getLi(PageType.LAST, totalNO));
if (fastJump) {
sb.append("<li class='page_number_input'><input /></li>");
sb.append("<li class='page_number_submit' onclick='");
sb.append(getSubmit());
sb.append("'>确定</li>");
}
sb.append("</ul></div></div>");
try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
throw new JspException(e);
}
return SKIP_BODY;
}
/**
* 获得确定按钮的HTML代码
*
* @return
*/
private StringBuilder getSubmit() {
StringBuilder sb = new StringBuilder();
sb.append(DEF_URL);
sb.append("(function(e){var v=e.previousSibling.firstChild.value;v=v<");
sb.append(totalNO);
sb.append("?v<1?1:v:");
sb.append(totalNO);
sb.append(";if(v==");
sb.append(page.getPageNO());
sb.append("){return false;};");
if (this.isFunction) {
sb.append(url.replace(PAGE_NO_FLAG, "v"));
} else {
sb.append(LOCATION_HREF);
int index = 0;
if ((index = url.indexOf(PAGE_NO_FLAG)) != -1) {
sb.append(url.substring(0, index));
sb.append("\"+v+\"");
sb.append(url.substring(index + PAGE_NO_FLAG.length()));
}
sb.append(WINDOW_EVENT);
}
sb.append(";})(this);");
return sb;
}
/**
* 向StringBuilder中追加分页li
*
* @param sb
* @param sub
* 从某值循环loopNO次后到达的值
* @param loopNO
* 循环次数
*/
private void addLi(StringBuilder sb, Long sub, Long loopNO) {
while (loopNO-- > 0) {
sb.append(getLi(PageType.GENERAL, sub - loopNO));
}
}
/**
* 综合页类型和页码计算翻页地址的li
*
* @param pageNO
* @return
*/
private StringBuilder getLi(PageType pageType, Long pageNO) {
StringBuilder sb = null;
switch (pageType) {
case FIRST:
sb = getLi(this.totalNO < 2 || page.getPageNO() < 2, GRAY,
pageType, pageNO, "首页");
break;
case OVER:
sb = getLi(this.totalNO < 2 || page.getPageNO() < 2, GRAY,
pageType, pageNO, "<");
break;
case NEXT:
sb = getLi(this.totalNO < 2
|| page.getPageNO().equals(this.totalNO), GRAY, pageType,
pageNO, ">");
break;
case LAST:
sb = getLi(this.totalNO < 2
|| page.getPageNO().equals(this.totalNO), GRAY, pageType,
pageNO, "末页");
break;
case BEFORE_OMIT:
sb = getOmitLi(
totalNO > showNO
&& showNO / 2 + showNO % 2 < page.getPageNO(),
pageType);
break;
case AFTER_OMIT:
sb = getOmitLi(totalNO > showNO
&& showNO / 2 + page.getPageNO() < totalNO, pageType);
break;
case GENERAL:
sb = getLi(pageNO.equals(page.getPageNO()), NOW, pageType, pageNO,
pageNO);
break;
}
return sb;
}
/**
* 获得忽略li标签
*
* @param rule
* @param pageType
* @return
*/
private StringBuilder getOmitLi(Boolean rule, PageType pageType) {
if (rule) {
StringBuilder sb = new StringBuilder("<li class='page_number_");
sb.append(pageType.getValue());
sb.append("'>...</li>");
return sb;
}
return new StringBuilder("");
}
/**
* 获得标准li标签
*
* @param rule
* @param trueRuleText
* @param pageType
* @param pageNO
* @param showText
* @return
*/
private StringBuilder getLi(Boolean rule, String trueRuleText,
PageType pageType, Long pageNO, Object showText) {
StringBuilder sb = new StringBuilder("<li class='page_number_");
sb.append(pageType.getValue());
if (rule) {
sb.append(trueRuleText);
} else {
sb.append("' onclick='");
sb.append(autoUrl.replace(PAGE_NO_FLAG, String.valueOf(pageNO)));
}
sb.append("'>");
sb.append(showText);
sb.append("</li>");
return sb;
}
/**
* 在set进url后自动计算需要的地址
*/
private void setAutoUrl() {
StringBuilder sb = new StringBuilder();
sb.append(DEF_URL);
// 要考虑可能是js方法的情况,如果是js方法时,则必有()这样的括号
this.isFunction = url.indexOf("(") < url.indexOf(")");
if (this.isFunction) {
sb.append(url);
} else {
sb.append(LOCATION_HREF);
sb.append(url);
sb.append(WINDOW_EVENT);
}
sb.append(";");
this.autoUrl = sb.toString();
}
public void setPage(Page page) {
this.page = page;
this.totalNO = page.getTotal() / page.getPageSize()
+ (page.getTotal() % page.getPageSize() == 0 ? 0 : 1);
this.totalNO = this.totalNO < 1 ? 1 : this.totalNO;
}
public void setUrl(String url) {
this.url = url;
setAutoUrl();
}
public void setNotice(Boolean notice) {
this.notice = notice;
}
public void setShowNO(Long showNO) {
this.showNO = showNO;
}
public Boolean getFastJump() {
return fastJump;
}
public void setFastJump(Boolean fastJump) {
this.fastJump = fastJump;
}
/**
* 页类型
*
*/
private static enum PageType {
/**
* 首页
*/
FIRST("first"),
/**
* 上一页
*/
OVER("over"),
/**
* 下一页
*/
NEXT("next"),
/**
* 尾页
*/
LAST("last"),
/**
* 前忽略页
*/
BEFORE_OMIT("omit"),
/**
* 后忽略页
*/
AFTER_OMIT("omit"),
/**
* 一般页
*/
GENERAL("li");
private String value;
private PageType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
}