기본 게시판 만들기
- 페이징 기능 추가하기
페이징 기능 추가하기
[ 정의 ]
- 게시판을 기준으로 page 단위로 나누는 행위를 의미한다.
- 게시물을 일정 단위로 끊어서 가져오는 기법
페이징(Paging)
[ 구현 목표 ]
- 전체페이지 개수 별로 10개의 page 씩 나누어서 순서대로 보여준다.
- 이전페이지, 다음페이지별로 버튼을 눌러서 이동이 가능하다.
- 현재페이지가 첫번째 페이지라면 이전페이지 이동은 불가능하다.
- 현재페이지가 마지막 페이지라면 다음페이지 이동은 불가능하다.
[ DB 작업 ]
1) com.test.myapp.board > BoardDAO.java
- rownum을 주기 위해 SQL구문 수정하기
- 'begin' : 가져올 게시물 시작 위치
- 'end' : 가져올 게시물 끝 위치
*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.
public ArrayList<BoardDTO> list(HashMap<String, String> map) {
try {
String where ="";
if ( map.get("isSearch").equals("y") ) {
if ( map.get("column").equals("all") ) {
where = String.format(" where subject like '%%%s%%' or content like '%%%s%%' "
, map.get("search"), map.get("search"));
} else {
where = String.format(" where %s like '%%%s%%' "
, map.get("column"), map.get("search"));
}
}
// rownum 생성하기, 및 조건문 추가하기
String sql = String.format("select * from(select b.*, rownum as rnum from vwBoard b %s) where rnum between %s and %s order by seq desc"
, where
, map.get("begin")
, map.get("end"));
pstat = conn.prepareStatement(sql);
rs = pstat.executeQuery();
// 옮겨 담을 큰상자
ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
while ( rs.next() ) {
BoardDTO dto = new BoardDTO();
dto.setSeq(rs.getString("seq"));
// dto.setId(rs.getString("id"));
dto.setName(rs.getString("name"));
dto.setSubject(rs.getString("subject"));
dto.setReadcount(rs.getString("readcount"));
dto.setRegdate(rs.getString("regdate"));
dto.setIsnew(rs.getString("isnew")); // 글쓰고 난뒤 며칠이 지났는지 시간
dto.setCcnt(rs.getString("ccnt")); // 현재 글에 달린 댓글 갯수
list.add(dto);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
2) com.test.myapp.board > BoardDAO.java
- List 서블릿에서 총 게시물 수를 구하기를 사용할 메소드
public int getTotalCount(HashMap<String, String> map) {
try {
String where ="";
if ( map.get("isSearch").equals("y") ) {
if ( map.get("column").equals("all") ) {
where = String.format(" where subject like '%%%s%%' or content like '%%%s%%' "
, map.get("search"), map.get("search"));
} else {
where = String.format(" where %s like '%%%s%%' "
, map.get("column"), map.get("search"));
}
}
String sql = String.format("select count(*) as cnt from tblBoards %s", where);
pstat = conn.prepareStatement(sql);
rs = pstat.executeQuery();
if ( rs.next() ) {
return rs.getInt("cnt");
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
[ Servlet 작업 - 게시판 리스트 페이지에서 페이징 처리하기 ]
1) com.test.myapp.board > List.java
- 페이징 처리를 위한 변수 생성
- 총 게시물 알아내기(getTotalCount 메소드) -> 총 페이지 수 알아내기 (10페이지씩 나누기)
- 조건문을 사용해서 구현하기
a. 이전페이지, 다음페이지 10개씩 나누기
b. 페이지에 글이 존재하지 않을때
- 페이징 처리의 모든 코드는 bootstrap에 존재하는 페이지바 코드를 가져와서 구현했습니다.
*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.
HashMap<String, String> map = new HashMap<String, String>();
// 페이징 처리 -> 보고 싶은 페이지를 정하기 위한 처리
int nowPage = 0; // 현재 페이지번호
int totalCount = 0; // 총 게시물
int pageSize = 10; // 한 페이지당 출력할 게시물 수
int totalPage = 0; // 총 페이지 수
int begin = 0; // 가져올 게시물 시작 위치
int end = 0; // 가져올 게시물 끝 위치
int n = 0; // 페이지바 제작
int loop = 0; // 페이지바 제작
int blockSize = 10; // 페이지바 제작
String page = req.getParameter("page");
if ( page == null || page.equals("")) {
nowPage = 1;
} else {
nowPage = Integer.parseInt(page);
}
// 현재 페이지에서 가져올 시작 위치 구하기
begin = ( (nowPage - 1) * pageSize ) + 1;
// 게시물 끝 위치 찾기
end = begin + pageSize - 1;
map.put("begin", begin + "");
map.put("end", end + "");
BoardDAO dao = new BoardDAO();
// 총 게시물 수 알아내기
totalCount = dao.getTotalCount(map);
// 총 페이지 수 알아내기
totalPage = (int)Math.ceil( (double)totalCount / pageSize );
// 부트스트랩 이용해서 String 자료형에 담기
String pagebar = "<nav>\r\n"
+ "<ul class=\"pagination\">";
// while 루프 변수
loop = 1;
// 출력되는 페이지 변수
n = ( (nowPage - 1) / blockSize ) * blockSize + 1;
// 이전 10페이지
if ( n == 1 ) {
pagebar += String.format(" <li class='disabled'><a href='#!' aria-label='Previous'><span aria-hidden='true'>«</span></a></li> ");
} else {
pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d'><span aria-hidden='true'>«</span></a></li> ", n-1, blockSize);
}
// 페이지에 글이 아무것도 없을떄..
if (totalPage == 0) {
pagebar += " <li class='active'><a href='#!'>1</a></li> ";
}
while ( !(loop > blockSize || n > totalPage ) ) {
if ( n == nowPage ) {
pagebar += String.format(" <li class='active'><a href='#!'>%d</a></li> ", n);
} else {
pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d'>%d</a></li> ", n, n);
}
loop ++;
n++;
}
// 다음 10페이지
if ( n > totalPage ) {
pagebar += String.format(" <li class='disabled'><a href='#!' aria-label='Next'><span aria-hidden='true'>»</span></a></li> ");
} else {
pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d' aria-label='Next'><span aria-hidden='true'>»</span></a></li> ", n);
}
pagebar += "</ul>\r\n"
+ "</nav>";
// 마지막으로 list.jsp에 넘기기
req.setAttribute("map", map);
req.setAttribute("pagebar", pagebar);
[ JSP 작업 - Servlet에서 만든 pagebar 넘기기 ]
- 글 목록 바로 하단에 작성
*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.
<div class="pagebar">
${ pagebar }
</div>
- 게시판 리스트 페이지 ( 첫번째 페이지 )
첫페이지라서 이전페이지로 이동 버튼이 눌리지 않는다. 그리고 각 숫자를 누르면 해당 페이지로 이동한다.
- 게시판 리스트 페이지 (마지막 페이지)
마지막 페이지라서 다음 페이지로 이동 버튼이 눌리지않는다.
[ 페이징 기법 ]
- 게시판 기능 구현한것중에 가장 복잡해보이지만, 단계별로 차근차근 나가면 어렵지 않다고 생각하자!!!
- 현재 페이지 번호 (위치) 구하기
- 가져올 시작, 끝 게시물 구하기
- 총 게시물 수 알아내기 -> 총 페이지 수 알아내기
- 조건식으로 이전/다음페이지, 페이지에 글이 아무것도 없을때 총 3가지로 구분해서 구현한다.
'인천일보아카데미 > - 학습일지' 카테고리의 다른 글
[학습일지]JAVA교육일지 게시판CRUD 8⭐답변기능 (0) | 2022.11.10 |
---|---|
[학습일지]JAVA교육일지 게시판CRUD 6⭐게시판보안정책 (0) | 2022.07.21 |
[학습일지]JAVA교육일지 게시판CRUD 6⭐ 댓글기능 (0) | 2022.07.20 |
[학습일지]JAVA교육일지 게시판CRUD 5⭐검색기능(2) (0) | 2022.07.20 |
[학습일지]JAVA교육일지 게시판CRUD 4⭐검색기능(1) (0) | 2022.07.20 |