import java.util.ArrayList;
public class PageDto {
private ArrayList<BoardDto> boardList;
private int pageStart;
private int pageEnd;
private int pageLast;
private int listPerPage;
private int pageBlock;
private int total;
private int clickedPage;
public ArrayList<BoardDto> getBoardList() {
return boardList;
}
public void setBoardList(ArrayList<BoardDto> boardList) {
this.boardList = boardList;
}
public int getPageStart() {
return pageStart;
}
public void setPageStart(int pageStart) {
this.pageStart = pageStart;
}
public int getPageEnd() {
return pageEnd;
}
public void setPageEnd(int pageEnd) {
this.pageEnd = pageEnd;
}
public int getPageLast() {
return pageLast;
}
public void setPageLast(int pageLast) {
this.pageLast = pageLast;
}
public int getListPerPage() {
return listPerPage;
}
public void setListPerPage(int listPerPage) {
this.listPerPage = listPerPage;
}
public int getPageBlock() {
return pageBlock;
}
public void setPageBlock(int pageBlock) {
this.pageBlock = pageBlock;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public int getClickedPage() {
return clickedPage;
}
public void setClickedPage(int clickedPage) {
this.clickedPage = clickedPage;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jjang051.mybatis">
<select id="getTotal" resultType="Integer">
SELECT COUNT(*) AS TOTAL FROM BOARD03
</select>
<!-- select는 resultType과 parameterType을 가질 수 있다. id는 dao의 메서드 명이랑 일치 시켜주면 된다.-->
<select id="getAllBoard" resultType="BoardDto">
SELECT * FROM BOARD03 ORDER BY NO
</select>
<select id="getAllBoard02" resultType="BoardDto"
parameterType="HashMap">
SELECT * FROM
(SELECT ROWNUM AS NUM,B.* FROM
(SELECT * FROM BOARD03 ORDER BY NO DESC) B
) WHERE NUM <![CDATA[>=]]> #{start} AND NUM <![CDATA[<=]]> #{end}
</select>
<select id="getSelectOne" parameterType="Integer" resultType="BoardDto">
SELECT * FROM BOARD03 WHERE NO = #{no}
</select>
<!-- insert, delete, update는 resultType이 없다 -->
<insert id="insertBoard" parameterType="BoardDto">
INSERT INTO BOARD03 VALUES (BOARD03_SEQ.NEXTVAL,
#{userName},
#{subject},
#{contents},
SYSDATE,
0
)
</insert>
<update id="updateHit" parameterType="Integer">
UPDATE BOARD03 SET HIT = HIT + 1 WHERE NO = #{no}
</update>
<update id="updateBoard" parameterType="BoardDto">
UPDATE BOARD03 SET USERNAME = #{userName}, SUBJECt = #{subject}, CONTENTS = #{contents}
WHERE NO = #{no}
</update>
</mapper>
.
.
.
public int getTotal() {
int result = 0;
SqlSession sqlSession = MybatisConnectionFactory.getSqlSession();
result = sqlSession.selectOne("getTotal");
sqlSession.close();
return result;
}
public List<BoardDto> getAllBoard() {
List<BoardDto> boardList = null;
SqlSession sqlSession = MybatisConnectionFactory.getSqlSession();
boardList = sqlSession.selectList("getAllBoard");
sqlSession.close();
return boardList;
}
public List<BoardDto> getAllBoard02(int start,int end) {
HashMap<String,Integer> pageMap = new HashMap<>();
pageMap.put("start", start);
pageMap.put("end", end);
List<BoardDto> boardList = null;
SqlSession sqlSession = MybatisConnectionFactory.getSqlSession();
boardList = sqlSession.selectList("getAllBoard02",pageMap);
// 파라미터를 여러개를 넣을 수가 없어서 pageMap 해시맵으로 파라미터 던져버린 것
sqlSession.close();
return boardList;
}
.
.
.
package com.jjang051.controller;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jjang051.model.BoardDao;
import com.jjang051.model.BoardDto;
import com.jjang051.model.PageDto;
@WebServlet("/board/list")
public class BoardListController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardListController() {
super();
}
// < 한 페이지 당 글 불러오는 myBatis SQL문 >
// SELECT * FROM (
// SELECT ROWNUM AS NUM, B.* FROM
// (SELECT * FROM BOARD03 ORDER BY NO DESC) B
// )
// WHERE NUM >= #{start} AND NUM <= #{end}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BoardDao boardDao = new BoardDao();
int total = boardDao.getTotal(); // db에서 긁어온 글 전체 갯수
int listPerPage = 5; // 한번에 보여질 글목록에 뿌려질 갯수
int pageBlock = 4;
// 아래쪽 아래쪽 페이지(pageBox)에 한번에 뿌려질 페이지 갯수; 이전 1/2/3 다음 | 이전 4/5/6 다음
String tempClickedPage = request.getParameter("page");
// list에 처음 접속 시 쿼리스트링이 없어서 page가 null일 수 있다. 그 경우를 처리
int clickedPage = 0;
if (tempClickedPage == null) {
clickedPage = 1;
} else {
clickedPage = Integer.parseInt(tempClickedPage);
}
int start = (clickedPage - 1) * listPerPage + 1; // 글 목록시작
int end = start + listPerPage - 1; // 글 목록 끝
System.out.println("end===" + end);
int pageStart = (int) ((clickedPage - 1) / pageBlock) * pageBlock + 1;
int pageEnd = pageStart + pageBlock - 1;
int pageLast = 0; // 아래쪽 페이지(pageBox)의 전체 갯수
if (total % listPerPage == 0) {
pageLast = (int) (total / listPerPage);
} else {
pageLast = (int) (total / listPerPage) + 1;
// 만약에 101개의 글이 있고 5개가 listPerPage라면
// 100개에서 페이지가 끊겨버리기에, 나누어 떨어지지 않는다면 +1을 해야 함
}
if (pageEnd > pageLast) {
pageEnd = pageLast;
// 가장 마지막
}
;
// 이렇게 너무 많은 request를 보내야 할 때는 Dto 및 Dao 만드는 걸 고려해야 함
ArrayList<BoardDto> boardList = (ArrayList<BoardDto>) boardDao.getAllBoard02(start, end);
// request.setAttribute("boardList", boardList);
// request.setAttribute("clickedPage", clickedPage);
// request.setAttribute("total", total);
// request.setAttribute("pageBlock", pageBlock);
// request.setAttribute("listPerPage", listPerPage);
// request.setAttribute("pageLast", pageLast);
// request.setAttribute("pageStart", pageStart);
// request.setAttribute("pageEnd", pageEnd);
PageDto pageDto = new PageDto();
pageDto.setBoardList(boardList);
pageDto.setClickedPage(clickedPage);
pageDto.setTotal(total);
pageDto.setPageBlock(pageBlock);
pageDto.setListPerPage(listPerPage);
pageDto.setPageLast(pageLast);
pageDto.setPageStart(pageStart);
pageDto.setPageEnd(pageEnd);
request.setAttribute("pageDto", pageDto);
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/board/list.jsp");
dispatcher.forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp"%>
<main>
<ul class="boardList">
<c:forEach items="${pageDto.boardList }" var="boardDto"
varStatus="status" begin="0" end="${pageDto.total}">
<li><span class="no item">${pageDto.total - (pageDto.clickedPage-1)*pageDto.listPerPage - status.index}</span>
<span class="userName item">${boardDto.userName}</span> <span
class="subject item"><a
href="../board/view?no=${boardDto.no}">${boardDto.subject }</a></span> <span
class="date item">${boardDto.regDate}</span></li>
</c:forEach>
</ul>
<ul class="pageBox">
<li><a href="../board/list?page=1"><span
class="material-icons"> first_page </span></a></li>
<c:if test="${pageDto.pageStart!=1 }">
<li><a
href="../board/list?page=${pageDto.pageStart-pageDto.pageBlock }"><span
class="material-icons"> chevron_left </span></a></li>
</c:if>
<c:forEach begin="${pageDto.pageStart }" end="${pageDto.pageEnd }"
step="1" varStatus="status" var="page">
<!-- JSTL + 삼항 연산자로 클래스 이름 붙이기-->
<li class="${pageDto.clickedPage==page ? 'active':'' }"><a
href="../board/list?page=${page }">${page }</a></li>
</c:forEach>
<c:if test="${pageDto.pageLast != pageDto.pageEnd }">
<li><a
href="../board/list?page=${pageDto.pageStart+pageDto.pageBlock }"><span
class="material-icons"> chevron_right </span></a></li>
</c:if>
<li><a href="../board/list?page=${pageDto.pageLast}"><span
class="material-icons"> last_page </span></a></li>
<!-- <li><a href="../board/list?page=1">1</a></li>
<li><a href="../board/list?page=2">2</a></li>
<li><a href="../board/list?page=3">3</a></li>
<li><a href="../board/list?page=4">4</a></li> -->
</ul>
<div class="btns">
<a href="../board/write" class="confirm">글쓰기</a> <a href="../index"
class="reset">홈</a>
</div>
</main>
<%@ include file="../include/footer.jsp"%>
public class PageDao {
// start 구하는 함수 (한 페이지)
public int getStart(int clickedPage, int listPerPage) {
return (clickedPage - 1) * listPerPage + 1;
}
// end 구하는 함수 (한 페이지)
public int getEnd(int start, int listPerPage) {
return start + listPerPage - 1;
}
// pageStart 구하는 함수
public int getPageStart(int clickedPage, int pageBlock) {
return (int) ((clickedPage - 1) / pageBlock) * pageBlock + 1;
}
// pageEnd 구하는 함수
public int getPageEnd(int pageStart, int pageBlock) {
return pageStart + pageBlock - 1;
}
}
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jjang051.model.BoardDao;
import com.jjang051.model.BoardDto;
import com.jjang051.model.PageDto;
import com.jjang051.model.PageDao;
@WebServlet("/board/list")
public class BoardListController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BoardListController() {
super();
}
// < 한 페이지 당 글 불러오는 myBatis SQL문 >
// SELECT * FROM (
// SELECT ROWNUM AS NUM, B.* FROM
// (SELECT * FROM BOARD03 ORDER BY NO DESC) B
// )
// WHERE NUM >= #{start} AND NUM <= #{end}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BoardDao boardDao = new BoardDao();
PageDao pageDao = new PageDao();
int total = boardDao.getTotal(); // db에서 긁어온 글 전체 갯수
int listPerPage = 5; // 한번에 보여질 글목록에 뿌려질 갯수
int pageBlock = 4; // 아래쪽 아래쪽 페이지(pageBox)에 한번에 뿌려질 페이지 갯수; 이전 1/2/3 다음 | 이전 4/5/6 다음
String tempClickedPage = request.getParameter("page");
// list에 처음 접속 시 쿼리스트링이 없어서 page가 null일 수 있다. 그 경우를 처리
int clickedPage = 0;
if (tempClickedPage == null) {
clickedPage = 1;
} else {
clickedPage = Integer.parseInt(tempClickedPage);
}
int start = pageDao.getStart(clickedPage, listPerPage); // 글 목록시작
int end = pageDao.getEnd(start, listPerPage); // 글 목록 끝
System.out.println("end===" + end);
int pageStart = pageDao.getPageStart(clickedPage, pageBlock);
int pageEnd = pageDao.getPageEnd(pageStart, pageBlock);
int pageLast = 0; // 아래쪽 페이지(pageBox)의 전체 갯수
if (total % listPerPage == 0) {
pageLast = (int) (total / listPerPage);
} else {
pageLast = (int) (total / listPerPage) + 1;
// 만약에 101개의 글이 있고 5개가 listPerPage라면
// 100개에서 페이지가 끊겨버리기에, 나누어 떨어지지 않는다면 +1을 해야 함
}
if (pageEnd > pageLast) {
pageEnd = pageLast;
}
;
// 이렇게 너무 많은 request를 보내야 할 때는 Dto 및 Dao 만드는 걸 고려해야 함
ArrayList<BoardDto> boardList = (ArrayList<BoardDto>) boardDao.getAllBoard02(start, end);
// request.setAttribute("boardList", boardList);
// request.setAttribute("clickedPage", clickedPage);
// request.setAttribute("total", total);
// request.setAttribute("pageBlock", pageBlock);
// request.setAttribute("listPerPage", listPerPage);
// request.setAttribute("pageLast", pageLast);
// request.setAttribute("pageStart", pageStart);
// request.setAttribute("pageEnd", pageEnd);
PageDto pageDto = new PageDto();
pageDto.setBoardList(boardList);
pageDto.setClickedPage(clickedPage);
pageDto.setTotal(total);
pageDto.setPageBlock(pageBlock);
pageDto.setListPerPage(listPerPage);
pageDto.setPageLast(pageLast);
pageDto.setPageStart(pageStart);
pageDto.setPageEnd(pageEnd);
request.setAttribute("pageDto", pageDto);
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/board/list.jsp");
dispatcher.forward(request, response);
}
}