본문 바로가기
괴발개발/java

특정 게시판에서 일정한 범위의 목록 조회 width 페이지 네이션Page nation

by 맛길만걷자 2024. 7. 9.
728x90
반응형

vo

package edu.kh.community.board.model.vo;

public class Pagination {
		//페이지네이션(페이징 처리)에 필요한 모든 값들을 저장하고 있는 객체
		
	  	private int currentPage; 	//현재 페이지 번호
	  	private int listCount;		//전체 게시글 수
	  	
	  	private int limit = 10;		//한 페이지에 보여질 게시글의 수
	  	private int pageSize = 10;	// 목록 하단 페이지 번호의 노출 개수
	  	
	  	private int maxPage;		// 제일 큰 페이지 번호 == 마지막 페이지 번호
	  	private int startPage; 		// 목록 하단에 노출된 페이지의 시작 번호
	  	private int endPage;		// 목록 하단에 노출된 페이지의 끝 번호
	  	
	  	private int prevPage;		// 목록 하단에 노출된 번호의 이전 목록의 끝 번호
	  	private int nextPage;		// 목록 하단에 노출된 번호의 다음 목록의 시작 번호
	  	
	  	// 매개변수 생성자
	  	public Pagination(int currentPage, int listCount) {
	  		this.currentPage = currentPage;
	  		this.listCount = listCount;
	  		
	  		calculatePagination(); // 계산 메소드 호출
	  	}

		public int getCurrentPage() {
			return currentPage;
		}

		public void setCurrentPage(int currentPage) {
			this.currentPage = currentPage;
			
			calculatePagination();
		}

		public int getListCount() {
			return listCount;
		}

		public void setListCount(int listCount) {
			this.listCount = listCount;
			
			calculatePagination();
		}

		public int getLimit() {
			return limit;
		}

		public void setLimit(int limit) {
			this.limit = limit;
			
			calculatePagination();
		}

		public int getPageSize() {
			return pageSize;
		}

		public void setPageSize(int pageSize) {
			this.pageSize = pageSize;
			
			calculatePagination();
		}

		public int getMaxPage() {
			return maxPage;
		}

		public void setMaxPage(int maxPage) {
			this.maxPage = maxPage;
		}

		public int getStartPage() {
			return startPage;
		}

		public void setStartPage(int startPage) {
			this.startPage = startPage;
		}

		public int getEndPage() {
			return endPage;
		}

		public void setEndPage(int endPage) {
			this.endPage = endPage;
		}

		public int getPrevPage() {
			return prevPage;
		}

		public void setPrevPage(int prevPage) {
			this.prevPage = prevPage;
		}

		public int getNextPage() {
			return nextPage;
		}

		public void setNextPage(int nextPage) {
			this.nextPage = nextPage;
		}

		@Override
		public String toString() {
			return "Pagination [currentPage=" + currentPage + ", listCount=" + listCount + ", limit=" + limit
					+ ", pageSize=" + pageSize + ", maxPage=" + maxPage + ", startPage=" + startPage + ", endPage="
					+ endPage + ", prevPage=" + prevPage + ", nextPage=" + nextPage + "]";
		}
	  	
	  	// 페이징 처리에 필요한 값을 계산하는 메소드
		private void calculatePagination() {
			
			// 전체 게시글 수 : 500개	// 보여지는 게시글의 수 : 10
			// -> 마지막 페이지 번호는 ? 500 / 10 = 50
			

			// 전체 게시글 수 : 501개	// 보여지는 게시글의 수 : 10
			// -> 마지막 페이지 번호는 ? 501/10 = 51 (50.1 올림처리)
			maxPage = (int)Math.ceil( (double)listCount / limit);
			
			// * startPage : 목록 하단에 노출된 페이지의 시작 번호
			
			// 목록 하단 페이지 번호의 노출 개수가 10개일 때
			
			// 현재 페이지가 1~10인 경우 : 1
			// 현재 페이지가 11~20인 경우 : 11
			// 현재 페이지가 21~30인 경우 : 21
			
			startPage = (currentPage - 1) /pageSize * pageSize +1;
			
			// * endPage : 목록 하단에 노출된 페이지의 끝 번호
			
			// 현재 페이지가 1~10인 경우 : 10
			// 현재 페이지가 11~20인 경우 : 20
			// 현재 페이지가 21~30인 경우 : 30
			
			endPage = startPage + pageSize - 1;
			
			// 만약 endPage가 maxPage를 초과하는 경우
			if(endPage > maxPage) {
				endPage = maxPage;
			}
			
			// prevPage;(<)		// 목록 하단에 노출된 번호의 이전 목록의 끝 번호
		  	// nextPage;(>)	// 목록 하단에 노출된 번호의 다음 목록의 시작 번호
			
			// 현재 페이지가 1~10 일 경우
			// < : 1 페이지
			// > : 11 페이지
			
			// 현재 페이지가 11~20 일 경우
			// < : 10 페이지
			// > : 21 페이지
			
			// 현재 페이지가 41~50 일 경우 (maxPage는 50)
			// < : 40 페이지
			// > : 50 페이지
			
			if(currentPage <= pageSize) {
				prevPage = 1;
			}else {
				prevPage = startPage -1;
			}
			
			if(endPage == maxPage) {
				nextPage = maxPage;
			}else {
				nextPage = endPage+1;
			}
			
		}
	  	
}

 

dao.

public List<Board> selectBoardList(Connection conn, int type, Pagination pagination) throws Exception {
		List<Board> boardList = new ArrayList<>();
		
		try {
			String sql = prop.getProperty("selectBoardList");
			
			// BETWEEN 구문에 들어갈 범위 계산
			
			int start = (pagination.getCurrentPage() -1) * pagination.getLimit() + 1;
			int end = start + pagination.getLimit() - 1;
			
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setInt(1, type);
			pstmt.setInt(2, start);
			pstmt.setInt(3, end);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				Board board = new Board();
				board.setBoardNo(rs.getInt("BOARD_NO"));
				board.setBoardTitle(rs.getString("BOARD_TITLE"));
				board.setMemberNickname(rs.getString("MEMBER_NICK"));
				board.setCreateDate(rs.getString("CREATE_DT"));
				board.setReadCount(rs.getInt("READ_COUNT"));
				
				boardList.add(board);
				
			}
			
		}finally {
			close(rs);
			close(pstmt);
			
		}
		
		
		return boardList;
	}

서비스

package edu.kh.community.board.model.service;

import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import edu.kh.community.board.model.dao.BoardDAO;
import edu.kh.community.board.model.vo.Board;
import edu.kh.community.board.model.vo.Pagination;

import static edu.kh.community.common.JDBCTemplate.*;

public class BoardService {

	private BoardDAO dao= new BoardDAO();

	/** 게시글 목록 조회 Service
	 * @param type
	 * @param cp
	 * @return map
	 * @throws Exception
	 */
	public Map<String, Object> selectBoardList(int type, int cp) throws Exception{
		
		Connection conn = getConnection();
		
		// 1. 게시판 이름 조회 DAO 호출
		String boardName = dao.selectBoardName(conn, type);
		
		// 2-1 특정 게시판 전체 게시글 수 조회 DAO 호출
		int listCount = dao.getListCount(conn,type);
		
		// 2-2 전체 게시글 수 + 현재페이지(cp)를 이용해 페이지네이션 객체 생성
		Pagination pagination = new Pagination(cp, listCount);
		
		// 3. 게시글 목록 조회
		List<Board> boardList = dao.selectBoardList(conn, type, pagination);
		
		// 4. Map 객체를 생성하여 1, 2, 3 결과 객체를 모두 저장
		Map<String, Object> map = new HashMap<>();
		
		map.put("boardName", boardName);
		map.put("pagination", pagination);
		map.put("boardList", boardList);
		
		
		
		close(conn);
		
		
		return map;
	}
	
}

 

서블릿

package edu.kh.community.board.controller;

import java.io.IOException;
import java.util.Map;

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 edu.kh.community.board.model.service.BoardService;

@WebServlet("/board/list")
public class BoardListServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		try {
			
			// 쿼리스트링 얻어오기 == 파라미터 얻어오기
			
			// /board/list?type=1
			
			int type = Integer.parseInt(req.getParameter("type"));
			
			
			// nav메뉴(공지사항, 자유게시판, 질문게시판) 선택 시 
			// 쿼리스트리에 cp가 없음 = 1고정
			
			int cp = 1;
			
			// 페이지네이션의 번호 선택 시 
			// 쿼리스트링에 cp가 있음 --> cp = 쿼리스트링의 cp값 
			if(req.getParameter("cp")!=null) {//쿼리스트링에 "cp"가 존재한다면
				cp = Integer.parseInt(req.getParameter("cp"));
				
			}
			
			BoardService service = new BoardService();
			
			// 게시판 이름, 페이지네이션 객체, 게시글 리스트를 한번에 반환하는 Service 호출
			Map<String, Object> map = service.selectBoardList(type, cp);
			
			// request 범위로 map을 세팅
			req.setAttribute("map", map);
			
			String path="/WEB-INF/views/board/boardList.jsp";
			
			req.getRequestDispatcher(path).forward(req, resp);
			
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	

	}

}

sql

	<!-- 특정 게시판 게시글 목록 조회 -->
	<entry key = "selectBoardList">
	SELECT * FROM(
            SELECT ROWNUM RNUM, A.* FROM(
            SELECT BOARD_NO, BOARD_TITLE, MEMBER_NICK, 
            TO_CHAR(CREATE_DT,'YYYY-MM-DD')AS CREATE_DT 
            ,READ_COUNT 
            FROM BOARD
            JOIN MEMBER USING(MEMBER_NO)
            WHERE BOARD_CD =?
            AND BOARD_ST='N'
            ORDER BY BOARD_NO DESC
        )A
	)
	WHERE RNUM BETWEEN ? AND ?
	</entry>
728x90
반응형

'괴발개발 > java' 카테고리의 다른 글

Spring Framework  (0) 2024.08.01
프로필 이미지 변경 (update profile Image)  (1) 2024.07.16
Lombok 라이브러리  (0) 2024.06.28
EL(Expression Laguage)  (0) 2024.06.26
Servlet -1 이론  (0) 2024.06.24