自定义标签(2)分页标签

自定义标签(二)分页标签

创建和使用一个标签的具体步骤如下:

  1. 创建标签的处理类(Tag Handler Class)
  2. 创建标签库描述文件(Tag Library Descrptor File)
  3. 在web.xml文件中配置元素
  4. 在jsp文件中引入标签库
import javax.servlet.http.HttpServletRequest;
/*****
 * 
 * @author wangyalei
 * 
 */
public class Pager {
	
	private int totalRows; // 数据总行数
	private int pageSize = 5;// 每页显示的行数
	private int currentPage; // 当前页号
	private int totalPages; // 总页数
	private int startRow;// 当前页在数据库中的起始行
	private String strUrl;// 出现[1][2][3][4]所用
	private int startPage;// 起始页码��
	private int endPage;// 结束页码��
	private boolean hasPreviousPage = false;// 上一页是否显示
	private boolean hasNextPage = false;// 下一页是否显示

	// 构造函数 总数
	// 对各个变量进行初始设置
	public Pager(int _totalRows) {
		totalRows = _totalRows;// 数据数量
		totalPages = totalRows / pageSize;// 页数
		if (totalRows % pageSize > 0) {
			totalPages++;
		}
		currentPage = 1;
		startRow = 0;
		if (totalPages > currentPage) {
			hasNextPage = true;
		}
		startPage = 1;
		// 当数据库中数据小于十页时
		if (totalPages < 10) {
			endPage = totalPages;
		} else {
			endPage = 10;
		}
	}

	public Pager() {
	}

	// 以下为类中字段的GET,SET访问器
	public int getStartRow() {
		return startRow;
	}

	public int getTotalPages() {
		return totalPages;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setTotalRows(int totalRows) {
		this.totalRows = totalRows;
	}

	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}

	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

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

	public int getTotalRows() {
		return totalRows;
	}

	public boolean getHasNextPage() {
		return hasNextPage;
	}

	public void setHasNextPage(boolean hasNextPage) {
		this.hasNextPage = hasNextPage;
	}

	public boolean getHasPreviousPage() {
		return hasPreviousPage;
	}

	public void setHasPreviousPage(boolean hasPreviousPage) {
		this.hasPreviousPage = hasPreviousPage;
	}

	public String getStrUrl() {
		return strUrl;
	}

	public void setStrUrl(String strUrl) {
		this.strUrl = strUrl;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	/*
	 * 方法名:previous 方法参数:空 方法返回值类型:void 方法功能:向上翻一页
	 */
	public void previous() {
		currentPage--;
		if (totalPages <= 10) {
			startPage = 1;
			endPage = totalPages;
		} else if (totalPages > 10 && totalPages <= 20) {
			startPage = 1;
			endPage = currentPage + 9 > totalPages ? totalPages
					: currentPage + 9;
		} else {
			if (currentPage <= 11) {
				startPage = 1;
				endPage = currentPage + 9;
			}
			if (currentPage > 11) {
				startPage = currentPage - 10;
				endPage = currentPage + 9;
			}
			if (currentPage + 9 >= totalPages) {
				startPage = totalPages - 19;
				endPage = totalPages;
			}
		}
		if (currentPage == 1) {
			hasPreviousPage = false;
		} else {
			hasPreviousPage = true;
		}
		if (currentPage == totalPages) {
			hasNextPage = false;
		} else {
			hasNextPage = true;
		}

		startRow = (currentPage - 1) * pageSize;
	}

	/*
	 * 方法名:next 方法参数:空 方法返回值类型:void 方法功能:向下翻一页
	 */
	public void next() {

		currentPage++;

		if (totalPages <= 10) {
			startPage = 1;
			endPage = totalPages;
		} else if (totalPages > 10 && totalPages <= 20) {
			startPage = 1;
			endPage = currentPage + 9 > totalPages ? totalPages
					: currentPage + 9;
		} else {
			if (currentPage <= 11) {
				startPage = 1;
				endPage = currentPage + 9;
			}
			if (currentPage > 11) {
				startPage = currentPage - 10;
				endPage = currentPage + 9;
			}
			if (currentPage + 9 >= totalPages) {
				startPage = totalPages - 19;
				endPage = totalPages;

			}
		}
		if (currentPage == 1) {
			hasPreviousPage = false;
		} else {
			hasPreviousPage = true;
		}
		if (currentPage == totalPages) {
			hasNextPage = false;
		} else {
			hasNextPage = true;
		}
		startRow = (currentPage - 1) * pageSize;
	}

	/*
	 * 方法名:getMyUrl 方法参数:空 方法返回值类型:void 方法功能:生成字符串送往客户端
	 */

	public void getMyUrl(String url) {

		StringBuffer myUrl = new StringBuffer();
		for (int i = startPage; i <= endPage; i++) {
			myUrl.append("<a href=" + url + "&currentPage=" + i
					+ "&totalPages=" + this.getTotalPages() + ">[" + i
					+ "]</a>");
		}
		strUrl = myUrl.toString();
	}

	/*
	 * 方法名:refresh 方法参数:int 方法返回值类型:void 方法功能:根据参数跳到指定页
	 */
	public void refresh(int _currentPage) {

		currentPage = _currentPage;
		if (totalPages <= 10) {
			startPage = 1;
			endPage = totalPages;
		} else if (totalPages > 10 && totalPages <= 20) {
			startPage = 1;
			endPage = currentPage + 9 > totalPages ? totalPages
					: currentPage + 9;
		} else {
			if (currentPage <= 11) {
				startPage = 1;
				endPage = currentPage + 9;
			}
			if (currentPage > 11) {
				startPage = currentPage - 10;
				endPage = currentPage + 9;
			}
			if (currentPage + 9 >= totalPages) {
				startPage = totalPages - 19;
				endPage = totalPages;
			}
		}
		if (currentPage == 1) {
			hasPreviousPage = false;
		} else {
			hasPreviousPage = true;
		}
		if (currentPage == totalPages) {
			hasNextPage = false;
		} else {
			hasNextPage = true;
		}
		startRow = (currentPage - 1) * pageSize;
	}

	public static Pager getPager(HttpServletRequest request, String url) {
		Pager pager = new Pager();
		pager.setCurrentPage(Integer.parseInt(request
				.getParameter("currentPage")));
		pager.setTotalPages(Integer
				.parseInt(request.getParameter("totalPages")));
		if (!StrUtil.isNull(request.getParameter("pageroperation"))) {
			if (StrUtil.isEqual(request.getParameter("pageroperation")
					.toString(), "previous")) {
				pager.previous();
				pager.getMyUrl(url);
			} else if (StrUtil.isEqual(request.getParameter("pageroperation")
					.toString(), "next")) {
				pager.next();
				pager.getMyUrl(url);
			}
		} else {
			pager.refresh(Integer.parseInt(request.getParameter("currentPage")
					.toString()));
			pager.getMyUrl(url);
		}
		return pager;
	}
}
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import com.handson.service.util.Pager;
/**********************
 * 
 * @author wangyalei
 *
 */
public class PaginationTag extends TagSupport {
	
	public int doStartTag() throws JspException {
		try {
			HttpServletRequest request = (HttpServletRequest) pageContext
					.getRequest();
			JspWriter out = pageContext.getOut();
			StringBuffer urlStr = new StringBuffer();
			if (StrUtil.isEqual(this.getHasPreviousPage(), "true")) {
				urlStr.append("<a href='");
				urlStr.append(action);
				urlStr.append("&pageroperation=previous&currentPage="+((Pager)request.getAttribute("page")).getCurrentPage()+"&totalPages="+((Pager)request.getAttribute("page")).getTotalPages()+"'>上一页</a>");
			}
			urlStr.append(url);
			if (StrUtil.isEqual(this.getHasNextPage(), "true")) {
				urlStr.append("<a href='");
				urlStr.append(action);
				urlStr.append("&pageroperation=next&currentPage="+((Pager)request.getAttribute("page")).getCurrentPage()+"&totalPages="+((Pager)request.getAttribute("page")).getTotalPages()+"'>下一页</a>");
			}
			
			out.print(urlStr);
		} catch (java.io.IOException e) {
			throw new JspTagException(e.getMessage());
		}

		return SKIP_BODY;
	}

	private String url;
	private String action;
	private String hasPreviousPage;
	private String hasNextPage;

	public String getHasPreviousPage() {
		return hasPreviousPage;
	}

	public void setHasPreviousPage(String hasPreviousPage) {
		this.hasPreviousPage = hasPreviousPage;
	}

	public String getHasNextPage() {
		return hasNextPage;
	}

	public void setHasNextPage(String hasNextPage) {
		this.hasNextPage = hasNextPage;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public String getUrl() {
		return url;
	}

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

 

<?xml version="1.0" encoding="UTF-8"?>
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>

	<tag>
	     <!-- 设定Tag的名字  -->
		<name>pagination</name>
		<!-- 设定Tag的处理类  -->
		<tag-class>com.tag.service.util.PaginationTag</tag-class>
		<!-- 表示标签中没有body  -->
		<body-content>empty</body-content>
		<attribute>
		        <!-- name:属性名称  -->
			<name>url</name>
				<!-- required:属性是否必需的,默认为false  -->
			<required>true</required>
		        <!-- rtexprvalue:属性值是否可以为request-time表达式,也就是类似于<%=…%>的表达式 默认为false -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>action</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>hasPreviousPage</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>hasNextPage</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>
 

 

<%@ page language="java" contentType="text/html; charset=gbk"
    pageEncoding="gbk"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@ taglib uri="/WEB-INF/Pagination.tld" prefix="p" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>系统帐户管理</title>
</head>
 <body>
<span class="STYLE1">系统参数</span><span class="STYLE5"><strong>|</strong><span class="STYLE3">系统帐户管理</span></span>
<form id="form1" name="form1" method="post" >
 <p:pagination url="${page.strUrl}" action="appUserManager.do?method=init" 
      hasPreviousPage="${page.hasPreviousPage}" hasNextPage="${page.hasNextPage}"/>
  </body>
</html>

 在jsp引擎遇到自定义标签的起始标志,就会调用doStartTag()方法,doStartTag()方法返回一个整数值,用来决定程序的后续流程。

 

  • Tag.SKIP_BODY :表示标签之间的内容被忽略
  • Tag.EVAL_BODY_INCLUDE:表示标签之间的内容正常执行

在jsp引擎遇到自定义标签的结束标志,就会调用doEndTag()方法,doStartTag()方法返回一个整数值,用来决定程序的后续流程。

  • Tag.SKIP_PAGE:表示立刻停止执行网页,网页尚未处理的静态内容与jsp程序均被忽略任何已有的输出的内容立刻返回到客户的浏览器上
  • tag_EVAL_PAGE:表示按照正常的流程继续执行jsp网页

一个标签处理类可以通过javax.servlet.jsp.PageContext与jsp交互,通过javax.servlet.jsp.PageContext类,标签处理类就可以访问jsp中的request,session和application对象