自定义标签(2)分页标签
自定义标签(二)分页标签
创建和使用一个标签的具体步骤如下:
- 创建标签的处理类(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 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对象