Language/JSP
JSP 게시판 구현 시 Paging 처리 하기
적외선
2014. 11. 11. 14:27
서버에서 Paging 에 대한 로직 처리 후, jsp include, param 기능을 사용하여 구현 한다.
1. Paging
Paging 기능을 구현하는 VO Class 이다. setTotalCount(int totalCount) 호출 시 makePaging() 함수 호출 한다.
/** * Paging * * @author whitelife * @since 2014.10.05 * @version 0.1 */ public class Paging { private int pageSize; // 게시 글 수 private int firstPageNo; // 첫 번째 페이지 번호 private int prevPageNo; // 이전 페이지 번호 private int startPageNo; // 시작 페이지 (페이징 네비 기준) private int pageNo; // 페이지 번호 private int endPageNo; // 끝 페이지 (페이징 네비 기준) private int nextPageNo; // 다음 페이지 번호 private int finalPageNo; // 마지막 페이지 번호 private int totalCount; // 게시 글 전체 수 /** * @return the pageSize */ public int getPageSize() { return pageSize; } /** * @param pageSize the pageSize to set */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * @return the firstPageNo */ public int getFirstPageNo() { return firstPageNo; } /** * @param firstPageNo the firstPageNo to set */ public void setFirstPageNo(int firstPageNo) { this.firstPageNo = firstPageNo; } /** * @return the prevPageNo */ public int getPrevPageNo() { return prevPageNo; } /** * @param prevPageNo the prevPageNo to set */ public void setPrevPageNo(int prevPageNo) { this.prevPageNo = prevPageNo; } /** * @return the startPageNo */ public int getStartPageNo() { return startPageNo; } /** * @param startPageNo the startPageNo to set */ public void setStartPageNo(int startPageNo) { this.startPageNo = startPageNo; } /** * @return the pageNo */ public int getPageNo() { return pageNo; } /** * @param pageNo the pageNo to set */ public void setPageNo(int pageNo) { this.pageNo = pageNo; } /** * @return the endPageNo */ public int getEndPageNo() { return endPageNo; } /** * @param endPageNo the endPageNo to set */ public void setEndPageNo(int endPageNo) { this.endPageNo = endPageNo; } /** * @return the nextPageNo */ public int getNextPageNo() { return nextPageNo; } /** * @param nextPageNo the nextPageNo to set */ public void setNextPageNo(int nextPageNo) { this.nextPageNo = nextPageNo; } /** * @return the finalPageNo */ public int getFinalPageNo() { return finalPageNo; } /** * @param finalPageNo the finalPageNo to set */ public void setFinalPageNo(int finalPageNo) { this.finalPageNo = finalPageNo; } /** * @return the totalCount */ public int getTotalCount() { return totalCount; } /** * @param totalCount the totalCount to set */ public void setTotalCount(int totalCount) { this.totalCount = totalCount; this.makePaging(); } /** * 페이징 생성 */ private void makePaging() { if (this.totalCount == 0) return; // 게시 글 전체 수가 없는 경우 if (this.pageNo == 0) this.setPageNo(1); // 기본 값 설정 if (this.pageSize == 0) this.setPageSize(10); // 기본 값 설정 int finalPage = (totalCount + (pageSize - 1)) / pageSize; // 마지막 페이지 if (this.pageNo > finalPage) this.setPageNo(finalPage); // 기본 값 설정 if (this.pageNo < 0 || this.pageNo > finalPage) this.pageNo = 1; // 현재 페이지 유효성 체크 boolean isNowFirst = pageNo == 1 ? true : false; // 시작 페이지 (전체) boolean isNowFinal = pageNo == finalPage ? true : false; // 마지막 페이지 (전체) int startPage = ((pageNo - 1) / 10) * 10 + 1; // 시작 페이지 (페이징 네비 기준) int endPage = startPage + 10 - 1; // 끝 페이지 (페이징 네비 기준) if (endPage > finalPage) { // [마지막 페이지 (페이징 네비 기준) > 마지막 페이지] 보다 큰 경우 endPage = finalPage; } this.setFirstPageNo(1); // 첫 번째 페이지 번호 if (isNowFirst) { this.setPrevPageNo(1); // 이전 페이지 번호 } else { this.setPrevPageNo(((pageNo - 1) < 1 ? 1 : (pageNo - 1))); // 이전 페이지 번호 } this.setStartPageNo(startPage); // 시작 페이지 (페이징 네비 기준) this.setEndPageNo(endPage); // 끝 페이지 (페이징 네비 기준) if (isNowFinal) { this.setNextPageNo(finalPage); // 다음 페이지 번호 } else { this.setNextPageNo(((pageNo + 1) > finalPage ? finalPage : (pageNo + 1))); // 다음 페이지 번호 } this.setFinalPageNo(finalPage); // 마지막 페이지 번호 } @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
2. Controller
setTotalCount(totalCount) 를 호출 한다. CustomServlet 으로 처리도 가능 하다.
/** * 리스트 조회 * * @param request * @return * @throws Exception */ @RequestMapping(value="/list", method=RequestMethod.GET) public ModelAndView list(Sample sample) throws Exception { try { // (Before) Doing... Paging paging = new Paging(); paging.setPageNo(1); paging.setPageSize(10); paging.setTotalCount(totalCount); // (After) Doing... } catch (Exception e) { throw e; } }
3. paging.jsp
View 스타일에 따라 수정이 가능 하다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <div class="paginate"> <a href="javascript:goPage(${param.firstPageNo})" class="first">처음 페이지</a> <a href="javascript:goPage(${param.prevPageNo})" class="prev">이전 페이지</a> <span> <c:forEach var="i" begin="${param.startPageNo}" end="${param.endPageNo}" step="1"> <c:choose> <c:when test="${i eq param.pageNo}"><a href="javascript:goPage(${i})" class="choice">${i}</a></c:when> <c:otherwise><a href="javascript:goPage(${i})">${i}</a></c:otherwise> </c:choose> </c:forEach> </span> <a href="javascript:goPage(${param.nextPageNo})" class="next">다음 페이지</a> <a href="javascript:goPage(${param.finalPageNo})" class="last">마지막 페이지</a> </div>
4. list.jsp
paging.jsp 를 호출 하는 부분이다.
// (Before) Doing... <jsp:include page="paging.jsp" flush="true"> <jsp:param name="firstPageNo" value="${paging.firstPageNo}" /> <jsp:param name="prevPageNo" value="${paging.prevPageNo}" /> <jsp:param name="startPageNo" value="${paging.startPageNo}" /> <jsp:param name="pageNo" value="${paging.pageNo}" /> <jsp:param name="endPageNo" value="${paging.endPageNo}" /> <jsp:param name="nextPageNo" value="${paging.nextPageNo}" /> <jsp:param name="finalPageNo" value="${paging.finalPageNo}" /> </jsp:include> // (After) Doing...
출처 - http://blog.whitelife.co.kr/215