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>
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Mongodb FAQ질문 1.exception in initandlisten 29 data directory/data/db not found 해결 방법: 루트 권한으로db 파일을 만듭니다.sudo mkdir -p /data/db 질문 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.