1. 程式人生 > >自定義通用分頁

自定義通用分頁

第一步配置PageBean(util)
public class PageBean {

private int page = 1;// 頁碼
private int rows = 3;// 行數/頁大小
private int total = 0;// 總記錄數

private boolean pagination = true;// 預設分頁

private String url;// 上一次請求的地址
private Map<String, String[]> parameterMap;// 上一次請求的所有引數

public PageBean() {
	super();
}

/**
 * 對分頁bean進行初始化
 * 
 * @param request
 */
public void setRequest(HttpServletRequest request) {
	// 公共引數
	this.setPage(request.getParameter("page"));
	this.setRows(request.getParameter("rows"));
	this.setPagination(request.getParameter("pagination"));

	// 請求地址和請求引數
	this.setUrl(request.getContextPath() + request.getServletPath());
	this.setParameterMap(request.getParameterMap());
}

public String getUrl() {
	return url;
}

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

public Map<String, String[]> getParameterMap() {
	return parameterMap;
}

public void setParameterMap(Map<String, String[]> parameterMap) {
	this.parameterMap = parameterMap;
}

public int getPage() {
	return page;
}

public void setPage(int page) {
	this.page = page;
}

public void setPage(String page) {
	if (null != page && !"".equals(page.trim())) {
		this.page = Integer.parseInt(page);
	}
}

public int getRows() {
	return rows;
}

public void setRows(int rows) {
	this.rows = rows;
}

public void setRows(String rows) {
	if (null != rows && !"".equals(rows.trim())) {
		this.rows = Integer.parseInt(rows);
	}
}

public int getTotal() {
	return total;
}

public void setTotal(int total) {
	this.total = total;
}

public void setTotal(String total) {
	this.total = Integer.parseInt(total);
}

public boolean isPagination() {
	return pagination;
}

public void setPagination(boolean pagination) {
	this.pagination = pagination;
}

public void setPagination(String pagination) {
	if ("false".equals(pagination)) {
		this.pagination = false;
	}
}

/**
 * 下一頁
 * 
 * @return
 */
public int getNextPage() {
	int nextPage = page + 1;
	if (nextPage > this.getMaxPage()) {
		nextPage = this.getMaxPage();
	}
	return nextPage;
}

/**
 * 上一頁
 * 
 * @return
 */
public int getPreviousPage() {
	int previousPage = page - 1;
	if (previousPage < 1) {
		previousPage = 1;
	}
	return previousPage;
}

/**
 * 最大頁碼
 * 
 * @return
 */
public int getMaxPage() {
	return total % rows == 0 ? total / rows : total / rows + 1;
}

/**
 * 起始記錄的下標
 * 
 * @return
 */
public int getStartIndex() {
	return (page - 1) * rows;
}

@Override
public String toString() {
	return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
}

第二步加上倆個幫助類(tag)
PageTag

public class PageTag extends BodyTagSupport {

private static final long serialVersionUID = 8003507841172246203L;

private PageBean pageBean;

public PageTag() {
	super();
}

public PageBean getPageBean() {
	return pageBean;
}

public void setPageBean(PageBean pageBean) {
	this.pageBean = pageBean;
}

@Override
public int doStartTag() throws JspException {
	try {
		JspWriter out = pageContext.getOut();
		out.println(this.toHtml());
		return SKIP_BODY;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

private String toHtml() {
	StringBuffer bf = new StringBuffer();
	if (null == pageBean || !pageBean.isPagination()) {
		return bf.toString();
	}

	// 1. 生成表單
	bf.append("<form id='pageBeanForm' action='" + pageBean.getUrl() + "' method='post'>");
	bf.append("<input type='hidden' name='page' value=''>");
	for (Map.Entry<String, String[]> entry : pageBean.getParameterMap().entrySet()) {
		String name = entry.getKey();
		String[] values = entry.getValue();
		if ("page".equals(name)) {
			continue;
		}

		for (String value : values) {
			bf.append("<input type='hidden' name='" + name + "' value='" + value + "'>");
		}
	}
	bf.append("</form>");

	// 2. 生成按鈕
	bf.append("<div style='text-align: right;font-size: 12px;'>每頁" + pageBean.getRows() + "條,共"
			+ pageBean.getTotal() + "條,當前第" + pageBean.getPage() + "頁,共" + pageBean.getMaxPage()
			+ "頁&nbsp;&nbsp;<a href='javascript:doGotoPage(1)'>首&nbsp;&nbsp;頁</a>&nbsp;&nbsp;<a href='javascript:doGotoPage("
			+ pageBean.getPreviousPage() + ")'>上一頁</a>&nbsp;&nbsp;<a href='javascript:doGotoPage("
			+ pageBean.getNextPage() + ")'>下一頁</a>&nbsp;&nbsp;<a href='javascript:doGotoPage("
			+ pageBean.getMaxPage()
			+ ")'>尾&nbsp;&nbsp;頁</a>&nbsp;&nbsp;<input id='pageNumber' type='text' style='text-align: center;width: 30px;'>&nbsp;&nbsp;<a href='javascript:doSkipPage();'>GO</a></div>");

	// 3. 動態生成js
	bf.append("<script type='text/javascript'>");
	bf.append("function doGotoPage(page){");
	bf.append("  var form = document.getElementById('pageBeanForm');");
	bf.append("  form.page.value = page;");
	bf.append("  form.submit();");
	bf.append("}");
	bf.append("function doSkipPage(page){");
	bf.append("  var page = document.getElementById('pageNumber').value;");
	bf.append("  if(!page||isNaN(page)||parseInt(page)<1||parseInt(page)>"+pageBean.getMaxPage()+"){");
	bf.append("    alert('頁碼必須為1~"+pageBean.getMaxPage()+"之間數字');");
	bf.append("    document.getElementById('pageNumber').value = '';");
	bf.append("    return;");
	bf.append("  }");
	bf.append("  doGotoPage(parseInt(page));");
	bf.append("}");
	bf.append("</script>");
	bf.append("");
	bf.append("");
	bf.append("");
	bf.append("");
	bf.append("");
	return bf.toString();
}

RownumTag

public class RownumTag extends BodyTagSupport {

private static final long serialVersionUID = 8003507841172246203L;

private PageBean pageBean;

private Integer count;

public RownumTag() {
	super();
}

public Integer getCount() {
	return count;
}

public void setCount(Integer count) {
	this.count = count;
}

public PageBean getPageBean() {
	return pageBean;
}

public void setPageBean(PageBean pageBean) {
	this.pageBean = pageBean;
}

@Override
public int doStartTag() throws JspException {
	try {
		int rownum = (pageBean.getPage() - 1) * pageBean.getRows() + count;
		JspWriter out = pageContext.getOut();
		out.println(rownum + "");
		return SKIP_BODY;
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

加上自定義的tld
在這裡插入圖片描述

<tag>
	<name>rownum</name>
	<tag-class>com.zking.tag.RownumTag</tag-class>
	<body-content>empty</body-content>
	<attribute>
		<name>pageBean</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>count</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

在jsp介面引用
<%@taglib prefix=“z” uri="/zking" %>

《div》<z:page pageBean="${pageBean}"/>
《/div》