首页 > 代码库 > Java标签实现分页

Java标签实现分页

Java实现标签分页

 

      最近为了开发一个网站,里面要用分页功能,但是之前很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。

      代码主要分为三个类:

  1. PageTag 分页标签类
  2. Page 分页bean
  3. Constant 设置常量

     Page代码:

Java代码  收藏代码
  1. /** 
  2.  *  
  3.  * @author byyang 
  4.  *  
  5.  */  
  6. public class Page  
  7. {  
  8.     private int current = 0;  //当前页,默认为第一页  
  9.     private int size;     //记录总数  
  10.     private int length;   //每页的长度  
  11.     private String url;   //访问路径  
  12.       
  13.     public Page(int offset, int size, int length) {  
  14.         super();  
  15.         this.current = offset;  
  16.         this.size = size;  
  17.         this.length = length;  
  18.     }  
  19.       
  20.     /** 
  21.      * 获取总页数 
  22.      * @return 
  23.      */  
  24.     public int pageCount(){  
  25.         int pagecount = 0;  
  26.         if(this.size % this.length == 0){  
  27.             pagecount = this.size / this.length;  
  28.         }else{  
  29.             pagecount = this.size / this.length + 1;  
  30.         }  
  31.           
  32.         return pagecount;  
  33.     }  
  34.       
  35.     //最后一页开始条数  
  36.     public int lastPageOffset(){  
  37.         return this.size - lastPageSize();  
  38.     }  
  39.       
  40.     //最后一页页大小  
  41.     public int lastPageSize(){  
  42.         int lastpagesize = 0;  
  43.         if(this.size % this.length == 0){  
  44.             lastpagesize = this.length;  
  45.         }else{  
  46.             lastpagesize = this.size % this.length;  
  47.         }  
  48.         return lastpagesize;  
  49.     }  
  50.       
  51.     //获取起始页  
  52.     public int getOffset() {  
  53.         return current;  
  54.     }  
  55.     //总记录数  
  56.     public int getSize() {  
  57.         return size;  
  58.     }  
  59.     //每页大小  
  60.     public int getLength() {  
  61.         return length;  
  62.     }  
  63.     //获取访问路径  
  64.     public String getUrl() {  
  65.         return url;  
  66.     }  
  67.       
  68.     //上一页  
  69.     public int getLastOffset(){  
  70.         int offset = this.getOffset() - this.getLength();  
  71.         if(offset > 0){  
  72.             return offset;  
  73.         }else{  
  74.             return 0;  
  75.         }  
  76.           
  77.     }  
  78.     //下一页  
  79.     public int getNextOffset(){  
  80.         int offset =  this.getOffset() + this.getLength();  
  81.         if(offset > this.getSize()){  
  82.             return getLastOffset();  
  83.         }else{  
  84.             return offset;  
  85.         }  
  86.     }  
  87.       
  88.     public String getPageNavigation(){  
  89.         String pageNavigation = "";  
  90.         return pageNavigation;  
  91.     }  
  92.   
  93.     public void setOffset(int offset) {  
  94.         this.current = offset;  
  95.     }  
  96.   
  97.     public void setSize(int size) {  
  98.         this.size = size;  
  99.     }  
  100.   
  101.     public void setLength(int length) {  
  102.         this.length = length;  
  103.     }  
  104.   
  105.     public void setUrl(String url) {  
  106.         this.url = url;  
  107.     }  
  108. }  

 

 

   现在我们要实现PageTag标签类,自定义标签有两种实现TagSupport和SimpleTagSupport,两个都能实现这个功能,这个看个人选择了。

 

 

Java代码  收藏代码
  1. import java.io.IOException;  
  2. import javax.servlet.http.HttpServletRequest;  
  3. import javax.servlet.jsp.JspException;  
  4. import javax.servlet.jsp.JspWriter;  
  5. import javax.servlet.jsp.tagext.TagSupport;  
  6.   
  7. import com.byyang.util.Constants;  
  8. /** 
  9.  *  doStartTag()和doEndTag()返回值处理: 
  10.  * SKIP_BODY (0) :跳过了开始和结束标签之间的代码。 
  11.  * EVAL_BODY_INCLUDE(1):将body的内容输出到存在的输出流中 
  12.  * SKIP_PAGE(5): 忽略剩下的页面。 
  13.  * EVAL_PAGE隐含(6):继续执行下面的页 
  14.  * @author yangby 
  15.  * 
  16.  */  
  17. public class PageTag extends TagSupport{  
  18.     
  19.    private String url;  
  20.    
  21.    public String getUrl(){  
  22.      return this.url;  
  23.    }  
  24.    
  25.    public void setUrl(String url) {  
  26.      this.url = url;  
  27.    }  
  28.    
  29.    public int doEndTag()throws JspException{  
  30.      return EVAL_PAGE;  
  31.    }  
  32.     
  33.   
  34.  public int doStartTag() throws JspException{  
  35.      HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();  
  36.      //获取分页bean  
  37.      Page page = (Page)request.getAttribute("pager");  
  38.        
  39.      JspWriter out = this.pageContext.getOut();  
  40.      //拼接分页信息  
  41.      StringBuilder s = new StringBuilder();  
  42.      s.append("共 " + ((page.getSize() - 1) / page.getLength() + 1) + " 页   ");  
  43.    
  44.      //设置当前页第一条记录索引  
  45.      String current = request.getParameter("current");  
  46.      if(current != null && !"".equals(current)){  
  47.       page.setOffset(Integer.parseInt(current));  
  48.      }  
  49.      if (page.getSize() > page.getLength()){  
  50.     //获取连接符pref  
  51.     String pref;  
  52.     if (this.url.indexOf("?") > -1){  
  53.     pref = "&";  
  54.     }else {  
  55.     pref = "?";  
  56.     }  
  57.     this.doStart(s, page, pref);  
  58.     this.doBody(s, page, pref);  
  59.     this.doEnd(s,page,pref);  
  60.      }else{  
  61.        s.append("    ");  
  62.      }  
  63.      s.append(" 共 " + page.getSize() + " 条记录");  
  64.      try{  
  65.        out.println(s.toString());  
  66.      }catch (IOException e){  
  67.        e.printStackTrace();  
  68.      }  
  69.        
  70.      return SKIP_BODY;  
  71.    }  
  72.    
  73.  /** 
  74.   * //拼接"首页"和"<" 
  75.   * @param s 
  76.   * @param page 
  77.   * @param pref 
  78.   */  
  79.  public void doStart(StringBuilder s,Page page,String pref){  
  80.        if (page.getOffset() > 0){  
  81.         s.append("<a href=http://www.mamicode.com/‘" + this.url + pref +   
  82.            "current=0‘>[首页]</a>\n" + "<a href=http://www.mamicode.com/‘" + this.url + pref +   
  83.            "current=" + page.getLastOffset() + "‘>[<]</a>\n");  
  84.        }else{  
  85.         s.append("<a href=http://www.mamicode.com/‘" + this.url + pref + "current=0‘>[首页]</a>\n" );  
  86.        }  
  87.  }  
  88.    
  89.  /** 
  90.   * 拼接"尾页"和">" 
  91.   * @param s 
  92.   * @param page 
  93.   * @param pref 
  94.   */  
  95.  public void doEnd(StringBuilder s,Page page,String pref){  
  96.        if (page.getOffset() < page.getSize() - page.getLength()) {  
  97.         s.append("<a href=http://www.mamicode.com/‘" + this.url + pref + "current=" + page.getNextOffset() + "‘>[>]</a>\n" + "<a href=http://www.mamicode.com/‘" +   
  98.            this.url + pref + "current=" + page.lastPageOffset() +   
  99.            "‘>[尾页]</a>\n");  
  100.        }else{  
  101.         s.append("\n""<a href=http://www.mamicode.com/‘" +  this.url + pref + "current=" + page.lastPageOffset() + "‘>[尾页]</a>\n");  
  102.        }  
  103.  }  
  104.    
  105.  /** 
  106.   * 数字连接 
  107.   * @param s 
  108.   * @param page 
  109.   * @param pref 
  110.   */  
  111.  public void doBody(StringBuilder s,Page page,String pref){  
  112.    //显示半径  
  113.        int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();  
  114.         
  115.        //显示数字的连接从第几条开始  
  116.        int startOffset;  
  117.        if ((page.getOffset() < radius) || (page.pageCount() <= Constants.MAX_PAGE_INDEX)){  
  118.         startOffset = 0;  
  119.        }else{  
  120.          if (page.getOffset() < page.getSize() - radius){  
  121.            startOffset = page.getOffset() - radius;  
  122.          }else{  
  123.            startOffset = (page.getSize() / page.getLength() - Constants.MAX_PAGE_INDEX) *   
  124.              page.getLength();  
  125.          }  
  126.        }  
  127.        for (int i = startOffset; (i < page.getSize()) && (i < startOffset + Constants.MAX_PAGE_INDEX * page.getLength()); ){  
  128.          if (i == page.getOffset()){  
  129.            s.append("<b>" + (i / page.getLength() + 1) + "</b>\n");  
  130.          }else{  
  131.           s.append("<a href=http://www.mamicode.com/‘" + this.url + pref + "current=" + i +   
  132.             "‘>" + (i / page.getLength() + 1) + "</a>\n");  
  133.          }  
  134.          i += page.getLength();  
  135.        }  
  136.  }  
  137. }  

 静态参数类:

Java代码  收藏代码
  1. public class Constants {  
  2.       
  3.     public static int PAGE_SIZE = 5//每页大小  
  4.     public static int MAX_PAGE_INDEX = 5;//最多显示5个数字连接  
  5.       
  6. }  

 

编写tld文件mypage.tld: 

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  3. <taglib>  
  4.     <tlib-version>2.5</tlib-version>  
  5.     <jsp-version>1.2</jsp-version>  
  6.     <short-name>mypage</short-name>  
  7.     <uri>\tag-page</uri>  
  8.     <tag>  
  9.         <name>page</name>  
  10.         <tag-class>com.byyang.tag.PageTag</tag-class>  
  11.         <body-content>pg</body-content>  
  12.         <attribute>  
  13.             <name>url</name>  
  14.             <required>true</required>  
  15.             <rtexprvalue>true</rtexprvalue>  
  16.         </attribute>  
  17.     </tag>  
  18. </taglib>   

 

   配置web.xml

 

Xml代码  收藏代码
  1.  <!-- 自定义标签 -->  
  2.  <jsp-config>  
  3.   <taglib>  
  4.     <taglib-uri>/tag-page</taglib-uri>  
  5.     <taglib-location>/WEB-INF/mypage.tld</taglib-location>  
  6.   </taglib>  
  7. </jsp-config>  

 

在jsp页面中添加如下代码:

Js代码  收藏代码
  1. <%@ taglib uri="/tag-page" prefix="pg"%>  

 

你可以放到一个公共jsp里面一块引。

 

现在咱们可以测试一下了:

在jsp页面代码:

Html代码  收藏代码
  1. <div align="center">  
  2.   <h2>图书列表</h2>  
  3.   <table border=1>  
  4.    <s:iterator var="book" status="index" value="books">  
  5.     <s:if test="#index.odd == true">  
  6.     <tr style="background-color: yellow">      
  7.     </s:if>  
  8.     <s:else>  
  9.     <tr>  
  10.     </s:else>  
  11.      <td align="right">图书名称:</td>  
  12.      <td align="left"><s:property value="book"/></td>  
  13.     </tr>  
  14.    </s:iterator>  
  15.   </table>  
  16.   <pg:page url="getBookList.action"></pg:page>  
  17.  </div>  

 

Action中咱们设一个测试数据:

 

Java代码  收藏代码
  1. public class BookAction extends BaseAction {  
  2.    
  3.  private String[] books;  
  4.  private BookService bookService = new BookService();  
  5.    
  6.  public String execute() throws Exception {  
  7.     
  8.   setBooks(bookService.getBookList());  
  9.   Page page = new Page(1,65,5);  
  10.   request.setAttribute("pager", page);  
  11.     
  12.   return SUCCESS;  
  13.    
  14.  }  
  15.  public String[] getBooks() {  
  16.   return books;  
  17.  }  
  18.   
  19.  public void setBooks(String[] books) {  
  20.   this.books = books;  
  21.  }  
  22.   
  23. }  

 好的,接下来启动tomcat,查看页面效果: