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 |