欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springmvc應(yīng)用Mongodb分頁實現(xiàn)

 更新時間:2017年11月22日 08:35:32   作者:chunqiuwei  
這篇文章主要為大家詳細(xì)介紹了Springmvc應(yīng)用Mongodb分頁實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下

對于web應(yīng)用來說分頁顯示數(shù)據(jù)是是最基本的功能,作為經(jīng)常開發(fā)web應(yīng)用的程序員來說這個功能也小菜一碟,但是對于初學(xué)者來說卻是是個常見的問題,以前自學(xué)web開發(fā)的時候?qū)@個問題也是各種google,整了半天才實現(xiàn)。
  現(xiàn)在手中的項目正好也需要一個分頁的功能,這個項目用了spring mvc數(shù)據(jù)庫用到了mongodb,自己就寫了一個分頁的標(biāo)簽供整個項目來使用,今天周六加完班閑著沒事就把分頁的實現(xiàn)寫出來以便大家參考,不當(dāng)之處歡迎批評指正。

1)分頁:

一般都是把一次查詢分幾次查詢來顯示。用戶每次點擊頁數(shù)(或者上一頁下一頁)的時候?qū)嶋H上一次查詢請求。查詢設(shè)定數(shù)據(jù)的條數(shù)返回并顯示。

2)mongodb分頁用到的工具

     在查詢的時候需要用到Query來保存用戶的查詢條件,該類有兩個方法是實現(xiàn)分頁功能的核心一個是skip(int),一個是limit(int)方法,其中l(wèi)imit用來限制每次查詢的條數(shù),也是每顯示的條數(shù)。而skip是跳過當(dāng)前頁之前的所有頁面的數(shù)據(jù)條數(shù)開始查詢

3)分頁關(guān)鍵點(所需的數(shù)據(jù)):

i) 每頁顯示的條數(shù)pageSize
ii)當(dāng)前的頁數(shù)currentPage,而前面的skip方法傳入的參數(shù)就是根據(jù)currentPage和pageSize來決定的,skip = (currentPage-1)*pageSize

4)分頁的具體實現(xiàn)

通過上面的分析,分頁簡單來說就是用戶點擊分頁的時候提交一個關(guān)鍵數(shù)據(jù)(currentPage)到后臺,后臺根據(jù)currentPage來進(jìn)行分頁查詢;至于上面的pageSize,
在后臺設(shè)置一個變量來控制即可。

下面是項目中的用來查詢的基類:MongodbBaseDao<T>的部分代碼

//每頁顯示五條 
  protected static final int PAGE_SIZE = 8; 
  /** 
   * 通過條件查詢,查詢分頁結(jié)果 
   */ 
  public Pagination<T> getPage(int currentPage, Query query) { 
    //獲取總條數(shù) 
    long totalCount = this.mongoTemplate.count(query, this.getEntityClass()); 
    //總頁數(shù) 
    int totalPage = (int) (totalCount/PAGE_SIZE); 
     
    int skip = (currentPage-1)*PAGE_SIZE; 
     
    Pagination<T> page = new Pagination<T>(currentPage, totalPage, (int)totalCount); 
    query.skip(skip);// skip相當(dāng)于從那條記錄開始 
    query.limit(PAGE_SIZE);// 從skip開始,取多少條記錄 
     
    List<T> datas = this.find(query); 
     
    page.build(datas);//獲取數(shù)據(jù)   
     
    return page; 
  } 

上面的代碼中Pagination類保存了分頁所需的必要的數(shù)據(jù),比如當(dāng)前頁currentPage,總頁數(shù)totalPage,總條數(shù)totalCount,當(dāng)然還有數(shù)據(jù)集合List 用來保存頁面所需的數(shù)據(jù)。另外getEntityClass()是T所對應(yīng)的class對象(由子類來具體實現(xiàn))。例如項目中有一個子類VideoMongodbDao

@Service 
public class VideoMongodbDao extends MongodbBaseDao<Video> { 
 
  @Override 
  protected Class<Video> getEntityClass() { 
    return Video.class; 
  } 
} 

分頁數(shù)據(jù)封裝類Pagination<T>,里面提供了分頁的數(shù)據(jù)

public class Pagination<T> { 
 
  /** 每頁顯示條數(shù) */ 
  private Integer pageSize = 8; 
 
  /** 當(dāng)前頁 */ 
  private Integer currentPage = 1; 
 
  /** 總頁數(shù) */ 
  private Integer totalPage = 1; 
 
  /** 查詢到的總數(shù)據(jù)量 */ 
  private Integer totalNumber = 0; 
 
  /** 數(shù)據(jù)集 */ 
  private List items; 
 
  public Integer getPageSize() { 
 
    return pageSize; 
  } 

Pagination類還有一個重要的build方法,根據(jù)該類封裝的數(shù)據(jù)來設(shè)定分了多少頁,具體實現(xiàn)方法如下

/** 
   * 處理查詢后的結(jié)果數(shù)據(jù) 
   * 
   * @param items 
   *      查詢結(jié)果集 
   * @param count 
   *      總數(shù) 
   */ 
  public void build(List items) { 
    this.setItems(items); 
    int count = this.getTotalNumber(); 
    int divisor = count / this.getPageSize(); 
    int remainder = count % this.getPageSize(); 
    this.setTotalPage(remainder == 0 ? divisor == 0 ? 1 : divisor : divisor + 1); 
  } 

所以在對應(yīng)的controller對應(yīng)的方法中查詢的時候,可以這么處理

Query query = new Query(); 
    
    Criteria channleIdCri = Criteria.where("channelId").is(channel_id);  
    query.addCriteria(channleIdCri);  
    //獲取當(dāng)前頁 
    String currentPageStr = request.getParameter("currentPage"); 
    int currentPage = 0; 
    if (currentPageStr != null ){ 
    currentPage = Integer.valueOf(currentPageStr); 
    } 
 
    Pagination<Video> videos = dao.getPage(currentPage, query); 
    m.addAttribute("videos", videos);//from 

下面需要生成分頁當(dāng)行條,在這里用到了spring的標(biāo)簽來處理,對應(yīng)的是標(biāo)簽類PaginationTag,該類封裝了頁面表單form對應(yīng)的id,分頁顯示所需的數(shù)據(jù),以及分頁顯示可點擊的頁面的長度。該類如下

public class PaginationTag extends TagSupport { 
  /** 列表頁面的form標(biāo)簽id值 */ 
  private String form; 
   
  /** 與后臺交互,保存在request中的 數(shù)據(jù),該數(shù)據(jù)包含l */ 
  private String pageInfo;//request對應(yīng)的bean包含了分頁的一些數(shù)據(jù) 
   
  /** 分頁顯示可點擊頁數(shù)的長度 */ 
  private int size; 
   
  public PaginationTag(){ 
    this.form = "form"; 
    this.size = 5; 
  } 

生成的分頁導(dǎo)航條的代碼如下

@Override 
  public int doStartTag() throws JspException { 
    int half = size / 2; 
    int point = size / 2 + size % 2; 
    int start = 1; 
    int loop = size;     
    Pagination query = (Pagination) this.pageContext.getRequest().getAttribute(pageInfo);   
    int pageSize = query.getPageSize(); 
    int currentPage = query.getCurrentPage(); 
    int totalPage = query.getTotalPage(); 
    long totalNumber = query.getTotalNumber();    
    if(totalPage <= size){ 
      start = 1; 
      loop = totalPage; 
    }else{ 
      if(currentPage > point && currentPage < totalPage - half + 1){ 
        start = 1 + (currentPage - point); 
      }else if(currentPage > totalPage - half){ 
        start = totalPage - size + 1; 
      } 
    } 
       
    if(currentPage<=0){ 
      currentPage = 1; 
    } 
    StringBuilder sb = new StringBuilder(); 
    sb.append("<div class=\"box-ttl\"><div class=\"g4\">共 <span class=\"text-info\">"); 
    sb.append(totalNumber).append("</span> 條數(shù)據(jù)"); 
    sb.append("/共 <span class=\"text-info\">"); 
    if(totalNumber!=0){ 
      sb.append(totalPage).append("</span> 頁!</div><div class=\"box collapsed g6 flt-r\"><ul class=\"nav-menu\">"); 
    }else{ 
      sb.append(0).append("</span> 頁!</div><div class=\"box collapsed g6 flt-r\"><ul class=\"nav-menu\">"); 
    }     
    // 處理上一頁 
    if(currentPage == 1){ 
      sb.append("<li class=\"disabled\"><a href=\"#\">上一頁</a></li>"); 
    }else{ 
      sb.append("<li><a href=\"javascript:dopage(" + (currentPage - 1) + ",'" + form + "');\">上一頁</a></li>"); 
    }     
    // 處理中間數(shù)據(jù) 
    for(int i = start; i < start + loop; i++){ 
      //<li class="active"><a href="#" rel="external nofollow" rel="external nofollow" >1</a></li> 
      if(currentPage == i){ 
        sb.append("<li class=\"active\"><a href=\"#\">" + i + "</a></li>"); 
      }else{ 
        //<li><a href="#" rel="external nofollow" rel="external nofollow" >2</a></li> 
        sb.append("<li><a href=\"javascript:dopage(" + i + ",'" + form + "');\">" + i + "</a></li>"); 
      } 
    }     
    // 處理下一頁 
    if(currentPage == totalPage){ 
      sb.append("<li class=\"disabled\"><a href=\"#\">下一頁</a></li>"); 
    }else{ 
      sb.append("<li><a href=\"javascript:dopage(" + (currentPage + 1) + ",'" + form + "');\">下一頁</a></li>"); 
    } 
         
    sb.append("</ul></div></div>"); 
 
    sb.append("<input type=\"hidden\" id=\"currentPage\" name=\"currentPage\" value=\"" + currentPage + "\"/>"); 
     
    try { 
      pageContext.getOut().write(sb.toString()); 
    } catch (IOException e) { 
      throw new JspException(e.toString(), e); 
    }       
    return super.doStartTag(); 
  } 

有上面的標(biāo)簽可以發(fā)現(xiàn),每次點擊頁面頁數(shù)的時候是用過js的dopage方法來實現(xiàn)的,該js方法根據(jù)form.submit()來提交信息查詢信息(特別是currentPage數(shù)據(jù))
js的代碼如下

function dopage(currentPage,formid){ 
  $("#currentPage").val(currentPage); 
  $("#" + formid).submit(); 
} 

在jsp頁面中只需要添加上述標(biāo)簽即可(標(biāo)簽類Pagination以及轉(zhuǎn)換成tld文件了—)

<div> 
  <tv:pagination pageInfo="videos" form="video-form" size="5"></tv:pagination>  
</div> 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析關(guān)于java的序列化和反序列化

    淺析關(guān)于java的序列化和反序列化

    這篇文章主要介紹了淺析關(guān)于java的序列化和反序列化,所謂序列化,就是把要傳輸?shù)膶ο笠约跋嚓P(guān)信息轉(zhuǎn)換成字節(jié)數(shù)組進(jìn)行存儲的過程,而反序列化就是將字節(jié)數(shù)組再轉(zhuǎn)回對象的過程,需要的朋友可以參考下
    2023-07-07
  • Springboot詳解如何實現(xiàn)SQL注入過濾器過程

    Springboot詳解如何實現(xiàn)SQL注入過濾器過程

    這篇文章主要介紹了基于springboot實現(xiàn)SQL注入過濾器,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2022-06-06
  • java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼

    java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼

    這篇文章主要介紹了java 中JDBC連接數(shù)據(jù)庫代碼和步驟詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • dubbo泛化調(diào)用使用及原理示例解析

    dubbo泛化調(diào)用使用及原理示例解析

    這篇文章主要為大家介紹了dubbo泛化調(diào)用使用及原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Spring?Boot?調(diào)用外部接口的幾種方式

    Spring?Boot?調(diào)用外部接口的幾種方式

    在微服務(wù)架構(gòu)中,服務(wù)間的調(diào)用是不可或缺的環(huán)節(jié),本文主要介紹了Spring?Boot調(diào)用外部接口的幾種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Spring?Bean創(chuàng)建流程分析講解

    Spring?Bean創(chuàng)建流程分析講解

    很多時候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的管理
    2023-01-01
  • Java動態(tài)代理之?dāng)r截器的應(yīng)用

    Java動態(tài)代理之?dāng)r截器的應(yīng)用

    今天小編就為大家分享一篇關(guān)于Java動態(tài)代理之?dāng)r截器的應(yīng)用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 關(guān)于Hadoop的HDFS集群

    關(guān)于Hadoop的HDFS集群

    這篇文章主要介紹了關(guān)于Hadoop的HDFS集群,Hadoop 如何配置集群、不同的計算機(jī)里又應(yīng)該有怎樣的配置,這些問題是在學(xué)習(xí)中產(chǎn)生的。本章的配置中將會提供一個典型的示例,需要的朋友可以參考下
    2023-05-05
  • java 反射getClass .class 的使用方法示例

    java 反射getClass .class 的使用方法示例

    這篇文章主要介紹了java 反射getClass .class 的使用方法,結(jié)合實例形式分析了java類反射機(jī)制的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • 用Java實現(xiàn)簡單計算器功能

    用Java實現(xiàn)簡單計算器功能

    這篇文章主要為大家詳細(xì)介紹了用Java實現(xiàn)簡單計算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論