[JSP] 페이징 처리 / 한 페이지에 보여지는 게시글 수
< 페이징 처리 >
- 게시판 글을 페이징 처리해줘서 글 당 번호, 한 페이지의 시작 번호, 한 페이지의 끝 번호를 매겨줄거다
- 글 아래에 있는 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가 페이지 수보다 크면 없는 페이지 수 보여주기보다 이때까지 쓴 페이지 수 만큼만 보여주기위함
- prev 버튼
· 첫 페이지가 페이지블록 단위보다 커야 prev 버튼 등장
· ex) 페이지블록이 10일 때, 11페이지까지 있어야 prev 버튼 등장해서 1-10 영역으로 옮겨줌
- next 버튼
· 페이지 총 수가 endpage보다 클 때 next 버튼 등장