[JAVA] 페이지네이션, 페이징 처리
페이지네이션
페이지네이션 시에 꼭 필요한 값은 한 페이지에 표시할 데이터의 개수, 한 블록당 표시할 페이지번호, 총 데이터의 개수이다.
public class Pagination {
private int rowsPerPage = 10; // 한 페이지당 표시할 데이터의 갯수
private int pagesPerBlock = 5; // 한 블록당 표시할 페이지번호 숫자
private int currentPageNo; // 현재 페이지번호
private int totalRecords; // 총 데이터 갯수
private int totalPages; // 총 페이지 갯수
private int totalBlocks; // 총 페이지블록 갯수
private int currentBlock; // 현재 페이지 번호에 해당하는 현재 블록 번호
private int beginPage; // 현재 블록번호에 해당하는 시작 페이지 번호
private int endPage; // 현재 블록번호에 해당하는 끝 페이지 번호
private int prevPage; // 이전 블록의 페이지번호
private int nextPage; // 다음 블록의 페이지번호
private int begin; // 현재 페이지번호에 해당하는 데이터 조회 시작 순번
private int end; // 현재 페이지번호에 해당하는 데이터 조회 끝 순번
/**
* 페이지번호와 총 데이터 갯수를 전달받아서 Pagination객체를 초기화한다.
* 페이징처리에 필요한 모든 값을 계산해서 멤버변수에 저장한다.
* @param pageNo 요청한 페이지 번호
* @param totalRecords 총 데이터 갯수
*/
public Pagination(String pageNo, int totalRecords) {
init(pageNo, totalRecords, rowsPerPage);
}
/**
* 페이지번호와 총 데이터 갯수, 행의 갯수를 전달받아서 Pagination객체를 초기화한다.
* 페이징처리에 필요한 모든 값을 계산해서 멤버변수에 저장한다.
* @param pageNo 요청한 페이지 번호
* @param totalRecords 총 데이터 갯수
* @param 한 화면당 표시할 행의 갯수
*/
public Pagination(String pageNo, int totalRecords, int rows) {
init(pageNo, totalRecords, rows);
}
private void init(String pageNo, int totalRecords, int rows) {
this.totalRecords = totalRecords;
this.rowsPerPage = rows;
// 총 페이지 갯수를 계산해서 멤버변수 totalPages에 대입한다.
totalPages = (int)(Math.ceil((double)totalRecords/rowsPerPage));
// 총 블록 갯수를 계산해서 멤버변수 totalBlocks에 대입한다.
totalBlocks = (int)(Math.ceil((double)totalPages/pagesPerBlock));
// 현재 페이지번호를 계산한다.
currentPageNo = 1;
try {
currentPageNo = Integer.parseInt(pageNo);
} catch (NumberFormatException e) {}
// 숫자로 변환된 현재 페이지번호가 0이거나 0보다 작으면 현재 페이지번호를 1로 설정한다.
if (currentPageNo <= 0) {
currentPageNo = 1;
}
// 숫자로 변환된 현재 페이지번호가 총 페이지갯수 보다 크면 현재 페이지번호를 totalPages로 설정한다.
if (currentPageNo > totalPages) {
currentPageNo = totalPages;
}
// 현재 페이지번호에 해당하는 데이터조회 시작 순번과 끝 순번을 계산해서 멤버변수에 대입한다.
begin = (currentPageNo - 1)*rowsPerPage + 1;
end = currentPageNo*rowsPerPage;
// 현재 페이지번호에 대한 현재 블록번호를 계산해서 멤버변수에 대입한다.
currentBlock = (int)(Math.ceil((double)currentPageNo/pagesPerBlock));
// 현재 블록 번호에 해당하는 시작페이지번호와 끝페이지번호를 계산해서 멤버변수에 대입한다.
beginPage = (currentBlock - 1)*pagesPerBlock + 1;
endPage = currentBlock*pagesPerBlock;
if (currentBlock == totalBlocks) {
endPage = totalPages;
}
// 현재 페이지번호에 대한 이전 블록의 페이지번호를 계산해서 멤버변수에 대입한다.
if (currentBlock > 1) {
prevPage = (currentBlock - 1)*pagesPerBlock;
}
// 현재 페이지번호에 대한 다음 블록의 페이지번호를 계산해서 멤버변수에 대입한다.
if (currentBlock < totalBlocks) {
nextPage = currentBlock*pagesPerBlock + 1;
}
}
/**
* 계산된 현재 페이지번호를 반환한다.
* @return 페이지번호
*/
public int getPageNo() {
return currentPageNo;
}
/**
* 총 게시글 갯수를 반환한다.
* @return 총 게시글 갯수
*/
public int getTotalRecords() {
return totalRecords;
}
/**
* 총 페이지 갯수를 반환한다.
* @return 총 페이지 갯수
*/
public int getTotalPages() {
return totalPages;
}
/**
* 시작 페이지번호를 반환한다.
* @return 시작 페이지번호
*/
public int getBeginPage() {
return beginPage;
}
/**
* 끝 페이지번호를 반환한다.
* @return 끝 페이지번호
*/
public int getEndPage() {
return endPage;
}
/**
* 조회 시작 순번을 반환한다.
* @return 조회 시작 순번
*/
public int getBegin() {
return begin;
}
/**
* 이전 블록의 페이지번호를 반환한다.
* @return 페이지번호
*/
public int getPrevPage() {
return prevPage;
}
/**
* 이전 블록 존재여부를 반환한다.
* @return 이전 블록 존재 여부
*/
public boolean isExistPrev() {
if (totalBlocks == 1) {
return false;
}
return currentBlock > 1;
}
/**
* 다음 블록 존재여부를 반환한다.
* @return 다음 블록 존재 여부
*/
public boolean isExistNext() {
if (totalBlocks == 1) {
return false;
}
return currentBlock < totalBlocks;
}
/**
* 다음 블록의 페이지번호를 반환한다.
* @return 페이지번호
*/
public int getNextPage() {
return nextPage;
}
/**
* 조회 끝 순번을 반환한다.
* @return 조회 끝 순번
*/
public int getEnd() {
return end;
}