zoukankan      html  css  js  c++  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='" + this.url + pref +   
    82.            "current=0'>[首页]</a> " + "<a href='" + this.url + pref +   
    83.            "current=" + page.getLastOffset() + "'>[<]</a> ");  
    84.        }else{  
    85.         s.append("<a href='" + this.url + pref + "current=0'>[首页]</a> " );  
    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='" + this.url + pref + "current=" + page.getNextOffset() + "'>[>]</a> " + "<a href='" +   
    98.            this.url + pref + "current=" + page.lastPageOffset() +   
    99.            "'>[尾页]</a> ");  
    100.        }else{  
    101.         s.append(" ""<a href='" +  this.url + pref + "current=" + page.lastPageOffset() + "'>[尾页]</a> ");  
    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> ");  
    130.          }else{  
    131.           s.append("<a href='" + this.url + pref + "current=" + i +   
    132.             "'>" + (i / page.getLength() + 1) + "</a> ");  
    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> ag-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,查看页面效果:

  • 相关阅读:
    第二章Redis管理实战
    第一章Redis入门部署及持久化介绍
    数据库命令
    第一章MySQL介绍及安装
    第十一章 MHA高可用及读写分离
    第八章 日志管理
    第九章 备份和恢复
    第十章 主从复制
    关系型数据库和非关系型数据库的对比
    MySQL面试题
  • 原文地址:https://www.cnblogs.com/564085446java/p/3725564.html
Copyright © 2011-2022 走看看