PageTag 源码下载

 针对 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, "&lt;");
			break;
		case NEXT:

			sb = getLi(this.totalNO < 2
					|| page.getPageNO().equals(this.totalNO), GRAY, pageType,
					pageNO, "&gt;");
			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;
		}
	}
}

猜你喜欢

转载自my.oschina.net/sxgkwei/blog/1817277
今日推荐