개발자 미니민의 개발스터디

[JSP] Paging 처리 (Myutil)

by mini_min

JSP

[JSP] Paging 처리 (Myutil)

✔️ 전체 페이지 수 구하기

	//전체 페이지 수
	public int pageCount(int dataCount, int size) {
		if(dataCount <= 0) {
			return 0;
		}
		
		return dataCount/size + (dataCount % size > 0 ? 1 : 0);
		
	}

 

✔️ GET 방식으로 페이징 처리하기

👩‍💻 여러 문자열을 더할 것이기 때문에, StringBuilder 객체를 만들어준다.

 

1) 파라미터 : current_page / total_page / list_url (링크 설정할 주소) 

RETURN : 페이징 결과 (sb.toString();)

public String paging(int current_page, int total_page, String list_url) {
    StringBuilder sb = new StringBuilder();
    
    //중략
    }

 

2) 한 페이지에 나올 데이터 수 : 10개

currentPageSetup; (데이터가 표시될 페이지의 범위에서 첫 번째 페이지 -1)

int numPerBlock = 10; //한줄에 나올 데이터 수
int currentPageSetup;
int n, page;

 

3) current_page 는 현재 보일 페이지이다.

만약, 현재 보일 페이지가 1보다 적거나, 전체 페이지 수를 넘어서면 RETURN ""

//current_page : 현재 보이는 페이지
if(current_page < 1 || total_page < current_page ) {
    return "";
}

 

4) GET 방식으로 페이징 처리하려면, <주소?이름1=값1&이름2=값2> 형식이기 때문에 list_url 에서 ?가 이미 있으면 &를 붙인다. 

//주소 물음표 있으면 & 붙이기
if(list_url.indexOf("?") != -1) {
    list_url += "&";
} else {
    list_url += "?";
}

 

5) currentPageSetup 는 표시를 시작할 페이지 -1

만약, 현재 페이지가 47이면 : 47/10 = 4 * 10 해서 currentPageSetup 은 40이 나온다.

//currentPageSetup : 표시를 시작할 페이지 -1
currentPageSetup = (current_page / numPerBlock) * numPerBlock;
        //나눠 떨어질 경우
    if( current_page % numPerBlock == 0) {
        currentPageSetup = currentPageSetup - numPerBlock;
    }

 


6) 처음페이지, 이전 태그 만들기 (10페이지 전)

: 전체 페이지수보다 데이터 수가 적고, 현재페이지셋업이 0보다 크면, (첫 페이지가 아니면) 처음과 이전 태그가 만들어지도록 한다.

(첫 페이지에서는 '이전' 버튼이 없어야함)

💡 if 현재 페이지가 34페이지일 때,
n 은 34 - 10 = 24. 
이전 페이지를 누르면 10만큼 뒷페이지로 넘어가서 24페이지가 열린다. 
sb.append("<div class='paginate'>");
//처음페이지, 이전(10페이지 전)
n = current_page - numPerBlock;
    // 1) 전체 페이지가 10장을 넘어야한다. 1장인데 이전 버튼 있으면 안된다. 
    // 2) currentPageSetup 이 10 은 되어야함 (1~10 페이지만 있을 때 이전 버튼 안된다.)
if(total_page > numPerBlock && currentPageSetup > 0) {
    sb.append("<a href='" + list_url + "page=1'>처음</a>");
    sb.append("<a href='" + list_url + "page=" + n + "'>이전</a>");

}

 

7) 페이징 처리 ⭐⭐

: 페이지는 현재페이지셋업에서 +1 부터 찍히도록 한다.

: 전체 페이지수를 넘어가지 않고 현재페이지셋업+한 페이지 출력 데이터 수를 넘어서지 않는 수일때 while 돌린다.

: 만약 페이지와 현재 페이지가 같으면 <span> 태그로 내용 출력

: 그게 아니라면 한 페이지씩 찍는다.

page = currentPageSetup + 1; //30이면 31부터 찍히도록 하는것 
while(page <= total_page && page <= (currentPageSetup+numPerBlock)) {
    if(page == current_page) {
        sb.append("<span>" + page + "</span>");
    } else {
        sb.append("<a href='" + list_url + "page=" + page + "'>" + page + "</a>");

    }
    page++;
}

 

 

8) 다음(10페이지 후), 마지막 페이지

: 10 페이지씩 넘어가기 (현재 페이지 + 10개)

n = current_page + numPerBlock; //페이지 오바해서 넘어가면 안되니까 아래 if조건
if(n > total_page ) n = total_page;
    // 97 - 80 = 17 > 10 일때도 생김. 
    // but, 97-90 = 7 > 10 안생김 (마지막 페이지)
if(total_page - currentPageSetup > numPerBlock) {
    sb.append("<a href='" + list_url + "page=" + n + "'>다음</a>");
    sb.append("<a href='" + list_url + "page=" + total_page + "'>끝</a>");

}
sb.append("</div>");
return sb.toString();

 


✔️ jsp - list

- 처음 페이지는 무조건 1

- 이후 클라이언트가 요청하는 값 (pageNum) 이 있으면 현재 페이지가 변경된다.

- 현재 페이지는 전체 페이지 수를 넘지 못한다. 

<%@page import="com.util.Myutil"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@page trimDirectiveWhitespaces="true" %>
<%
	request.setCharacterEncoding("utf-8");
		
	// 파라미터로 넘어온 페이지 번호(JSP 에서 PAGE 는 예약어로 변수명으로 사용 불가)
	String pageNum = request.getParameter("page");
	int current_page = 1;
	
	Myutil util = new Myutil();
	
	//파라미터가 존재하면
	if(pageNum != null){
		current_page = Integer.parseInt(pageNum);
	}
	
	int dataCount = 965;
	int size = 10;
	int total_page = util.pageCount(dataCount, size);
	if(current_page > total_page) {
		current_page = total_page;
	}
	
	//페이징 처리
	String listUrl = "list.jsp";
	String paging = util.paging(current_page, total_page, listUrl);
	
%>

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기