반응형
출처 : http://theeye.pe.kr/82
게시판에서 쓸만한 페이징 클래스를 제작해 보았다. 문제 발견시 피드백 부탁드립니다^^
---------------------------------------------------------------------------------------
페이징 클래스 소스코드 :
---------------------------------------------------------------------------------------
public class PageNavigation {
private boolean isPrevPage;
private boolean isNextPage;
protected int nowPage;
protected int rowTotal;
protected int blockList;
protected int blockPage;
private int totalPage;
private int startPage;
private int endPage;
private int startRow;
private int endRow;
// 페이지를 계산하는 생성자
public PageNavigation(int nowPage, int rowTotal, int blockList, int blockPage) {
super();
// 각종 플래그를 초기화
isPrevPage = false;
isNextPage = false;
// 입력된 전체 열의 수를 통해 전체 페이지 수를 계산한다
this.totalPage = (int) Math.ceil((double)rowTotal / (double)blockList);
// 현재 페이지가 전체 페이지수보다 클경우 전체 페이지수로 강제로 조정한다
if(nowPage > this.totalPage)
{
nowPage = this.totalPage;
}
// DB입력을 위한 시작과 종료값을 구한다
this.startRow = (int) (nowPage - 1) * blockList;
this.endRow = (int) this.startRow + blockList - 1;
// 시작페이지와 종료페이지의 값을 구한다
this.startPage = (int) ((nowPage - 1) / blockPage) * blockPage + 1;
this.endPage = (int) this.startPage + blockPage - 1;
// 마지막 페이지값이 전체 페이지값보다 클 경우 강제 조정
if(this.endPage > this.totalPage)
{
this.endPage = totalPage;
}
// 시작 페이지가 1보다 클 경우 이전 페이징이 가능한것으로 간주한다
if(this.startPage > 1)
{
this.isPrevPage = true;
}
// 종료페이지가 전체페이지보다 작을경우 다음 페이징이 가능한것으로 간주한다
if(this.endPage < this.totalPage)
{
this.isNextPage = true;
}
// 기타 값을 저장한다
this.nowPage = nowPage;
this.rowTotal = rowTotal;
this.blockList = blockList;
this.blockPage = blockPage;
}
public void Debug()
{
System.out.println("Total Page : " + this.totalPage + " / Start Page : " + this.startPage + " / End Page : " + this.endPage);
System.out.println("Total Row : " + this.rowTotal + " / Start Row : " + this.startRow + " / End Row : " + this.endRow);
}
// 전체 페이지 수를 알아온다
public int getTotalPage()
{
return totalPage;
}
// 시작 Row값을 가져온다
public int getStartRow()
{
return startRow;
}
// 마지막 Row값을 가져온다
public int getEndRow()
{
return endRow;
}
// Block Row 크기를 가져온다
public int getBlockSize()
{
return blockSize;
}
// 시작페이지값을 가져온다
public int getStartPage()
{
return startPage;
}
// 마지막 페이지값을 가져온다
public int getEndPage()
{
return endPage;
}
// 이전페이지의 존재유무를 가져온다
public boolean isPrevPage()
{
return isPrevPage;
}
// 다음페이지의 존재유무를 가져온다
public boolean isNextPage()
{
return isNextPage;
}
}
---------------------------------------------------------------------------------------
서블릿(Controller) 소스코드 :
---------------------------------------------------------------------------------------
// 리스트를 가져온다
if(request.getParameter("page") == null)
{
nowPage = 1;
}
else
{
nowPage = Integer.parseInt(request.getParameter("page"));
if(nowPage < 1)
{
nowPage = 1;
}
}
// 객체를 생성한다 (현재페이지, 전체글수, 페이지당표시할 글의수, 한번에 표시할 페이징블록수)
PageNavigation pageNav = new PageNavigation(nowPage, rowTotal, 10, 5);
// 디버깅이 필요할시 사용한다. 안써도 됨
pageNav.Debug();
// 시작Row값과 종료Row값을 넣어 쿼리문을 작성한다
sql = "SELECT * FROM TableName ORDER BY no DESC LIMIT " + pageNav.getStartRow() + ", " + pageNav.getBlockSize();
// 뷰에게 넘길 값을 지정한다
request.setAttribute("pageIsPrev", pageNav.isPrevPage()); // 이전페이지 블록의 존재유무
request.setAttribute("pageIsNext", pageNav.isNextPage()); // 다음페이지 블록의 존재유무
request.setAttribute("pageStart", pageNav.getStartPage());// 시작페이지 번호
request.setAttribute("pageEnd", pageNav.getEndPage()); // 종료페이지 번호
---------------------------------------------------------------------------------------
jsp(View) 소스코드(EL표기법, JSTL사용) :
---------------------------------------------------------------------------------------
<div>
<center>
<c:if test="${pageIsPrev}">
<a href="index.do?page=${pageStart - 1}">prev</a>
</c:if>
<c:forEach var="page" begin="${pageStart}" end="${pageEnd}">
<a href="index.do?page=${page}">[${page}] </a>
</c:forEach>
<c:if test="${pageIsNext}">
<a href="index.do?page=${pageEnd + 1}">next</a>
</c:if>
</center>
</div>
---------------------------------------------------------------------------------------
결과 :
---------------------------------------------------------------------------------------
prev [11] [12] [13] [14] [15] next