`

我写的一个自定义分页标签

阅读更多

一、标签处理类:还是采用继承自BodyTagSupport(其实继承自TageSupport也行),而没有采用SimpleTagSupport(?)

package org.qiujy.tag;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/**
 * 自定义分页标签
 * 1.从表单中获得全部查询条件参数,生成对应的<input type=hidden>以备下次提交查询条件参数及值.
 * 2.把当前页号(pageNo)设置成了请求参数,以便后台程序可以获得该值进行时时从数据数据库查询相应要显示的数据
 * 3.使用举例:
 *   a) 后台程序:
 *      //设置每页要显示的记录数,并保存到请求对象中(必须步骤)
 *      int pageSize = 20;
 *      request.setAttribute("pageSize", pageSize);
 *      //获取当前页号(必须步骤)
 *      String pageNo = request.getParameter("pageNo");
 *      //利用这两参数进行数据查询
 *      ...
 *      // 支持分页而在请求中设置的总记录数(必须步骤)
 *      request.setAttribute("total", size + "");
 *     
 *     
 *   b) 页面首先导入标签库: <%@ taglib uri="http://www.qiujy.cn" prefix="q"%>
 *   c) 页面使用标签: <q:pageTag recordCount="每页显示的记录数" gotoURI="要跳转到的目的地"/>
 *  
 * @author qiujy
 *
 */
public class PageControllerTag extends BodyTagSupport {

 /** 每页显示的记录数(标签的属性) */
 private int pageSize = 20;

 /** 目的地(标签的属性) */
 private String gotoURI;

 /** 总记录数名 */
 public static final String TOTAL = "total";

 /** 当前页号名 */
 public static final String PAGNENO = "pageNo";

 /** 每页要显示的记录数名 */
 public static final String RECORDCOUNT = "pageSize";

 /** 目的地名 */
 public static final String GOTOURI = "gotoURI";
 

 //标签处理程序
 public int doStartTag() throws JspException {
  /** 当前页号(从请求对象中得到) */
  int pageNo = 1;
  /** 总记录数(从请求对象中得到) */
  int total = 0;
  /** 总页数(计算得出) */
  int totalPage = 1;
  
  HttpServletRequest request = (HttpServletRequest) pageContext
    .getRequest();

  // 要输出到页面的HTML文本
  StringBuffer sb = new StringBuffer();

  sb.append("\r\n<form method='post' action='' ").append(
    "name='pageController'>\r\n");

  // 获取所有提交的参数(包括查询条件参数)
  Enumeration enumeration = request.getParameterNames();
  String name = null;
  String value = null;
  while (enumeration.hasMoreElements()) {
   name = (String) enumeration.nextElement();
   value = request.getParameter(name);
   
   if (name.equals(RECORDCOUNT)) {
    continue;
   }
   // 从请求对象中获取要跳转到的页号
   if (name.equals(PAGNENO)) {
    if (null != value && !"".equals(value)) {
     pageNo = Integer.parseInt(value);
     System.out.println("from request pageNo====>" + pageNo);
    }
    continue;
   }

   sb.append("<input type='hidden' name='").append(name).append(
     "' value='").append(value).append("'/>\r\n");
  }
  
  //把当前页号设置成请求参数
  System.out.println("tag:pageNo=====>" + pageNo);
  sb.append("<input type='hidden' name='").append(PAGNENO).append(
  "' value='").append(pageNo).append("'/>\r\n");

  // 从请求对象中获取总记录数
  String tot = (String) request.getAttribute(TOTAL);
  if (null != tot && !"".equals(tot)) {
   total = Integer.parseInt(tot);
  }
  //计算总页数
  totalPage = getTotalPage(total);

  System.out.println("total-->" + total);

  sb.append("<hr width='97%'/>\r\n");
  sb.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n");
  sb.append("总 ").append(totalPage).append(" 页,当前第 ").append(pageNo)
    .append(" 页\r\n");
  sb.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n");
  if (pageNo == 1) {
   sb.append("首页");
   sb.append("&nbsp;");
   sb.append("上一页\r\n");

  } else {
   sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>\r\n");
   sb.append("&nbsp;");
   sb.append("<a href='#' onclick='turnOverPage(")
     .append((pageNo - 1)).append(")'>上一页</a>\r\n");
  }

  sb.append("&nbsp;");
  if (pageNo == totalPage) {
   sb.append("下一页");
   sb.append("&nbsp;");
   sb.append("尾页\r\n");

  } else {
   sb.append("<a href='#' onclick='turnOverPage(")
     .append((pageNo + 1)).append(")'>下一页</a>\r\n");
   sb.append("&nbsp;");
   sb.append("<a href='#' onclick='turnOverPage(")
    .append(totalPage).append(")'>尾页</a>\r\n");
  }

  sb.append("&nbsp;");
  
  sb.append("跳到<select onChange='turnOverPage(this.value)'>\r\n");
  
  for(int i = 1; i <= totalPage; i++){
   if(i == pageNo){
    sb.append("  <option value='").append(i).append("' selected>第")
    .append(i).append("页</option>\r\n");
   }else{
    sb.append("  <option value='").append(i).append("'>第")
    .append(i).append("页</option>\r\n");
   }
  }
  sb.append("</select>\r\n");
  
//  sb.append("<input type='text' name='").append(PAGNENO).append(
//    "' size='3' maxlength='3'/>\r\n");
//  sb.append("<input type='button' value='GO'").append(
//    "onclick='turnOverPage(pageNo.value)'/>\r\n");
  sb.append("&nbsp;\r\n");
  sb.append("</form>\r\n");

  // 生成提交表单的JS
  sb.append("<script language='javascript'>\r\n");
  sb.append("  function turnOverPage(no){\r\n");
  sb.append("    var form = document.pageController;\r\n");
  sb.append("    //页号越界处理\r\n");
  sb.append("    if(no").append(">").append(totalPage).append(") {\r\n");
  sb.append("        no=").append(totalPage).append(";\r\n");
  sb.append("    }\r\n");
  sb.append("    if(no").append("<=0){\r\n");
  sb.append("        no=1;\r\n");
  sb.append("    }\r\n");
  sb.append("    form.").append(PAGNENO).append(".value=no;\r\n");
  sb.append("    form.action='").append(gotoURI).append("';\r\n");
  sb.append("    form.submit();\r\n");
  sb.append("  }\r\n");
  sb.append("</script>\r\n");

  try {
   pageContext.getOut().println(sb.toString());
  } catch (IOException e) {

   e.printStackTrace();
  }
  return super.doStartTag();
 }

 public String getGotoURI() {
  return gotoURI;
 }

 public void setGotoURI(String gotoURI) {
  this.gotoURI = gotoURI;
 }

 public int getPageSize() {
  return pageSize;
 }

 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }

 /**
  * 根据总记录数得到总页数
  *
  * @return int 总页数
  */
 private int getTotalPage(int total) {
  int totalPage = 1;
  if (total == 0) {
   totalPage = 1;
  } else {
   totalPage = (total % pageSize == 0) ? (total / pageSize)
     : (total / pageSize + 1);
  }

  return totalPage;
 }

}

 二、标签库描述文件:

<?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">
  <tlib-version>0.9</tlib-version>
  <short-name>myCustomerTag</short-name>
  <uri>http://www.qiujy.cn</uri>
  <tag>
    <name>pageTag</name>
    <tag-class>org.qiujy.tag.PageControllerTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
      <name>pageSize</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>gotoURI</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

三、页面使用:(由于是采用jsp2.0版本,所以不用在web.xml中声明tld文件了)

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="WEB-INF/c.tld" prefix="c"%>
<%@ taglib uri="WEB-INF/fn.tld" prefix="fn"%>
<%@ taglib uri="WEB-INF/fmt.tld" prefix="fmt"%>
<%@ taglib uri="http://www.qiujy.cn" prefix="q"%>
<html>
 <head>
  <title>博雅博客</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <link rel="StyleSheet" type="text/css" href="images/mystyle.css">
 </head>
 <body>
  <jsp:include flush="true" page="./templet/header.jsp"/>

  <table border="1" width="900" bordercolor="#FCD447" align="center">
   <tr>
    <td width="10%" valign="top">
    <!-- 导航栏开始 -->
     <table cellspacing="0" cellpadding="0" width="150" border="0">
      <tbody>
       <tr>
        <td>
         <table cellspacing="0" cellpadding="0" width="150" border="0">
          <tbody>
           <tr>
            <td colspan="2" height="5">
            <img src="./images/default_icon.jpg" alt="logo" >
            </td>
           </tr>
          </tbody>
          
          <tr>
          <td>
           <jsp:include flush="true" page="./templet/navigationbar.jsp"/>
          </td>
          </tr>

         </table>
        </td>
       </tr>
      </tbody>
     </table>
     <!-- 导航栏结束 -->
    </td>
    <td width="90%" valign="top">
     <table width="100%">
      <tr>
       <td><font color="#FF0000"><b>查询关键字:${keyword}&nbsp;&nbsp;相关文章 ${total} 篇</b></font>
      </td>
      </tr>
      <c:forEach var="art" items="${requestScope.artList}" end="9">
      <tr>
       <td>
         <table width="100%">
           <tr>
          <td><b>*&nbsp;<a href="articleDetail.do?id=${art.id}" class="a02">${art.title}</a>&nbsp;...
          &nbsp;&nbsp;&nbsp;&nbsp;
          <fmt:formatDate value="${art.pubTime}" pattern="yyyy-MM-dd"/></b></td>
           </tr>
           <tr>
          <td>
         &nbsp;&nbsp;&nbsp;&nbsp;<b>摘要:</b>${art.summary}
          </td>
           </tr>
        </table>
        </td>
      </tr>
      </c:forEach>
      <tr>
       <td><q:pageTag pageSize="${requestScope.pageSize}" gotoURI="searchArticle.do"/></td>
      </tr>
     </table>
    </td>
    
  </table>
  <jsp:include flush="true" page="./templet/footer.jsp" />
 </body>
</html>

分享到:
评论

相关推荐

    java分页标签自定义分页标签自定义分页标签

    自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签...

    jsp自定义分页标签

    本主题将深入探讨“jsp自定义分页标签”,这是一种在网页展示大量数据时非常实用的功能,它可以有效地帮助用户浏览和操作数据。 一、JSP自定义标签基础 JSP自定义标签是JSP技术的一部分,它允许开发者创建自己的...

    java自定义分页标签

    在Java开发中,自定义分页标签是一种常见的需求,它能帮助我们构建用户友好的界面,使得大量数据的展示变得更加高效和便捷。本教程将详细讲解如何创建和使用自定义分页标签,以及如何实现淘宝购物分页标签的样式。 ...

    Struts2自定义分页标签

    本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...

    自定义分页标签 Java

    自定义分页标签是指开发者根据项目需求创建的个性化分页组件,它能够灵活地与后端数据库交互,实现数据的分页展示。本文将深入探讨如何在Java环境中自定义分页标签,以及涉及到的相关技术点。 首先,我们需要理解...

    一个功能强大的自定义分页标签

    "一个功能强大的自定义分页标签"实例提供了一种高效且灵活的方式来处理分页问题,特别是对于那些希望通过自定义逻辑来增强其应用程序分页功能的开发者而言。 自定义标签是JSP(JavaServer Pages)技术的一部分,它...

    JSP自定义分页标签

    JSP自定义分页标签,mysql数据库,通过导入jar包,使用标签的方式实现分页的功能。

    自定义分页标签自定义分页标签

    在IT行业中,分页是一种常见的数据展示...总的来说,自定义分页标签是一个集前端UI设计、交互逻辑、数据处理和性能优化于一体的开发任务。开发者需要结合业务需求,综合运用多种技术,创造出既美观又实用的分页组件。

    这是一个自定义分页标签

    总的来说,自定义分页标签是一个强大的工具,可以帮助开发者轻松处理大数据量的展示问题,同时提供更高的可扩展性和可维护性。在项目中,可以根据具体需求对分页标签进行定制,以满足不同场景下的性能和功能要求。...

    非常好用的自定义分页标签

    在这个场景下,我们讨论的是一个名为"非常好用的自定义分页标签"的组件,它由一位个人开发者创建,并打包在一个名为"kevinb.jar"的Java档案文件中。 首先,我们需要理解什么是自定义标签。在JSP(JavaServer Pages...

    基于struts2 自定义标签 分页

    通过以上步骤,你可以创建一个基于Struts2的自定义分页标签,实现与Oracle数据库的交互。这个实践有助于提升你对Struts2框架的理解,同时掌握自定义标签和数据库操作的关键技能。记得在实际项目中,还需要关注安全性...

    自定义分页标签源代码

    本自定义分页标签源代码提供了一种解决方案,它独立于数据库操作,仅处理分页逻辑,允许开发者专注于数据获取和展示。接下来,我们将详细讨论相关知识点。 1. **自定义标签**: 自定义标签是JSP中的一种特性,允许...

    一个用于分页的自定义标签

    一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...

    自定义页面分页标签自定义页面分页标签

    这个文件可能是用于测试自定义分页标签的代码或示例。可能包含HTML、CSS、JavaScript文件,以及可能的服务器端脚本。通过查看和运行这个项目,你可以更深入地理解自定义分页标签的实现细节。 总的来说,自定义页面...

    一个自定义分页标签的实现

    总结,自定义分页标签的实现涉及Java的面向对象编程、JSP标签技术、数据库操作以及前端页面的渲染。通过这种方式,我们可以将业务逻辑和视图分离,提高代码的可读性和可维护性。实践这个项目不仅能加深对Java Web...

Global site tag (gtag.js) - Google Analytics