✅ 두번의 쿼리문 작업이 필요
cPage = 현재 사용자가 보고 있는 페이지
numPerPage = 한 페이지당 나타낼 자료의 갯수
totalMember = 현재 디비에 등록된 총 회원 수
totalPage = (총 회원수/한 페이지당 나타낼 회원 수)의 총 갯수, ex) 10명/2개씩 -> 총 5페이지
(int)Math.ceil((double)totalData/numPerpage)
pageBar = html 코드를 넣어줄 변수 (실질적인 페이지바 화면)
pageBarSize = 아래 사진과 같은건데 1~5까지 보일것이냐 1~10까지 보일꺼냐 정하는 것.
서블릿
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int cPage,numPerpage;
try {
cPage=Integer.parseInt(request.getParameter("cPage"));
}catch(Exception e) {
cPage=1;
}
try {
numPerpage=Integer.parseInt(request.getParameter("numPerPage"));
}catch(Exception e) {
numPerpage=5;
}
// 페이지 수만큼 데이터를 불러옴 ex) 1~5데이터,6~10데이터,11~16데이터 ...
List<Student> list=new StudentService().selectStudentPage(cPage,numPerpage);
request.setAttribute("students", list);
int totalData=new StudentService().selectStudentCount(); // 전체 데이터 수
int totalPage=(int)Math.ceil((double)totalData/numPerpage); // 전체 페이지 수
int pageBarSize=5;
int pageNo=((cPage-1)/pageBarSize)*pageBarSize+1;
int pageEnd=pageNo+pageBarSize-1;
String pageBar="<ul class='pagination justify-content pagination-sm'>"; // 부스트랩 디자인
if(pageNo==1) {
//15버전
pageBar+="""
<li class='page-item disabled'>
<a class='page-link' href='#'>이전</a>
</li>
""";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()
+"?cPage="+(pageNo-1)+"'>이전</a>";
pageBar+="</li>";
}
while(!(pageNo>pageEnd||pageNo>totalPage)) {
if(cPage==pageNo) {
pageBar+="<li class='page-item disabled'>";
pageBar+="<a class='page-link' href='#'>"+pageNo+"</a>";
pageBar+="</li>";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()
+"?cPage="+(pageNo)+"'>"+pageNo+"</a>";
pageBar+="</li>";
}
pageNo++;
}
if(pageNo>totalPage) {
pageBar+="""
<li class='page-item disabled'>
<a class='page-link' href='#'>다음</a>
</li>
""";
}else {
pageBar+="<li class='page-item'>";
pageBar+="<a class='page-link' href='"+request.getRequestURI()
+"?cPage="+(pageNo)+"'>다음</a>";
pageBar+="</li>";
}
pageBar+="</ul>";
request.setAttribute("pageBar", pageBar);
request.getRequestDispatcher("/views/studentPage.jsp")
.forward(request, response);
}
Service
public int selectStudentCount() { // 학생수 조회
SqlSession session=getSession();
int count=dao.selectStudentCount(session);
session.close();
return count;
}
public List<Student> selectStudentPage(int cPage, int numPerpage){
SqlSession session = getSession();
List<Student> result=dao.selectStudentPage(session,cPage,numPerpage);
session.close();
return result;
}
dao
RowBounds
클래스 이용함 public int selectStudentCount(SqlSession session) {
// selectOne()메소드를 이용해서 데이터를 조회할 수 있다. (하나의 로우)
int result = session.selectOne("student.selectStudentCount");
return result;
}
public List<Student> selectStudentPage(SqlSession session, int cPage, int numPerpage){
// 1 매개변수 : offset -> 시작 row번호를 보냄 (cPage-1)*numPerpage
// 2 매개변수 : 범위 -> numPerpage
// new RowBounds((cPage-1)*numPerpage,numPerpage);
// RowBounds 객체는 알아서 마이배티스에서 처리해줌
RowBounds rb=new RowBounds((cPage-1)*numPerpage,numPerpage);
return session.selectList("student.selectStudentPage",null,rb);
// 두번째 매개변수는 조건이 따로없으면 파라미터값을 null로 둠
}
mapping xml파일
<select id="selectStudentCount" resultType="_int"> <!-- 개수를 반환해야하므로 리턴타입-> 정수 -->
SELECT COUNT(*) FROM STUDENT
</select>
<select id="selectStudentPage" resultMap="studentMap">
<!-- SELECT * FROM (SELECT ROWNUM AS RNUM, S.* FROM()) -->
SELECT * FROM STUDENT <!-- 위 쿼리문을 작성할필요없이 Mybatis가 알아서 페이징처리해줌 -->
</select>
jsp
<c:if test="${not empty students }">
<table>
<tr>
<th>학생번호</th>
<th>학생이름</th>
<th>학생전화번호</th>
<th>학생이메일</th>
<th>학생주소</th>
<th>학생등록일</th>
</tr>
<tr>
<c:forEach var="s" items="${students }">
<tr>
<td><c:out value="${s.studentNo}"/></td>
<td><c:out value="${s.studentName}"/></td>
<td><c:out value="${s.studentTel}"/></td>
<td><c:out value="${s.studentEmail}"/></td>
<td><c:out value="${s.studentAddress}"/></td>
<td><c:out value="${s.reg_date}"/></td>
</tr>
</c:forEach>
</tr>
</table>
</c:if>
<div>
<c:out value="${pageBar}" escapeXml="false"/>
<!-- escapeXml -> pageBar 자체를 문자열로 인식시키기 위해서 -->
</div>