관리 메뉴

DeseoDeSeo

[Spring ] SpringMVC 08, 게시판 페이징 본문

spring

[Spring ] SpringMVC 08, 게시판 페이징

deseodeseo 2023. 10. 23. 20:35
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

 

Bootstrap Pagination

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

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>