아이인포

게시판 만들기 페이징 본문

카테고리 없음

게시판 만들기 페이징

아이인포 2020. 3. 1. 16:22

과거 게시판 페이징 만들기 답변 링크.

 

나름 그때 당시 공들여서 썼다고 생각해서 블로그에 포스팅 해봅니다.

 

아래 내용 

 

클래스를 구현하기 전에 조건부터 생각해볼까요

 

1. 페이징을 하기 위해서는 한 화면에 몇개의 글을 보여줄 것인가?

 

2. 총 몇개의 페이지를 보여 줄 것인가?

 

의 선 조건이 있어야겠죠.

 

그렇다면 페이징 클래스는 몇개의 글을 보여줄 것인가를 위한 w_size 라는 멤버 변수와

 

몇개의 페이지를 보여줄 것인가를 위한 p_size 라는 멤버 변수를 둬보죠.

 

계산은 어떻게 할까요?

 

w_size = 5;

p_size = 5;

 

(42 -1  /  5) + 1  = 9

 

(40-1 / 5)+1 = 8 // 딱 나누어 떨어지는 40으로 해도 8 이 맞게 나오는군요.

 

 

이런 계산을 통하면 총 페이지수가 나오겠군요. 9 가 나왔습니다.

 

그 다음 구해야 할것은 뭐가 있을까요? 아. 페이징 수가 나왔으니 페이징 사이즈에 따라 다시

 

시작 페이지를 보여줘야 겠지요. 보통 화면이

 

pre 1.2.3.4.5 next

 

pre 6.7.8.9.10  next

 

이런식의 화면을 생각할 것입니다.

 

여기서 1 , 6 을 구하고 5, 10 그러니까 페이징의 시작과 끝을 구해야 겠죠??

 

시작 페이지는 현재 보고 있는 ( (페이지 번호 -1) / 총 페이지 사이즈 ) * 총 페이지 사이즈 + 1

 

로 구할수 있습니다.

 

Default 페이지 번호는 1로 되겠죠?

 

( ( 1 -1 ) / 5 ) * 5 + 1 = 1

 

만약 7 페이지를 보고 있다고 하고 7을 넣어봅시다.

 

( ( 7 -1 ) / 5 ) * 5 + 1 = 6

 

이런식으로 첫 시작 페이지 번호를 구할수 있습니다.

 

그럼 마지막 번호는 어떻게 구할까요?

 

시작 페이지 번호 + 페이지 총 사이즈 -1

 

1 +  5  - 1 = 5       5가 나오는군요..

 

시작 페이지 번호를 6으로 바꿔볼까요?

 

6 +5 -1 = 10         10이 나오는군요.. 맞죠?

 

하지만 여기서 총 페이지 숫자는 9입니다. 9가 마지막 페이지인데 10이 나올수가 없죠??

 

따라서 다음과 같이 구합니다.

 

시작 페이지 번호 + 페이지 총 사이즈 -1  과 총 페이지 수 중 더 작은 것!!

 

1 +  5  - 1 = 5 , 총 페이지 수 (9) 따라서 5

 

6 +5 -1 = 10  , 총 페이지 수 (9) 따라서 9

 

그러면 화면에 이렇게 보여줄수 있겠죠??

 

1,2,3,4,5

 

6,7,8,9

 

뭔가 허전하죠. pre와 next가 빠졌군요.. pre는 pre가 잇을때에 보여주거나 링크를 걸고

 

next도 또한 마찬가지군요..어떤 조건을 붙일까요? pre는 페이지 스타트가 1이 아니면 되겠죠?

 

next는 총 페이지 수보다 작으면 되겠군요.

 

그렇다면 페이지 표시는 다 나왔군요.

 

페이지를 눌렀을때 원하는 글의 범위를 셀렉트 하기 위해 글의 범위는 간단하죠

 

현재 페이지 수 * 5 하면 마지막 글의 번호(이 번호는 범위 넘버 )가 나오겠죠?

 

1 * 5 = 5

 

6 * 5 = 35

 

여기서 다시 5를 빼면 시작 번호가 나오죠.

 

5 - 5 + 1 = 1;

 

35 - 5 +1 = 31;

 

현재 페이지수가 1일 경우는 1~5의 글을 보여주고  , 6일 경우 31~35의 글을 보여줍니다. 맞죠?

 

이걸 클래스로 구현해볼까요.

 

public class Paging {
 public int w_size = 5;
 public int p_size = 5;
 public int writing_Count = 0;
 
 public int cur_Page = 0;
 
 
 public Paging(int w_size, int p_size, int writing_Count,  int cur_Page) {
  super();
  this.w_size = w_size;
  this.p_size = p_size;
  this.writing_Count = writing_Count;
  this.cur_Page = cur_Page;
 }
 
 public int getPage_Count()
 {
  return ( (writing_Count - 1) / w_size) + 1;
 }
 
 public int getPage_Start()
 {
  return ( ( cur_Page - 1 ) / p_size ) * p_size + 1;
 }
 
 public int getPage_End()
 {
  return Math.min( getPage_Start() + p_size - 1 , getPage_Count() );
 }
 
 public boolean isPre()
 {
  return getPage_Start() != 1;
 }
 
 public boolean isNext()
 {
  return getPage_End() < getPage_Count();
 }
 
 public int getWriting_Start()
 {
  return getWriting_End() - w_size + 1;
 }
 
 public int getWriting_End()
 {
  return cur_Page * w_size;
 }
 
 
 
 
 
 public static void main(String[] args) {
  
  // 여러가지 매개변수로 테스트 해보시기 바랍니다.
  Paging pg = new Paging(5, 5, 26 , 6 );
   // 총 글의 갯수는 select count(*) from board 하면 나오겠죠 ,
  //현재 보고 있는 페이지 번호는 Default 1, 그리고 밑에 페이징에서 링크 걸린 i가 현재 페이지가 됩니다. 
  
  //Paging pg = new Paging(한 화면에 보여질 글 수 , 페이지 분할 수 , 총 글의 갯수  , 현재 보고 있는 페이지 번호  );
  
  System.out.println("총 페이지 개수 : "+pg.getPage_Count());
  System.out.println("페이지 시작 숫자  : "+pg.getPage_Start());
  System.out.println("페이지 마지막 숫자  : "+pg.getPage_End());
  System.out.println("Pre 표시 여부  : "+pg.isPre());
  System.out.println("Next 표시 여부   : "+pg.isNext());
  System.out.println("글 범위 시작 번호   : "+pg.getWriting_Start());
  System.out.println("글 범위 끝 번호   : "+pg.getWriting_End());
  
  System.out.println("select * from board where no between "+pg.getWriting_Start()+" and "+pg.getWriting_End());
  // 이 셀렉트 결과를 화면에 뿌린 후에
  
  
   // 밑에서 페이징을 하면 되겠죠? 이거에 링크를 걸고 i가 현재 페이지 번호로서 링크가 걸리게 되겠죠?
  if(pg.isPre())
   System.out.print(" Pre ");
  for(int i = pg.getPage_Start(); i <= pg.getPage_End();i++)
  {
   System.out.print(" "+i+" ");
  }
  if(pg.isNext())
   System.out.print(" Next ");
  
  // 이런 페이징 클래스를 작성하여 사용하는 것이 여러모로 편리합니다. ~ ㅋㅋ
  
 }
 
}

 





Comments