wasup

게시판 만들기#ver1_paging 본문

IT/Java

게시판 만들기#ver1_paging

wasupup 2021. 5. 30. 13:05
반응형

Paging

게시판의 게시물 목록의 페이징

번호(일련번호) 1~10 11~20 21~30
페이지 1p 2p 3p

*번호 : 수집된 게시물을 정렬한 순서


필요한 정보

1. 페이지당 게시물 수

2. 각 페이지의 시작일련번호

3. 각 페이지의 마지막일련번호

4. 총게시물 수

-> 여기서 총 게시물 수는 DB의 게시물 수가 아닌 수집할 게시물 수.


예상 페이징 URL

board_list.jsp?시작페이지=1

or

board_list.jsp?시작일련번호=1&마지막일련번호=10

 

-> 결정된 페이징 파라미터 [/board_list.jsp?page=3]

 


<%
String strBoardPage=request.getParameter("page");
int boardPage = (strBoardPage==null ? 1 : Integer.valueOf(strBoardPage) );//페이지
int totalCount = 0;//총게시물수
int postsPerPage = 10;//페이지당게시물수
int startNum = (boardPage-1)*postsPerPage; //시작일련번호 zero-base

ArrayList<boardtable> boardPosts = new ArrayList<boardtable>();

try {
	//드라이버로드
	Class.forName("com.mysql.cj.jdbc.Driver");
	
	//드라이버 관리자를 통해 DB연결자를 얻음
	Connection DBConManagement = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true&characterEncoding=utf8", ConnectionInfo.DBIP, ConnectionInfo.DBPort, ConnectionInfo.DBName), ConnectionInfo.DBID, ConnectionInfo.DBPASSWORD);
	
	//연결자를 통해 명령 전달자를 얻음
	Statement CommandState = DBConManagement.createStatement();
	
	//총(전체가 아닌 수집한 것)게시물수 구하기
	String totalCountSQL = "select count(*) as 갯수 from boardtable";
	ResultSet setCTManagement = CommandState.executeQuery(totalCountSQL);
	setCTManagement.next();
	totalCount = setCTManagement.getInt("갯수");
	
	setCTManagement.close();
	
	//게시물수집
	String CollecSQL = String.format("select boNum, boTit, boDate, boHit from boardtable ORDER BY boDate desc limit %d, %d", startNum, postsPerPage);
	ResultSet CollectManager = CommandState.executeQuery(CollecSQL);
	
	while(CollectManager.next()) {//next() 다음줄로
		int boNum = CollectManager.getInt("boNum");
		String boTit = CollectManager.getString("boTit");
		java.sql.Date boDate = CollectManager.getDate("boDate");
		int boHit = CollectManager.getInt("boHit");
		
		boardtable boardPost = new boardtable();
		boardPost.setBoNum(boNum);
		boardPost.setBoTit(boTit);
		boardPost.setBoDate(boDate);
		boardPost.setBoHit(boHit);
		
		boardPosts.add(boardPost);
	}
	CollectManager.close();
	
	//연결끊기
	DBConManagement.close();
} catch (Exception e) {
	e.printStackTrace();
}
%>

 

<div class="paging_box">
맨처음
이전
<% 
int postsPerPage = 10;
int startPageNum = 1;
int remainder = totalCount%postsPerPage;
		//332%10 = 2
int lastPageNum = (totalCount-remainder)/postsPerPage+((remainder>0)?1:0);
				//(332 - 2)/ 10+1+(remainder가 1이상이면 1을더하고 그렇지않으면 안더함.)

for(int printPageNo = startPageNum; printPageNo <= lastPageNum; printPageNo++){
	if(printPageNo==boardPage){//현재페이지인 경우 %>
		<a href="./board_list.jsp?page=<%=printPageNo %>" class="active"><%= printPageNo %></a>
	<% }else{//현재페이지 아닌경우 %>
		<a href="./board_list.jsp?page=<%=printPageNo %>" ><%= printPageNo %></a>
	<%}
}%>
다음
맨끝
</div>

페이지 구분이 필요함.


페이징의 페이징

1. 블럭단위

1~10까지는 페이지 1블럭,
2~20까지는 페이지 2블럭이 나와야한다.

2. 블럭구분

(1-1)/10 = 0 
(2-1)/10 = 0.1
(10-1)/10 = 0.9
-> 1~10까지 몫은 0, 11~20까지 몫은 1이됨.

3. 각 블럭의 시작번호

몫이 0일때 : 0 * 10 + 1 =1
몫이 1일때 : 1 * 10 + 1 =11
몫이 2일때 : 2 * 10 + 1 =21


*중간에 DAO구조로 변경

<%
String strBoardPage=request.getParameter("page");
int boardPage = (strBoardPage==null ? 1 : Integer.valueOf(strBoardPage) );//페이지
int postsPerPage = 10;//페이지당게시물수
%>

<div class="paging_box">
  <% 
  int pageBlockPage = 10; //하단에 출력되는 페이지들 : 페이지블럭
  int remainder = ((int)((boardPage-1)/pageBlockPage)); //입력된 페이지 번호를 페이지 블럭당 페이지 수로 나눈 몫 : 구한 몫은 실제 블럭수보다 1 적음.
  int startPageNum = remainder*10+1;//시작페이지번호
  int useRemainder = totalCount.value%postsPerPage;//사용할 나머지 값
          //332%10 = 2
  int totalLastPageNum = (totalCount.value-useRemainder)/postsPerPage+((useRemainder>0)?1:0);//전체에서 마지막 페이지 번호
                  //(332 - 2)/ 10+1+(나머지가 1이상이면 1을더하고 그렇지않으면 안더함.)
  int blockLastPageNum = (startPageNum-1)+pageBlockPage;//페이지 블럭의 마지막 번호로 출력될 수 
  int lastPageNum = (totalLastPageNum < blockLastPageNum) ? totalLastPageNum : blockLastPageNum;//실제 마지막 페이지 번호
  %>
  <% if(startPageNum>1){%>
      <a href="./board_list.jsp?page=1">맨처음</a>
      <a href="./board_list.jsp?page=<%=startPageNum-1%>">이전</a>
  <%}

  for(int printPageNo = startPageNum; printPageNo <= lastPageNum; printPageNo++){
      if(printPageNo==boardPage){//현재페이지인 경우 %>
          <a href="./board_list.jsp?page=<%=printPageNo %>" class="active"><%= printPageNo %></a>
      <% }else{//현재페이지 아닌경우 %>
          <a href="./board_list.jsp?page=<%=printPageNo %>" ><%= printPageNo %></a>
      <%}
  }%>

  <% if(lastPageNum<totalLastPageNum){%>
      <a href="./board_list.jsp?page=<%=lastPageNum+1%>">다음</a>
      <a href="./board_list.jsp?page=<%=totalLastPageNum%>">맨끝</a>
  <%}%>
</div>
반응형

'IT > Java' 카테고리의 다른 글

게시판 만들기#ver2_정리  (0) 2021.05.31
Java) 객체는 무엇이고 클래스는 무엇인가?  (0) 2021.05.31
게시판 만들기#ver1_basedata  (0) 2021.05.29
게시판 만들기#ver1_list and view  (0) 2021.05.28
게시판 만들기#ver1_write  (0) 2021.05.27
Comments