自定义一个分页插件

  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"/>

posted @ 2020-08-27 10:55  庄嘉豪  阅读(313)  评论(0编辑  收藏  举报