利用JSP自定义标签实现分页复用

6 篇文章 0 订阅
5 篇文章 0 订阅

首先看一下运行效果如下:

第13页为最后一页,故下一页和尾页为灰显状态.下面直接上源码:
首先我们需要在WEB-INF/tld/目录下创建page.tld文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>page</short-name>
	<uri>http://www.KinderWang.com/taglibs/page</uri>
	<tag>
		<name>htmlPage</name>
		<tag-class>com.medicine.common.page.PageTag</tag-class>
		<body-content>JSP</body-content>
		<description>htmlPage Tag</description>
		<attribute>
			<name>pageNo</name><!-- 当前页 -->
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>pageSize</name><!-- 每页数量 -->
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>totalSum</name><!-- 总记录数 -->
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>url</name><!-- 页码链接 -->
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>showPage</name><!-- 显示的页码数目 -->
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>
编写对应的tag标签代码:
package com.medicine.common.page;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

/**
 * 分页处理标签
 */
public class PageTag extends TagSupport {
	private int pageNo;// 当前页
	private int pageSize = 10;// 每页页数
	private int totalSum;// 总记录数
	private int showPage = 10;//
	private String url;

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getTotalSum() {
		return totalSum;
	}

	public void setTotalSum(int totalSum) {
		this.totalSum = totalSum;
	}

	public int getShowPage() {
		return showPage;
	}

	public void setShowPage(int showPage) {
		this.showPage = showPage;
	}

	public String getUrl() {
		return url;
	}

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

	@Override
	public int doEndTag() throws JspException {
		if (pageSize == 0) {
			return TagSupport.SKIP_PAGE;// 不显示分页
		} else if (pageSize > totalSum) {
			return TagSupport.SKIP_BODY;// 不显示分页
		}
		JspWriter out = pageContext.getOut();
		try {
			if (url.indexOf(";jsessionid=") == -1) {
				if (url.indexOf("?") == -1) {
					url += ";jsessionid=" + pageContext.getSession().getId()
							+ "?pageNo=";
				} else {
					url = url.replaceFirst("\\?", ";jsessionid="
							+ pageContext.getSession().getId() + "?");
					if (url.indexOf("pageNo=") == -1) {
						url += "&pageNo=";
					}
				}
			}
			url = pageContext.getServletContext().getContextPath() + url;
			VariablePage variablePage = new VariablePage(pageNo, totalSum,
					pageSize, url);
			variablePage.setShowPageNum(showPage);
			Page page = new HtmlPage(variablePage);
			out.print("<div id='pagination'>" + page.getFirstNo()
					+ page.getBackpageNum() + page.pagination()
					+ page.getNextpageNum() + page.getLastNo() + "</div>");
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		return super.doEndTag();
	}

	@Override
	public void release() {
		url = null;
		pageNo = 0;
		totalSum = 0;
		pageSize = 10;
		super.release();
	}

	private static final long serialVersionUID = -2642907859641024483L;
}

分页实体Bean
package com.medicine.common.page;
/**
 * 分页变量
 */
public class VariablePage{
	/**
	 * 显示页码数
	 */
	protected int showPageNum = 10;
	/**
	 * 连接URL
	 */
	protected String url = null;
	/**
	 * 当前页码
	 */
	protected int pageNo = 1;
	/**
	 * 总页码
	 */
	protected int totalPage = 1;
	/**
	 * 总条数
	 */
	protected int totalSum = 0;
	/**
	 * 每页显示条数
	 */
	protected int pageSize = 10;

	public VariablePage(int pageNo, int totalSum, int pageSize, String url) {
		pageNo = pageNo < 1 ? 1 : pageNo;
		this.pageNo = pageNo;
		this.totalSum = totalSum;
		this.url = url;
		this.pageSize = pageSize;
	}

	public VariablePage(int pageNum, int totalSum, String url) {
		pageNum = pageNum < 1 ? 1 : pageNum;
		this.pageNo = pageNum;
		this.totalSum = totalSum;
		this.url = url;
	}
	public String getUrl() {
		return url;
	}

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

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public int getTotalSum() {
		return totalSum;
	}

	public void setTotalSum(int totalSum) {
		this.totalSum = totalSum;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getShowPageNum() {
		return showPageNum;
	}

	public void setShowPageNum(int showPageNum) {
		this.showPageNum = showPageNum;
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}
}

完成Html打印输出基类:
package com.medicine.common.page;

public abstract class Page {
	
	protected VariablePage variablePage;

	public Page(VariablePage variablePage) {
		this.variablePage = variablePage;
		calculateTotalPage();
	}

	/**
	 * 上一页
	 * @return
	 */
	public String getBackpageNum() {
		if (variablePage.pageNo <= 1) {
			return buildBan("上一页", variablePage);
		} else {
			return buildN("上一页", variablePage.getUrl() + (variablePage.pageNo - 1));
		}
	}
	/**
	 * 下一页
	 * @return
	 */
	public String getNextpageNum() {
		if (variablePage.pageNo >= variablePage.totalPage) {
			return buildBan("下一页", variablePage);
		} else {
			return buildN("下一页", variablePage.getUrl() + (variablePage.pageNo + 1));
		}
	}

	/**
	 * 计算总页数
	 */
	private void calculateTotalPage() {
		if (variablePage.totalSum % variablePage.pageSize == 0) {
			variablePage.totalPage = variablePage.totalSum / variablePage.pageSize;
		} else {
			variablePage.totalPage = variablePage.totalSum / variablePage.pageSize + 1;
		}
		if (variablePage.totalPage < variablePage.pageNo) {
			variablePage.pageNo = variablePage.totalPage;
		} else if (variablePage.pageNo < 1) {
			variablePage.pageNo = 1;
		}
	}
	/**
	 * 打印所有(显示页码数小于总页码数)
	 * @return
	 */
	protected String displayAll() {
		StringBuilder sBuilder = new StringBuilder(10);
		for (int i = 1; i <= variablePage.totalPage; i++) {
			if (i == variablePage.pageNo) {//如果是当前页,直接返回页码
				sBuilder.append(buildC(variablePage, i));
			} else {
				sBuilder.append(buildA(variablePage, i));
			}
		}
		return sBuilder.toString();
	}

	/**
	 * 抽象出分页方法
	 * 
	 * @return
	 */
	public abstract String pagination();

	/**
	 * 实现从第一页开始打印
	 * 
	 * @return
	 */
	protected final String fromFirstPagePrint() {
		StringBuffer buffer = new StringBuffer(100);
		for (int i = 1; i <= variablePage.showPageNum; i++) {
			if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
				buffer.append(buildC(variablePage,i));
			} else {
				buffer.append(buildA(variablePage, i));
			}
		}
		return buffer.toString();
	}

	/**
	 * 实现从最后一页开始打印
	 * 
	 * @return
	 */
	protected final String fromLastPagePrint() {
		StringBuffer buffer = new StringBuffer(100);
		int startPage = variablePage.totalPage - (variablePage.showPageNum - 1);
		for (int i = startPage; i <= variablePage.totalPage; i++) {
			if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
				buffer.append(buildC(variablePage, i));
			} else {
				buffer.append(buildA(variablePage, i));
			}
		}
		return buffer.toString();
	}
	/**
	 * 输入首页
	 * @return
	 */
	public String getFirstNo() {
		if (isExistsPagination() && variablePage.pageNo!=1) {
			return buildN("首页", variablePage.url + 1);
		} else {
			return buildBan("首页", variablePage);
		}
	}

	/**
	 * 判断是否存在分页
	 * 
	 * @return
	 */
	private boolean isExistsPagination() {
		if (variablePage.totalSum > 1 && variablePage.totalPage > 1) {
			return true;
		}
		return false;
	}
	/**
	 * 下一页
	 * @return
	 */
	public String getLastNo() {
		if (isExistsPagination() && variablePage.pageNo!=variablePage.totalPage) {
			return buildN("尾页", variablePage.url + variablePage.totalPage);
		} else {
			return buildBan("尾页", variablePage);
		}
	}

	public abstract String buildBan(String text, VariablePage variablePage);

	public abstract String buildA(String text, String url);

	public abstract String buildA(VariablePage variablePage, int num);
	
	public abstract String buildC(VariablePage variablePage, int num);
	
	public abstract String buildN(String text, String url);
	
}

HTML打印输出实现类:
package com.medicine.common.page;
/**
 * HTML 分页类,实现分页输出分页页码功能
 * @author wk
 *
 */
public class HtmlPage extends Page {
	public HtmlPage(VariablePage variablePage) {
		super(variablePage);
	}
	public String pagination() {
		String printNo = "";
		System.out.println("pagination:totalPage"+variablePage.totalPage);
		// 如果已分页;并且页数小于等于要显示的页数
		if (variablePage.totalPage > 1
				&& variablePage.totalPage <= variablePage.showPageNum) {
			return displayAll();
			// 如果分页数:大于显示的页码数
		} else if (variablePage.totalPage > 1
				&& variablePage.totalPage > variablePage.showPageNum) {
			if (variablePage.pageNo == 1) {// 当前页等于第一页
				return fromFirstPagePrint();
			} else if (variablePage.pageNo == variablePage.totalPage) {// 当前页等于最后一页
				return fromLastPagePrint();
			} else {// 如果当前页:即不是首页也不是尾页
				if (variablePage.showPageNum % 2 == 0) {// 可以平分页码
					int print$No = variablePage.showPageNum / 2;
					if (variablePage.pageNo >= print$No) {
						int index$No = variablePage.pageNo - print$No;
						if (variablePage.pageNo + print$No >= variablePage.totalPage) {
							return fromLastPagePrint();
						} else {
							if (index$No == 0)
								index$No = 1;
							for (int i = index$No; i < (variablePage.showPageNum + index$No); i++) {
								if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
									printNo += (buildC(variablePage, i));//样式
								} else {
									printNo += (buildA(variablePage, i));
								}
							}
						}
					} else {
						return fromFirstPagePrint();
					}
				} else {// 打印页数不是偶数时:
					int print$No = variablePage.showPageNum / 2 + 1;
					if (variablePage.pageNo >= print$No
							&& variablePage.pageNo + print$No < variablePage.totalPage) {
						int index$No = variablePage.pageNo - print$No + 1;
						for (int i = index$No; i < variablePage.showPageNum
								+ index$No; i++) {
							if (i == variablePage.pageNo) {// 如果是当前页:不添加连接URL
								printNo += (buildC(variablePage, i));
							} else {
								printNo += (buildA(variablePage, i));
							}
						}
					} else if (variablePage.pageNo <= print$No) {// 从第一页开始
						return fromFirstPagePrint();
					} else {
						return fromLastPagePrint();
					}
				}
			}
			return (printNo);
		} else {
			return "1";
		}
	}

	/**
	 * 不存在则灰显即禁止
	 */
	public String buildBan(String text, VariablePage variablePage) {
		return "<a class='pgEmpty'>" + text + "</a>";
	}
	/**
	 * 创建a标签
	 */
	public String buildA(String text, String url) {
		return "<a href=\"" + url + "\">" + text + "</a>";
	}
	/**
	 * 创建页数a标签
	 */
	public String buildA(VariablePage variablePage, int num) {
		return ("<a href=\"" + variablePage.url + num + "\">" + num + "</a>");
	}
	/**
	 * 创建当前页a标签
	 */
	public String buildC(VariablePage variablePage, int num) {
		return ("<a class='pgCurrent'>" + num + "</a>");
	}
	/**
	 * 
	 */
	@Override
	public String buildN(String text, String url) {
		return ("<a class='pgNext' href=\"" + url + "\">" + text + "</a>");
	}
}

JSP页面首页引用
<%@taglib uri="http://www.KinderWang.com/taglibs/page" prefix="page" %>
使用示例:
<page:htmlPage pageNo="14" url="your_url"  totalSum="150" showPage="10" pageSize="12"/>
JSP页面使用示例:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="http://www.KinderWang.com/taglibs/page" prefix="page" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<style type="text/css">
a{
	text-decoration: none;
}
#pagination{
	
}
#pagination a{
  display: inline-block;
  width: 32px;
  height: 32px;
  border: 0;
  margin-left: 3px;
  line-height: 30px;
  border: 1px solid #e4e4e4;
  text-align: center;
  font-size: 12px;
  background: #fff;
  color: #333;
}
#pagination a:hover{
  line-height: 30px;
  border: 1px solid #35B558;
}
#pagination .pgNext{
	width:50px;
}
#pagination .pgCurrent {
  background: #35b558;
  color: #fff;
  border: 1px solid #35B558;
}
#pagination .pgEmpty {
  border: 1px solid #f0f0f0;
  color: #d9d6c3;
  width: 50px;
  cursor: default;
}
#pagination .pgEmpty:hover {
	border: 1px solid #f0f0f0;
}
</style>
</head>
<body>
<br><br>
<page:htmlPage pageNo="14" url="your_url"  totalSum="150" showPage="10" pageSize="12"/>
</body>
</html>
最终运行效果如第一张图所示;


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值