自定義分頁標籤詳解

nqmysb發表於2017-01-06

最核心的自定義分頁標籤類的寫法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>
");  
        sb.append("<div class="pagination">
");  
        if(recordCount == 0){  
            sb.append("<strong>沒有可顯示的專案</strong>
");  
        }else{  
            //頁號越界處理  
            if(pageNo > pageCount){      pageNo = pageCount; }  
            if(pageNo < 1){      pageNo = 1; }  
              
            sb.append("<form method="post" action="").append(this.url)  
                .append("" name="qPagerForm">
");  
              
            //獲取請求中的所有引數  
            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(""/>
");  
            }  
      
            // 把當前頁號設定成請求引數  
            sb.append("<input type="hidden" name="").append("pageNo")  
                .append("" value="").append(pageNo).append(""/>
");  
              
            // 輸出統計資料  
            sb.append(" 共<strong>").append(recordCount)  
                .append("</strong>項")  
                .append(",<strong>")  
                .append(pageCount)  
                .append("</strong>頁: 
");  
              
            //上一頁處理  
            if (pageNo == 1) {  
                sb.append("<span class="disabled">« 上一頁")  
                    .append("</span>
");  
            } else {  
                sb.append("<a href="javascript:turnOverPage(")  
                  .append((pageNo - 1))  
                  .append(")">« 上一頁</a>
");  
            }  
              
            //如果前面頁數過多,顯示"..."  
            int start = 1;   
            if(this.pageNo > 4){  
                start = this.pageNo - 1;  
                sb.append("<a href="javascript:turnOverPage(1)">1</a>
");  
                sb.append("<a href="javascript:turnOverPage(2)">2</a>
");  
                sb.append("…
");  
            }  
            //顯示當前頁附近的頁  
            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>
");  
                }else{  
                    sb.append("<a href="javascript:turnOverPage(")  
                        .append(i)  
                        .append(")">")  
                        .append(i)  
                        .append("</a>
");  
                }  
            }  
            //如果後面頁數過多,顯示"..."  
            if(end < pageCount - 2){  
                sb.append("…
");  
            }  
            if(end < pageCount - 1){  
                sb.append("<a href="javascript:turnOverPage(")  
                .append(pageCount - 1)  
                .append(")">")  
                .append(pageCount - 1)  
                .append("</a>
");  
            }  
            if(end < pageCount){  
                sb.append("<a href="javascript:turnOverPage(")  
                .append(pageCount)  
                .append(")">")  
                .append(pageCount)  
                .append("</a>
");   
            }  
              
            //下一頁處理  
            if (pageNo == pageCount) {  
                sb.append("<span class="disabled">下一頁 »")  
                    .append("</span>
");  
            } else {  
                sb.append("<a href="javascript:turnOverPage(")  
                    .append((pageNo + 1))  
                    .append(")">下一頁 »</a>
");  
            }  
            sb.append("</form>
");  
      
            // 生成提交表單的JS  
            sb.append("<script language="javascript">
");  
            sb.append("  function turnOverPage(no){
");  
            sb.append("    if(no>").append(pageCount).append("){");  
            sb.append("      no=").append(pageCount).append(";}
");  
            sb.append("    if(no<1){no=1;}
");  
            sb.append("    document.qPagerForm.pageNo.value=no;
");  
            sb.append("    document.qPagerForm.submit();
");  
            sb.append("  }
");  
            sb.append("</script>
");  
        }  
        sb.append("</div>
");  
          
        //把生成的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}”/>


相關文章