分页

来源:互联网 发布:java毕业论文开题报告 编辑:程序博客网 时间:2024/06/09 13:44
  1. package ssh.core.orm;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.commons.lang.StringUtils;  
  7.   
  8. import com.google.common.collect.Lists;  
  9. public class Page<T> {  
  10.     //-- 公共变量 --//  
  11.     public static final String ASC = "asc";  
  12.     public static final String DESC = "desc";  
  13.   
  14.     //-- 分页参数 --//  
  15.     protected int pageNo = 1;  
  16.     protected int pageSize = 1;  
  17.     protected String orderBy = null;  
  18.     protected String order = null;  
  19.     protected boolean autoCount = true;  
  20.        
  21.   
  22.     //-- 返回结果 --//  
  23.     protected List<T> result = Lists.newArrayList();  
  24.     protected long totalCount = -1;  
  25.   
  26.     private List list = new ArrayList(0);  //存放数据     
  27.     private int barNumbers = 10//几个为一条,默认为10    
  28.     private List listNumbers = new ArrayList(); //数字翻页条     
  29.       
  30.       
  31.     //-- 构造函数 --//  
  32.     public Page() {  
  33.     }  
  34.   
  35.     public Page(int pageSize) {  
  36.         this.pageSize = pageSize;  
  37.     }  
  38.   
  39.     //-- 访问查询参数函数 --//  
  40.     /** 
  41.      * 获得当前页的页号,序号从1开始,默认为1. 
  42.      */  
  43.     public int getPageNo() {  
  44.         return pageNo;  
  45.     }  
  46.   
  47.     /** 
  48.      * 设置当前页的页号,序号从1开始,低于1时自动调整为1. 
  49.      */  
  50.     public void setPageNo(final int pageNo) {  
  51.         this.pageNo = pageNo;  
  52.   
  53.         if (pageNo < 1) {  
  54.             this.pageNo = 1;  
  55.         }  
  56.     }  
  57.   
  58.     public Page<T> pageNo(final int thePageNo) {  
  59.         setPageNo(thePageNo);  
  60.         return this;  
  61.     }  
  62.   
  63.     /** 
  64.      * 获得每页的记录数量,默认为1. 
  65.      */  
  66.     public int getPageSize() {  
  67.         return pageSize;  
  68.     }  
  69.   
  70.     /** 
  71.      * 设置每页的记录数量,低于1时自动调整为1. 
  72.      */  
  73.     public void setPageSize(final int pageSize) {  
  74.         this.pageSize = pageSize;  
  75.   
  76.         if (pageSize < 1) {  
  77.             this.pageSize = 1;  
  78.         }  
  79.     }  
  80.   
  81.     public Page<T> pageSize(final int thePageSize) {  
  82.         setPageSize(thePageSize);  
  83.         return this;  
  84.     }  
  85.   
  86.     /** 
  87.      * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始. 
  88.      */  
  89.     public int getFirst() {  
  90.         return ((pageNo - 1) * pageSize) + 1;  
  91.     }  
  92.   
  93.     /** 
  94.      * 获得排序字段,无默认值.多个排序字段时用','分隔. 
  95.      */  
  96.     public String getOrderBy() {  
  97.         return orderBy;  
  98.     }  
  99.   
  100.     /** 
  101.      * 设置排序字段,多个排序字段时用','分隔. 
  102.      */  
  103.     public void setOrderBy(final String orderBy) {  
  104.         this.orderBy = orderBy;  
  105.     }  
  106.   
  107.     public Page<T> orderBy(final String theOrderBy) {  
  108.         setOrderBy(theOrderBy);  
  109.         return this;  
  110.     }  
  111.   
  112.     /** 
  113.      * 获得排序方向. 
  114.      */  
  115.     public String getOrder() {  
  116.         return order;  
  117.     }  
  118.   
  119.     /** 
  120.      * 设置排序方式向. 
  121.      *  
  122.      * @param order 可选值为desc或asc,多个排序字段时用','分隔. 
  123.      */  
  124.     public void setOrder(final String order) {  
  125.         //检查order字符串的合法值  
  126.         String[] orders = StringUtils.split(StringUtils.lowerCase(order), ',');  
  127.         for (String orderStr : orders) {  
  128.             if (!StringUtils.equals(DESC, orderStr) && !StringUtils.equals(ASC, orderStr)) {  
  129.                 throw new IllegalArgumentException("排序方向" + orderStr + "不是合法值");  
  130.             }  
  131.         }  
  132.   
  133.         this.order = StringUtils.lowerCase(order);  
  134.     }  
  135.   
  136.     public Page<T> order(final String theOrder) {  
  137.         setOrder(theOrder);  
  138.         return this;  
  139.     }  
  140.   
  141.     /** 
  142.      * 是否已设置排序字段,无默认值. 
  143.      */  
  144.     public boolean isOrderBySetted() {  
  145.         return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(order));  
  146.     }  
  147.   
  148.     /** 
  149.      * 查询对象时是否自动另外执行count查询获取总记录数, 默认为false. 
  150.      */  
  151.     public boolean isAutoCount() {  
  152.         return autoCount;  
  153.     }  
  154.   
  155.     /** 
  156.      * 查询对象时是否自动另外执行count查询获取总记录数. 
  157.      */  
  158.     public void setAutoCount(final boolean autoCount) {  
  159.         this.autoCount = autoCount;  
  160.     }  
  161.   
  162.     public Page<T> autoCount(final boolean theAutoCount) {  
  163.         setAutoCount(theAutoCount);  
  164.         return this;  
  165.     }  
  166.   
  167.     //-- 访问查询结果函数 --//  
  168.   
  169.     /** 
  170.      * 取得页内的记录列表. 
  171.      */  
  172.     public List<T> getResult() {  
  173.         return result;  
  174.     }  
  175.   
  176.     /** 
  177.      * 设置页内的记录列表. 
  178.      */  
  179.     public void setResult(final List<T> result) {  
  180.         this.result = result;  
  181.     }  
  182.   
  183.     /** 
  184.      * 取得总记录数, 默认值为-1. 
  185.      */  
  186.     public long getTotalCount() {  
  187.         return totalCount;  
  188.     }  
  189.   
  190.     /** 
  191.      * 设置总记录数. 
  192.      */  
  193.     public void setTotalCount(final long totalCount) {  
  194.         this.totalCount = totalCount;  
  195.     }  
  196.   
  197.     /** 
  198.      * 根据pageSize与totalCount计算总页数, 默认值为-1. 
  199.      */  
  200.     public long getTotalPages() {  
  201.         if (totalCount < 0) {  
  202.             return -1;  
  203.         }  
  204.   
  205.         long count = totalCount / pageSize;  
  206.         if (totalCount % pageSize > 0) {  
  207.             count++;  
  208.         }  
  209.         return count;  
  210.     }  
  211.   
  212.     /** 
  213.      * 是否还有下一页. 
  214.      */  
  215.     public boolean isHasNext() {  
  216.         return (pageNo +1 <= getTotalPages());  
  217.     }  
  218.   
  219.     /** 
  220.      * 取得下页的页号, 序号从1开始. 
  221.      * 当前页为尾页时仍返回尾页序号. 
  222.      */  
  223.     public int getNextPage() {  
  224.         if (isHasNext()) {  
  225.             return pageNo + 1;  
  226.         } else {  
  227.             return pageNo;  
  228.         }  
  229.     }  
  230.   
  231.     /** 
  232.      * 是否还有上一页. 
  233.      */  
  234.     public boolean isHasPre() {  
  235.         return (pageNo - 1 >= 1);  
  236.     }  
  237.   
  238.     /** 
  239.      * 取得上页的页号, 序号从1开始. 
  240.      * 当前页为首页时返回首页序号. 
  241.      */  
  242.     public int getPrePage() {  
  243.         if (isHasPre()) {  
  244.             return pageNo - 1;  
  245.         } else {  
  246.             return 1;  
  247.         }  
  248.     }  
  249.        
  250.       
  251.       
  252.             
  253.          
  254.   
  255.           
  256.         /** 
  257.          * 计算开始页和结束页 
  258.          *  
  259.          * @param barNumbers 页面中要显示的页面个数 
  260.          * @param pageNo  当前页 
  261.          * @param totalPages 总页面数 
  262.          * @return PageIndex 记录开始页(startindex)和结束页(endindex) 
  263.          */  
  264.         public List  getListNumbers( ) {  
  265.              List listn = new ArrayList();    
  266.              int totalPages = Integer.valueOf(String.valueOf(this.getTotalPages()));  
  267.             int startpage = pageNo - (barNumbers % 2 == 0 ? barNumbers / 2 - 1: barNumbers / 2);  
  268.             int endpage = pageNo + barNumbers / 2;  
  269.             if (startpage < 1) {  
  270.                 startpage = 1;  
  271.                 if (totalPages >= barNumbers)  
  272.                     endpage = barNumbers;  
  273.                 else  
  274.                     endpage = totalPages;  
  275.             }  
  276.             if (endpage > totalPages) {  
  277.                 endpage = totalPages;  
  278.                 if ((endpage - barNumbers) > 0)  
  279.                     startpage = endpage - barNumbers + 1;  
  280.                 else  
  281.                     startpage = 1;  
  282.             }  
  283.             for (int i = startpage; i <= endpage; i++) {  
  284.                  listn.add(i);   
  285.             }  
  286.             return   listn ;  
  287.         }  
  288.           
  289.         public void setListNumbers(List listNumbers) {  
  290.             this.listNumbers = listNumbers;  
  291.         }  
  292.   
  293.         public List getList() {    
  294.             return list;    
  295.         }    
  296.         public void setList(List list) {    
  297.             this.list = list;    
  298.         }    
  299.         public int getBarNumbers() {    
  300.             return barNumbers;    
  301.         }    
  302.         public void setBarNumbers(int barNumbers) {    
  303.             this.barNumbers = barNumbers;    
  304.         }    
  305. }  

页面中使用


[plain] view plaincopy
  1. <div class="digg" >   
  2.                 <a href="javascript:jumpPage(1)" style="padding-top:4px; margin-bottom:2px; margin:-3px;">首页</a>  
  3.                 <s:if test="page.hasPre">  
  4.                      <a href="javascript:jumpPage(${page.prePage})"><</a>  
  5.                 </s:if>  
  6.                   
  7.                 <s:iterator value = "page.listNumbers" var="stau"  >   
  8.                   <s:if test="#stau==page.pageNo">  
  9.                    <span  class = "current"> <s:property /></span>   
  10.                  </s:if>  
  11.                  <s:else>  
  12.                    <span> <a href="javascript:jumpPage(<s:property />)"><s:property /></a></span>   
  13.                  </s:else>  
  14.                 </s:iterator>  
  15.                   
  16.                 <s:if test="page.hasNext">  
  17.                     <a href="javascript:jumpPage(${page.nextPage})">></a>  
  18.                 </s:if>  
  19.                 <a href="javascript:jumpPage(${page.totalPages})" style="padding-top:4px; margin-bottom:2px;">末页</a>     
  20. </div>  

css
[css] view plaincopy
  1. DIV.digg {  
  2.  PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: 3px; PADDING-TOP: 3px; TEXT-ALIGN: center  
  3. }  
  4. DIV.digg A {  
  5.  BORDER-RIGHT: #aaaadd 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #aaaadd 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #aaaadd 1px solid; COLOR: #000099; PADDING-TOP: 2px; BORDER-BOTTOM: #aaaadd 1px solid; TEXT-DECORATION: none  
  6. }  
  7. DIV.digg A:hover {  
  8.  BORDER-RIGHT: #000099 1px solid; BORDER-TOP: #000099 1px solid; BORDER-LEFT: #000099 1px solid; COLOR: #000; BORDER-BOTTOM: #000099 1px solid  
  9. }  
  10. DIV.digg A:active {  
  11.  BORDER-RIGHT: #000099 1px solid; BORDER-TOP: #000099 1px solid; BORDER-LEFT: #000099 1px solid; COLOR: #000; BORDER-BOTTOM: #000099 1px solid  
  12. }  
  13. DIV.digg SPAN.current {  
  14.  BORDER-RIGHT: #000099 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #000099 1px solid; PADDING-LEFT: 5px; FONT-WEIGHT: bold; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #000099 1px solid; COLOR: #fff; PADDING-TOP: 2px; BORDER-BOTTOM: #000099 1px solid; BACKGROUND-COLOR: #000099  
  15. }  
  16. DIV.digg SPAN.disabled {  
  17.  BORDER-RIGHT: #eee 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #eee 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 2px; MARGIN: 2px; BORDER-LEFT: #eee 1px solid; COLOR: #ddd; PADDING-TOP: 2px; BORDER-BOTTOM: #eee 1px solid;   
  18. }  


显示效果


0 0