`

自定义分页标签最新修改版

阅读更多

 一、标签处理类:

  1. /**
  2.  *  ClassName: PagerTag.java
  3.  *  created on Oct 21, 2008
  4.  *  Copyrights 2008 qjyong All rights reserved.
  5.  *  EMail: qjyong@gmail.com
  6.  */
  7. package com.qiujy.tags;
  8. import java.io.IOException;
  9. import java.util.Enumeration;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.jsp.JspException;
  12. import javax.servlet.jsp.tagext.TagSupport;
  13. /**
  14.  * 自定义分页标签 
  15.  * 使用方式 <my:pager pageSize="10" 
  16.  *                   pageNo="1" 
  17.  *                   recordCount="100"
  18.  *                   url="index.jsp" />
  19.  * 
  20.  * @author qiujy
  21.  * 
  22.  */
  23. public class PagerTag extends TagSupport {
  24.     private int pageSize = 10// 每页要显示的记录数
  25.     private int pageNo = 1// 页号
  26.     private int recordCount; // 总记录数
  27.     private String url; // 目的地URL
  28.     
  29.     public void setPageSize(int pageSize) {
  30.         this.pageSize = pageSize;
  31.     }
  32.     public void setPageNo(int pageNo) {
  33.         this.pageNo = pageNo;
  34.     }
  35.     public void setRecordCount(int recordCount) {
  36.         this.recordCount = recordCount;
  37.     }
  38.     public void setUrl(String url) {
  39.         this.url = url;
  40.     }
  41.     // 主要的逻辑
  42.     @Override
  43.     public int doStartTag() throws JspException {
  44.         if(recordCount == 0){
  45.             return super.doStartTag();
  46.         }
  47.         
  48.         // 总页数
  49.         int pageCount = (recordCount + pageSize - 1) / pageSize;
  50.         // 页号越界处理
  51.         if (pageNo > pageCount) {
  52.             pageNo = pageCount;
  53.         }
  54.         if (pageNo < 1) {
  55.             pageNo = 1;
  56.         }
  57.         
  58.         StringBuilder sb = new StringBuilder();
  59.         
  60.         sb.append("<form name='pageController' id='pageController' action='' method='post'>\r\n")
  61.           .append("<input type='hidden' id='pageNo' name='pageNo' value='" + pageNo + "' />\r\n");
  62.         
  63.         //------------------------------------ 获取所有請求中的参数
  64.         HttpServletRequest request = (HttpServletRequest) pageContext
  65.                 .getRequest();
  66.         Enumeration<String> enumeration = request.getParameterNames();
  67.         String name = null;
  68.         String value = null;
  69.         //把请求中的所有参数当作隐藏表单域在页面中写出)
  70.         while (enumeration.hasMoreElements()) {
  71.             name =  enumeration.nextElement();
  72.             value = request.getParameter(name);
  73.             // 去除页号
  74.             if (name.equals("pageNo")) {
  75.                 if (null != value && !"".equals(value)) {
  76.                     pageNo = Integer.parseInt(value);
  77.                 }
  78.                 continue;
  79.             }
  80.             sb.append("<input type='hidden' name='")
  81.               .append(name)
  82.               .append("' value='")
  83.               .append(value)
  84.               .append("'/>\r\n");
  85.         }
  86.         //----------------------------------------------------
  87.         
  88.           
  89.         sb.append(" 总共有" + pageCount + "页,")
  90.           .append("当前是第" + pageNo + "页 \r\n");
  91.         
  92.         if (pageNo == 1) {
  93.             sb.append("首页");
  94.             sb.append(" ");
  95.             sb.append("上一页\r\n");
  96.         } else {
  97.             sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>\r\n");
  98.             sb.append(" ");
  99.             sb.append("<a href='#' onclick='turnOverPage(")
  100.                     .append((pageNo - 1)).append(")'>上一页</a>\r\n");
  101.         }
  102.         sb.append(" ");
  103.         if (pageNo == pageCount) {
  104.             sb.append("下一页");
  105.             sb.append(" ");
  106.             sb.append("尾页\r\n");
  107.         } else {
  108.             sb.append("<a href='#' onclick='turnOverPage(")
  109.                     .append((pageNo + 1)).append(")'>下一页</a>\r\n");
  110.             sb.append(" ");
  111.             sb.append("<a href='#' onclick='turnOverPage(").append(pageCount)
  112.                     .append(")'>尾页</a>\r\n");
  113.         }
  114.         
  115.         sb.append(" 跳到<select onChange='turnOverPage(this.value)'>\r\n");
  116.         for (int i = 1; i <= pageCount; i++) {
  117.             if (i == pageNo) {
  118.                 sb.append("  <option value='")
  119.                   .append(i)
  120.                   .append("' selected='selected'>第")
  121.                   .append(i)
  122.                   .append("页</option>\r\n");
  123.             } else {
  124.                 sb.append("  <option value='")
  125.                   .append(i)
  126.                   .append("'>第")
  127.                   .append(i)
  128.                   .append("页</option>\r\n");
  129.             }
  130.         }
  131.         sb.append("</select>\r\n");
  132.         sb.append(" \r\n");
  133.         sb.append("</form>\r\n");
  134.         
  135.         // 生成提交表单的JS
  136.         sb.append("<script language='javascript'>\r\n");
  137.         sb.append("  //翻页函数\t\n");
  138.         sb.append("  function turnOverPage(no){\r\n");
  139.         sb.append("    var form = document.pageController;\r\n");
  140.         sb.append("    //页号越界处理\r\n");
  141.         sb.append("    if(no").append(">").append(pageCount).append(") {\r\n");
  142.         sb.append("        no=").append(pageCount).append(";\r\n");
  143.         sb.append("    }\r\n");
  144.         sb.append("    if(no").append("< 1){\r\n");
  145.         sb.append("        no=1;\r\n");
  146.         sb.append("    }\r\n");
  147.         sb.append("    form.").append("pageNo").append(".value=no;\r\n");
  148.         sb.append("    form.action='").append(url).append("';\r\n");
  149.         sb.append("    form.submit();\r\n");
  150.         sb.append("  }\r\n");
  151.         sb.append("</script>\r\n");
  152.         
  153.         try {
  154.             pageContext.getOut().println(sb.toString());
  155.         } catch (IOException e) {
  156.             e.printStackTrace();
  157.         }
  158.         
  159.         return super.doStartTag();
  160.     }
  161. }

二、标签库描述文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
  3.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  4.  <tlib-version>2.0</tlib-version>
  5.  <short-name>my</short-name>
  6.  <uri>http://blog.csdn.net/qjyong</uri>
  7.  <tag>
  8.     <description>通用分页标签</description>
  9.     <name>pager</name>
  10.     <tag-class>com.qiujy.tags.PagerTag</tag-class>
  11.     <body-content>empty</body-content>
  12.     <attribute>
  13.       <name>pageNo</name>
  14.       <required>true</required>
  15.       <rtexprvalue>true</rtexprvalue> 
  16.     </attribute>
  17.     <attribute>
  18.       <name>recordCount</name>
  19.       <required>true</required>
  20.       <rtexprvalue>true</rtexprvalue>
  21.     </attribute>
  22.     <attribute>
  23.       <name>pageSize</name>
  24.       <required>true</required>
  25.       <rtexprvalue>true</rtexprvalue>
  26.     </attribute>
  27.     <attribute>
  28.       <name>url</name>
  29.       <required>true</required>
  30.       <rtexprvalue>true</rtexprvalue>
  31.     </attribute>
  32.   </tag>
  33. </taglib>

三、把标签处理类和tld打成pager.jar包。使用时只需添加到项目的类路径中即可。

 

四、测试:先写一个Servlet来创建测试数据

  1. package com.qiujy.web.servlet;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class MyServlet extends HttpServlet {
  10.     
  11.     public static List<String> list = new ArrayList<String>();
  12.     
  13.     public MyServlet(){
  14.         for(int i = 0; i < 100; i++){
  15.             list.add("aaa" + i);
  16.         }
  17.     }
  18.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  19.             throws ServletException, IOException {
  20.         this.doPost(request, response);
  21.     }
  22.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  23.             throws ServletException, IOException {
  24.         String pageNoStr = request.getParameter("pageNo");
  25.         int pageNo = 1;
  26.         if(pageNoStr != null && !pageNoStr.equals("")){
  27.             pageNo = Integer.parseInt(pageNoStr);
  28.         }
  29.         
  30.         int recordCount = list.size();
  31.         int pageSize = 10;
  32.         int startNo = (pageNo - 1) * pageSize;
  33.         
  34.         List<String> result = list.subList(startNo, startNo + 10);
  35.         
  36.         request.setAttribute("recordCount", recordCount);
  37.         request.setAttribute("pageNo", pageNo);
  38.         request.setAttribute("pageSize", pageSize);
  39.         request.setAttribute("data", result);
  40.         
  41.         request.getRequestDispatcher("index.jsp").forward(request, response);
  42.     }
  43. }

web.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  6.     <servlet>
  7.         <servlet-name>pageTestServlet</servlet-name>
  8.         <servlet-class>com.qiujy.web.servlet.MyServlet</servlet-class>
  9.     </servlet>
  10.     <servlet-mapping>
  11.         <servlet-name>pageTestServlet</servlet-name>
  12.         <url-pattern>/testpager</url-pattern>
  13.     </servlet-mapping>
  14.     
  15.     <welcome-file-list>
  16.         <welcome-file>index.jsp</welcome-file>
  17.     </welcome-file-list>
  18. </web-app>

 

页面:index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://blog.csdn.net/qjyong" prefix="q" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5.   <head>
  6.     <title>PagerTag使用示例</title>
  7.   </head>
  8.   
  9.   <body>
  10.     <
  11.       List<String> list = (List<String>)request.getAttribute("data");
  12.       for(String str : list){
  13.         out.println(str + "<br/>");
  14.       }
  15.     %>
  16.     
  17.     <q:pager pageNo="${pageNo}" 
  18.                  recordCount="${recordCount}"
  19.              pageSize="${pageSize}" 
  20.              url="testpager" />
  21.   </body>
  22. </html>

 

访问testpager后的效果图:

 

 

分享到:
评论
3 楼 weideming 2008-12-23  
       错了,那个该是/除号,写成%百分号了
List<String> result = new ArrayList();
if(pageNo == (recordCount/pageSize+1)){
          result = list.subList(startNo,recordCount);
}else{
          result = list.subList(startNo, startNo + 10);
}
2 楼 weideming 2008-12-23  
    Servlet里面 这样稍微修改下该很好用了,
    用subList()好像没有充足的数据就会报错

         List<String> result = new ArrayList();
if(pageNo == (recordCount%pageSize+1)){
result = list.subList(startNo,recordCount);
}else{
result = list.subList(startNo, startNo + 10);
}
1 楼 weideming 2008-12-23  
        99条记录的话,最后一页将报错

相关推荐

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

    自定义分页标签是指开发者根据项目需求,为应用程序创建的特定分页组件,以便更好地控制和美化页面的分页显示。本篇文章将深入探讨自定义分页标签的相关知识点。 首先,我们要理解什么是分页。分页是将大量数据分割...

    一个JSP自定义通用分页标签最新修改版及其使用示例

    一个JSP自定义通用分页标签最新修改版及其使用示例。 可先参看:http://blog.csdn.net/qjyong/archive/2008/11/06/3240303.aspx 的介绍再决定下载。

    js-swiper-分页标签加进度条-自定义位置加进度条

    在Swiper中自定义分页标签和进度条的位置,主要通过CSS来实现。你可以调整这些元素的`position`, `top`, `right`, `bottom`, `left`等属性,让它们在页面上的任何地方显示。例如: ```css .swiper-pagination { ...

    自定义分页控件和Table表格,附源码

    本实例提供了一个自定义分页控件和多表头处理的Table表格的实现,帮助开发者更好地理解和运用这些技术。 首先,让我们深入探讨自定义控件。在.NET框架中,自定义控件允许开发者根据特定需求扩展或创建新的用户界面...

    JSP自定义分页标签TAG全过程

    JSP自定义分页标签是一种在Java Server Pages中实现分页功能的自定义标签,它通过TLD文件(标签库描述文件)来定义和描述标签的属性和行为,实现分页显示的功能。以下是关于JSP自定义分页标签全过程的一些详细知识点...

    最好最好的java万能分页标签

    它不仅可以应用于各种数据库,还能适应不同的前端展示需求,例如更改每页显示的数量、自定义分页样式等。对于熟悉Java和Struts的开发者来说,通过这个分页标签可以在短时间内高效地实现分页功能,提升开发效率。 ...

    自定义数字分页源码

    首先,从标题“自定义数字分页源码”我们可以知道,这是一个用于创建自定义分页功能的源代码。这意味着开发者可以根据具体需求定制分页样式和逻辑,而不是依赖于预设的库或框架。这在某些场景下尤其有用,比如当需要...

    让Dede的分页标签pagelist支持中英文双语版.txt

    修改分页标签的参数 为了使`pagelist`支持多语言,我们可以在调用该标签时添加一个新的参数`pagelang`,该参数用于指定当前使用的语言类型。例如: ```php {dede:pagelist pagelang='en' listsize='5' /} ``` 其中...

    分页插件.zip

    3. **自定义样式**:插件允许开发者自定义分页按钮的样式,可以通过CSS来改变按钮的外观,满足不同网站设计需求。 4. **多种导航模式**:除了常见的数字分页,还可以提供“上一页”、“下一页”、“首页”、“末页...

    Mybatis分页拦截器

    3. 自定义分页逻辑:根据不同的数据库(如MySQL、Oracle等),拦截器需要处理不同的分页语法。 4. 兼容性测试:由于不同的Mybatis版本可能有不同的API或行为,因此需要确保拦截器在目标版本下正常工作。 在压缩包...

    jsp分页插件11.2版

    - **自定义模板**:允许开发者自定义分页链接的HTML结构,以满足复杂布局需求。 - **缓存优化**:插件可能包含缓存机制,减少不必要的数据库查询,提高性能。 ### 五、常见问题与解决 在使用过程中,可能会遇到如...

    eWebEditor 编辑器带分页符

    eWebEditor增加分页符功能意味着开发者可以自定义分页算法,根据需要将长文章按照特定规则(例如字数、段落等)分割成多页。这可能涉及到对源代码的深入理解和修改,以确保分页符的插入不会破坏原有HTML结构,并且在...

    JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页界面优化最终版

    4. **标签库**:在描述中未明确提及,但通常在JSP页面中,我们会使用JSTL(JavaServer Pages Standard Tag Library)或自定义标签来简化HTML和Java代码的混合,提高可读性和可维护性。 5. **学生管理系统**:这个...

    织梦分页插件

    此外,插件的样式可以根据网站的总体设计进行自定义,通过修改CSS文件来调整分页按钮的外观,使其更好地融入网站风格。 总的来说,"织梦分页插件"是提高织梦CMS首页性能和用户体验的重要工具,其安装和配置涉及到对...

    html5分页控件

    1. **HTML5基础知识**:HTML5是超文本标记语言的最新版本,增加了许多新特性,如语义化标签、离线存储、拖放功能以及媒体元素等。在创建分页控件时,可以利用这些新特性来提高网页的可访问性和性能。 2. **jQuery库...

    HTML分页插件pagination源码

    分页通常包含“上一页”、“下一页”、数字页码等元素,这些元素可以通过`&lt;a&gt;`标签来创建,设置合适的`href`属性指向相应的URL,以便用户点击后跳转到相应页面。 2. CSS样式: 为了使分页看起来美观,CSS代码会...

    修改mybatis的MBG工具源码,支持mysql分页

    标题 "修改mybatis的MBG工具源码,支持mysql分页" 暗示了我们需要讨论的话题是关于MyBatis Generator (MBG) 的自定义,特别是如何扩展它以支持MySQL数据库的分页功能。MBG 是一个强大的代码生成器,能够自动根据...

    PHPCMS V9.6.6 修改版

    32. 百度编辑器上传视频播放器由embed改成video标签 33. 添加本地关键词获取API,原官方关键词接口已失效 34. 添加站点自定义字段、栏目自定义字段、单网页自定义字段 35. 添加一键导入微信文章字段 36. 添加Word...

    mybatis分页共享

    MyBatis插件机制允许开发者自定义拦截器,这些拦截器可以拦截SQL执行的各个阶段,从而在特定时刻插入、修改或删除执行流程。在"mybatis分页共享"这个资源中,开发者创建了一个插件,它拦截了`StatementHandler`接口...

    带标签栏的强大分页视图.zip

    【标题】"带标签栏的强大分页视图.zip" 提供的是一个开源项目,它实现了一个功能丰富的分页视图,结合了标签栏(TabBar)功能,使得用户可以在多个页面间轻松切换,同时保持清晰的导航结构。这种设计常见于移动应用...

Global site tag (gtag.js) - Google Analytics