自定义分页标签详解

来源:互联网 发布:2016西决g6知乎 编辑:程序博客网 时间:2024/05/19 13:56

最核心的自定义分页标签类的写法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}"/>




0 0
原创粉丝点击