반응형
목차
- Controller
- Service
- Mapper
- JSP
- JavaScript
페이징
Controller
1. 게시판 조회 결과를 list 담아 JSP 전달
2. 페이징 처리 후 결과를 map 담에 JSP 전달
Service
게시판 list
curPage : 현재 페이지
pageScale : 페이지 당 게시글 수
pageBegin : 시작 페이지
pageEnd : 끝 페이지
페이징 Map
int count = postDao.pageMap(map); // 총 게시글 수
int pageScale = 20; // 페이지당 게시글 수
int blockScale = 5;
int curPage = map.get("curPage") == null ? 1 : Integer.parseInt(map.get("curPage").toString());
int totPage = (int) Math.ceil(count * 1.0 / pageScale);
int totBlock = (int) Math.ceil(totPage / blockScale);
// *현재 페이지가 몇번째 페이지 블록에 속하는지 계산
int curBlock = (int) Math.ceil((curPage - 1) / blockScale) + 1;
// *현재 페이지 블록의 시작, 끝 번호 계산
int blockBegin = (curBlock-1) * blockScale + 1;
// 페이지 블록의 끝번호
int blockEnd = blockBegin + blockScale - 1;
// *마지막 블록이 범위를 초과하지 않도록 계산
if(blockEnd > totPage) blockEnd = totPage;
// *이전을 눌렀을 때 이동할 페이지 번호
int prevPage = (curPage == 1) ? 1:(curBlock-1) * blockScale;
// *다음을 눌렀을 때 이동할 페이지 번호
int nextPage = curBlock > totBlock ? (curBlock * blockScale) : (curBlock * blockScale) + 1;
// 마지막 페이지가 범위를 초과하지 않도록 처리
if(nextPage >= totPage) nextPage = totPage;
Map<String, Object> pageMap = new HashMap<String, Object>();
pageMap.put("curBlock", curBlock);
pageMap.put("prevPage", prevPage);
pageMap.put("blockBegin", blockBegin);
pageMap.put("blockEnd", blockEnd);
pageMap.put("curPage", curPage);
pageMap.put("totBlock", totBlock);
pageMap.put("nextPage", nextPage);
pageMap.put("totPage", totPage);
return pageMap;
Mapper
게시판 list
<select id="list" resultMap="mapList">
select rnum
,SEQ
,MEM_NAME
,MEM_ID
,BOARD_SUBJECT
,BOARD_CONTENT
,REG_DATE ,UPT_DATE
,VIEW_CNT
from (
select
row_number() over(order by seq desc) rnum
,SEQ
,MEM_NAME
,MEM_ID
,BOARD_SUBJECT
,BOARD_CONTENT
,REG_DATE ,UPT_DATE
,VIEW_CNT
from board_study
where 1=1
<choose>
<when test="choose == 'name'">
and mem_name like '%' || #{searchTxt} || '%'
</when>
<when test="choose == 'subject'">
and BOARD_SUBJECT like '%' || #{searchTxt} || '%'
</when>
<when test="choose == 'subCont'">
and (BOARD_SUBJECT like '%' || #{searchTxt} || '%' or BOARD_CONTENT like '%' || #{searchTxt} || '%')
</when>
</choose>
<if test="cal1 != null and cal1 != ''">
and to_char(reg_date, 'yyyy-MM-dd') between #{cal1} and #{cal2}
</if> ) where rnum between ${pageBegin} and ${pageEnd}
</select>
1. 기존 테이블에 row_number() over(order by seq desc) rnum 컬럼을 추가
2. 상위 select from ( ) 묶어서 테이블 검색
2. 하단 where rnum between ${pageBegin} and ${pageEnd} where 조건으로 요청 게시글 수 만큼 조회
게시판 수
<select id="pageMap" parameterType="map" resultType="integer">
select count(seq)
from BOARD_STUDY
where 1=1
<choose>
<when test="choose == 'name'">
and mem_name like '%' || #{searchTxt} || '%'
</when>
<when test="choose == 'subject'">
and BOARD_SUBJECT like '%' || #{searchTxt} || '%'
</when>
<when test="choose == 'subCont'">
and (BOARD_SUBJECT like '%' || #{searchTxt} || '%' or BOARD_CONTENT like '%' || #{searchTxt} || '%')
</when>
</choose>
<if test="cal1 != null and cal1 != ''">
and to_char(reg_date, 'yyyy-MM-dd') between #{cal1} and #{cal2}
</if>
</select>
count 사용시 해당 컬럼 명으로 검색!!! " * " 사용금지
JSP
<!-- **처음페이지로 이동 : 현재 페이지가 1보다 크면 [처음]하이퍼링크를 화면에 출력-->
<c:if test="${pageMap.curBlock > 1}">
<a href="javascript:list('1')">[처음]</a>
</c:if>
<!-- **이전페이지 블록으로 이동 : 현재 페이지 블럭이 1보다 크면 [이전]하이퍼링크를 화면에 출력 -->
<c:if test="${pageMap.curBlock > 1}">
<a href="javascript:list('${pageMap.prevPage}')">[이전]</a>
</c:if>
<!-- **하나의 블럭에서 반복문 수행 시작페이지부터 끝페이지까지 -->
<c:forEach var="num" begin="${pageMap.blockBegin}" end="${pageMap.blockEnd}">
<!-- **현재페이지이면 하이퍼링크 제거 -->
<c:choose>
<c:when test="${num == pageMap.curPage}">
<span style="color: red">${num}</span>
</c:when>
<c:otherwise>
<a href="javascript:list('${num}')">${num}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- **다음페이지 블록으로 이동 : 현재 페이지 블럭이 전체 페이지 블럭보다 작거나 같으면 [다음]하이퍼링크를 화면에 출력 -->
<c:if test="${pageMap.curBlock <= pageMap.totBlock}">
<a href="javascript:list('${pageMap.nextPage}')">[다음]</a>
</c:if>
<!-- **끝페이지로 이동 : 현재 페이지가 전체 페이지보다 작거나 같으면 [끝]하이퍼링크를 화면에 출력 -->
<c:if test="${pageMap.curPage <= pageMap.totPage}">
<a href="javascript:list('${pageMap.totPage}')">[끝]</a>
</c:if>
JavaScript
1. input type="hidden"에 페이지 값 넣은 후 Controller 요청
2. 페이지 당 보이는 글 갯 수 변경 시 pageScale 값 조정
반응형
'Spring' 카테고리의 다른 글
[Spring] 파일 업로드 & 다운로드 (0) | 2021.06.16 |
---|---|
[Spring] ajax 사용법 (0) | 2021.06.16 |
[Spring] 달력 datepicker (0) | 2021.06.15 |
[Spring] 스프링 게시판 개발을 위한 기본 셋팅 (0) | 2021.06.09 |
[Spring] Spring Tools 4 설치 및 초기설정 (0) | 2021.05.16 |