• 自定义一个分页插件


    1. 在WEB-INF创建一个文件夹tld,里面创建一个commons.tld文件

       1 //commons.tld
       2 <?xml version="1.0" encoding="UTF-8" ?>
       3 <!DOCTYPE taglib
       4   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
       5   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
       6 <taglib>
       7     <tlib-version>2.0</tlib-version>
       8     <jsp-version>1.2</jsp-version>
       9     <short-name>common</short-name>
      10     <!-- 名字可以随便写,相当于引入标签库中的uri -->
      11     <uri>http://zjh.com/common/</uri>
      12     <!-- 相当于给标签库起的名字 -->
      13     <display-name>Common Tag</display-name>
      14     <!-- 给标签库进行的描述 -->
      15     <description>Common Tag library</description>
      16     <!-- 在该标签库中定义一个标签 -->
      17     <tag>
      18     <!-- 标签的名称 -->
      19         <name>page</name>
      20         <!-- 和相关的类进行关联 -->
      21         <tag-class>com.zhiyou100.crm.tools.NavigationTag</tag-class>
      22         <body-content>JSP</body-content>
      23         <description>create navigation for paging</description>
      24         <!-- 定义标签中的一个属性名称是bean-->
      25         <attribute>
      26             <name>bean</name>
      27             <!-- 是否可以通过jsp表达式动态的进行赋值 -->
      28             <rtexprvalue>true</rtexprvalue>
      29         </attribute>
      30         <!-- 定义标签中的一个属性名称是number-->
      31         <attribute>
      32             <name>number</name>
      33             <!-- 是否可以通过jsp表达式动态的进行赋值 -->
      34             <rtexprvalue>true</rtexprvalue>
      35         </attribute>
      36         <!-- 定义标签中的属性 -->
      37         <attribute>
      38             <name>url</name>
      39             <!-- 是否是必须的 -->
      40             <required>true</required>
      41             <rtexprvalue>true</rtexprvalue>
      42         </attribute>
      43     </tag>
      44 </taglib>
    2. 创建一个pojo,

      public class Page<T> {
          
          private int total;//总条数
          private int page;//当前页
          private int size;//每页显示多少条
          private List<T> rows;//数据集合
          public int getTotal() {
              return total;
          }
          public void setTotal(int total) {
              this.total = total;
          }
          public int getPage() {
              return page;
          }
          public void setPage(int page) {
              this.page = page;
          }
          public int getSize() {
              return size;
          }
          public void setSize(int size) {
              this.size = size;
          }
          public List<T> getRows() {
              return rows;
          }
          public void setRows(List<T> rows) {
              this.rows = rows;
          }  
      }
      

        

    3. 创建一个NavigationTag工具类

      /**
       * 显示格式 上一页 1 2 3 4 5 下一页
       */
      public class NavigationTag extends TagSupport {
          static final long serialVersionUID = 2372405317744358833L;
          
          /**
           * request 中用于保存Page<E> 对象的变量名,默认为“page”
           */
          private String bean = "page";
          
          /**
           * 分页跳转的url地址,此属性必须
           */
          private String url = null;
          
          /**
           * 显示页码数量
           */
          private int number = 5;
          
          @Override
          public int doStartTag() throws JspException {
              JspWriter writer = pageContext.getOut();
              HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
              Page page = (Page)request.getAttribute(bean); 
              if (page == null) 
                  return SKIP_BODY;
              url = resolveUrl(url, pageContext);
              try {
                  //计算总页数
                  int pageCount = page.getTotal() / page.getSize();
                  if (page.getTotal() % page.getSize() > 0) {
                      pageCount++;
                  }
                  writer.print("<nav><ul class="pagination">");
                  //显示“上一页”按钮
                  if (page.getPage() > 1) {
                      String preUrl = append(url, "page", page.getPage() - 1);
                      preUrl = append(preUrl, "rows", page.getSize());
                      writer.print("<li><a href="" + preUrl + "">上一页</a></li>");
                  } else {
                      writer.print("<li class="disabled"><a href="#">上一页</a></li>");
                  }
                  //显示当前页码的前2页码和后两页码 
                  //若1 则 1 2 3 4 5, 若2 则 1 2 3 4 5, 若3 则1 2 3 4 5,
                  //若4 则 2 3 4 5 6 ,若10  则 8 9 10 11 12
                  int indexPage = (page.getPage() - 2 > 0)? page.getPage() - 2 : 1;  
                  for(int i=1; i <= number && indexPage <= pageCount; indexPage++, i++) {
                      if(indexPage == page.getPage()) {
                          writer.print( "<li class="active"><a href="#">"+indexPage+"<span class="sr-only"></span></a></li>");
                          continue;
                      }
                      String pageUrl  = append(url, "page", indexPage);
                      pageUrl = append(pageUrl, "rows", page.getSize());
                      writer.print("<li><a href="" + pageUrl + "">"+ indexPage +"</a></li>");
                  }
                  //显示“下一页”按钮
                  if (page.getPage() < pageCount) {
                      String nextUrl  = append(url, "page", page.getPage() + 1);
                      nextUrl = append(nextUrl, "rows", page.getSize());
                      writer.print("<li><a href="" + nextUrl + "">下一页</a></li>");
                  } else {
                      writer.print("<li class="disabled"><a href="#">下一页</a></li>");
                  }
                  writer.print("</nav>");
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return SKIP_BODY;
          }
          
          private String append(String url, String key, int value) {
      ​
              return append(url, key, String.valueOf(value));
          }
          
          /*
           * 为url添加参数,按照?跟参数类型和参数名称
           * 
           * 
           */
          private String append(String url, String key, String value) {
              if (url == null || url.trim().length() == 0) {
                  return "";
              }
      ​
              if (url.indexOf("?") == -1) {
                  url = url + "?" + key + "=" + value;
              } else {
                  if(url.endsWith("?")) {
                      url = url + key + "=" + value;
                  } else {
                      url = url + "&" + key + "=" + value;
                  }
              }
              
              return url;
          }
          
          /*
           * 为页码标签进行其他数据的拼接
           * 
           */
          private String resolveUrl(String url, javax.servlet.jsp.PageContext pageContext) throws JspException{
              Map params = pageContext.getRequest().getParameterMap();
              for (Object key:params.keySet()) {
                  if ("page".equals(key) || "rows".equals(key)) continue;
                  Object value = params.get(key);
                  if (value == null) continue;
                  if (value.getClass().isArray()) {
                      url = append(url, key.toString(), ((String[])value)[0]);
                  } else if (value instanceof String) {
                      url = append(url, key.toString(), value.toString());
                  }
              }
              return url;
          }
        
          public String getBean() {
              return bean;
          }
      ​
       
          public void setBean(String bean) {
              this.bean = bean;
          }
      ​
        
          public String getUrl() {
              return url;
          }
      ​
      ​
          public void setUrl(String url) {
              this.url = url;
          }
      ​
          public void setNumber(int number) {
              this.number = number;
          }
          
      }
      

        

    4. 打开commons.tld文件,根据需要进行修改,主要修改<uri>标签和<tag-class>标签,使得<tag-class>标签里的路径和NavigationTag工具类的所在路径保持一致

    5. 使用分页对象,页面获取的当前页码数的key值为”page“

    6. 组装分页对象,新建一个Page<T>对象,给里面的属性进行赋值

    7. 使用插件时需要在该页面的头部引入自定义分页标签库

      <%@ taglib prefix="zjh" uri="http://zjh.com/common/"%>

    8. 在页面需要插件的位置引入自定义标签

      <zjh:page url="${pageContext.request.contextPath}/user/listUser"/>

  • 相关阅读:
    SQL2005自动备份,定期删除的维护计划及自动定期清除日志
    asp.net(C#)生成Code39条形码 条码枪可以扫描出
    Oracle中自定义函数 无参数 输入参数 输出参数等各种用法
    SQL Server2005 实现两台服务器上的数据库同步
    C#后台给某网址传递参数,并接收返回值
    LINUX 11G RAC ASM磁盘组在线增加磁盘扩容 .
    使用SQL*PLUS构建完美excel或html输出
    Oracle RAC + Data Guard 环境搭建 .
    ORA15097: cannot SHUTDOWN ASM instance with connected client 和 ORA01031: insufficient privileges 处理方法
    AIX性能监控topas命令的详细解析
  • 原文地址:https://www.cnblogs.com/---------zjh---------/p/13570149.html
Copyright © 2020-2023  润新知