Springmvc 응용 Mongodb 페이지 나누기 구현

웹 응용에 있어 페이지별 디스플레이 데이터는 가장 기본적인 기능이다. 웹 응용을 자주 개발하는 프로그래머로서 이 기능은 식은 죽 먹기지만 초보자에게는 흔히 볼 수 있는 문제이다. 이전에 웹 개발을 독학했을 때 이 문제에 대해서도 각종 구글이 반나절이 지나서야 실현되었다.
현재 수중의 프로젝트도 페이지 나누기 기능이 필요합니다. 이 프로젝트는springmvc 데이터베이스에서mongodb를 사용했습니다. 자신은 페이지 나누기 라벨을 써서 전체 프로젝트에 사용할 수 있도록 했습니다. 오늘 토요일에 출근을 마치고 일이 없으면 페이지 나누기의 실현을 써서 여러분이 참고하도록 했습니다. 부적절한 점은 비판과 지적을 환영합니다.
1) 페이지 나누기:
일반적으로 한 번의 조회를 몇 번의 조회로 나누어 표시한다.사용자가 페이지 수 (또는 이전 페이지 다음 페이지) 를 클릭할 때마다 실제로 조회 요청을 합니다.조회 설정 데이터의 갯수가 되돌아와 표시됩니다.
2) mongodb 페이지 나누기에 사용되는 도구
검색할 때Query를 사용하여 사용자의 검색 조건을 저장해야 합니다. 이 종류는 페이지 나누기 기능을 실현하는 두 가지 방법이 있습니다. 하나는 skip(int)이고, 하나는 limit(int) 방법입니다. 그 중에서 limit는 매번 검색의 갯수를 제한하는 데 사용되며, 표시된 갯수도 있습니다.skip은 현재 페이지의 모든 페이지를 건너뛰고 검색을 시작합니다
3) 페이지 나누기 포인트 (필요한 데이터):
i) 페이지당 표시줄 수 pageSize
ii) 현재 페이지 수currentPage, 앞의 skip 방법이 전송한 매개 변수는currentPage와 pageSize에 따라 결정됩니다. skip = (currentPage-1)*pageSize
4) 페이지별 구현
위의 분석을 통해 페이지를 나누는 것은 간단하게 말하면 사용자가 페이지를 클릭할 때 관건적인 데이터(current Page)를 백엔드에 제출하고 백엔드는current Page에 따라 페이지를 나누는 조회를 하는 것이다.위의 pageSize는
백그라운드에서 변수를 설정하여 제어하면 됩니다.
다음은 프로젝트에서 조회하는 기본 클래스입니다: MongodbBaseDao의 일부 코드

//  
  protected static final int PAGE_SIZE = 8; 
  /** 
   *  ,  
   */ 
  public Pagination<T> getPage(int currentPage, Query query) { 
    //  
    long totalCount = this.mongoTemplate.count(query, this.getEntityClass()); 
    //  
    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  
    query.limit(PAGE_SIZE);//  skip ,  
     
    List<T> datas = this.find(query); 
     
    page.build(datas);//    
     
    return page; 
  } 
위의 코드에서 Pagination 클래스는 페이지를 나누는 데 필요한 데이터를 저장합니다. 예를 들어 현재 페이지current Page, 총 페이지 수 total Page, 총 항목 수 total Count, 물론 데이터 집합 List는 페이지에 필요한 데이터를 저장하는 데 사용됩니다.또한 get Entity Class () 는 T에 대응하는class 대상입니다.예를 들어 프로젝트에 하위 클래스가 있습니다. VideoMongodbDao.

@Service 
public class VideoMongodbDao extends MongodbBaseDao<Video> { 
 
  @Override 
  protected Class<Video> getEntityClass() { 
    return Video.class; 
  } 
} 
페이지 데이터 패키지 클래스 Pagination, 페이지 데이터 제공

public class Pagination<T> { 
 
  /**   */ 
  private Integer pageSize = 8; 
 
  /**   */ 
  private Integer currentPage = 1; 
 
  /**   */ 
  private Integer totalPage = 1; 
 
  /**   */ 
  private Integer totalNumber = 0; 
 
  /**   */ 
  private List items; 
 
  public Integer getPageSize() { 
 
    return pageSize; 
  } 
Pagination 클래스는 또 하나의 중요한build 방법이 있는데 이 클래스가 봉인된 데이터에 따라 몇 페이지를 나누었는지 설정하고 구체적인 실현 방법은 다음과 같다.

/** 
   *   
   * 
   * @param items 
   *        
   * @param count 
   *        
   */ 
  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); 
  } 
그래서 대응하는 컨트롤러에 대응하는 방법에서 조회할 때 이렇게 처리할 수 있습니다

Query query = new Query(); 
    
    Criteria channleIdCri = Criteria.where("channelId").is(channel_id);  
    query.addCriteria(channleIdCri);  
    //  
    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 
다음은 페이지 나누기 줄거리를 생성해야 합니다. 여기서spring의 탭을 사용해서 처리합니다. 탭 클래스 Pagination Tag에 대응하는 것은 탭 폼에 대응하는 id, 페이지 나누기에 필요한 데이터, 클릭할 수 있는 페이지의 길이를 표시합니다.이 종류는 다음과 같다.

public class PaginationTag extends TagSupport { 
  /**  form id  */ 
  private String form; 
   
  /**  , request   , l */ 
  private String pageInfo;//request bean  
   
  /**   */ 
  private int size; 
   
  public PaginationTag(){ 
    this.form = "form"; 
    this.size = 5; 
  } 
생성된 페이지 내비게이션 막대 코드는 다음과 같습니다.

@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>  "); 
    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>"); 
    }     
    //   
    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(); 
  } 
위의 탭에서 알 수 있듯이 페이지의 페이지 수를 클릭할 때마다 js의dopage 방법으로 이루어진 것입니다. 이 js 방법은form에 근거합니다.submit () 정보 조회 정보 제출 (특히currentPage 데이터)
js의 코드는 다음과 같습니다.

function dopage(currentPage,formid){ 
  $("#currentPage").val(currentPage); 
  $("#" + formid).submit(); 
} 
jsp 페이지에 상기 탭만 추가하면 됩니다 (탭 클래스 Pagination 및 tld 파일로 변환됨 --)

<div> 
  <tv:pagination pageInfo="videos" form="video-form" size="5"></tv:pagination>  
</div> 
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기