일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Apache Lucene
- STS
- Web Service
- 자바스크립트
- Eclipse
- Android
- 컬럼명
- decompiler
- asp.net
- 자바
- TextBox
- 웹뷰
- MS-SQL
- 이클립스
- scrollView
- javascript
- Java
- SpringSource Tool Suite
- varags
- html
- 웹 서비스
- Maven
- C#
- jsp
- Bootstrap
- 안드로이드
- MSsql
- Redirect
- MANTIS
- WebView
- Today
- Total
bboks.net™
JSP 페이징 로직 본문
총 데이터 수가 37개인 데이터를 페이징 처리 해보자.
데이터는 DB에서 가져오거나 xml파일을 읽어올 것이다.
페이지를 3 페이지씩 보여줄 수도 있고 [1] [2] [3] [다음]
혹은 10페이지씩 보여줄 수도 있다. [1] [2] [3] [4] [5] ...[10] [다음]
값 셋팅에 따라 달라질 수 있도록 페이지그룹 사이즈(pageGroupSize) 변수를 사용하겠다.
셋팅할 수 있는 값이 페이지그룹 사이즈 말고 또 무엇이 있을까?
한 페이지 당 보여주는 리스트 갯수도 변할 가능성이 많다.
이것은 페이지 사이즈(pageSize) 변수로 놓자.
그러면, 페이징 로직의 결과를 예측하기 위해서 이 두개의 변수에 값을 넣어보자.
총 데이터 갯수 (count): 37
페이지그룹 사이즈 (페이지그룹을 몇개씩 묶을 것인가) : 3
페이지 사이즈 (한 페이지 당 리스트 갯수): 4
이렇게 셋팅을 할 경우, 나오는 결과는?
총 페이지 수(pageCount)는 37 / 4 = 9.25 니까 10 페이지 되겠다.
pageCount = (count / pageSize ) + ( count % pageSize == 0 ? 0 : 1);
=> count % pageSize == 0 ? 0 : 1 이 수식을 풀어서 쓰면
if(count % pageSize == 0)
return 0;
else
return 1;
이렇게 표현된다.
=============================================================================
[1][2][3] [4][5][6] [7][8][9] [10]
페이지그룹넘버(numPageGroup) : - 1 - - 2 - - 3 - - 4 -
=============================================================================
페이지 그룹은 위와같이 총 4개로 나올 것이다. (pageGroupCount : 4)
이 페이지 그룹을 본 후, 현재페이지가 호출될 경우를 생각해보면
5페이지가 호출된다면 numPageGroup이 2인 상태로 페이지바가 보여질 것이다.
그렇다면, 호출된 현재페이지를 가지고 페이지그룹넘버를 구하고,
페이지그룹넘버값으로 페이지바의 첫번째 페이지를 계산해보자.
numPageGroup = 올림(currentPage/pageGroupSize)
=> int numPageGroup = (int) Meth.ceil ((double)currentPage/pageGroupSize)
=> numPageGroup : 올림(5/3) = 2
startPage = (numPageGroup - 1)*pageGroupSize + 1;
=> stratPage : (2-1)*3+1 = 4
이제 시작페이지를 가지고 마지막 페이지도 구해보자
endPage = startPage + pageGroupSize -1 => 4+3-1 = 6
이런식으로 시작페이지와 마지막페이지를 구했다면, for문을 돌려서 페이지바를 출력할 수 있을 것이다.
그런데, 마지막 페이지그룹을 위 공식대로 계산하면 endPage가 12페이지가 나온다.
총 페이지수가 10개인데 12페이지까지 출력되면 안 될것이다.
따라서, if문 처리를 추가해주자.
if( 마지막페이지 > 총페이지 )
마지막페이지 = 총 페이지 => endPage = 10
자바 클래스
// 한 페이지 당 보여줄 글 갯수 private final static int pageSize = 4; // 페이지그룹안의 페이지 갯수 //ex) [이전] 1 2 3 4 5 [다음] 일 경우 페이지 갯수는 5 private final static int pageGroupSize = 3; //페이지 번호 String pageNum = request.getParameter("pageNum"); if (pageNum == null) { pageNum = "1"; } int currentPage = Integer.parseInt(pageNum); //한 페이지의 시작글 번호 int startRow = (currentPage - 1) * pageSize + 1; //한 페이지의 마지막 글번호 int endRow = currentPage * pageSize; int count = 0; int number = 0; ArrayList articleList = new ArrayList(); BoardDAO dbPro = BoardDAO.getInstance();// DB연동 count = dbPro.getTotalCnt();// 전체 글의 수 if (count > 0) { if (endRow > count) { endRow = count; } // 현재 페이지에 해당하는 글 목록 articleList = dbPro.select(startRow, endRow); } else { articleList = null; } //글목록에 표시할 글번호 number = count - (currentPage - 1) * pageSize; // 페이지그룹의 갯수 // ex) pageGroupSize가 3일 경우 //'[1][2][3]'가 pageGroupCount 개 만큼 있다. int pageGroupCount = count / (pageSize * pageGroupSize) + (count % (pageSize * pageGroupSize) == 0 ? 0 : 1); // 페이지 그룹 번호 // ex) pageGroupSize가 3일 경우 //'[1][2][3]'의 페이지그룹번호는 1 이고 '[2][3][4]'의 // 페이지그룹번호는 2 이다. int numPageGroup = (int) Math .ceil((double) currentPage / pageGroupSize); // 해당 뷰에서 사용할 속성 request.setAttribute("currentPage", new Integer(currentPage)); request.setAttribute("startRow", new Integer(startRow)); request.setAttribute("endRow", new Integer(endRow)); request.setAttribute("count", new Integer(count)); request.setAttribute("pageSize", new Integer(pageSize)); request.setAttribute("number", new Integer(number)); request.setAttribute("pageGroupSize", new Integer(pageGroupSize)); request.setAttribute("numPageGroup", new Integer(numPageGroup)); request.setAttribute("pageGroupCount", new Integer(pageGroupCount)); request.setAttribute("articleList", articleList); return "./list.jsp";// 해당 뷰
JSP 부분
<c:set var="pageCount"
value="${count / pageSize + ( count % pageSize == 0 ? 0 : 1)}" />
<c:set var="startPage" value="${pageGroupSize*(numPageGroup-1)+1}" />
<c:set var="endPage" value="${startPage + pageGroupSize-1}" />
<c:if test="${endPage > pageCount}">
<c:set var="endPage" value="${pageCount}" />
</c:if>
<c:if test="${numPageGroup > 1}">
<a href="./list.do?pageNum=${(numPageGroup-2)*pageGroupSize+1 }">[이전]</a>
</c:if>
<c:forEach var="i" begin="${startPage}" end="${endPage}">
<a href="list.do?pageNum=${i}">[
<font color="#000000">
<c:if test="${currentPage == i}"></c:if> ${i} </font>] </a>
</c:forEach>
<c:if test="${numPageGroup < pageGroupCount}">
<a href="./list.do?pageNum=${numPageGroup*pageGroupSize+1}">[다음]</a>
</c:if>
</c:if>
[출처] [JSP] 게시판 페이징 처리 로직