페이징 처리 1에서 pageNum을 안주면 오백 오류가 났다.
pageNum을 안줘도 오류가 안나게 수정을 하겠습니다.
1.방법
@RequestParam(name="사용할변수명", defaultValue="지정하고싶은기본값") 변수 왼쪽에 저렇게 붙여주면 처리완료
실행해보면
pageNum을 3을 주면 안바뀌고 page2로 주면 페이지가 변경되는걸 알 수 있다.
2.방법
@PathVariable의 경우 defaultValue를 직접 줄 수 없으나, required=false를 이용해 필수입력을 안받게 처리한 후
컨트롤러 내부에서 디폴트값을 인력해 줄수 있다.
실행하면
boardList/숫자를 넣으면 그페이지로 넘어간다.
(기본형 자료는 null을 저장할 수 없기 때문에 wrapper class를 이용해 Long을 선언합니다.)
페이징 처리를 돕는 Criteria 객체를 만들어 보겠습니다.
com.ict.domain / 우클릭 new / class / Criteria 생성
Criteria
Limit라는 구문이 새로 생기고, 2개의 정보(시작번호,출력갯수)를 넘겨야 하기 때문에
Criteria객체가 추가 됩니다.
BoardMapper.xml getList
#{pageStart}로 수정해줍니다.
(etter는 #{} 내부에서 호출가능함 get을 뺀 나머지 메서드명을 적어주면 됩니다. )
BoardMapper.java
버튼 추가를 위해 pageNum대신 Criteria를 활용합니다
BoardController
BoardMapper.java에 getList가 Criteria를 요구하고 있으니까 BoardMapper.java로 넘겨준다.
이렇게 함으로써
pageNum과 number를 받을수 있게된다.
실행하면
되는걸 확인 가능.
Criteria
BoardMapper.xml getList
게시판 하단의 페이지 번호를 클릭했을때 자동으로 클릭한 페이지로 넘어가도록 설정을 바꿔보겠습니다.
페이지네이션은 10개단위로 실행되기 때문에 시작번호, 끝번호를 구하는것이 먼저 입니다.
가령 내가 5페이지를 본다고 해도 시작페이지는 1번, 끝페이지는 10번 이어야 합니다.
예)
아래쪽 페이지 이동 버튼 정보를 제공하기 위해 PageMaker객체를 선언
com.ict.domain / 우클릭 new / class / PageMaker 생성
PageMaker
이 객체는 총 페이지 개수를 구하기 위한 전체 글수 totalBoard
화면상 시작페이지를 가늠하기 위한 startPage
화면상 끝페이지를 가늠하기 위한 endPage
그리고 다음페이지, 이전페이지 표시여부를 나타낸 prev,next를 가집니다.
만약 페이지 하단 버튼개수를 유동적으로 가져가고싶은 경우
displayPageNum을 선업합니다.
Criteria에서 현재 조회중인 페이지 정보 + 한 페이지에 깔리는글 수를 받아와야함
필요한 모든 사항을 계산해주는 메서드
먼저 끝나는 지점을 구하고, 그걸 토대로 다시 시작지점을 구하기 위해 끝나는 지점을 구하는 메서드부터 보내겠습니다.
(올림을 이용해서(Math.ceil) getPage(현재페이지)값에서 나누기
displayPageNum(10)) * displayPageNum(10)
끝나는 페이지를 토대로 페이지 그룹의 시작페이지를 구함
위의 endPage는 명목상의 (단순 그룹계산으로 ) 끝나는 페이지이기 때문에 실질적인 글 개수를 통해 보정해줘야함
(전체 페이지의 개수는 10으로 떨어지지 않을수도 있기 때문에 다시 계산합니다.
먼저 tempEndPage에 실제 최종페이지를 구한 다음
만약 자동으로 집계되는 endPage보다 값이 크다면 실제 최종페이지로 하락시킵니다.
실제 최종페이지가 753페이지인 경우, 명목상 endPage는 760욿 먼저 집계되므로 만약 실 페이지가 명목상 마지막 페이지보다 작다면 실 페이지로 재지정하는 로직)
next,prev 버튼 여부 처리
prev는 startPage가 1인 경우에만 비활성화 이므로 삼항연산자로 간단히 처리합니다.
(이전 페이지는 출력페이지가 1~10인 경우만 아니면 갈 수 있어야 하므로 위와 같이 startPage변수가 1인지 여부로 검사)
next는 여태까지 출력한 페이지에 속한 글 개수보다 DB내 전체 글이 더 많은경우에 활성화
(다음 페이지 여부는 현재 조회중인 페이지 뒤에 더 데이터가 있는지 없는지 여부입니다 따라서 endpage * 글 개수가 현재 전체 글 수 보다 적다면 제공합니다. )
이상의 정보는 페이지를 처리 할때 한꺼번에 받아놔야 화면에 표시할 수 있기 때문에 그냥 전체 글 개수를 조회하는 시점에 다 계산하도록 합니다.
이제 List화면이 그려지기 전에, 하단 버튼정보를 담은 pageMaker객체까지 전달해야 합니다.
BoardController boardList
확인하기 위해
boardList.jsp
하단에
작성을 하고 실행을 해보면
페이지의 정보 구성을 확인할 수 있다.
부트스트랩 홈페이지에서 페이지네이션 1개를 복사 해옵니다.
이전 페이지 버튼 보일지 결정하는 부분
(먼저 뒤로가기 버튼은.pageMaker의 prev 변수가 boolean 타입이기 때문에 그 자체로 true/false의 의미를 가지므로 c:if 태그의 조건문에 변수째로 넣습니다. 만약
true라면 이전 페이지가 존재하므로, 이동할 링크를 걸어주면됨)
실행해보면
1페이지일때는 안보이고
그 다음 페이지일때 보여지는걸 확인할 수 있다.
밑에 깔아줄 버튼들
(다음은 숫자 버튼으로, c:forEach구문의 begin, end 속성을 이용해 반복횟수를 정하고, ver의 idx숫자를 이용해 표기합니다.
li태그의 class내에 active여부를 출력하기 위해 삼항연산자를 이용하고 링크주소도 페이지를 선택한 숫자 번호로 이동하게 세팅합니다. )
실행 해보면
숫자들을 누르면 그 페이지로 이동된다.
다음 페이지 버튼 보일지 결정하는 부분
(다음 페이지네이션 목록 버튼 end페이지가 0이라면 당연히 출력할 필요가 없으니 0보다 큰 상태에서, next가 참이어야 출력하는 것입니다.
href를 이용해 역시 endPage로 지목된 마지막 번호 +1을 목표지로 잡습니다.)
실행해 보면
마지막 페이지로 갔을때 >> 사라진걸 확인할 수 있습니다.
--
이제 글 정보 전체를 받아올수 있게 처리 하겠습니다.
BoardMapper.java
BoardMapper.xml
전체 글 개수를 얻어오는 getPageNum를 선언합니다.
파라미터는 필요없습니다.
글 개수 => 정수 값을 조회하기 때문에 int 리턴입니다.
BoardController
실행하면
전체 글 받아온걸 확인할 수 있다.