分析自定义数据分页标签的案例

1.
package com.csdn.hbsi.Servlet;

import java.io.IOException;
import java.io.PrintWriter;
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);
}
}

}

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;
}
}


<%@ 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>

2.PageTag.java:TagSupport的实现子类。 在该类的doStartTag()方法中,我们要实现对页面分页标签的所有涉及参数初始值的设置。这些初始值包括:
private String url; // 请求url
private int pageSize = 10; // 每页要显示的记录数
private int pageNo = 1; // 当前页号
private int recordCount; // 总记录数
建立一个标签文件:PageTag.java,实现主要的分页数据计算,和页面分页样式的显示功能。所有页面可以直接引用该分页标签。该类实现TagSupport的继承。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值