自定义标签(二)分页标签
创建和使用一个标签的具体步骤如下:
- 创建标签的处理类(Tag Handler Class)创建标签库描述文件(Tag Library Descrptor File)在web.xml文件中配置元素在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 + "¤tPage=" + 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¤tPage="+((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¤tPage="+((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 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对象