`
ln_ydc
  • 浏览: 266716 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

jsp自定义标签——分页标签

    博客分类:
  • Java
 
阅读更多

 

效果预览:

实现代码:

分页标签处理类:

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">
    				操作&nbsp;&nbsp;
    				<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>
 
  • 大小: 82.8 KB
分享到:
评论
6 楼 薛小强 2016-09-22  
document.forms['formName'];
里面放的是form的name值,不是id值。
5 楼 双双37278752 2014-06-24  
能给个完整的实现分页的代码吗?最好给出一个Demo,谢谢
4 楼 ribavnu 2013-03-19  
能给个完整的实现分页的代码吗?还是不能实现分页呀。
3 楼 ln_ydc 2012-08-03  
Zhang987526341 写道
请问,您在action或servlet里面的代码怎么写啊

Pagination<User> paga = userDao.list(pageNo, pageSize, deleteStatus);
			request.setAttribute("pagaination", paga);
2 楼 Zhang987526341 2012-07-30  
[align=center][/align]
1 楼 Zhang987526341 2012-07-30  
请问,您在action或servlet里面的代码怎么写啊

相关推荐

    jsp使用自定义标签taglib分页系列——完整例子

    jsp使用自定义标签taglib分页系列——完整例子

    基于SSM框架的旅游网站

    3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...

    后端+旅游网站+springboot+毕业设计

    3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...

    基于SSM使用idea构建的旅游网站---毕业设计

    3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...

    毕业设计 - 基于SSM使用idea构建的旅游网站

    3)分页使用的是jsp自定义标签; 4)上传图片到项目也是封装好了工具类; 5)在线支付调用易宝的支付接口; 6)自定义拦截器对为登陆用户进行拦截; 7)复杂的业务在于一个景点对应多个门票,想要门票显示在对应...

    低清版 大型门户网站是这样炼成的.pdf

    7.6.2 文本新闻列表分页控制自定义标签类textnewspagetag 502 7.6.3 图片新闻列表自定义标签类picnewstag 505 7.6.4 幻灯片新闻列表自定义标签类slidenewstag 507 7.6.5 struts2与ajax完全结合实现点击数加一 510...

    JAVA程序开发大全---上半部分

    20.6.3 分页显示系统中销售的所有宠物信息的页面newPet.jsp 366 20.6.4 显示销售的每个宠物详细信息的页面petInfo.jsp 368 20.7 显示宠物商品模块的实现 370 20.7.1 显示商品页面 370 20.7.2 定义对宠物商品信息进行...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码... 6 用Servlet实现分页查看数据库

    JAVA上百实例源码以及开源项目

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    JAVA上百实例源码以及开源项目源代码

    Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接与浏览,Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP  Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

Global site tag (gtag.js) - Google Analytics