본문 바로가기

수업 & 공부/수업 내용

26- 게시판 만들기4 (페이징 처리)

추가한 기능 페이징처리와, EndUser에게 입력받은 '숫자'에 맞추어 글을 출력

 

  동작순서

  1. BoardList.jsp에서 EndUser에게 입력받아 Controller를 통해 BoardLIstCmd로 값을 넘겨준다 (action)

  2. BoardListCmd에서 받은 데이터를 서버(BoardDAO)로 넘겨주고 

  3. 서버(BoardDAO) 에서는 주어진 쿼리를 수행 > 수행한 쿼리값을 다시 BoardListCmd로 넘겨준다

  4. BoardLIstCmd에서 값을 받아 BoardList.jsp로 전달 > request.setAttribute(“객체명”, 객체)

  5. BoardLIst.jsp에서 EndUser에게 입력받은 값의 동작을 보여준다

 

  :: Action으로 넘어온 값을 변경시킨후 JSP 페이지로 넘겨주기 위해서는  

    request.setAttribute() 로 넘기고  request.getAttribute() 로 받는다. 아래 예시를 보자

 

   (java to jsp)

   request.setAttribute("boardRowList", list); 로 넘겨서 ${boardRowList} 로 받는다

   ( Jstl 저장객체 접근 : ${boardRowList} => request.getAttribute("boardRowList"); ) 

 

BoardListCmd

 

// db에 접근해서 데이터 가져오는 인스턴스
        BoardDAO dao = new BoardDAO();
        // dao 기능 호출해서 가져온 db 데이터를 저장하는 컬렉션
        ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();

  dao 기능을 호출해서 가져온 db 데이터를 List로 저장한다

 

 

  아래 코드는 페이지당 보여줄 pagePerRow를 요청받는다

  ( boardList.jsp 에서 boardListCmd로 넘겨주어 처리 )

  public static final int DEFAULT_PAGE_PER_ROW = 3; 페이지당 보여줄 default값은 3으로 지정되어있다

String pagePerRowStr = request.getParameter("pagePerRow");
        int pagePerRow = DEFAULT_PAGE_PER_ROW;
        if(pagePerRowStr != null){
            pagePerRow = Integer.parseInt(pagePerRowStr);
        }

  페이지당 보여줄 글 수가 null이라면 디폴드 값을

  null값이 아니라면 입력받은 값을 형변환 하여 pagePerRow로 지정해준다 

  PagePerRow =  입력받은 값을 > 페이지당 보여줄 글 수로 (페이지당 보여줄 글 수)

 

// pageNum의 요청을 받는다.
        String page = request.getParameter("page");

        int pageNum;
        if(page == null){
            pageNum = 1;
        } else {
            pageNum = Integer.parseInt(request.getParameter("page"));
        }

 

  client에서 요청받은 page. null값이면 1이고 아니면 요청받은 값을 숫자로 형변환 하여 pageNum으로 지정

  pageNum = 선택한 페이지

 

try {
            list = dao.getBoardList(pageNum, pagePerRow);
            /*
             * 페이지 번호가 몇번까지 나올 수 있는가?
             * */
            // (board테이블 전체 글의 갯수, row갯수)
            int totalRowCount = dao.getBoardTotalRowCount();
            // 전체 페이지 수 산출
            int totalPageCount = getTotalPageCount(pagePerRow, totalRowCount);

            /*
             * 가져온 db 데이터 리스트를 어떻게 jsp로 보여줄것인가?
             * */
            request.setAttribute("boardRowList", list);
            request.setAttribute("pagePerRow", pagePerRow);
            request.setAttribute("totalPageCount", totalPageCount);

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

  1. list에 dao (BoardDAO)에서 가져온 데이터 pageNum, pagePerRow 를 저장한다

     (1. BoardDAO로 이동)

 

  2. totalPageCount에 dao에서 가져온 데이터 pagePerRow, totalRowCount 를 int형으로 받는다

     (2. BoardDAO로 이동)

 

  3. dao에서 가져온 데이터를 request.setAttribute(“객체명”, 객체); 통해서 jsp로 보낸다

      :: Action으로 넘어온 값을 변경시킨후 JSP 페이지로 넘겨주기 위해서는  request.setAttribute() 

 

 

 

 

1. BoardDAO - getBoardList

 

  (db 접속코드 생략)

// 페이징 처리에 따라 rowNum의 시작과 끝값을 변수처리
        int startRowNum;
        int endRowNum = pageNum*pagePerRow;
        if(pageNum == 1){
            startRowNum = pageNum;
        } else {
            startRowNum = (pagePerRow*(pageNum-1))+1;
        }

 

  BoardDAO에서는 BoardListCmd에서  pageNum 과 pagePerRow를 받아 페이징 처리를위해 계산

  1page :  a              ~  a*N
  2page : (N*(a-1))+1  ~  a*N

  ( a는 페이지 N은 보여줄 글의 수 )

  첫 페이지와 그 뒤 페이지의 변수처리가 다르다 

 

// 쿼리 준비 & db 쿼리
        pstmt = conn.prepareStatement("select * \n" +
                "from \n" +
                "(select board.*, ROW_NUMBER() OVER() as rowNum from board order by id asc) tb\n" +
                "where tb.rowNum between "+startRowNum+" and "+endRowNum);
        rs = pstmt.executeQuery();

  그리고 계산한 값을 준비한 DB쿼리에 넣어서 boardList에서 보여줄 글을 정한다

 

 

 

 

 

2. BoardDAO - getBoardTotalRowCount

 

  (db 접속코드 생략)

// board테이블 전체 row 갯수
        pstmt = conn.prepareStatement("select count(*) as count from Board");
        rs = pstmt.executeQuery();

        if(rs.next()){
            return rs.getInt("count");
        }

        throw new SQLException("Board테이블의 전체 갯수를 가지고 올 수 없습니다.");

  전체 글의 수를 출력하는 DB쿼리를 넣고, 결과값을 가져온다

 

 

 

 

 

3. boardList.jsp

 

    <tr>
        <td colspan="7">
            <c:forEach var="i" begin="1" end="${totalPageCount}">
            <a href="boardList.bbs?page=${i}&pagePerRow=${pagePerRow}">[<c:out value="${i}"/>]<a/>
                </c:forEach>
        </td>
    </tr>

  boardListCmd에서 받은 totalPageCount

  forEach문을 통해 페이지와 페이지당 보여줄 글 수 (아래 스크립트에서 숫자인지 숫자가 아닌지 판별 후) 를 받아 이동

 

<script>
    function checkPagePerRow() {
        // input name="pagePerRow"의 데이터 가져와서
        const value = document.getElementById("pagePerRow").value;
        console.log('value', value);
        // 숫자로 변환 가능한지 체크
        if(!isNaN(Number(value))){
            // 변환가능 : submit
            reqPagePerRow.submit();
        } else {
            // 불가능 : alert('숫자를 정확히 입력 해 주세요')
            alert('숫자를 정확히 입력 해 주세요');
        }
    }
</script>