[MVC] 대용량레코드 만들기 --> 페이지나누기-3

🐷Jinie (juniorDeveloper)·2020년 11월 10일
0

JSP/MVC/SPRING

목록 보기
36/81

1. 페이지나누기 8가지 값 가져오기

1:페이지사이즈
2:페이지List Size
3:총레코드 수
4.총페이지수
5.현재레코드
6.현재페이지
7. 하단 가로 시작페이지
8. 하단 가로 마지막페이지

  • 이전 게시물에서 저장했던 8가지의 값을 가져와서 페이지 나누기를 본격적으로 실행한다.

  • 값을 저장할 공간을 model에 함께 마련하고

  • DAO에서 쿼리문을 통해 얻은 데이터와 함께 set한다.

  • 리스트형태로 값을 함께 담아두게 된다.

  • Controller에서 list에서 담아온 값을 꺼내 request.setAttribute를 사용하는데,
    이때 list.get(0)이 페이지 나누기의 key라고 볼 수 있다.

    get(int index)은 인자로 인덱스를 받습니다. 이 인덱스의 위치에 있는 객체를 리턴해준다.

  • 즉, list.get(0)이라는 메서드를 사용하면
    list라는 공간에서 0번 인덱스의 위치에 있는 객체들을 리턴해 준다고 생각하면 된다.

  • 페이지 나누기에 필요한 8가지 값은 쿼리에서 받아온 값과 달리 각각 변수에 1개의 값들이 저장되어 있기 때문에, 인덱스 0번의 값만 가져오면된다.

  • list.get(0) 을 통해 0번 인덱스 결과를 리턴해주고 리턴받은 값을 guestVo형의 m에 저장한다.

  • m의 값을 다음 페이지 속성 'g'로 넘긴다. : request.setAttribute("g",m);

2. list.jsp에서 값을 이용해 페이지나누기

  • JSTL을 이용해 구현할 예정이기 때문에, 필요한 jar파일과 위와같은 선언문을 기재해준다.
  • Controller에서 request.setAttribute를 통해 속성값을 다음페이지로 넘겨주었기 때문에,
    우리는 속성의 이름 'g'를 호출해서 그 안의 값들을 가져올 수 있다.
  • 그래서 각각의 변수명에는 g.을 붙여서 불러왔다.
  • 페이지 나누기를 위한 코드를 작성한다.
<c:if test="${ g.start_page > g.page_list_size }">         
      <a href='<%=path%>/BigListController?idx=${now_Record}' > 
      	[이전( ${g.page_list_size } ) ] 
      </a>  &emsp;
      <c:set var="now_Record"  value="${ ( g.start_page - 2 ) * g.page_size + 1}"/>
</c:if>
<c:if test="${ g.start_page <= g.page_list_size }">         
       [이전( ${g.page_list_size } )]  &emsp;
</c:if> 
   
  • [이전] 버튼이 링크가 필요한 경우와 필요가 없는 경우 두가지를 먼저 생각해보자
  • 링크가 필요한 경우 = 페이지 리스트 사이즈보다 커질경우
    예를들어 페이지 리스트 사이즈가 10이라면 [이전]버튼은 시작페이지 값이 11페이지부터 필요하게 된다. 시작페이지가 10일경우까지는 이전에 표시할 10페이지가 없기 때문이다.
  • 따라서, <c:if>문의 test="시작하는 페이지가 페이지리스트사이즈보다 클경우"를 넣어주고
    이 조건문에 만족하면 [이전]에 링크를 걸도록한다.
  • 또한, 현재 레코드 값으로 (시작페이지-2)의 곱하기 페이지사이즈 +1 의 값을 넣어준다.
<c:if test="${ g.end_page <  g.pagetotal }">   
      <c:set var="now_Record"  value="${g.end_page*g.page_size + 1} "  />     
      <a href='<%=path%>/BigListController?idx=${now_Record}' >
      	[다음( ${g.page_list_size } )]
      </a>  &emsp;
</c:if> 
   
<c:if test="${ g.end_page >=  g.pagetotal }">   
       [다음( ${g.page_list_size } )]  &emsp;
</c:if> 
  • [다음] 버튼의 링크가 필요한 경우와 필요가 없는 경우를 생각해보자
  • 링크가 필요한 경우 = 총페이지수보다 끝페이지가 작을경우
    즉, 마지막 페이지의 번호보다 끝페이지가 작을 경우에 다음으로 표시할 10개의 페이지가 있다는 뜻이다.
  • 따라서, <c:if>문의 test="총 페이지수보다 끝페이지가 작을경우"를 넣어주고
    이 조건문에 만족하면 [다음]에 링크를 걸도록한다.
  • 또한, 현재 레코드 값으로 끝페이지 곱하기 페이지사이즈 +1 의 값을 넣어준다.
 <c:forEach var="i"  begin="${g.start_page}" end="${g.end_page}">
      <c:if test="${ i <= g.pagetotal }">   
          <c:set var="now_Record"  value="${  (i-1) * g.page_size + 1 }"/>
          <a href='<%=path%>/BigListController?idx=${now_Record}' >
          	[ ${ i } ]</a>  &nbsp;  
      </c:if>
</c:forEach>   
  • 이번에는 각 페이지를 갈 수 있는 [1][2][3]...[10]형태의 링크를 생각해보자
  • 일단, 1부터 계속해서 숫자를 찍을 수 있도록 for문을 이용한다.
  • for문에서 i는 페이지의 시작값 부터 페이지의 끝값 까지 증가한다.
  • 그래야 10페이지씩 차례로 표시할 수 있다.
  • 증가하면서 i를 표기하는 것과 동시에 링크를 걸어주어야한다.
  • Controller로 가는 링크에는 idx=now_Record를 함께 넘겨준다.
  • now_Record의 값은 i-1의 값에 곱하기 페이지사이즈 +1 을 넣어준다.
<a href='<%=path%>/BigListController?idx=1'>[처음]</a>&emsp;&emsp;
<c:set  var="now_Record"  value="${ (g.pagetotal -1 ) * g.page_size + 1}" /> &emsp;
<a href='<%=path%>/BigListController?idx=${now_Record}' >[마지막]</a>  &emsp;
  • 처음은 간단하다. idx=1 을 넘겨주면 당연히 가장 첫 페이지로 가게된다.
  • 마지막은 now_Record에 (총페이지수-1) 곱하기 페이지사이즈+1 한 값을 넘기고
  • 그 now_Record를 idx값으로 넘긴다.

3. 결과화면




profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

0개의 댓글