自定义标签(二)分页标签
创建和使用一个标签的具体步骤如下:
创建标签的处理类(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 + 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=
%@ taglib uri= /WEB-INF/Pagination.tld prefix= p %
!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
html xmlns=
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对象