自定义分页标签

2023-11-17

原文地址:http://blog.csdn.net/wjt1989wjt/article/details/4720350


步骤一:编写分页标签处理类

 

/**
 * 分页标签处理类
 */
public class PagerTag extends TagSupport {
 private static final long serialVersionUID = 5729832874890369508L;
 private String url;         //请求URI
 private int pageSize = 10;  //每页要显示的记录数
 private int pageNo = 1;     //当前页号
 private int recordCount;    //总记录数

 @SuppressWarnings("unchecked")
 public int doStartTag() throws JspException {
  int pageCount = (recordCount + pageSize - 1) / pageSize;  //计算总页数
  
  //拼写要输出到页面的HTML文本
  StringBuilder sb = new StringBuilder();
  
  
  sb.append("<style type=/"text/css/">");
  sb.append(".pagination {padding: 5px;float:right;font-size:12px;}");
  sb.append(".pagination a, .pagination a:link, .pagination a:visited {padding:2px 5px;margin:2px;border:1px solid #aaaadd;text-decoration:none;color:#006699;}");
  sb.append(".pagination a:hover, .pagination a:active {border: 1px solid #ff0000;color: #000;text-decoration: none;}");
  sb.append(".pagination span.current {padding: 2px 5px;margin: 2px;border: 1px solid #ff0000;font-weight: bold;background-color: #ff0000;color: #FFF;}");
  sb.append(".pagination span.disabled {padding: 2px 5px;margin: 2px;border: 1px solid #eee; color: #ddd;}");
  sb.append("</style>/r/n");
  sb.append("<div class=/"pagination/">/r/n");
  if(recordCount == 0){
   sb.append("<strong>没有可显示的项目</strong>/r/n");
  }else{
   //页号越界处理
   if(pageNo > pageCount){  pageNo = pageCount; }
   if(pageNo < 1){  pageNo = 1; }
   
   sb.append("<form method=/"post/" action=/"").append(this.url)
    .append("/" 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 (null != value && !"".equals(value)) {
      pageNo = Integer.parseInt(value);
     }
     continue;
    }
    sb.append("<input type=/"hidden/" name=/"")
      .append(name)
      .append("/" value=/"")
      .append(value)
      .append("/"/>/r/n");
   }
 
   // 把当前页号设置成请求参数
   sb.append("<input type=/"hidden/" name=/"").append("pageNo")
    .append("/" value=/"").append(pageNo).append("/"/>/r/n");
   
   // 输出统计数据
   sb.append("&nbsp;共<strong>").append(recordCount)
    .append("</strong>项")
    .append(",<strong>")
    .append(pageCount)
    .append("</strong>页:&nbsp;/r/n");
   
   //上一页处理
   if (pageNo == 1) {
    sb.append("<span class=/"disabled/">&laquo;&nbsp;上一页")
     .append("</span>/r/n");
   } else {
    sb.append("<a href=/"javascript:turnOverPage(")
      .append((pageNo - 1))
      .append(")/">&laquo;&nbsp;上一页</a>/r/n");
   }
   
   //如果前面页数过多,显示"..."
   int start = 1;
   if(this.pageNo > 4){
    start = this.pageNo - 1;
    sb.append("<a href=/"javascript:turnOverPage(1)/">1</a>/r/n");
    sb.append("<a href=/"javascript: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/">")
      .append(i)
      .append("</span>/r/n");
    }else{
     sb.append("<a href=/"javascript:turnOverPage(")
      .append(i)
      .append(")/">")
      .append(i)
      .append("</a>/r/n");
    }
   }
   //如果后面页数过多,显示"..."
   if(end < pageCount - 2){
    sb.append("&hellip;/r/n");
   }
   if(end < pageCount - 1){
    sb.append("<a href=/"javascript:turnOverPage(")
    .append(pageCount - 1)
    .append(")/">")
    .append(pageCount - 1)
    .append("</a>/r/n");
   }
   if(end < pageCount){
    sb.append("<a href=/"javascript:turnOverPage(")
    .append(pageCount)
    .append(")/">")
    .append(pageCount)
    .append("</a>/r/n");
   }
   
   //下一页处理
   if (pageNo == pageCount) {
    sb.append("<span class=/"disabled/">下一页&nbsp;&raquo;")
     .append("</span>/r/n");
   } else {
    sb.append("<a href=/"javascript:turnOverPage(")
     .append((pageNo + 1))
     .append(")/">下一页&nbsp;&raquo;</a>/r/n");
   }
   sb.append("</form>/r/n");
 
   // 生成提交表单的JS
   sb.append("<script language=/"javascript/">/r/n");
   sb.append("  function turnOverPage(no){/r/n");
   sb.append("    if(no>").append(pageCount).append("){");
   sb.append("      no=").append(pageCount).append(";}/r/n");
   sb.append("    if(no<1){no=1;}/r/n");
   sb.append("    document.qPagerForm.pageNo.value=no;/r/n");
   sb.append("    document.qPagerForm.submit();/r/n");
   sb.append("  }/r/n");
   sb.append("</script>/r/n");
  }
  sb.append("</div>/r/n");
  
  //把生成的HTML输出到响应中
  try {
   pageContext.getOut().println(sb.toString());
  } catch (IOException e) {
   throw new JspException(e);
  }
  return SKIP_BODY;  //本标签主体为空,所以直接跳过主体
 }

 public void setUrl(String url) {
  this.url = url;
 }
 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
 public void setPageNo(int pageNo) {
  this.pageNo = pageNo;
 }
 public void setRecordCount(int recordCount) {
  this.recordCount = recordCount;
 }
}

 

步骤二:配置TLD文件

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
 <tlib-version>0.9</tlib-version>
 <short-name>q</short-name>
 <uri>http://blog.csdn.net/qjyong/tags/pager</uri>
 
 <!-- 自定义标签的描述信息 -->
 <tag>
  <!-- 标签名 -->
  <name>pager</name>
  <!-- 对应的标签处理类全限定名 -->
  <tag-class>com.qiujy.web.tags.PagerTag</tag-class>
  <!-- 标签主体的类型 -->
  <body-content>empty</body-content>
  <!-- 当前页号属性的描述信息 -->
  <attribute>
   <!-- 属性名 -->
   <name>pageNo</name>
   <!-- 该属性是否为必要的 -->
   <required>true</required>
   <!-- 属性值是否可以在JSP运行时期动态产生 -->
   <rtexprvalue>true</rtexprvalue>
   <!-- 属性的数据类型 -->
   <type>int</type>
  </attribute>
  <!-- 总记录数属性的描述信息 -->
  <attribute>
   <name>recordCount</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
   <type>int</type>
  </attribute>
  <!-- 总页数属性的描述信息 -->
  <attribute>
   <name>pageSize</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
   <type>int</type>
  </attribute>
  <!-- 分页标签要跳转的URI属性的描述信息 -->
  <attribute>
   <name>url</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
 </tag>
</taglib>

 

第三步:在合适的位置使用

    先导入自定义标签库:<%@ taglib uri="http://blog.csdn.net/qjyong/tags/pager" prefix="q" %>

    在需要用到的地方使用:<q:pager pageSize="${msgForm.pageSize}" pageNo="${msgForm.pageNo}" url="${ctx}/msg/list.jspx" recordCount="${msgForm.recordCount}"/>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义分页标签 的相关文章

随机推荐

  • Mapreduce学习基础

    一 Mapreduce的基础 1 1 为什么要学习Mapreduce 1 单机资源受限 比如CPU 磁盘 2 分布式计算的程序的复杂度特别高 难度大 mapreduce就是解决以上问题的 1 利用集群的所有cpu 所有内存 所有磁盘 2 m
  • 【TCP/IP】第四章 IP协议

    4 1 即网际协议 TCP IP的心脏是互联网层 这一层主要是由IP Internet Protocol 和ICMP Internet Control Message Protocol 两个协议组成 IP相当于OSI参考模型的第3层 IP
  • 06-TensorFlow 自制数据集

    1 数据文件介绍 数据集下载 https download csdn net download qq 41865229 85254826 训练集60000张数字图片 测试集10000张图片 都是黑底白字的灰度图 每张图有28行28列个像素点
  • c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)

    首先定义数据库操作的标准接口IDBAccess 定义接口的基本功能 通过基本的接口设置 完成数据访问的统一抽象 public interface IDBAccess void Init string strServer string str
  • android编译时报错:Error parsing XML: unbound prefix 的错误原因及解决方案

    原因之一 拼写错误 例如 android写成androd之类 原因之二 xmlns没有添加 有的时候 自定了一些view 且新加了一些自定义的命名 那么需要添加声明到根上 如果忘了添加也会报这个错误 xmlns calendar http
  • javacv 人脸检测_使用JavaCV进行手和手指检测

    javacv 人脸检测 这篇文章是Andrew Davison博士发布的有关自然用户界面 NUI 系列的一部分 内容涉及使用JavaCV从网络摄像头视频提要中检测手 注意 本章的所有源代码都可以从http fivedots coe psu
  • 抖音微信消息推送情侣告白浪漫(简易版)

    抖音微信消息推送情侣告白浪漫 简易版 一 首先去微信公众平台用微信扫码登录 登录后会自动生成属于自己的appId appSecret 二 在上述登录后页面中下拉 用一个手机扫码会生成user id 即微信消息推送的接收方 三 点击下方的新增
  • PBR渲染原理

    PBR渲染原理 Tags computer graphics 基于PBR做渲染 需要涉及到很多物理学 几何学 热辐射学概念 本文将逐一介绍每个关键概念 并给出相关重要公式 微平面 microfacets 理论 微观尺度下的任意一个平面 su
  • bootstrap table 表头排序

    在columns 里面加上 sortable true 如下 columns field width 50 align center title sortable true
  • Calendar类介绍 获取对象方式 和方法

    重点 是一个抽象日历类 Calendar 类是一个抽象类 它为特定瞬间与一组诸如 YEAR MONTH DAY OF MONTH HOUR 等 日历字段之间的转换提供了一些方法 并为操作日历字段 例如获得下星期的日期 提供了一些方法 无法直
  • QML实现文件十六进制数据展示

    前言 将一个二进制文件直接拖放到Qt Creator中可以直接查看到以十六进制显示的数据格式 如 要实现一个这样的效果 还是要花不少时间的 在网上找了挺多示例 其中一个开源代码效果不错 参考这里 但是是在QWidget中实现的 通过继承QA
  • 小知识:随机生成26个字母中(一个或多个)的字母

    小知识 就直接上代码了 不多说 String str for int i 0 i lt 1 i str str char Math random 26 A 特别注意的2点 1 A 是随机生成大写的26个随机字母 2 a 是随机生成小写的26
  • LangChain之Output parsers

    LangChain之Output parsers Output parsers将LLM输出的文本 转换为structured data CommaSeparatedListOutputParser 解析结果为List 提示词如下 def g
  • 用python怎样实现滑动验证码呢?

    手把手带大家实现Bilibili模拟登陆 滑动验证码 项目 来肝 1 为什么要处理滑动验证码 在很多时候我们在做模拟登陆的时候会遇到滑动验证码 这个时候就必须要处理 2 目标网站 bilibili视频网站的滑动验证码 外链图片转存失败 源站
  • 头文件 sting.h 和 cstring 还有 string 区别

  • 显示器颜色不正常的原因是什么

    显示器是电脑的重要部件之一 显示器颜色不正常 会对我们看电脑造成很大影响 也很容易感觉到眼睛疲劳 显示器颜色不正常是怎么回事 应该怎么处理呢 下面为大家一一道来 显示器颜色不正常的根源 显示器是属于电脑的I O设备 即输入输出设备 它可以分
  • echarts之饼图制作+标示线

    1 安装echarts组件 npm install echarts s 2 在main js中全局引入以及挂载 import echarts from echarts 引入 Vue prototype echarts echarts 挂载
  • 对于Scanner类中next()和nextLine()的区别

    对于键盘录入对象Scanner对象的两个录入字符串方法的区别 Scanner sc new Scanner System in sc next 和 sc nextLine 的区别 next 对于录入的字符串碰到空格就会停止录入 nextLi
  • CentOS7 yum源修改为阿里,配置阿里epel源

    一 概念 区分 yum源 什么是yum源 yum是一个在CentOS RedHat和Fedora操作系统中使用的Shell前端软件包管理器 yum主要管理基于rpm的软件包 Centos先将发布的软件放置到YUM服务器内 然后分析这些软件的
  • 自定义分页标签

    原文地址 http blog csdn net wjt1989wjt article details 4720350 步骤一 编写分页标签处理类 分页标签处理类 public class PagerTag extends TagSuppor