~홍~

Spring 게시판 (5) _ 페이징 구현 본문

Spring/-

Spring 게시판 (5) _ 페이징 구현

~홍~ 2021. 4. 9. 14:13
728x90

- java Resources >> src/main/java >> com.web.shopping.pageutil  package 생성 

- com.web.shopping.pageutil >> pageCriteria.java 생성 

 

pageCriteria 

package com.spring.board.pageutil;

// 브라우저에 보여질 페이지 번호와 한페이지에서 보여질 게시글의 개수를 저장하는 클래스 
// paging 처리에 필요한 start와 end 번호를 알 수 있음  
public class PageCriteria {

	private int page; // 현재 페이지 번호  
	private int numsPerPage; // 한 페이지의 게시글 수 
	
	public PageCriteria() {
		this.page = 1;
		this.numsPerPage = 20;   // 한 페이지의 게시글 수 20개로 설정 
	}
	
	public PageCriteria(int page, int numsPerPage) {
		this.page = page;
		this.numsPerPage = numsPerPage;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public int getNumsPerPage() {
		return numsPerPage;
	}

	public void setNumsPerPage(int numsPerPage) {
		this.numsPerPage = numsPerPage;
	}
	
	// 현재 보여지는 페이지 시작 글 일련번호(rn) 
	public int getStart() {
		return (this.page - 1) * this.numsPerPage + 1;
	}
	
	// 현재 보여지는 페이지의 마지막 글 일련번호(rn)
	public int getEnd() {
		return this.page * this.numsPerPage;
	}
} // end pageCriteria 

 

- com.web.shopping.pageutil >> pageMaker.java 생성 

pageMaker

package com.spring.board.pageutil;

// 페이지 번호들의 링크를 만들기 위한 유틸리티 클래스  
public class PageMaker {
	
	private PageCriteria criteria; 
	private int totalCount; // 전체 게시글 개수  
	private int numsOfPageLinks; // 페이지 번호 링크(예:게시판 개수)의 개수  
	private int startPageNo; // 시작 페이지 링크 번호 
	private int endPageNo; // 끝 페이지 링크 번호 
	private boolean hasPrev; // 화면에 보이는 시작 페이지 번호보다 작은 숫자의 페이지가 있는 지 
	private boolean hasNext; // 화면에 보이는 끝 페이지 번호보다 큰 숫자의 페이지가 있는 지
	
	public PageMaker() {
		// 한번에 표시할 페이징 번호의 갯수  
		this.numsOfPageLinks = 10; 
	}

	public PageCriteria getCriteria() {
		return criteria;
	}

	public void setCriteria(PageCriteria criteria) {
		this.criteria = criteria;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public int getNumsOfPageLinks() {
		return numsOfPageLinks;
	}

	public void setNumsOfPageLinks(int numsOfPageLinks) {
		this.numsOfPageLinks = numsOfPageLinks;
	}

	public int getStartPageNo() {
		return startPageNo;
	}

	public void setStartPageNo(int startPageNo) {
		this.startPageNo = startPageNo;
	}

	public int getEndPageNo() {
		return endPageNo;
	}

	public void setEndPageNo(int endPageNo) {
		this.endPageNo = endPageNo;
	}

	public boolean isHasPrev() {
		return hasPrev;
	}

	public void setHasPrev(boolean hasPrev) {
		this.hasPrev = hasPrev;
	}

	public boolean isHasNext() {
		return hasNext;
	}

	public void setHasNext(boolean hasNext) {
		this.hasNext = hasNext;
	}
	
	// startPageNo, endPageNo, hasPrev, hasNext 값을 계산 및 세팅 
	// Math.ceil (올림)
	// Math.floor (버림)
	public void setPageData() {
		// 하단 페이징 번호 ([게시물 총 갯수 / 한페이지에 출력할 갯수]의 올림번호) 즉, 10, 20, 30.. 으로 나오는 번호 ( 한번에 10페이지 표시로 설정함 ) 
		int totalLinkNo = (int) Math.ceil((double) totalCount / criteria.getNumsPerPage());
		
		// 표시되는 페이지 번호 중 마지막 번호 
		// 마지막 페이지 번호 = ((올림)(현재 페이지 번호 / 한번에 표시할 페이지 번호의 갯수)) * 한번에 표시할 페이지 번호의 갯수
		int temp = (int) Math.ceil((double) criteria.getPage() / numsOfPageLinks) * numsOfPageLinks;
	
		// 표시되는 페이지 번호가 하단 페이징 번호보다 크면 하단페이지 번호로 표시, 반면 ... 
		if (temp > totalLinkNo) { 
			endPageNo = totalLinkNo;
		} else {
			endPageNo = temp;
		}
		// 표시되는 페이지 번호 중 첫번째 번호 
		// 시작 페이지 = 마지막 페이지 번호 - 한번에 표시할 페이지 번호의 갯수 + 1
		startPageNo = ((endPageNo - 1) / numsOfPageLinks) * numsOfPageLinks + 1;
	
		// boolean prev = startPageNum == 1 ? false : true;
		if (startPageNo == 1) {
			hasPrev = false;
		} else {
			hasPrev = true;
		}
		
		// boolean next = endPageNum * pageNum_cnt >= count ? false : true;
		if (endPageNo * criteria.getNumsPerPage() >= totalCount) {
			hasNext = false;
		} else {
			hasNext = true;
		}
		
	}
	
} // end PageMaker

- src/main/resources >> mappers >> board-mapper.xml  ( 게시물 총 갯수, 게시글 리스트 페이지 처리_쿼리작성)

게시물 총 갯수 

<!-- 게시물 총 갯수 -->
	<select id="total_count" resultType="Integer">
		select count(*) total_cnt from ${board}
	</select>

게시글 리스트 페이지 처리

<!-- 게시글 리스트 페이지 처리  -->
	<select id="paging" resultType="BoardVO">
		select 
		b.${bNo}, b.${title}, b.${writer}, b.${content}, b.${bDate}, b.${viewCnt}, b.${replyCnt}
		from (
			select rownum rn, a.*
			from (
				select * from ${board} order by ${bNo} desc 
				)a
			)b
			where rn between #{start} and #{end}
	</select>

- java Resources >> src/main/java >> com.web.shopping.persistence >> BoardDAO.java

( 전체 게시글 수량, 게시판 페이지 DAO 변수 추가 )

	public abstract int getTotalNumsOfRecords() throws Exception; // 전체 게시글 수량 
	public abstract List<BoardVO> select(PageCriteria criteria); // 게시판 페이지 설정 

- java Resources >> src/main/java >> com.web.shopping.persistence >> BoardDAOImple.java

( 전체 게시글 수량, 게시판 페이지  쿼리 연결 코드 추가 )

	// 게시글 수량  
	@Override
	public int getTotalNumsOfRecords() throws Exception {
		LOGGER.info("getTotalNumsOfRecords() 호출");
		return sqlSession.selectOne(NAMESPACE + ".total_count");
	}
	
	// 게시판 페이지 표시 
	@Override
	public List<BoardVO> select(PageCriteria criteria) {
		LOGGER.info("select() 호출 : page = " + criteria.getPage());
		return sqlSession.selectList(NAMESPACE + ".paging", criteria);
	}

- java Resources >> src/main/java >> com.web.shopping.service >> BoardService.java

( 전체 게시글 수량, 게시판 페이지 service 변수 추가 ) 

	public abstract int getTotalNumsOfRecords() throws Exception; // 전체 게시글 수량 
	public abstract List<BoardVO> readBoard(PageCriteria criteria); // // 게시판 페이지 설정

- java Resources >> src/main/java >> com.web.shopping.service >> BoardServiceImple.java

( 전체 게시글 수량, 게시판 페이지 dao class 연결 코드 추가 ) 

	// 게시글 수량 
	@Override
	public int getTotalNumsOfRecords() throws Exception {
		LOGGER.info("getTotalNumsOfRecords() 호출");
		return dao.getTotalNumsOfRecords();
	}

	// 게시판 페이지 표시
	@Override
	public List<BoardVO> readBoard(PageCriteria criteria) {
		LOGGER.info("readeBoard() 호출 : page = " + criteria.getPage());
		return dao.select(criteria);
	}

list.jsp  ( page 관련 코드 추가 : 이전, 다음, 표시될 페이지 ) 

	<ul class="pager">
		<!-- 이전 -->
		<c:if test="${pageMaker.hasPrev }">
			<li><a href="${pageMaker.startPageNo - 1 }">이전</a></li>
		</c:if>
		<!-- 표시되는 페이지 갯수 -->
		<c:forEach begin="${pageMaker.startPageNo }" end="${pageMaker.endPageNo }" var="num">
			<li><a href="list?page=${num }">${num }</a></li>
		</c:forEach>
		<!-- 다음 -->
		<c:if test="${pageMaker.hasNext }">
			<li><a href="${pageMaker.endPageNo + 1 }">다음</a></li>
		</c:if>
	</ul>
	
	<!-- 현재 페이지 -->
	<div>
		<form id="pagingForm" style="display: none;">
			<input type="text" name="page">
		</form>
	</div>

전체 코드 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!--  jstl 라이브러리중 fmt(포맷) 라이브러리를 -->

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 리스트</title>
</head>
<body>

	<div id="nav">
		<%@ include file="../include/nav.jsp"%>
	</div>

	<table>
		<thead>
			<tr>
				<th>번호</th>
				<th>제목</th>
				<th>작성일</th>
				<th>작성자</th>
				<th>댓글수</th>
				<th>조회수</th>
			</tr>
		</thead>

		<tbody>
			<c:forEach items="${boardList }" var="list">
				<tr>
					<td>${list.bNo }</td>
					<td><a href="info?bNo=${list.bNo }">${list.title }</a></td>
					<td><fmt:formatDate value="${list.bDate }" pattern="yyyy-MM-dd" /></td>

					<td>${list.writer }</td>
					<td>${list.replyCnt }</td>
					<td>${list.viewCnt }</td>
				</tr>
			</c:forEach>
		</tbody>
	</table>

	<ul class="pager">
		<!-- 이전 -->
		<c:if test="${pageMaker.hasPrev }">
			<li><a href="${pageMaker.startPageNo - 1 }">이전</a></li>
		</c:if>
		<!-- 표시되는 페이지 갯수 -->
		<c:forEach begin="${pageMaker.startPageNo }" end="${pageMaker.endPageNo }" var="num">
			<li><a href="list?page=${num }">${num }</a></li>
		</c:forEach>
		<!-- 다음 -->
		<c:if test="${pageMaker.hasNext }">
			<li><a href="${pageMaker.endPageNo + 1 }">다음</a></li>
		</c:if>
	</ul>
	
	<!-- 현재 페이지 -->
	<div>
		<form id="pagingForm" style="display: none;">
			<input type="text" name="page">
		</form>
	</div>
	
	<!-- 게시글 추가 성공되면 동작되는 코드 -->
	<input id="insertAlter" type="hidden" value="${insert_result }">
	
</body>
</html>
Comments