고래씌

[MyBatis] 3-1. 게시판 설정(페이징 설정) 본문

Server/MyBatis

[MyBatis] 3-1. 게시판 설정(페이징 설정)

고래씌 2023. 12. 24. 20:50

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 }&currentPage=${pi.currentPage - 1 }">[이전]</a>
			</c:if>
			
			<c:forEach var="p" begin="${pi.startPage }" end="${pi.endPage }" >
				<a href="${url }&currentPage=${p} ">[${p}]</a> <!--현재 반복중인 순번  -->
			</c:forEach>
			
			<c:if test="${pi.currentPage ne pi.maxPage }" > <!-- 마지막페이지가 아닐때-->
				<a href="${url }&currentPage=${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값을 제시해야 한다.