<div class="page-menu mt-3 flex justify-center">
<div class="btn-group">
<c:forEach begin="1" end="20" var="i">
<a class="btn btn-md ${param.page == i ? 'btn-active' : '' }" href="?page=${i }">${i }</a>
</c:forEach>
</div>
</div>
1) ArticleController showList()
int pagesCount = (int)Math.ceil((double)articlesCount/itemsInAPage);
model.addAttribute("articles", articles);
model.addAttribute("board", board);
model.addAttribute("articlesCount", articlesCount);
model.addAttribute("page", page);
model.addAttribute("pagesCount", pagesCount);
pagesCount
는 총 게시물갯수 / 페이지당 보여줄 게시물 갯수에 반올림한 값으로 페이지의 갯수
를 의미 한다.pagesCount
만큼 페이지버튼을 만들기위해 model.addAttribute("pagesCount", pagesCount)
2) list.jsp
<div class="page-menu mt-3 flex justify-center">
<div class="btn-group">
<c:forEach begin="1" end="${pagesCount }" var="i">
<a class="btn btn-md ${page == i ? 'btn-active' : '' }" href="?page=${i }">${i }</a>
</c:forEach>
</div>
</div>
pagesCount
즉 페이지 총갯수 만큼 반복문을 사용해 버튼을 구현1) 페이지 메뉴의 최대 크기지정
<div class="page-menu mt-3 flex justify-center">
<c:set var="pageMenuLen" value="5"/>
<c:set var="startPage" value="${page - pageMenuLen >= 1 ? page - pageMenuLen : 1}"/>
<c:set var="endPage" value="${page + pageMenuLen <= pagesCount ? page + pageMenuLen : pagesCount}"/>
<div class="btn-group">
<c:if test="${startPage>1 }">
<a class="btn btn-md" href="?boardId=${board.id}&page=1">1</a>
</c:if>
<c:if test="${startPage > 2 }">
<a class="btn btn-md btn-disabled" href="#">...</a>
</c:if>
<c:forEach begin="${startPage }" end="${endPage}" var="i">
<a class="btn btn-md ${page == i ? 'btn-active' : '' }" href="?boardId=${board.id}&page=${i }">${i }</a>
</c:forEach>
<c:if test="${endPage < pagesCount-1 }">
<a class="btn btn-md btn-disabled" href="#">...</a>
</c:if>
<c:if test="${endPage < pagesCount }">
<a class="btn btn-md" href="?boardId=${board.id}&page=${pagesCount }">${pagesCount }</a>
</c:if>
</div>
</div>
pageMenuLen
만큼 앞 뒤로 페이지 버튼을 구현하고자 한다.startPage
부터 endPage
까지 반복문을 이용해 페이지버튼을 구현pageMenuLen
이므로 음수가 나오게 된다.${page - pageMenuLen >= 1 ? page - pageMenuLen : 1}
: 음수가 나오게되면 startPage는 1로 설정${page + pageMenuLen <= pagesCount ? page + pageMenuLen : pagesCount}
: endPage가 pagesCount(총 페이지 갯수) 보다 크다면 없는 페이지 버튼을 생성함으로 endPage를 pagesCount(총 페이지 갯수)
로 설정${startPage>1 }
, ${endPage < pagesCount }
: 1페이지 보다 startPage가 커야 버튼을 생성, pagesCount
보다 endPage가 작다면 마지막 버튼 생성보여지지 않는 페이지버튼
이 있다는 것을 표시하기위해 ...
버튼을 추가 예 (1 ... 3 4 5 6 ... 10)
${startPage > 2 }
, ${endPage < pagesCount - 1 }
: ...
를 버튼을 추가하기 위한 조건으로 앞단 버튼은 3페이지 이상부터 ...
버튼을 추가2) 페이지 이동시 게시판정보가 누락되지 않도록
<c:if test="${endPage < pagesCount }">
<a class="btn btn-md" href="?boardId=${board.id}&page=${pagesCount }">${pagesCount }</a>
</c:if>
boardId
를 추가 1) 검색 타입과 검색키워드 파라미터 추가
@RequestMapping("/usr/article/list")
public String showList(Model model, @RequestParam(defaultValue = "1") int boardId,
@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "title,body") String searchKeywordType,
@RequestParam(defaultValue = "") String searchKeyword) {
2) 총 게시물 수를 파악하는 쿼리문
<select id="getArticlesCount" resultType="int">
SELECT COUNT(*) FROM article
WHERE boardId = #{boardId}
<if test="searchKeyword !=''">
<choose>
<when test="searchKeywordType==title">
AND title LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<when test="searchKeywordType==body">
AND body LIKE CONCAT('%',#{searchKeyword},'%')
</when>
<otherwise>
AND (
title LIKE CONCAT('%',#{searchKeyword},'%') OR
body LIKE CONCAT('%',#{searchKeyword},'%')
)
</otherwise>
</choose>
</if>
</select>
defaultValue = ""
이므로 if test="searchKeyword !=''"
에 해당하므로 조건문(choose)이 실행되지 않는다.searchKeyword
가 포함되는 게시물 데이터를 가져옴 if test="searchKeyword !=''"
를 작성하지 않는다면 예상되는 쿼리문은 searchKeyword의 defaultValue = ""
이므로 AND (
title LIKE CONCAT('%','','%') OR
body LIKE CONCAT('%','','%')
)
defaultValue
의값이 제대로 적용되지 않는 것으로 보인다.