效果预览:
实现代码:
分页标签处理类:
package ln.ydc.blog.web.tag.myjsp; import java.io.IOException; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; import common.util.Pagination; /** * 分页标签处理类 * * @author yangdc * */ public class PaginationTag extends SimpleTagSupport { /** * 分页数据(required) */ private Pagination pagination; /** * 查询form的Id,默认为queryForm */ private String queryForm = "queryForm"; /** * 分页div,默认为paginationId */ private String divId = "paginationId"; /** * 分页样式,默认为technorati */ private String divClass = "technorati"; public void doTag() throws JspException, IOException { // 参数验证 StringBuffer strBuf = new StringBuffer(); strBuf.append("<script type=\"text/javascript\">"); strBuf.append("var paga_queryForm = document.forms['").append(queryForm).append("'];"); /* strBuf.append("var newInput = document.createElement('input');"); strBuf.append("newInput.type='hidden';"); strBuf.append("newInput.name='pageNo';"); strBuf.append("paga_queryForm.appendChild(newInput);"); */ strBuf.append("function paga_toPage(pageNo) {"); strBuf.append("paga_queryForm.pageNo.value=").append("pageNo;"); strBuf.append("paga_queryForm.submit();"); strBuf.append("}"); strBuf.append("</script>"); strBuf.append("<div id=\"").append(divId).append("\" class=\"").append(divClass).append("\">"); // 上一页 if (pagination.getPageNo() == 1) { // strBuf.append(" <a href=\"#\"><span class=\"first_link\">首页</span></a> "); strBuf.append(" <span class=\"disabled\">").append(" << </span> "); } else { // strBuf.append(" <a href=\"#\" onclick=\"paga_toPage(1);\"><span class=\"first_link\">首页</span></a> "); strBuf.append(" <a href=\"#\" onclick=\"paga_toPage(").append(pagination.getPageNo() - 1).append(")\"> << </a> "); } for (int i = pagination.getStartIndex(); i <= pagination.getEndIndex(); i++) { if (pagination.getPageNo() == i) { strBuf.append("<span class=\"current\">").append(i).append("</span>"); } else { strBuf.append("<a href=\"#\"").append(" onclick=\"paga_toPage(").append(i).append(");\">").append(i).append("</a>"); } } // 下一页 if (pagination.getPageNo() == pagination.getTotalPage()) { strBuf.append(" <span class=\"disabled\">").append(" >> </span> "); // strBuf.append(" <a href=\"#\"><span class=\"end_link\">末页</span></a> "); } else { strBuf.append(" <a href=\"#\" onclick=\"paga_toPage(").append(pagination.getPageNo() + 1).append(")\"> >> </a> "); // strBuf.append(" <a href=\"#\" onclick=\"paga_toPage(").append(pagination.getTotalPage()).append(")\"><span class=\"end_link\">末页</span></a> "); } strBuf.append("<span class=\"info\">(第").append(pagination.getPageNo()).append("/").append(pagination.getTotalPage()).append("页").append(" 共").append(pagination.getTotalRecord()).append( "条)</span>"); strBuf.append("</div>"); // System.out.println(strBuf.toString()); JspContext ctx = getJspContext(); JspWriter out = ctx.getOut(); out.print(strBuf.toString()); } public Pagination getPagination() { return pagination; } public void setPagination(Pagination pagination) { this.pagination = pagination; } public String getQueryForm() { return queryForm; } public void setQueryForm(String queryForm) { this.queryForm = queryForm; } public String getDivId() { return divId; } public void setDivId(String divId) { this.divId = divId; } public String getDivClass() { return divClass; } public void setDivClass(String divClass) { this.divClass = divClass; } }
分页工具类:
package common.util; import java.util.List; /** * 分页工具类 * @author ydc * * @param <T> */ public class Pagination<T> { // 以下4个属性必须指定 private List<T> records; // 分页数据 private int totalRecord; // 总记录数 private int pageNo; // 当前页码,第几页 private int pageSize; // 每页显示的记录数,每页显示多少条数据 private int totalPage; // 总页数 private int startIndex; // 开始索引 private int endIndex; // 结束索引 private int indexCount = 10;// 显示的索引数目,如:10的话, 则显示1-10, 2-11 // public Pagination() {} public Pagination(List<T> records, int totalRecord, int pageNo, int pageSize) { this.records = records; this.totalRecord = totalRecord; this.pageNo = pageNo; this.pageSize = pageSize; // 根据总记录数和每页显示数计算总页数(totalRecord+pageSize->totalPage) totalPage = this.totalRecord / this.pageSize; totalPage = (this.totalRecord % pageSize == 0) ? totalPage : (totalPage + 1); // 根据索引数目,当前页,总页数计算开始索引和结束索引(indexCount+pageNo+totalPage->startIndex+endIndex) startIndex = indexCount/2; startIndex = pageNo - (indexCount%2 == 0 ? (startIndex - 1) : startIndex); endIndex = pageNo + indexCount/2; // 1 <= startIndex < pageNo < endIndex <= totalPage // startIndex = pageNo - indexCount/2 // endIndex = pageNo + indexCount/2 if(startIndex < 1) { startIndex = 1; if(totalPage >= indexCount) { endIndex = indexCount; } else { endIndex = totalPage; } } if(endIndex > totalPage) { endIndex = totalPage; if(endIndex > indexCount) { startIndex = endIndex - indexCount + 1; } else { startIndex = 1; } } } /** * 获取分页数据 * @return */ public List<T> getRecords() { return records; } /** * 获取总记录数 * @return */ public int getTotalRecord() { return totalRecord; } /** * 当前页数(第几页) * @return */ public int getPageNo() { return pageNo; } /** * 每页显示数据记录数 * @return */ public int getPageSize() { return pageSize; } /** * 总页数 * @return */ public int getTotalPage() { return totalPage; } /** * 起始索引 * @return */ public int getStartIndex() { return startIndex; } /** * 结束索引 * @return */ public int getEndIndex() { return endIndex; } /****************************************************************/ /************************get/set方法******************************/ /****************************************************************/ public int getIndexCount() { return indexCount; } public void setIndexCount(int indexCount) { this.indexCount = indexCount; } }
标签声明文件:MyTaglib.tld
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>自定义标签类</description> <tlib-version>1.0</tlib-version> <short-name>Mytaglib</short-name> <uri></uri> <tag> <description>分页标签</description> <name>Pagination</name> <tag-class>ln.ydc.blog.web.tag.myjsp.PaginationTag</tag-class> <body-content>empty</body-content> <attribute> <description> Collection of items to iterate over. </description> <name>pagination</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.Object</type> </attribute> <attribute> <name>queryForm</name> <required>false</required> </attribute> <attribute> <name>divId</name> <required>false</required> </attribute> <attribute> <name>divClass</name> <required>false</required> </attribute> </tag> </taglib>
分页样式(具体见附件):
/*CSS technorati style pagination*/ DIV.technorati { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: 3px; PADDING-TOP: 3px; TEXT-ALIGN: center } DIV.technorati A { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 6px; BACKGROUND-POSITION: 50% bottom; BORDER-TOP: #ccc 1px solid; PADDING-LEFT: 6px; FONT-WEIGHT: bold; PADDING-BOTTOM: 2px; BORDER-LEFT: #ccc 1px solid; COLOR: rgb(66,97,222); MARGIN-RIGHT: 3px; PADDING-TOP: 2px; BORDER-BOTTOM: #ccc 1px solid; TEXT-DECORATION: none } DIV.technorati A:hover { BACKGROUND-IMAGE: none; COLOR: #fff; BACKGROUND-COLOR: #4261df } DIV.technorati A:active { BACKGROUND-IMAGE: none; COLOR: #fff; BACKGROUND-COLOR: #4261df } DIV.technorati SPAN.current { PADDING-RIGHT: 6px; PADDING-LEFT: 6px; FONT-WEIGHT: bold; PADDING-BOTTOM: 2px; COLOR: #000; MARGIN-RIGHT: 3px; PADDING-TOP: 2px } DIV.technorati SPAN.disabled { BORDER-RIGHT: #eee 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #eee 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #eee 1px solid; COLOR: #ddd; PADDING-TOP: 2px; BORDER-BOTTOM: #eee 1px solid /* DISPLAY: none */ }
应用实例:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> <%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="mytag"%> <c:set var="ctx" value="${pageContext.request.contextPath}"></c:set> <!-- 分页样式(附件中css.css文件) --> <link rel="stylesheet" type="text/css" href="${ctx }/res/styles/paginationStyle.css"> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>用户列表</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="${ctx }/admin/user" method="post" name="userListForm"> <input type="hidden" name="operation" value="list"/> <!-- 为了兼容ie --> <input type="hidden" name="pageNo" value="${pagination.pageNo }"> <table border="1"> <caption>用户列表</caption> <tr> <td>用户标识</td> <td>用户名</td> <td>真实姓名</td> <td>性别</td> <td>注册日期</td> <td>删除标志</td> <td colspan="3"> 操作 <a href="${ctx }/admin/user?operation=add">添加用户</a> </td> </tr> <c:forEach var="user" items="${pagination.records}"> <tr> <td>${user.id }</td> <td>${user.userName }</td> <td>${user.realName }</td> <td>${user.gender }</td> <td>${user.registerDate }</td> <td>${user.deleteFlag }</td> <td> <c:choose> <c:when test="${user.deleteFlag==0}"> <a href="${ctx }/admin/user?operation=delete&id=${user.id }&pageNo=${pagination.pageNo }">删除</a> </c:when> <c:otherwise> <a href="${ctx }/admin/user?operation=recover&id=${user.id }&pageNo=${pagination.pageNo }">恢复</a> </c:otherwise> </c:choose> </td> <td><a href="${ctx }/admin/user?operation=edit&id=${user.id }">编辑</a></td> <td><a href="${ctx }/admin/user?operation=info&id=${user.id }">查看</a></td> </tr> </c:forEach> </table> <mytag:Pagination pagination="${pagination}" queryForm="userListForm" divId="pagaId" /> </form> </body> </html>
相关推荐
jsp使用自定义标签taglib分页系列——完整例子
【JSP源码——分页 QQ菜单 jsp标签_noka3.9.zip】是一个包含JSP编程中的分页和自定义标签实现的源代码集合。这个压缩包主要展示了如何在JSP应用程序中创建一个类似QQ菜单的交互式界面,并利用JSP自定义标签来简化...
根据提供的压缩包文件名“jsp自定义标签——分页标签 - Free Coding - ITeye技术网站_files”,我们可以推断内容可能涉及自定义JSP分页标签的实现。通常,自定义标签的流程如下: 1. **创建Tag类**:继承`javax....
本文档将详细介绍一个使用Java Server Pages (JSP)技术实现的自定义分页标签——`PagerTag`。该标签允许开发者在不编写冗余代码的情况下轻松地在JSP页面中实现分页功能。 #### 二、标签简介 `PagerTag`是一个自定义...
本网上书店系统是一个基于MVC(Model-View-Controller)设计模式的Web应用程序,它整合了Java的两大核心框架——Struts和Hibernate,以及自定义标签技术,旨在提供一个高效、安全的图书浏览与购买平台。 **1. ...
这篇毕业设计论文主要聚焦在IT计算机领域,特别是Java后台开发中的一个重要实践——使用jsp标签来实现分页功能,以及QQ菜单的构建。这里我们将深入探讨这些知识点,以便更好地理解这个项目。 首先,让我们来了解**...
在`pagerdemo`中,可能包含了一个自定义的taglib,例如名为`pager.tld`的标签库描述符文件,它定义了分页标签的相关属性和方法。这个taglib可能有一个名为`<pager:display>`的标签,用于在页面上渲染分页组件。标签...
本文将深入探讨“分页组件——通用的分页标签”,以及如何在JSP环境中实现这一功能。 首先,我们要理解分页组件的基本原理。在网页上展示大量数据时,一次性加载所有数据可能导致页面加载速度慢,用户体验下降。...
本自制的Java分页标签通过两个关键参数——总页数和当前页数,实现了动态控制标签的显示,以提供用户友好的导航体验。下面将详细探讨分页标签的原理、实现方式以及如何自定义。 1. 分页原理: 分页的基本思想是将...
- 为了提高代码复用性和可维护性,开发者可能会使用JSP标准标签库(JSTL)或者自定义标签。这些标签可以简化页面逻辑,例如,用于分页、数据遍历等常见任务。 6. **响应式设计与前端技术**: - 考虑到多设备访问...
为了解决代码重复的问题,提高代码复用性以及增强代码的可维护性,Struts框架提供了一种机制——自定义标签(Custom Tags)来帮助开发者解决这一问题。 #### 1.2 自定义标签的实现方式 在Struts中实现自定义标签...
7. **核心技术**:JSP中的自定义标签(Tag Libraries)和Servlet可能会被用到,它们可以扩展JSP的功能并处理复杂逻辑。此外,DOM(Document Object Model)或SAX解析器用于处理XML文件,将XML数据转换为Java对象,...
《深入解析JSP源码——以Opencart简洁主题SimpleCart sot12为例》 在Web开发领域,JavaServer Pages(JSP)是一种广泛使用的动态网页技术,它允许开发者将HTML代码与Java代码相结合,以创建交互式、数据驱动的网页...
6. **JSP自定义标签**:如何创建和使用自定义标签,提高代码复用性和可读性。 7. **MVC模式**:探讨在JSP中实现Model-View-Controller架构,以分离业务逻辑、数据模型和用户界面。 **项目实践——网上书店** 教程...
JSP自定义标签库(Tag Libraries) 自定义标签库允许开发者创建可重用的组件,提高代码的可读性和可维护性。常见的有JSTL(JavaServer Pages Standard Tag Library),包含一系列用于处理XML、查询数据库等功能的...
3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...
3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...
3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...
【Jsp实验1】——构建动态网页的基石 在网页开发的世界里,JavaServer Pages(JSP)是一种强大的技术,它允许开发者将静态内容与动态数据结合起来,创建交互式的Web应用。"Jsp实验1"是初学者踏入JSP领域的第一步,...