自定义数据分页标签

来源:互联网 发布:热恋软件 编辑:程序博客网 时间:2024/05/17 07:37

PagerTag.java:

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)' onclick='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)' onclick='turnOverPage(1)'>1</a>\r\n");
    sb
      .append("<a href='javascript:void(null)' onclick='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)' onclick='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)' onclick='turnOverPage("
        + (pageCount - 1)
        + ")'>"
        + (pageCount - 1)
        + "</a>\r\n");
   }
   if (end < pageCount) {
    sb
      .append("<a href='javascript:void(null)' onclick='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)' onclick='turnOverPage("
        + (pageNo + 1) + ")'>&laquo;&nbsp下一页</a>\r\n");
   }
   sb.append("</form>\r\n");
   sb.append("<script language='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;
 }
}


TestPagerServlet.java:

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

}

Pager.jsp:

<%@ page language="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>

 

Tag.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>

web.xml:

<?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>