프로젝트와 같이 하면서 블로깅이 밀리고 있다. 일단 프로젝트에 실제로 적용해야 할 부분을 정리하면서 동시에 기능을 만들어 나가려고 한다.
내가 맡은 부분은 여행사진 공유 게시판이기 때문에, 업로드된 여행사진을 한눈에 볼 수 있는 페이지와 상세보기 페이지를 따로 만들어야 한다.
특히 한눈에 볼 수 있는 페이지에서는 페이지 블록을 나눠줘야 많은 데이터를 한번에 출력하는게 아닌, 페이지를 나누어 출력할 수 있다.
이전 다음 이 부분이 페이지 블록을 나눠주는 부분이다.
우선 총페이지를 구해주고, 페이지 블록을 얼만큼 설정해줄 것인지 정해야 한다.
int totalpage=(int)(Math.ceil(count/12.0));
final int BLOCK=10;
int startPage=((curpage-1)/BLOCK*BLOCK)+1;
// 1~10 => 9/10 => 0.9 int는 소수점 인식하지 않기 때문에 0
// 11~20 => start가 11
int endPage=((curpage-1)/BLOCK*BLOCK)+BLOCK;
if(endPage>totalpage)
endPage=totalpage;
수업 예제에서는 블록을 10으로 설정했다.
startPage는 현재페이지 (?page=n 으로 받아온 값) 빼기 1을 해주고, 그걸 블록 수만큼 나눠준다
1~10페이지면 0/10 => 0, 1/10 => 0.1 ... 0.9까지이지만 int는 소수점을 인식하지 않기 때문에 0이 된다.
11~20페이지면 10/10 =>1, 11/10 => 1.1 ... 1.9 도 역시 전부 1로 인식을 한다.
여기에 다시 블록만큼 곱해주고 +1을 해준다
1페이지면 0*10+1=1
2페이지면 1*10+1=11
endPage는 마지막에 BLOCK만큼 (10)만큼 더해주면 값이 나온다.
혹은 startPage에 BLOCK-1을 그냥 더해줘도 될것같다.
그리고 endPage가 totalPage보다 크면 그냥 endPage에 totalPage값을 넣어준다.
22까지 밖에 없는데 굳이 23,24를 출력해줄 필요가 없기 때문이다.
내가 프로젝트에 쓴 코드
@RequestMapping("board/board_main.do")
public String board_main (HttpServletRequest request, HttpServletResponse response)
{
// dao연결, 리스트에 담아두기, request에 담아서 보내기
BoardDAO dao=BoardDAO.newInstance();
String page=request.getParameter("page");
if(page==null)
page="1";
int curpage=Integer.parseInt(page);
List<BoardVO> mList=dao.boardMainData(curpage);
// 총페이지
int totalPage=dao.boardToatalPage();
// 페이지 나누기
final int BLOCK=5;
int startPage=((curpage-1)/BLOCK*BLOCK)+1;
int endPage=startPage + (BLOCK-1);
if(endPage>totalPage)
endPage=totalPage;
request.setAttribute("BLOCK", BLOCK);
request.setAttribute("curpage", curpage);
request.setAttribute("startPage", startPage);
request.setAttribute("endPage", endPage);
request.setAttribute("totalPage", totalPage);
request.setAttribute("mList", mList);
request.setAttribute("main_jsp", "../board/board_main.jsp");
return "../main/main.jsp";
}
이렇게 모델에서 처리를 해주고 request로 값을 보내준다.
****curpage-1 꼭 해줘야 한다. 안그러면 다음으로 넘어가기전 마지막 페이지에서 오류난다.
ex) 블록이 5인데 curpage가 5인 경우
5/5 => 1 => 1*5=> 5 => 5+1=6
이것때문에 뭐가 문제인지도 모르고 좀 한참해맸다... 바보같군
그러면 board_main에서 값을 받아와서 처리를 해준다.
<ul class="pagination justify-content-start">
<!-- 이전 -->
<c:if test="${startPage>1 }">
<li class="page-item"><a class="page-link" href="../board/board_main.do?page=${startPage-1 }">이전</a></li>
</c:if>
<c:forEach var="i" begin="${startPage }" end="${endPage }" step="1">
<li class="page-item active"><a class="page-link" href="../board/board_main.do?page=${i }">${i }</a></li>
</c:forEach>
<!-- 다음 -->
<c:if test="${endPage<totalpage}">
<li class="page-item"><a class="page-link" href="../board/board_main.do?page=${endPage+1 }">다음</a></li>
</c:if>
</ul>
이게 뭐라고 참.. 오래 걸렸다. 그래도 내가 직접 이유를 찾아내서 그게 어디야 라고 위안을 삼고있다..
일단 오늘 배운건 여기까지 적용하고 나머지 프로젝트 완성을 위해 다른 부분을 이어서 만들도록 하겠다.
'programming > Gukbi' 카테고리의 다른 글
국비 교육 69일차 - 로그인 (0) | 2021.04.06 |
---|---|
국비 교육 68일차 - 회원가입/아이디 중복 체크/우편번호 찾기 (0) | 2021.04.03 |
국비 교육 66일차 - mainPage만들기 (0) | 2021.04.03 |
국비 교육 65일차 - annotation 사용 controller 제작 (0) | 2021.03.30 |
국비 교육 65일차 - mvc구조, controller 만들기, xml parsing (0) | 2021.03.30 |