자 이제 페이지를 만들어 보자
//게시물 출력코드
@RequestMapping(value="/board/list.kh", method =RequestMethod.GET)
public ModelAndView boardList(ModelAndView mv,
@RequestParam(value="page", required=false) Integer page) {
//@RequestParam(value="page", required=false)의 값은 page이지만
// required=false 필수값은 아니라는 뜻
int currentPage = (page != null) ? page: 1;
//현재 페이지
//만약 page값이 없으면 기본형 1로 출력할것, 아니면 받아온 page의 값을 준다.
//삼항연상자 사용
int totalCount = bService.getTotalCount();
int boardLimit = 10; //한 화면에 출력할 게시물 수
int naviLimit = 5; //한 화면에 출력할 게시판 페이지 수
int maxPage; //게시판의 총 페이지 수
int startNavi; //한 화면에 출력되는 게시판 페이지의 처음 수
int endNavi;//한 화면에 출력되는 게시판 페이지의 마지막 수
maxPage =(int)((double)totalCount/boardLimit+0.9);
startNavi = ((int)((double)currentPage/naviLimit+0.9)-1)*naviLimit+1;
endNavi=startNavi+naviLimit-1;
//endNavi가 maxNavi보다 커지는 오류방지
if(maxPage<endNavi) {
endNavi = maxPage;
}
List<Board> bList = bService.printAllBoard(currentPage, boardLimit);
if(!bList.isEmpty()) {
mv.addObject("startNavi",startNavi);
mv.addObject("endNavi", endNavi);
mv.addObject("maxPage", maxPage);
mv.addObject("bList", bList);
}
mv.setViewName("/board/listView");
return mv;
}
public ModelAndView boardList(ModelAndView mv, @RequestParam(value="page", required=false) Integer page)
<a href = “/board/list.kh?page= 이동할페이지 >
required=false
int currentPage = (page != null) ? page: 1;
int totalCount = bService.getTotalCount();
이것이다.@Override
public int getTotalCount() {
int count = bStore.selectTotalCount(session);
return count;
}
@Override
public int selectTotalCount(SqlSessionTemplate session) {
int count = session.selectOne("BoardMapper.selectBoardCount");
return count;
}
session에서 연결한 select태그의 BoardMapper 라는 nameSpace에 selectBoardCount라는 id를 가진 쿼리문을 실행할것이다.
<!-- 숫자 반환할거니까 resultTypeuploadFile="_int" 기억할것! -->
<select id="selectBoardCount" resultType="_int">
select count(*) from board_tbl where b_status = 'Y'
</select>
resultType="_int"
으로 선언해주어야 한다.b_status = 'Y'
는 삭제 처리 하지 않아다는 뜻이다, 게시물을 삭제할때 지워버릴수도 있지만 N으로 표시해 데이터베이스에는 남겨놓고 출력하지 않을수도 있다.
int totalCount = bService.getTotalCount();
int boardLimit = 10; //한 화면에 출력할 게시물 수
int naviLimit = 5; //한 화면에 출력할 게시판 페이지 수
int maxPage; //게시판의 총 페이지 수
int startNavi; //한 화면에 출력되는 게시판 페이지의 처음 번호
int endNavi;//한 화면에 출력되는 게시판 페이지의 마지막 번호
maxPage =(int)((double)totalCount/boardLimit+0.9);
startNavi = ((int)((double)currentPage/naviLimit+0.9)-1)*naviLimit+1;
endNavi=startNavi+naviLimit-1;
//endNavi가 maxNavi보다 커지는 오류방지
if(maxPage<endNavi) {
endNavi = maxPage;
}
List<Board> bList = bService.printAllBoard(currentPage, boardLimit);
if(!bList.isEmpty()) {
mv.addObject("startNavi",startNavi);
mv.addObject("endNavi", endNavi);
mv.addObject("maxPage", maxPage);
mv.addObject("bList", bList);
}
mv.setViewName("/board/listView");
return mv;
@Override
public List<Board> printAllBoard(int currentPage, int limit) {
List<Board> bList = bStore.selectAllboard(session,currentPage,limit);
return bList;
}
@Override
public List<Board> selectAllboard(SqlSessionTemplate session, int currentPage, int limit) {
//offset currentPage에 의해서 변경되는 값
//1->1, 2->11, 3->21 게시판 페이지에서 처음의 출력되는 게시물의 번호
//limit는 한 페이지당 보여주고 싶은 게시물의 갯수
//지금은 10
//RowBounds란 쿼리문을 변경하지 않고도 페이징을 처리할수 있게 해주는 클래스이며
//offset과 limit값을 이용해서 동작함, offset은 currentPage에 의해서 변하는 값이고
//limit값은 고정값이다
//offset은 0, 10 , 20으로 currentPage에서 실제로 2페이지에 출력하는 첫 게시물의 번호인 11 보다 1작다
int offset = (currentPage-1)*limit;
RowBounds rowBounds= new RowBounds(offset,limit);
List<Board> bList = session.selectList("BoardMapper.selectAllBoard",null,rowBounds);
return bList;
}
session.selectList("BoardMapper.selectAllBoard",null,rowBounds);
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자유게시판</title>
</head>
<body>
<h1 align="center">게시글 목록</h1>
<br>
<br>
<table align="center" border="1">
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>날짜</th>
<th>조회수</th>
<th>첨부파일</th>
</tr>
<c:forEach items="${bList }" var="board" varStatus="i">
<tr>
<td>${i.count }</td>
<td>${board.boardTitle }</td>
<td>${board.boardWirter }</td>
<td>${board.bCreateDate }</td>
<td>${board.boardCount }</td>
<td>0</td>
</tr>
</c:forEach>
<!----------------------------------페이징시작-------------------------------------->
<tr align="center" height="20">
<td colspan="6">
<!-- startNavi가 1일이 아닐때만 출력 -->
<c:if test="${startNavi ne 1 && startNavi > 0}">
<a href="/board/list.kh?page=${startNavi-1 }">이전</a>
</c:if>
<!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 -->
<c:forEach var="p" begin="${startNavi }" end="${endNavi }" >
<a href="/board/list.kh?page=${p }">${p }</a>
</c:forEach>
<!-- endNavi가 maxPage와 같지 않을때만 출력 -->
<c:if test="${endNavi ne maxPage }">
<a href="/board/list.kh?page=${endNavi+1 }">다음</a>
</c:if>
</td>
</table>
</body>
</html>
<c:if test="${startNavi ne 1 && startNavi > 0}">
/board/list.kh?page=${startNavi-1 }
: 이전은 페이지의 시작페이지번호 -1이다<c:if test="${endNavi ne maxPage }">
<a href="/board/list.kh?page=${endNavi+1 }">
다음은 페이지의 마지막페이지번호 +1이다