고래씌
[MyBatis] 3-1. 게시판 설정(페이징 설정) 본문
1. 게시판 페이징 처리
▶ menubar.jsp 수정

▶ boardListView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
#list-area{
border : 1px solid white;
text-align : center;
}
.outer a{
color : white;
text-decoration : none;
}
</style>
</head>
<body>
<jsp:include page="../common/menubar.jsp"/>
<div class="outer" align="center">
<br>
<h1 align="center">게시판</h1>
<br>
<div id="search-area">
<form action="search.bo" method="get">
<input type="hidden" name="currentPage" value="1"/>
<!-- 검색 페이지는 1값으로 -->
<select name="condition">
<option value="writer">작성자</option>
<option value="title">제목</option>
<option value="content">내용</option>
</select>
<input type="text" name="keyword" value="${keyword }">
<button>검색</button>
</form>
</div>
<script>
$(function(){
const condition = '${condition}'; // '', 'writer', 'title', 'content'
if(condition){ //condition 에 값이 있다면
$("#search-area option[value=${condition}]").attr("selected",true);
// 아이디 search-area의 자식 중 option에 적용, el표현식으로 condition
}
})
</script>
<br>
<table id="list-area">
<thead>
<tr>
<th>글번호</th>
<th width="400">제목</th>
<th>작성자</th>
<th>조회수</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<c:forEach var="b" items="${list }">
<tr onclick='location.href="detail.bo?bno=${b.boardNo}"'>
<td>${b.boardNo }</td>
<td>${b.boardTitle }</td>
<td>${b.boardWriter }</td>
<td>${b.count }</td>
<td>${b.createDate }</td>
</tr>
</c:forEach>
</tbody>
</table>
<div id="paging-area">
<c:url value="${empty condition ? 'list.bo' : 'search.bo' }" var="url">
<!-- condition 값이 비어있다면 (list.bo-기본페이지) : (search.bo-검색시) -->
<c:param name='condition' value='${condition }'/>
<c:param name='keyword' value='${keyword }'/>
</c:url>
<c:if test="${pi.currentPage ne 1}" > <!-- 1페이지가 아닐때만 보이게 하기 -->
<a href="${url }¤tPage=${pi.currentPage - 1 }">[이전]</a>
</c:if>
<c:forEach var="p" begin="${pi.startPage }" end="${pi.endPage }" >
<a href="${url }¤tPage=${p} ">[${p}]</a> <!--현재 반복중인 순번 -->
</c:forEach>
<c:if test="${pi.currentPage ne pi.maxPage }" > <!-- 마지막페이지가 아닐때-->
<a href="${url }¤tPage=${pi.currentPage + 1 }">[다음]</a>
</c:if>
</div>
<br><br>
</div>
<br><br>
</body>
</html>
▶ Board.java
package com.kh.board.model.vo;
import java.sql.Date;
import java.util.ArrayList;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor //매개변수 없는 생성자
@AllArgsConstructor //매개변수 모두 포함한 생성자
@Setter
@Getter
@ToString
@Builder
public class Board {
private int boardNo;
private String boardTitle;
private String boardContent;
private int boardWriter;
private String userId; //board테이블에는 없음
private int count;
private Date createDate;
private String status;
private ArrayList<Reply> list; //댓글 목록 저장할 예정
}
▶ board-mapper.xml

▶ BoardService.java

▶ BoardServiceImpl.java

▶ mybatis-config.xml 에 다음과 같이 실행할 sql문을 등록하기 위해 추가

- typeAliases에도 board.java 클래스를 추가해주었기 때문에 따로 추가해야하지만 아래와 같이 package로 등록하면 별도로 추가할 필요없다.

- underscore의 규칙을 카멀케이스로 바꾸어라로 설정

▶ BoardDAO.java

▶ PgaeInfo.java
package com.kh.common.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class PageInfo {
private int listCount; // 총 게시글 갯수
private int currentPage; // 현재 페이지 (즉, 요청한 페이지)
private int pageLimit; // 하단에 보여질 페이징바의 페이지 목록 최대 갯수
private int boardLimit; // 해당 페이지에 보여질 게시글 최대 갯수
private int maxPage; // 가장 마지막 페이지의 수 (listCount, boardLimit 을 가지고 구함)
private int startPage; // 해당 페이지에 보여질 페이징 바의 시작수 (pageLimit, currentPage 를 가지고 구함)
private int endPage; // 해당 페이지에 보여질 페이징 바의 끝수 (startPage, pageLimit, maxPage)
}
▶ Pagination.java
package com.kh.common.template;
import com.kh.common.model.vo.PageInfo;
public class Pagination {
public static PageInfo getPageInfo(int listCount, int currentPage, int pageLimit, int boardLimit) {
int maxPage = (int) Math.ceil((double)listCount / boardLimit);
int startPage = (currentPage - 1) / pageLimit * pageLimit + 1;
int endPage = startPage + pageLimit - 1;
if(endPage > maxPage) {
endPage = maxPage ;
}
PageInfo pi = new PageInfo(listCount, currentPage, pageLimit, boardLimit, maxPage, startPage, endPage);
return pi;
}
}
▶ BoardListController.java(Servlet)
package com.kh.board.controller;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.kh.board.model.service.BoardService;
import com.kh.board.model.service.BoardServiceImpl;
import com.kh.board.model.vo.Board;
import com.kh.common.model.vo.PageInfo;
import com.kh.common.template.Pagination;
/**
* Servlet implementation class BoardListController
*/
@WebServlet("/list.bo")
public class BoardListController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardListController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardService service = new BoardServiceImpl(); //인터페이스 = 인터페이스 구현하는 객체 (업캐스팅 발생)
// ---------------------- 페이징처리 ----------------------
int listCount = service.selectListCount();
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
int pageLimit = 10;
int boardLimit = 5;
PageInfo pi = Pagination.getPageInfo(listCount, currentPage, pageLimit, boardLimit);
ArrayList<Board> list = service.selectList(pi);
request.setAttribute("pi", pi);
request.setAttribute("list", list);
request.getRequestDispatcher("WEB-INF/views/board/boardListView.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
▶ board-mapper.xml

▶ BoardService.java

▶ BoardServiceImpl.java

▶ BoardDAO.java
=> 마이바티스에서는 페이징 처리를 위해 RowBounds라는 클래스 제공함
- offset : 몇 개의 게시글을 건너뛰고 조회할 건지에 대한 값
- boardLimit가 5일 경우 offset limit
- currentPage : 1=> 1~5 0 5
- currentPage : 2=> 6~10 5 5
- currentPage : 3=> 11~15 10 5
=> RowBounds 객체를 넘겨야 할 경우
- selectList메소드의 오버로딩된 메서드 중 매개변수가 3개인 메소드를 사용해야만 한다.
- 단, 이 때 두번째 매개변수(쿼리문을 꾸밀 객체)가 필요 없다면 null값을 제시해야 한다.


'Server > MyBatis' 카테고리의 다른 글
[MyBatis] 형상관리 (개인정보가 있으므로 비공개 설정) (0) | 2023.12.24 |
---|---|
[MyBatis] 3-2. 게시판 설정(게시판 상세, 조회수, 댓글, 검색) (0) | 2023.12.24 |
[MyBatis] 2. 암호화 설정 (0) | 2023.12.24 |
[MyBatis] 1-3. 회원가입 만들기 (0) | 2023.12.20 |
[MyBatis] 1-2. 로그인 기능 (0) | 2023.12.19 |