8_ws_(페이징처리)

study/WebServer · 2020. 1. 22. 08:48

@@@ 페이징 처리@@@

#BoardController

package com.kh.sjproject.board.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
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.sjproject.board.model.service.BoardService;
import com.kh.sjproject.board.model.vo.Board;
import com.kh.sjproject.board.model.vo.PageInfo;
import com.kh.sjproject.common.ExceptionForward;

// frontcontroller 디자인패턴
@WebServlet("/board/*")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public BoardController() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String uri = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = uri.substring((contextPath+"/board").length());
		
		String msg = null;
		String path = null;
		RequestDispatcher view = null;
		BoardService boardService = new BoardService();
		
		// 게시글 목록 조회용 Controller
		if(command.equals("/list")) {
			
			try {
				// 페이징 처리 (pagination)
				// 눈에 보이는 게시판에 일정 개수의 게시글만 노출되고 
				// 나머지는 페이지로 구분하여 숫자 형태로 보여주게하는 방법
				
				// DB
				// 현재 게시글 전체 수
				int listCount = boardService.getListCount();
				
				// 사용자지정
				// 한 페이지에 보여질 게시글의수
				int limit = 5;
				// 보여질 페이징바의 페이지 개수
				int pagingBarSize = 10;
				
				// 계산
				// 현재 페이지 번호를 표시할 변수
				int currentPage = 0;
				// 전체 페이지의 수 (== 마지막 페이지)
				int maxPage = 0;
				// 페이징바 시작 페이지 번호
				int startPage = 0;
				// 페이징바 끝 페이지 번호
				int endPage = 0;
				
				// currentPage - 현재 페이지 번호를 표시할 변수
				// 처음 게시판 목록으로 화면이 전환이되면 1페이지가 보여야 함
				if(request.getParameter("currentPage") == null) {
					currentPage = 1;
				} else {
					// 전달 받은 값이 있을 경우 해당 번호를 저장
					currentPage = Integer.parseInt(request.getParameter("currentPage"));
				}
				
				// maxPage - 총 페이지 수(== 마지막 페이지)
				// limit == 5일 경우
				// 게시글의 개수가 50개일 경우 필요 페이지의 수 : 10페이지
				// 게시글의 개수가 51개일 경우 필요 페이지의 수 : 11페이지
				maxPage = (int)Math.ceil( ( (double)listCount / limit) );
				
				// startPage - 페이징바의 시작 페이지 번호
				// 페이징바에 수가 10개씩 보여질 경우
				// 시작번호는 1, 11, 21, 31, ....
				startPage = (currentPage - 1) / pagingBarSize * pagingBarSize + 1;
				
				// endPage - 페이징바 끝 페이지 번호
				endPage = startPage + pagingBarSize - 1;
				if(maxPage <= endPage) {
					endPage = maxPage;
				}
				
				PageInfo pInf = new PageInfo(listCount, limit, pagingBarSize, currentPage, maxPage, startPage, endPage);
				
				System.out.println(pInf);
				
				List<Board> bList = boardService.selectList(currentPage, limit);
				
				path = "/WEB-INF/views/board/boardList.jsp";
				request.setAttribute("bList", bList);
				request.setAttribute("pInf", pInf);
				
				view = request.getRequestDispatcher(path);
				view.forward(request, response);
						
			} catch (Exception e) {
				ExceptionForward.errorPage(request, response, "게시판 목록 조회", e);
			}
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

# BoardService

package com.kh.sjproject.board.model.service;

import static com.kh.sjproject.common.JDBCTemplate.*;

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

import com.kh.sjproject.board.model.dao.BoardDao;
import com.kh.sjproject.board.model.vo.Board;

public class BoardService {

	/** 전체 게시글 수 조회 Service
	 * @return listCount
	 * @throws Exception
	 */
	public int getListCount() throws Exception{
		Connection conn = getConnection();
		
		int listCount = new BoardDao().getListCount(conn);
		
		close(conn);
		return listCount;
	}

	
	/** 게시판 목록 조회용 Service
	 * @param currentPage
	 * @param limit
	 * @return bList
	 * @throws Exception
	 */
	public List<Board> selectList(int currentPage, int limit) throws Exception{
		Connection conn = getConnection();
		
		List<Board> bList = new BoardDao().selectList(conn, currentPage, limit);
		
		close(conn);
		return bList;
	}

}

#BoardDao

package com.kh.sjproject.board.model.dao;

import static com.kh.sjproject.common.JDBCTemplate.*;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.kh.sjproject.board.model.vo.Board;
import com.kh.sjproject.notice.model.dao.NoticeDao;

public class BoardDao {

private Properties prop = null;
	
	public BoardDao() throws Exception{
		
		String fileName
		// 컴파일된 버전		
		= BoardDao.class // 자원을 얻어와라()
			.getResource("/com/kh/sjproject/sql/board/board-query.properties")
			.getPath();//풀경로를 나타내라
		
		prop = new Properties();
		prop.load(new FileReader(fileName));
	}
	
	/** 전체 게시글 수 조회용 Dao
	 * @param conn
	 * @return listCount
	 * @throws Exception
	 */
	public int getListCount(Connection conn) throws Exception{
		Statement stmt = null;
		ResultSet rset = null;
		int listCount = 0;
		String query = prop.getProperty("getListCount");
		
		try {
			stmt = conn.createStatement();
			rset = stmt.executeQuery(query);
			
			if(rset.next()) {
				listCount = rset.getInt(1);
			}
		} finally {
			close(rset);
			close(stmt);
		}
		return listCount;
	}

	/** 게시판 목록 조회용 Dao
	 * @param conn
	 * @param currentPage
	 * @param limit
	 * @return bList
	 * @throws Exception
	 */
	public List<Board> selectList(Connection conn, int currentPage, int limit) throws Exception{
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		List<Board> bList = null;
		
		String query = prop.getProperty("selectList");
		
		try {
			// 쿼리문 실행 시 between 조건에 사용될 값
			int startRow = (currentPage -1) * limit + 1;
			int endRow = startRow + limit - 1;
			
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, 1);
			pstmt.setInt(2, startRow);
			pstmt.setInt(3, endRow);
			
			rset = pstmt.executeQuery();
			
			bList = new ArrayList<Board>();
			Board board = null;
			
			while(rset.next()) {
				board = new Board(rset.getInt("BOARD_NO"),
						rset.getString("BOARD_TITLE"), 
						rset.getInt("BOARD_COUNT"),
						rset.getDate("BOARD_MODIFY_DT"),
						rset.getString("MEMBER_ID"),
						rset.getString("CATEGORY_NM")
						);
				bList.add(board);
			}
			
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return bList;
	}

}

#SQL

-- 조회가 가능한 게시물 조회
SELECT BOARD_NO, BOARD_TITLE, 
            BOARD_CONTENT, BOARD_COUNT,
            BOARD_MODIFY_DT,
            BOARD_TYPE,
            MEMBER_ID, CATEGORY_NM
FROM BOARD
JOIN MEMBER ON(BOARD_WRITER = MEMBER_NO)
JOIN CATEGORY ON(BOARD_CATEGORY = 
CATEGORY_CD)
WHERE BOARD_STATUS='Y';

-- VIEW 생성
CREATE OR REPLACE VIEW V_BOARD AS 
SELECT BOARD_NO, BOARD_TITLE, 
            BOARD_CONTENT, BOARD_COUNT,
            BOARD_MODIFY_DT,
            BOARD_TYPE,
            MEMBER_ID, CATEGORY_NM
FROM BOARD
JOIN MEMBER ON(BOARD_WRITER = MEMBER_NO)
JOIN CATEGORY ON(BOARD_CATEGORY = 
CATEGORY_CD)
WHERE BOARD_STATUS='Y'
ORDER BY BOARD_NO DESC;

-- ORA-01031: insufficient privileges
--> VIEW 생성 권한이 없을 경우 나타나는 에러
-- 관리자 계정으로 접속하여 VIEW 생성 권한 부여
GRANT CREATE VIEW TO server;

SELECT * FROM V_BOARD WHERE BOARD_TYPE=1;

-- BOARD 목록 조회 시 
-- LIMIT 만큼의 범위로 잘라서 조회

-- V_BOARD에서 ROWNUM이 1~5 사이 이고
-- 게시판 타입이 1인 행의
-- ROWNUM, 글번호, 글제목, 조회수
-- 수정일, 작성자, 카테고리명 조회

SELECT RNUM, BOARD_NO, BOARD_TITLE, 
            BOARD_COUNT, BOARD_MODIFY_DT,
            MEMBER_ID, CATEGORY_NM
FROM (SELECT ROWNUM RNUM, BOARD_NO, 
BOARD_TITLE, 
            BOARD_COUNT, BOARD_MODIFY_DT,
            MEMBER_ID, CATEGORY_NM, BOARD_TYPE
            FROM V_BOARD WHERE BOARD_TYPE=1)
WHERE RNUM BETWEEN 6 AND 10;

------------------------------------------------------- 
SELECT RNUM, BOARD_NO, BOARD_TITLE, 
BOARD_COUNT, BOARD_MODIFY_DT, MEMBER_ID, 
CATEGORY_NM FROM (SELECT ROWNUM RNUM, 
BOARD_NO, BOARD_TITLE, BOARD_COUNT, 
BOARD_MODIFY_DT, MEMBER_ID, CATEGORY_NM, 
BOARD_TYPE FROM V_BOARD WHERE 
BOARD_TYPE=?) WHERE RNUM BETWEEN ? AND ?
-------------------------------------------------
properties 에 복붙

 

'study > WebServer' 카테고리의 다른 글

10_ws_(EL, JSTL)  (0) 2020.02.11
9_ws_(파일업로드)  (0) 2020.01.23
7_ws_(암호화)  (0) 2020.01.17
6_ws_(session)  (0) 2020.01.16
5_ws_(mapge 수정정보창)  (0) 2020.01.15