自定义分页标签详解-阿里云开发者社区

开发者社区> 开发与运维> 正文

自定义分页标签详解

简介: 最核心的自定义分页标签类的写法PagerTag.java,前提是要继承自TagSupport类 package com.

最核心的自定义分页标签类的写法PagerTag.java,前提是要继承自TagSupport类

package com.javacrazyer.web.tag;  
  
import java.io.IOException;  
import java.util.Enumeration;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.jsp.JspException;  
import javax.servlet.jsp.tagext.TagSupport;  
  
  
/** 
 * 分页标签处理类 
 */  
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(" 共<strong>").append(recordCount)  
                .append("</strong>项")  
                .append(",<strong>")  
                .append(pageCount)  
                .append("</strong>页: \r\n");  
              
            //上一页处理  
            if (pageNo == 1) {  
                sb.append("<span class=\"disabled\">« 上一页")  
                    .append("</span>\r\n");  
            } else {  
                sb.append("<a href=\"javascript:turnOverPage(")  
                  .append((pageNo - 1))  
                  .append(")\">« 上一页</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("…\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("…\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\">下一页 »")  
                    .append("</span>\r\n");  
            } else {  
                sb.append("<a href=\"javascript:turnOverPage(")  
                    .append((pageNo + 1))  
                    .append(")\">下一页 »</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;  
    }  
}
WEB-INF/pager.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>w</short-name>  
    <!--将来在页面用taglib引用时的uri属性,这部分的名字可以随便写,只要是符合HTTP网址形式的 -->  
    <uri>http://javacrazyer.iteye.com/tags/pager</uri>  
      
    <!-- 自定义标签的描述信息 -->  
    <tag>  
        <!-- 标签名 -->  
        <name>pager</name>  
        <!-- 对应的标签处理类全限定名 -->  
        <tag-class>com.javacrazyer.web.tag.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>

好了,就上面的两个基本要素就已经构成了完整的分页标签,下面就差在页面的使用方式了

一般的使用步骤为在JSP页面中:

先倒入标签库:<%@taglib uri="http://javacrazyer.iteye.com/tags/pager" prefix="w"%>

然后使用: <w:pager pageSize="${pageSize}" pageNo="${pageNo}" url="do.jsp" recordCount="${pm.recordCount}"/>




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章