페이징을 적용해봅시다. 검색따윈 안합니다. 페이징은 List만 신경쓰면 됩니다.
페이징을 위해선 PagingVO가 필요합니다.
com.study.common.vo 패키지에 PagingVO를 만들어줍시다.
PagingVO
package com.study.common.vo;
import java.io.Serializable;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
public class PagingVO implements Serializable {
//입력받는 데이터
private int curPage=1; // 현재 페이지 번호
private int rowSizePerPage=10; // 한 페이지당 레코드 수 기본10
private int pageSize=10; // 페이지 리스트에서 보여줄 페이지 갯수 이거는 보통 10 or 5 안 변함
private int totalRowCount ; // 총 레코드 건수
//입력받는 데이터를 통해 계산되는 값
private int firstRow ; // 시작 레크드 번호
private int lastRow; // 마지막 레크드 번호
private int totalPageCount; // 총 페이지 건수
private int firstPage; // 페이지 리스트에서 시작 페이지 번호
private int lastPage; // 페이지 리스트에서 마지막 페이지 번호
public void pageSetting() {
totalPageCount = (totalRowCount-1)/rowSizePerPage+ 1;
firstRow = (curPage - 1) * rowSizePerPage + 1;
lastRow = firstRow + rowSizePerPage-1;
if(lastRow >= totalRowCount) {
lastRow = totalRowCount;
}
firstPage = ( (curPage-1) / pageSize) * pageSize + 1;
lastPage = firstPage + pageSize-1;
if(lastPage > totalPageCount) {
lastPage = totalPageCount;
}
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getRowSizePerPage() {
return rowSizePerPage;
}
public void setRowSizePerPage(int rowSizePerPage) {
this.rowSizePerPage = rowSizePerPage;
}
public int getFirstRow() {
return firstRow;
}
public void setFirstRow(int firstRow) {
this.firstRow = firstRow;
}
public int getLastRow() {
return lastRow;
}
public void setLastRow(int lastRow) {
this.lastRow = lastRow;
}
public int getTotalRowCount() {
return totalRowCount;
}
public void setTotalRowCount(int totalRowCount) {
this.totalRowCount = totalRowCount;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getFirstPage() {
return firstPage;
}
public void setFirstPage(int firstPage) {
this.firstPage = firstPage;
}
public int getLastPage() {
return lastPage;
}
public void setLastPage(int lastPage) {
this.lastPage = lastPage;
}
}
/free/freeList.wow로 요청 할 때 PagingVO를 매개변수로 받습니다.
그리고 DB에서 PagingVO를 통해 데이터를 제한적으로 가져와야합니다.
이를 위해 IFreeBoardDao에 getTotalRowCount(PagingVO paging)를 추가합니다.
또 IFreeBoardDao의 getBoardList()메소드도 getBoardList(PagingVO paging)으로 바꿉니다.
바뀐 IFreeBoardDao.java
public int getTotalRowCount(PagingVO paging);
public List<FreeBoardVO> getBoardList(PagingVO paging);
이제 freeBoard.xml에서 getTotalRowCount를 작성하고
getBoardList를 약간 수정해 줍시다.
freeBoard.xml
<select id="getTotalRowCount" parameterType="com.study.common.vo.PagingVO" resultType="int">
SELECT count(*)
FROM free_board
</select>
<select id="getBoardList" resultType="com.study.free.vo.FreeBoardVO" parameterType="com.study.common.vo.PagingVO">
SELECT * FROM
(SELECT a.*,rownum AS rnum FROM (
SELECT bo_no
, bo_title , bo_category, bo_writer
, bo_pass, bo_content, bo_hit
, to_char(bo_reg_date,'YYYY-MM-DD') AS bo_reg_date
, to_char(bo_mod_date,'YYYY-MM-DD') AS bo_mod_date
, bo_del_yn
FROM free_board
WHERE bo_del_yn='N'
ORDER BY bo_no desc
) a )b
WHERE rnum between #{firstRow} and #{lastRow}
</select>
Controller단에서 PagingVO의 나머지 필드들도 세팅한 후 model 담아 jsp에 전달합니다.
FreeController의 바뀐 freeList메소드는 다음과 같습니다.
FreeController.java
@RequestMapping("/free/freeList.wow")
public String freeList(Model model, @ModelAttribute("paging")PagingVO paging) {
int totalRowCount=freeBoardDao.getTotalRowCount(paging);
paging.setTotalRowCount(totalRowCount);
paging.pageSetting();
List<FreeBoardVO> freeBoardList=freeBoardDao.getBoardList(paging);
model.addAttribute("freeBoardList",freeBoardList);
return "free/freeList";
}
이 상태에서 /free/freeList.wow를 요청해보면 화면은 다음과 같다.
이는 기본적으로 curPage가 1인 화면이다. 이제 여기에서 curPage에 변화를 주는 a태그를 만들면 된다.
freeList.jsp 하단부에 다음의 태그를 추가하자.
freeList.jsp
<a href="freeList.wow?curPage=1">«</a>
<a href="freeList.wow?curPage=${paging.curPage-1 }"><</a>
<c:forEach begin="${paging.firstPage }" end="${paging.lastPage }" var="i">
<a href="freeList.wow?curPage=${i }" >
<c:if test="${i eq paging.curPage }"> <span style="color: red"> ${i } </span> </c:if>
<c:if test="${i ne paging.curPage }"> ${i } </c:if>
</a>
</c:forEach>
<a href="freeList.wow?curPage=${paging.curPage+1 }">></a>
<a href="freeList.wow?curPage=${paging.totalPageCount }">»</a>
이후 다시 /free/freeList.wow를 요청하면 다음과 같은 화면이 나온다.
※간단한 버전에서 > 는 1페이지씩 다음페이지로 이동하도록 구현하였다.