自定义分页标签

本文档详细介绍了如何创建一个自定义分页标签,包括`PagerTag`类的实现,该类处理分页逻辑,jsp文件的编写展示分页效果,以及对应的servlet处理类和tld文件配置。通过这个实例,读者可以了解如何在Java Web应用中实现数据的分页显示。
摘要由CSDN通过智能技术生成
1.建立标签处理类
package com.csdn.hbsi.tags;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

public class PagerTag extends TagSupport {

private static final long serialVersionUID = 1L;
private String url; // 请求url
private int pageSize = 10; // 每页要显示的记录数
private int pageNo = 1; // 当前页号
private int recordCount; // 总记录数

public int doStartTag() throws JspException {

int pageCount = (recordCount + pageSize - 1) / pageSize; // 计算总页数

StringBuilder sb = new StringBuilder();
sb.append("\r\n<div class='pagination'>\r\n");
if (recordCount == 0) {
sb.append(" 没有可以显示的项目");
} else {
if (pageNo > pageCount) { // 页号越界处理
pageNo = pageCount;
}
if (pageNo < 1) {
pageNo = 1;
}
sb.append("<form method='post' action='' name='qPagerForm'>\r\n");
// 获取请求中的所有参数
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
Enumeration<String> enumeration = request.getParameterNames();
String name = null; // 参数名
String value = null; // 参数值
// 把所有的请求参数当作隐藏表单域
while (enumeration.hasMoreElements()) {
name = enumeration.nextElement();
value = request.getParameter(name);
// 去除页号
if (name.equals("pageNo")) {
if (value != null && !value.equals("")) {
pageNo = Integer.parseInt(value);
}
continue;
}
sb.append("<input type='hidden' name='" + name + "' value='"
+ value + "'/>\r\n");
}
// 把当前页号设置成请求参数
sb.append("<input type='hidden' name='" + "pageNo" + "' value='"
+ pageNo + "'/>\r\n");
sb.append("&nbsp;共<strong>" + recordCount + "</strong>项,<strong>"
+ pageCount + "</strong>页:&nbsp;\r\n");

// 上一页处理
if (pageNo == 1) {
sb.append("<span class='disabled'>&laquo;&nbsp;上一页</span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage("
+ (pageNo - 1) + ")'>&laquo;&nbsp上一页</a>\r\n");
}
// 如果前面页数过多,显示...
int start = 1;
if (this.pageNo > 4) {
start = this.pageNo - 1;
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage(1)'>1</a>\r\n");
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage(2)'>2</a>\r\n");
sb.append("&hellip;\r\n");
}
// 显示当前页附近的页
int end = this.pageNo + 1;
if (end > pageCount) {
end = pageCount;
}
for (int i = start; i <= end; i++) {
if (pageNo == i) { // 判断是否是当前页
sb.append("<span class='current'>" + i + "</span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage("
+ i + ")'>" + i + "</a>\r\n");
}
}
// 如果后面页数过多,显示...
if (end < pageCount - 2) {
sb.append("&hellip;\r\n");
}
if (end < pageCount - 1) {
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage("
+ (pageCount - 1)
+ ")'>"
+ (pageCount - 1)
+ "</a>\r\n");
}
if (end < pageCount) {
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage("
+ pageCount + ")'>" + pageCount + "</a>\r\n");
}

// 下一页的处理
if (pageNo == pageCount) {
sb
.append("<span class='disabled'>下一页&nbsp;&raquo; </span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xοnclick='turnOverPage("
+ (pageNo + 1) + ")'>&laquo;&nbsp下一页</a>\r\n");
}
sb.append("</form>\r\n");
sb.append("<script Xlanguage='javascript'>\r\n");
sb.append("function turnOverPage(no){\r\n");
sb.append("var qForm=document.qPagerForm;\r\n");
sb.append("if(no>" + pageCount + "){no=" + pageCount + ";}");
sb.append("if(no<1){no=1;}");
sb.append("qForm.pageNo.value=no;\r\n");
sb.append("qForm.action='" + url + "'\r\n");
sb.append("qForm.submit();\r\n}</script>\r\n");
}
sb.append("</div>\r\n");
try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Tag.SKIP_BODY;
}


public void setUrl(String url) {
this.url = url;
}

/**
* @param pageSize
* the pageSize to set
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

/**
* @param pageNo
* the pageNo to set
*/
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}

/**
* @param recordCount
* the recordCount to set
*/
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
}

2.我们来写jsp文件
<%@ page Xlanguage="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://csdn.hbsi/pageTag" prefix="q"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>自定义分页标签使用示例</title>
<style type="text/css">
body {
margin-top: 20px;
text-align: left;
font-family: 宋体, Arial, Verdana;
font-size: 13px;
line-height: 150%;
min-width: 800px;
word-break: break-all;
}

/* 分页标签样式 */
.pagination {
padding: 5px;
float: right;
}

.pagination a,.pagination a:link,.pagination a:visited {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #aaaadd;
text-decoration: none;
color: #006699;
}

.pagination a:hover,.pagination a:active {
border: 1px solid #ff0000;
color: #000;
text-decoration: none;
}

.pagination span.current {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #ff0000;
font-weight: bold;
background-color: #ff0000;
color: #FFF;
}

.pagination span.disabled {
padding: 2px 5px 2px 5px;
margin: 2px;
border: 1px solid #eee;
color: #ddd;
}
</style>
</head>

<body>
<div style="margin: 0px auto; width: 700px">
<div id="title">
<h3>
自定义数据分页标签的使用示例
</h3>
<hr />
</div>
<div id="data">
<table border="1" width="600px" align="center">
<% //从请求 中获取要进行分页的数据
List<String> datas = (List<String>) request.getAttribute("datas");
for (String str : datas) {
out.print("<tr><td>" + str + "</td></tr>");
}
%>
</table>
</div>
<%--自定义分页标签 --%>
<q:pager pageNo="${pageNo}" pageSize="${pageSize}" recordCount="${recordCount}" url="TestPagerServlet"/>


</div>
</body>
</html>
3.建立servlet处理类
package com.csdn.hbsi.Servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestPagerServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private List<String> datas;// 用户存储数据的集合
public static final int PAGER_PAGESIZE = 10; // 定义每页要显示的数据的条数

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");

int recordCount = this.datas.size(); // 获取总记录数

int pageNo = 1; // 获取当前页号
String pageNoStr = request.getParameter("pageNo");
if (pageNoStr != null && !pageNoStr.equals("")) {
pageNo = Integer.parseInt(pageNoStr);
}

// 获取分页数据
int start = (pageNo - 1) * PAGER_PAGESIZE; // 定义开始位置
int end = start + PAGER_PAGESIZE; // 定义结束位置
if (end > this.datas.size()) {
end = this.datas.size();
}
List<String> result = this.datas.subList(start, end); // subList方法返回列表中指定的start(包括)和end(不包括)之间的数据视图

// 把用于分页的数据和分页标签的需要的属性放到request中
request.setAttribute("datas", result);
request.setAttribute("pageNo", pageNo);
request.setAttribute("pageSize", PAGER_PAGESIZE);
request.setAttribute("recordCount", recordCount);

// 请求转发到JSP页面
request.getRequestDispatcher("/pager.jsp").forward(request, response);

}

/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occurs
*/
public void init() throws ServletException {// 在servlet初始化的时候进行的数据装载
// 准备用于分页的数据
datas = new ArrayList<String>();
for (int i = 1; i <= 123; i++) {
datas.add("字符串" + i);
}
}

}
4.建立tld文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>w</short-name>
<uri>http://csdn.hbsi/pageTag</uri>
<tag>
<name>pager</name>
<tag-class>com.csdn.hbsi.tags.PagerTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pageNo</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSize</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>recordCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
5.web的文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>TestPagerServlet</servlet-name>
<servlet-class>com.csdn.hbsi.Servlet.TestPagerServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>TestPagerServlet</servlet-name>
<url-pattern>/TestPagerServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值