1. mapper에 아래와 같이 select 태그 추가
<select id="listCri" resultType="BoardVO">
select * from tbl_board
order by bno desc, regdate desc
limit #{pageStart},#{perPageNum}
</select>
2. domain에 PageMaker 객체 추가
- 현재 페이지 번호(page), 페이지 크기(보여줄 게시글 수, perPageNum) 등 설정할 수 있는 PageMaker 객체 추가
- sql문에 limit에 들어갈 수는 0부터 시작함. 따라서 getPageStart 메서드를 이용해 해당 페이지의 시작 컬럼번호를 계산해줌
mapper에서 #{} 을 이용하면 getter에서 값을 가져올 수 있음. 따라서 pageStart 변수 없어도 getPageStart getter를 통해 값을 가져옴
package com.itwillbs.domain;
public class PageMaker {
// 페이징 처리에 필요한 모든 정보를 저장하는 객체
// 상단부 페이징 처리
private int page; // 페이지 시작번호
private int perPageNum; // 페이지 크기
// 하단부 페이징 처리
private int totalCount; // 총 게시글 수
private int startPage;
private int endPage;
private boolean prev;
private boolean next;
private int displayPageNum = 10; // 페이지 블럭의 수
public PageMaker() {
this.page = 1;
this.perPageNum = 10;
}
public void setPage(int page) {
if (page <= 0) {
this.page = 1;
return;
}
this.page = page;
}
public void setPerPageNum(int perPageNum) {
if (perPageNum <= 0 || perPageNum > 100) {
this.perPageNum = 10;
return;
}
this.perPageNum = perPageNum;
}
// mapper에서 사용될 메서드
public int getPageStart() {
return (this.page - 1) * perPageNum;
}
public int getPage() {
return page;
}
public int getPerPageNum() {
return perPageNum;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
calData();
}
public void calData() {
endPage = (int) (Math.ceil(this.page / (double) displayPageNum) * displayPageNum);
int tmpEndPage = (int) (Math.ceil(totalCount / (double) this.perPageNum));
if (endPage > tmpEndPage) {
endPage = tmpEndPage;
}
startPage = (endPage - displayPageNum) + 1;
prev = startPage == 1 ? false : true;
next = endPage * this.perPageNum >= totalCount ? false : true;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public boolean isPrev() {
return prev;
}
public void setPrev(boolean prev) {
this.prev = prev;
}
public boolean isNext() {
return next;
}
public void setNext(boolean next) {
this.next = next;
}
public int getDisplayPageNum() {
return displayPageNum;
}
public void setDisplayPageNum(int displayPageNum) {
this.displayPageNum = displayPageNum;
}
public int getTotalCount() {
return totalCount;
}
@Override
public String toString() {
return "PageMaker [page=" + page + ", perPageNum=" + perPageNum + ", totalCount=" + totalCount + ", startPage="
+ startPage + ", endPage=" + endPage + ", prev=" + prev + ", next=" + next + ", displayPageNum="
+ displayPageNum + "]";
}
}
3. DAO에 아래와 같이 메서드 추가
@Override
public List<BoardVO> listPage(PageMaker pm) {
return sqlSession.selectList(NAMESPACE+".listPage", pm);
}
4. service에 메서드 추가
@Override
public List<BoardVO> boardListCri(PageMaker pm) {
return dao.listPage(pm);
}
5. 컨트롤러에서 호출
@RequestMapping(value="/listPM", method=RequestMethod.GET)
public void listCriGET(PageMaker pm, Model model) throws Exception {
// 서비스 - 페이징 처리된 리스트 동작 호출
// 해당 정보를 view 페이지로 전달
model.addAttribute("boardList", service.boardListCri(pm));
// 하단 페이징처리 정보 전달
pm.setTotalCount(336);
model.addAttribute("pm", pm);
}
http://localhost:8088/board/listPM 으로 호출하면 Criteria의 기본 생성로 인해 1페이지에 10개 글 정보가,
// http://localhost:8088/board/listPM?page=5 로 호출하면 5페이지의 10개 글 정보가 출력되게 된다.
'3. Back-end > 3-1. Spring MVC - 국비' 카테고리의 다른 글
MyBatis - [ 쿼리문 where like ] (0) | 2022.06.29 |
---|---|
Spring MVC - [ mapper : sql구문에 부등호 기호 사용 ] (0) | 2022.06.28 |
SpringMVC - [ 컨트롤러에서 예외 처리 ( @ControllerAdivce ) ] (0) | 2022.06.22 |
Spring MVC - [ tomcat 실행 주소 경로 변경 ] (0) | 2022.06.13 |
Spring MVC - [ 컨트롤러 주소 매핑 / 파라메터 전달 / 페이지 이동 ] (0) | 2022.06.13 |