본문 바로가기

IT, 인터넷/JAVA, 스프링부트

스프링부트 jsp 페이징 처리 하기

반응형

스프링부트 기본적인 개발환경 설정을 해서 게시판 만들기는 해당 주소를 참고 바랍니다.

https://astonysia-story.tistory.com/21

 

스프링부트 + jsp + yml로 게시판 만들기 - (1) 개발환경 설정

개발환경은 JAVA, 이클립스(이클립스 대신에 sts를 사용 하셔도 됩니다), 마리아디비, dbeaver(데이터베이스 툴)를 먼저 다운로드를 받아서 개발환경을 맞추어 줍니다. 1. JAVA 다운로드 설치 및 실행 h

astonysia-story.tistory.com

https://astonysia-story.tistory.com/22

 

스프링부트 + jsp + yml로 게시판 만들기 - (2) 게시판 만들기

먼저 이클립스의 src/main/resource에 application.properties -> application.yml로 파일명을 변경하여 줍니다. 그리고 마리아 디비에서 데이터베이스를 만들고 테이블을 만들어 주어야 합니다. 실행 검색에 mar.

astonysia-story.tistory.com

 

 

paging 패키지를 만든어서 Criteria.java Paging.java 파일을 만듭니다.

Criteria.java

package com.example.demo.paging;

public class Criteria {

// 특정 페이지 조회를 위한 클래스
    private int page; // 현재 페이지 번호
    private int perPageNum; // 페이지당 보여줄 게시글의 개수
    
    public int getPageStart() {
        // 특정 페이지의 범위를 정하는 구간, 현재 페이지의 게시글 시작 번호
        // 0 ~ 10 , 10 ~ 20 이런식으로
        return (this.page -1) * perPageNum;
    }
 
    public Criteria() {
        // 기본 생성자 : 최초 게시판에 진입시 필요한 기본값
        this.page = 1;
        this.perPageNum = 10;
    }
 
    // 현재 페이지 번호 page : getter, setter
    public int getPage() {
        return page;
    }
 
    public void setPage(int page) {
        if(page <= 0) {
            this.page = 1;
            
        } else {
            this.page = page;
        }    
    }
 
    
    // 페이지당 보여줄 게시글의 개수 perPageNum : getter, setter
    public int getPerPageNum() {
        return perPageNum;
    }
 
    public void setPerPageNum(int perPageNum) {
        int cnt = this.perPageNum;
        
        if(perPageNum != cnt) {
            this.perPageNum = cnt;    
        } else {
            this.perPageNum = perPageNum;
        }
        
    }
    
    @Override
    public String toString() {
        return "Criteria [page=" + page + ", perPageNum=" + perPageNum + "]";
    }
}

 

Paging.java

package com.example.demo.paging;

public class Paging {

private int totalCount; // 게시판 전체 데이터 개수
    private int displayPageNum = 10; // 게시판 화면에서 한번에 보여질 페이지 번호의 개수
    
    private int startPage; // 화면의 시작 번호
    private int endPage;  // 화면의 끝 번호
    private boolean prev; // 페이징 이전 버튼 활성화 여부
    private boolean next; // 페이징 다음 버튼 활성화 여부
    
    private Criteria cri;
 
    
    public int getTotalCount() {
        return totalCount;
    }
 
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        
        pagingData();
    }
    
    private void pagingData() {
        
        endPage = (int) (Math.ceil(cri.getPage() / (double) displayPageNum) * displayPageNum);
        // endPage = (현재 페이지 번호 / 화면에 보여질 페이지 번호의 개수) * 화면에 보여질 페이지 번호의 개수
        startPage = (endPage - displayPageNum) + 1;
        // startPage = (끝 페이지 번호 - 화면에 보여질 페이지 번호의 개수) + 1
        
        int tempEndPage = (int) (Math.ceil(totalCount / (double) cri.getPerPageNum()));    
        if(endPage > tempEndPage) {
            endPage = tempEndPage;
        }
        // 마지막 페이지 번호 = 총 게시글 수 / 한 페이지당 보여줄 게시글의개수
        
        prev = startPage == 1 ? false : true;    
        // 이전 버튼 생성 여부 = 시작 페이지 번호가 1과 같으면 false, 아니면 true
        next = endPage * cri.getPerPageNum() >= totalCount ? false : true;
        // 다음 버튼 생성 여부 = 끝 페이지 번호 * 한 페이지당 보여줄 게시글의 개수가 총 게시글의 수보다
        // 크거나 같으면 false, 아니면 true
    }
 
    public int getDisplayPageNum() {
        return displayPageNum;
    }
 
    public void setDisplayPageNum(int displayPageNum) {
        this.displayPageNum = displayPageNum;
    }
 
    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 boolean isPrev() {
        return prev;
    }
 
    public void setPrev(boolean prev) {
        this.prev = prev;
    }
 
    public boolean isNext() {
        return next;
    }
 
    public void setNext(boolean next) {
        this.next = next;
    }
 
    public Criteria getCri() {
        return cri;
    }
 
    public void setCri(Criteria cri) {
        this.cri = cri;
    }
    
    
    @Override
    public String toString() {
        return "PageMaker [totalCount=" + totalCount + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
                + prev + ", next=" + next + ", displayPageNum=" + displayPageNum + ", cri=" + cri + "]";
    }
}

 

그리고 이미 스프링부트 게시판 만들기에서 만든 TestVo.java에 이걸 추가를 합니다.

 extends Criteria

TestController.java에 해당내용을 추가를 합니다.

TestController.java

// 페이징 객체
        Paging paging = new Paging();
        paging.setCri(vo);
        paging.setTotalCount(151); // 리스트 총갯수 (디비에서 count(*) 가지고 와야 함)

 

request.setAttribute("paging", paging);

 

 

그리고 test.jsp 에 해당 내용을 하단에 추가를 합니다.

<ul class="paging">
    <c:if test="${paging.prev}">
        <span><a href='<c:url value="/test?page=${paging.startPage-1}"/>'>이전</a></span>
    </c:if>
    <c:forEach begin="${paging.startPage}" end="${paging.endPage}" var="num">
        <span><a href='<c:url value="/test?page=${num}"/>'>${num}</a></span>
    </c:forEach>
    <c:if test="${paging.next && paging.endPage>0}">
        <span><a href='<c:url value="/test?page=${paging.endPage+1}"/>'>다음</a></span>
    </c:if>
</ul>

그리고 페이지를 띄우면 정상적으로 되는걸 볼수 있습니다.

 

결과)

 

반응형