DeseoDeSeo
[Spring ] SpringMVC 08, 게시판 페이징 본문
kr.spring.entity > class 파일 생성 " Criteria.java "
➜ 현재 내가 몇번째 페이지를 보고 있는지 페이지번호, 한 페이지에서의 게시글의 개수 등을 보관할 VO 생성
Criteria에는 기본으로 설정되는 한 페이지에 몇개의 게시글이 들어가는지. 페이지 번호는 몇개인지를 설정한다.
package kr.spring.entity;
import lombok.Data;
@Data
public class Criteria { //기준이라는 뜻임.
private int page; //현재 페이지 번호를 저장할 변수
private int perPageNum; //한 페이지에 보여줄 게시글의 개수
//Criteria 기본 셋팅 생성자를 통해서 하기
public Criteria() {
this.page = 1;
this.perPageNum =5;
}
//현재 페이지의 게시글의 시작번호를 구하는 메소드
// :현재 1페이지를 보고 싶으면 1부터 10까지의 게시물을 보여줌.
// 다음 페이지를 클릭하면 11 ~ 20까지의 게시물을 보여줌.
// 예외 : mysql에서는 시작값을 0으로 인식 -> 1페이지에서는 0~9임,
public int getPageStart() {
return(page-1) * perPageNum;
}
}
kr.spring.entity > class 파일 생성 " PageMaker.java "
➜ Criteria를 활용해서 게시판 페이징 처리를 해줄 클래스 생성
package kr.spring.entity;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class PageMaker {
//실제 페이징처리 클래스임. criteria는 설정 클래스임.
private Criteria cri; //게시판의 정보(현재 페이지의 정보, 한 페이지당 몇개의 게시물..)를 가지고 있는 객체 criteria가 있어야 페이징 처리가 가능하다.
private int totalCount; // 총 게시글의 수(를 알아야 몇 페이지가 필요한지 알 수 있다.)
private int startPage; // 시작페이지 번호(현재 있는 페이지 번호?!)
private int endPage; //끝페이지 번호
private boolean prev; //이전 버튼
private boolean next; // 다음 버튼
private int displayPageNum = 5; // 하단에 몇개의 페이지를 보여줄 것 인지( 페이지 목록에 들어가는 페이지 개수?!)
PageMaker.java
: 총 게시글의 수를 구하는 메서드
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
makePagein();
}
public void makePagein() {
//1. 화면에 보여질 마지막 페이지 번호
// 현재 하단에 보여줄 페이지 개수는 ? 10개
// Q : 현재 13페이지를 보고 있다면 우측 끝에 있는 마지막 페이지는 ? 20
// 13/10 -> 소수 발생 시 올림 -> 2 *10 = 20
// 현재 페이지/ 하단에 보여줄 페이지 개수 -> 소수 발생 시 올림 -> 결과 *10
endPage = (int)(Math.ceil(cri.getPage() / (double)displayPageNum)* displayPageNum);
// 2. 화면에 보여질 시작 페이지 번호
// 현재 15페이지라면 11~20. 20(마지막페이지)-10(보여줄 페이지 개수) + 1
startPage = endPage - displayPageNum +1;
if(startPage <=0) {
startPage =1; // 혹시라도 startPage가 0보다 작거나 같다면 1부터 시작할 수 있게
}
//3.최종 페이지가 맞는지 유효성 검사
// ex) 실제로 글이 101개라면 10개 페이지 +1개 페이지 더 만들어야한다.
//마지막 페이지 계산
int tempEndPage = (int)(Math.ceil(totalCount / (double)cri.getPerPageNum()));
//4.화면에 보여질 마지막 페이지 유효성 체크
if(tempEndPage < endPage) {
endPage = tempEndPage; // 마지막 페이지가 진짜로 구한 페이지 숫자보다 높으면 치환.
}
//5.이전, 다음 페이지 버튼 존재여부
prev = (startPage ==1)?false : true;
next = (endPage < tempEndPage) ? true: false;
}
BoardController.java
@GetMapping("/list")
public String boardList(Model model, Criteria cri) {
// board파일의 boardList.
// 이제는 페이지 정보를 알고 있는 Criteria객체를 Service에게 전달해야됨.
List<Board> list = service.getList(cri); //크리테리아를 기준으로 리스트를 불러올거임.
model.addAttribute("list",list);
return "board/list";
}
BoardService.java
public List<Board> getList(Criteria cri);
BoardServiceImpl.java
@Override
public List<Board> getList(Criteria cri) {
// 게시글 전체목록 가져오기 기능 = mapper가 하는 일임.controller > service > mapper.
List<Board> list = mapper.getList(cri);
return list;
}
BoardMapper.java
public List<Board> getList(Criteria cri);
BoardMapper.xml
limit 절 : 특정 집합을 출력시, 출력하는 행의 수를 한정하는 역할.
<select id="getList" parameterType="kr.spring.entity.Criteria" resultType="kr.spring.entity.Board">
SELECT * FROM TBLBOARD
ORDER BY BOARDGROUP DESC, BOARDSEQUENCE ASC
LIMIT #{pageStart}, #{perPageNum}
</select>
BoardController.java
@GetMapping("/list")
public String boardList(Model model, Criteria cri) {
// board파일의 boardList.
// 이제는 페이지 정보를 알고 있는 Criteria객체를 Service에게 전달해야됨.
List<Board> list = service.getList(cri); //크리테리아를 기준으로 리스트를 불러올거임.
//페이징 처리에 필요한 pageMaker객체도 생성해야한다.
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(cri); // pagemaker가 페이지기법을 하기위한 cri객체 전달
pageMaker.setTotalCount(service.totalCount()); //페이징 기법을 하려면 전체 게시글 개수를 알려줘야함.
System.out.println(pageMaker.toString());
model.addAttribute("list",list);
model.addAttribute("pageMaker",pageMaker); // 페이징 정보를 알고 있는 객체를 전달
return "board/list";
}
BoardService.java
public int totalCount();
BoardServiceImpl.java
@Override
public int totalCount() {
return mapper.totalCount();
}
BoardMapper,java
public int totalCount();
BoardMapper.xml
<select id="totalCount" resultType="int">
SELECT COUNT(*) FROM TBLBOARD
</select>
DataSourceTest.java
@Test
public void testGetList() {
Criteria cri= new Criteria();
cri.setPage(2);
cri.setPerPageNum(5);
List<Board> list = service.getList(cri);
for(Board vo: list) {
System.out.println(vo.toString());
}
}
https://www.w3schools.com/bootstrap/bootstrap_pagination.asp
list.jsp
<div style="text-align:center;">
<ul class="pagination">
<!-- 이전 버튼 처리, true면 사용 가능 -->
<c:if test="${pageMaker.prev}">
<li class="paginate_button previous">
<a href="${pageMaker.startPage-1}"> ◀</a>
</li>
</c:if>
<!-- 페이지 번호 처리 -->
<!-- boardcontroller에서 model로 pageMaker 보냄 -->
<c:forEach var="pageNum" begin="${pageMaker.startPage}" end="${pageMaker.endPage}">
<c:if test="${pageMaker.cri.page ==pageNum}">
<li class="paginate_button active"><a href="${pageNum}">${pageNum}</a></li>
</c:if>
<c:if test="${pageMaker.cri.page != pageNum}">
<li class="paginate_button"><a href="${pageNum}">${pageNum}</a></li>
</c:if>
</c:forEach>
<!-- 다음 버튼 -->
<c:if test="${pageMaker.next}">
<li class="paginate_button previous">
<a href="${pageMaker.endPage+1}"> ▶ </a> <!-- *************1번여기서 값을 가져와서 -->
</li>
</c:if>
</ul>
<c:forEach var="pageNum" begin="${pageMaker.startPage}" end="${pageMaker.endPage}">
<c:if test="${pageMaker.cri.page ==pageNum}">
<li class="paginate_button active"><a href="${pageNum}">${pageNum}</a></li>
</c:if>
<c:if test="${pageMaker.cri.page != pageNum}">
<li class="paginate_button"><a href="${pageNum}">${pageNum}</a></li>
</c:if>
</c:forEach>
'spring' 카테고리의 다른 글
elipse에서 spring project 만들기 (0) | 2023.11.01 |
---|---|
[오류] Problems occurred while performing provisioning operation: operation plan must be resolved operation plan must be resolved (0) | 2023.11.01 |
[Spring] MVC07. 답글 작성, 게시글삭제, XSS대비 (0) | 2023.10.23 |
[Spring] mvc07 글 작성, 로그인, 로그아웃 (0) | 2023.10.21 |
[Spring] mvc07_환경설정, 3 tier구조 (1) | 2023.10.21 |