자바 웹 개발자가 될거야/JSP

[JSP] 페이징 처리 / 한 페이지에 보여지는 게시글 수

whitz 2021. 12. 10. 15:03

 

< 페이징 처리 >

 

- 게시판 글을 페이징 처리해줘서 글 당 번호, 한 페이지의 시작 번호, 한 페이지의 끝 번호를 매겨줄거다

- 글 아래에 있는 nav에 적용해서 글이 많아졌을 때 넘어갈 수 있도록 처리

- DAO에서 getBoardList 메서드 오버로딩해서 사용할거임

 

① 한 페이지에 보여지는 글 수 

 

- 위와 같은 게시판에서 한 페이지당 10개의 글만 보고 싶으면 pageSize를 10으로 지정하고 ArrayList에 적용하여 글을 가져와야함

 

<%
	// BoardDAO 객체 생성
	BoardDAO bdao = new BoardDAO();
	// 게시판 DB에 있는 글 개수를 확인
	int cnt = bdao.getBoardCount();
	
	//////////////////////////////////////////////////////////////////////////////////////////
	// 페이징 처리
	
	// 한 페이지에 출력될 글 수 
	int pageSize = 3;
	
	// 현 페이지 정보 설정
	String pageNum = request.getParameter("pageNum");
	if(pageNum == null){
		pageNum = "1";
	}
	
	// 첫행번호를 계산
	int currentPage = Integer.parseInt(pageNum);	
	int startRow = (currentPage-1)*pageSize + 1;
%>

 

- pageNum

  · 지금 내가 몇 페이지에 있는지 확인하기 위함

  · 페이지 번호가 없을 때 내가 보는 페이지가 첫 페이지이도록 if문 설정

 

 

  · url 창에 ?pageNum=2,3,4 .. 이렇게 치면 페이지가 넘어감

 

- startRow

  · 각 페이지마다 맨 위의 행 번호를 계산하기 위함

  · 3개씩(pageSize) 글이 보여진다면 2페이지에서는 시작행이 4이되고 3페이지에서 시작행이 7이 되게끔

     → 2페이지 : ( 2 - 1 ) * 3 + 1 = 4

 

 

 

- BoardDAO.java에 작성

 

// getBoardList(startRow, pageSize)
public List getBoardList(int startRow, int pageSize){
		List boardList = new ArrayList();
        
		try {
			// 1,2 디비연결
			con = getCon();
			// 3. sql 작성 & pstmt 객체 생성
			// 글 re_ref 최신글 위쪽(내림차순), re_seq (오름차순)
			// DB 데이터를 원하는만큼씩 잘라내기 : limit 시작행-1, 페이지크기 
			sql = "select * from itwill_board order by re_ref desc, re_seq asc limit ?,?";			
			pstmt = con.prepareStatement(sql);
			
			// ?
			pstmt.setInt(1, startRow-1); //시작행-1 (시작 row 인덱스 번호)
			pstmt.setInt(2, pageSize); // 페이지크기 (한번에 출력되는 수)
			
			// 4. sql 실행
			rs = pstmt.executeQuery();
			// 5. 데이터처리 ( 글1개의 정보 -> DTO 1개에 담음 -> ArrayList 1칸 )
			while(rs.next()) {
				// 데이터가 있을때마다 글 1개의 정보를 저장하는 객체 생성
				BoardDTO bdto = new BoardDTO();
				
				bdto.setContent(rs.getString("content"));
				bdto.setDate(rs.getDate("date"));
				bdto.setFile(rs.getString("file"));
				bdto.setIp(rs.getString("ip"));
				bdto.setName(rs.getString("name"));
				bdto.setNum(rs.getInt("num"));
				bdto.setPass(rs.getString("pass"));
				bdto.setRe_lev(rs.getInt("re_lev"));
				bdto.setRe_ref(rs.getInt("re_ref"));
				bdto.setRe_seq(rs.getInt("re_seq"));
				bdto.setReadcount(rs.getInt("readcount"));
				bdto.setSubject(rs.getString("subject"));
				
				// DTO 객체를 ArrayList 한칸에 저장
				boardList.add(bdto);				
			}
			
			System.out.println("DAO : 글 정보 저장완료! "+boardList.size());
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB();
		}		
		return boardList;
	}	
	// getBoardList(startRow, pageSize) 끝

 

- 데이터를 들고오는데 시작행과 페이지 사이즈를 매개변수로 받아서 들고오는 메서드

- 최신글이 순서로 글 나열하기

  · select절에서 order by로 desc 내림차순으로 해서 최신글이 위로 오도록

- limit ?,?

  · 데이터베이스 데이터를 원하는 만큼씩 잘라내기 

  · 첫 번째 물음표 : 시작행 ( 0부터 시작 )

  · 두 번째 물음표 : 한 번에 출력되는 수

 

 

- DB에 있는 정보들을 게시판으로 보여주기 위해서 DTO 모인 ArrayList에 저장했다

 

 

②  하단에 글 페이지 번호 + prev + next 버튼 구현

 

- a 링크 이용해서 페이지 이동하도록

 

<div id="page_control">
	<%if(cnt != 0){ 
		////////////////////////////////////////////////////////////////
		// 페이징 처리
		// 전체 페이지수 계산
		int pageCount = cnt / pageSize + (cnt%pageSize==0?0:1);
		
		// 한 페이지에 보여줄 페이지 블럭
		int pageBlock = 10;
		
		// 한 페이지에 보여줄 페이지 블럭 시작번호 계산
		int startPage = ((currentPage-1)/pageBlock)*pageBlock+1;
		
		// 한 페이지에 보여줄 페이지 블럭 끝 번호 계산
		int endPage = startPage + pageBlock-1;
		if(endPage > pageCount){
			endPage = pageCount;
		}	
	%>
    
	<% if(startPage>pageBlock){ %>
		<a href="notice.jsp?pageNum=<%=startPage-pageBlock%>">Prev</a>
	<%} %>
    
	<% for(int i=startPage;i<=endPage;i++){ %>
		<a href="notice.jsp?pageNum=<%=i%>"><%=i %></a>
	<%} %>
    
	<% if(endPage<pageCount){ %>
		<a href="notice.jsp?pageNum=<%=startPage+pageBlock%>">Next</a>
	<%} %>
	<%} %>
</div>

 

- pageCount

  · 총 몇 페이지인지 계산하기 위한 변수

  · cnt / pageSize + ( cnt % pageSize == 0 ? 0 : 1 )

  · cnt는 게시판에 있는 총 게시글 수 , pageSize는 한 페이지당 출력되는 글 수

  · cnt % pageSize == 0 ? 0 : 1는 

    → 총 게시글이 13개이고 pageSize가 4라면 총 4페이지가 필요하다. 즉, 나머지가 있으면 그만큼 수용해주기 위해서 +1 이 필요

 

- pageBlock

  · 한 페이지에 보여줄 페이지 블럭(수)

  · pageBlock을 10으로 지정했을 때 오른쪽처럼 [1-10] [11-20] 이렇게 10개씩 숫자 보여주는 거임

 

 

- startPage

  · 한 페이지에 보여줄 페이지 블럭(수)의 시작 번호

  · ((currentPage-1)/pageBlock)*pageBlock+1

  · 아래 그림처럼 블럭이 10이라고 가정했을 때, 현재 페이지가 6페이지라면 시작번호는 1이고

      현재 페이지가 29라면 시작번호는 21이다

  · 5/10했을 때 정수형이라서 0으로 받아들임

 

- endpage

  · 한 페이지에 보여줄 페이지 블럭(수)의 끝 번호

  · (startPage + pageBlock-1)

  · 첫 페이지가 1이고 페이지블록이 10이면 ( 1 + 10 - 1 ) 로 마지막 페이지 수는 10

 

  · 페이지블록을 가지고 계산하는 거라서 endpage는 고정되어있음

  · 그래서 endPage가 페이지 수보다 크면 없는 페이지 수 보여주기보다 이때까지 쓴 페이지 수 만큼만 보여주기위함

 

페이지블록은 10이지만 글 수가 그것보다 적어서 마지막 페이지 수 보여줌

 

 

- prev 버튼

· 첫 페이지가 페이지블록 단위보다 커야 prev 버튼 등장

· ex) 페이지블록이 10일 때, 11페이지까지 있어야 prev 버튼 등장해서 1-10 영역으로 옮겨줌

페이지블록 2로 두고 실험

- next 버튼

  · 페이지 총 수가 endpage보다 클 때 next 버튼 등장