国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Java > 正文

java分頁工具類的使用方法

2024-07-14 08:40:05
字體:
供稿:網(wǎng)友

說明:曾經(jīng)在網(wǎng)上看過花樣繁多的分頁,很多都號(hào)稱如何通用,但很多時(shí)候往往不盡如人意:有在分頁類中還加入U(xiǎn)RL地址信息的,有在分頁類中還進(jìn)行分頁動(dòng)作處理(此動(dòng)作完全屬于操作數(shù)據(jù)庫方面的事情)的?,F(xiàn)在好了,經(jīng)本人總結(jié)與提煉:

無論你是否自己手動(dòng)分頁,還是借助了框架進(jìn)行分頁。此工具類都可以幫助你達(dá)到穩(wěn)定的分頁效果(包括導(dǎo)航頁碼功能),而且使用方法也相對(duì)簡(jiǎn)單:好了,廢話少說,代碼如下:

package test.dao;  import java.util.List;  /**  * 用于分頁的工具類  * @author 莫取網(wǎng)名  */ public class Pager<T> {   private List<T> list; //對(duì)象記錄結(jié)果集  private int total = 0; // 總記錄數(shù)  private int limit = 20; // 每頁顯示記錄數(shù)  private int pages = 1; // 總頁數(shù)  private int pageNumber = 1; // 當(dāng)前頁    private boolean isFirstPage=false;  //是否為第一頁  private boolean isLastPage=false;   //是否為最后一頁  private boolean hasPreviousPage=false; //是否有前一頁  private boolean hasNextPage=false;  //是否有下一頁    private int navigatePages=8; //導(dǎo)航頁碼數(shù)  private int[] navigatePageNumbers; //所有導(dǎo)航頁號(hào)    public Pager(int total, int pageNumber) {   init(total, pageNumber, limit);  }    public Pager(int total, int pageNumber, int limit) {   init(total, pageNumber, limit);  }    private void init(int total, int pageNumber, int limit){   //設(shè)置基本參數(shù)   this.total=total;   this.limit=limit;   this.pages=(this.total-1)/this.limit+1;      //根據(jù)輸入可能錯(cuò)誤的當(dāng)前號(hào)碼進(jìn)行自動(dòng)糾正   if(pageNumber<1){    this.pageNumber=1;   }else if(pageNumber>this.pages){    this.pageNumber=this.pages;   }else{    this.pageNumber=pageNumber;   }      //基本參數(shù)設(shè)定之后進(jìn)行導(dǎo)航頁面的計(jì)算   calcNavigatePageNumbers();      //以及頁面邊界的判定   judgePageBoudary();  }    /**   * 計(jì)算導(dǎo)航頁   */  private void calcNavigatePageNumbers(){   //當(dāng)總頁數(shù)小于或等于導(dǎo)航頁碼數(shù)時(shí)   if(pages<=navigatePages){    navigatePageNumbers=new int[pages];    for(int i=0;i<pages;i++){     navigatePageNumbers[i]=i+1;    }   }else{ //當(dāng)總頁數(shù)大于導(dǎo)航頁碼數(shù)時(shí)    navigatePageNumbers=new int[navigatePages];    int startNum=pageNumber-navigatePages/2;    int endNum=pageNumber+navigatePages/2;        if(startNum<1){     startNum=1;     //(最前navigatePages頁     for(int i=0;i<navigatePages;i++){      navigatePageNumbers[i]=startNum++;     }    }else if(endNum>pages){     endNum=pages;     //最后navigatePages頁     for(int i=navigatePages-1;i>=0;i--){      navigatePageNumbers[i]=endNum--;     }    }else{     //所有中間頁     for(int i=0;i<navigatePages;i++){      navigatePageNumbers[i]=startNum++;     }    }   }  }   /**   * 判定頁面邊界   */  private void judgePageBoudary(){   isFirstPage = pageNumber == 1;   isLastPage = pageNumber == pages && pageNumber!=1;   hasPreviousPage = pageNumber > 1;   hasNextPage = pageNumber < pages;  }      public void setList(List<T> list) {   this.list = list;  }   /**   * 得到當(dāng)前頁的內(nèi)容   * @return {List}   */  public List<T> getList() {   return list;  }   /**   * 得到記錄總數(shù)   * @return {int}   */  public int getTotal() {   return total;  }   /**   * 得到每頁顯示多少條記錄   * @return {int}   */  public int getLimit() {   return limit;  }   /**   * 得到頁面總數(shù)   * @return {int}   */  public int getPages() {   return pages;  }   /**   * 得到當(dāng)前頁號(hào)   * @return {int}   */  public int getPageNumber() {   return pageNumber;  }    /**   * 得到所有導(dǎo)航頁號(hào)   * @return {int[]}   */  public int[] getNavigatePageNumbers() {   return navigatePageNumbers;  }   public boolean isFirstPage() {   return isFirstPage;  }   public boolean isLastPage() {   return isLastPage;  }   public boolean hasPreviousPage() {   return hasPreviousPage;  }   public boolean hasNextPage() {   return hasNextPage;  }   public String toString(){   StringBuffer sb=new StringBuffer();   sb.append("[")    .append("total=").append(total)    .append(",pages=").append(pages)    .append(",pageNumber=").append(pageNumber)    .append(",limit=").append(limit)    .append(",isFirstPage=").append(isFirstPage)    .append(",isLastPage=").append(isLastPage)    .append(",hasPreviousPage=").append(hasPreviousPage)    .append(",hasNextPage=").append(hasNextPage)   .append(",navigatePageNumbers=");   int len=navigatePageNumbers.length;   if(len>0)sb.append(navigatePageNumbers[0]);   for(int i=1;i<len;i++){    sb.append(" "+navigatePageNumbers[i]);   }   sb.append(",list.size="+list.size());   sb.append("]");   return sb.toString();  } } 

關(guān)于用法:使用步驟如下:

1).不管是否用了條件查詢,首先count出相應(yīng)的總條數(shù)
2).構(gòu)造一個(gè)Pager類(關(guān)于limit參數(shù)可根據(jù)自身前臺(tái)進(jìn)行取舍)
3).根據(jù)構(gòu)造好的Pager類獲取已經(jīng)自動(dòng)糾正過的pageNumber參數(shù),-1再乘個(gè)limit,做為實(shí)際要查詢的第一條記錄的位置
4).設(shè)置要查從起始位置開始,直到第limit條的所有記錄.(如果手工分頁,則也有可能第二個(gè)參數(shù)是結(jié)尾記錄的位置偏移,具體情況視數(shù)據(jù)庫而定)
5).將[條件]查詢出的list設(shè)置入pager對(duì)象中并返回.
6).在展現(xiàn)層通過Servlet或Action或直接拿到這個(gè)pager對(duì)象即可使用,具體如何拼接url的事情,也應(yīng)該交由展現(xiàn)層來完成即可。

int totalCount=Integer.valueOf(queryCount.uniqueResult().toString()); Pager pager=new Pager(totalCount, pageNumber,limit); queryList.setFirstResult((pager.getPageNumber()-1)*limit); //容錯(cuò)處理 queryList.setMaxResults(limit); pager.setList(queryList.list()); return pager; 

上述代碼是使用了hibernate的一個(gè)簡(jiǎn)單示例。如果你是手工分頁,也按使用步驟來即可。

當(dāng)然了,分頁可以放在dao層來完成,也可以放在Service層來完成。而Servlet或Action則去調(diào)用service層的代碼。個(gè)人認(rèn)為:分頁其實(shí)也是一種業(yè)務(wù)需要,因此,可以將其放在業(yè)務(wù)層。因?yàn)镈AO層提供相應(yīng)的[條件查詢]list及[條件]統(tǒng)計(jì)count,在業(yè)務(wù)層完全可以根據(jù)自己的需要進(jìn)行方法調(diào)用(只不過需要按既定的步驟來罷了,當(dāng)然了,很多時(shí)候,業(yè)務(wù)都是有既定的流程步驟的)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁河县| 鹤山市| 财经| 大理市| 邹平县| 婺源县| 云梦县| 襄垣县| 攀枝花市| 惠水县| 石嘴山市| 资源县| 辰溪县| 布尔津县| 桃园县| 钟山县| 马尔康县| 青冈县| 伊宁县| 太康县| 罗平县| 太湖县| 淄博市| 高邑县| 绥芬河市| 通许县| 陵水| 永定县| 东乡族自治县| 邵阳县| 连江县| 枣强县| 仁化县| 大厂| 娄底市| 霞浦县| 眉山市| 名山县| 兴国县| 延寿县| 黑龙江省|