일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- innerclass
- append()
- 접근제한수식어
- singleton
- 자바 개발환경준비
- inheritance
- spring 페이징
- protected
- File
- Visuall code
- Overloading
- Spring 구조
- 톰켓
- New Dialog
- java
- 싱글톤 패턴
- DB 설정
- Statement
- Spring 개념
- tomat
- Runnable
- OuterClass
- 오라클 데이터베이스
- New Frame
- SPRING 특징
- 오버로딩
- JDK 설치
- 드림코딩
- pox.xml 오류
- Unbox
- Today
- Total
~홍~
Spring 게시판 (5) _ 페이징 구현 본문
- 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>
'Spring > -' 카테고리의 다른 글
Spring 게시판 (4) _ nav, 게시글 삭제 (0) | 2021.04.08 |
---|---|
Spring 게시판 (3) _ 게시판 전체리스트 / 글작성 / 게시물 상세 정보 / 게시글 수정 (0) | 2021.04.05 |
Junit test (0) | 2021.04.05 |
Spring 게시판 (2) DB 테이블 생성 및 스프링 연결 (0) | 2021.04.04 |
스프링 게시판 만들기 ( 1 ) 기본 설정 (0) | 2021.04.04 |