class 31 - Paging 처리

yoneeki·2023년 3월 17일
0

training-jp

목록 보기
21/31


Paging DAO 없이

Paging DTO

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>

BoardDao

.
.
.
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);
	}
}

JSP VIEW

<%@ 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"%>

Paging DAO 있게

Paging DAO

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);
	}
}
profile
Working Abroad ...

0개의 댓글