select t.* from
(select sub.*, rownum as rnum from
(select * from bboard order by num desc) sub) t
where rnum between #{startNo} and #{endNo}
최신순으로 정렬해서 rownum으로 원하는 글들을 출력해내는
쿼리문
페이징을 구현하기 위한 VO 변수들
페이징을 구현하기 위한 계산 메서드
private void calcPage() {
startNo = (this.page - 1) * perPageNum+ 1;
DB쿼리에서 사용... 시작데이터번호 = (jsp클릭한 페이지번호-1) 페이지당 보여지는 개수
page 변수는 현재 jsp에서 클릭한 페이지번호
만약 2페이지라면 11-20번글이 와야하기 때문에 첫글번호는 (2-1)10+1=11
시작글번호는 변함이 없으니 이대로 고정
int tempEnd = (int) (Math.ceil(page / (double)
this.perPageNum) * this.perPageNum);
1-10번째 페이지만 처음에 출력되고 11-20까지는 다음버튼을 눌렀을 시 나온다.
126개의 게시물이 있다면 100개까진 첫화면에 26개는 2번째 화면에 출력
ceil함수는 천장 함수로 1.1 = 2, 2.1 = 3 으로 출력된다.
jsp에서 클릭한 페이지번호를 기준으로 끝 페이지를 계산한다.
this.startPage = (tempEnd - this.perPageNum) + 1;
시작페이지 계산 클릭한 page번호 10일때까지 시작페이지는 1
if (tempEnd * this.perPageNum > this.totalCount) {
this.endPage = (int) Math.ceil(this.totalCount / (double) this.perPageNum);
if(endPage!=page) {
this.endNo = startNo + this.perPageNum-1;
}else {
this.endNo = startNo + this.totalCount % 10-1;
}
클릭한 page번호로 계산된 게시물수가 실제 게시물개수 totalCount 클때
현재 페이지가 마지막 페이지라면 게시글 갯수가 10개가 되지 않을수도 있으니 확인후 보정
} else {
this.endPage = tempEnd;
this.endNo = startNo + this.perPageNum -1;
}
클릭한 page번호로 계산된 게시물수가 실제게시물개수 totalCount 작을때
this.prev = this.startPage != 1;
시작페이지 1보다 크면 무조건 이전 페이지가 있음. true
this.next = this.endPage * this.perPageNum
< this.totalCount;
클릭한 page번호로 계산된 게시물수가 실제 게시물 개수보다 작다면 다음페이지가 있음. true!
controller 메서드
@RequestMapping(value = "/bbsList", method = RequestMethod.GET)
public String bbsList(Locale locale, Model model, @ModelAttribute("pageVO")PageVO pageVO )throws Exception {
System.out.println("현재 페이지 정보: "+pageVO.getPage());
if(pageVO.getPage()==null) { //클라이언트가 페이지정보를 넘겨주지 않는다면 기본값 1로 셋팅
pageVO.setPage(1);
}
//page 계산하기 위해서는 첫번째 페이지 정보 (클라이언트가 넘겨줍니다.), 두번쨰는 전체 페이지수, 세번째는 페이지당 그리고 페이지 그룹당 수
int totalpageCnt=brsv.countBoard();
System.out.println(totalpageCnt+"건 등록됨");
pageVO.setTotalCount(totalpageCnt);
List<BoardVO> list=brsv.selectAll(pageVO);
System.out.println(list.size()+"ddsfsd");
model.addAttribute("bList",list);
model.addAttribute("pageVO",pageVO);//페이지 객체를 view에게 전달
return "bbs/bbsList";
}
view jsp 코드
<tr>
<td colspan=6>
<c:if test="${pageVO.prev}">
<a href="bbsList?page=${pageVO.startPage -1}">이전 페이지 그룹 </a>
</c:if>
<c:forEach begin="${pageVO.startPage}" end="${pageVO.endPage}" var="idx">
<c:if test="${pageVO.page == idx}">*</c:if>
<a href="bbsList?page=${idx}" }>${idx}</a>
</c:forEach>
<c:if test="${pageVO.next}">
<a href="bbsList?page=${pageVO.endPage +1}"> 다음 페이지 그룹</a>
</c:if>
</td>
</tr>
forEach문을 이용해 10개씩 10번 출력을 해주었고,
if문을 이용해 [이전페이지] , [다음페이지] 를 출력해주었다.