首先看一下运行效果如下:
第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>
最终运行效果如第一张图所示;