21.03.08

민주·2021년 3월 8일
0

[페이징 처리]

[쿼리]
SELECT idx,subject,bHit,reg_date FROM bbs ORDER BY idx DESC;
-- 5개씩 부르고 싶어도 기준이 될 컬럼이 없다.
--첫페이지 5개씩 보이기
--1. ROWNUM 각 행에 번호를 붙인 가상컬럼 ROWNUM을 추가
-- idx를 기준으로 잡으면 rnum이 뒤섞인다.(페이징처리 불가)
SELECT ROWNUM AS rnum,idx,subject,bHit,reg_date FROM bbs ORDER BY idx DESC;
-- rnum을 기준으로 잡으면 idx가 뒤섞인다.(페이징 처리는 되는데 최신순으로 정렬 불가능)
SELECT ROWNUM AS rnum,idx,subject,bHit,reg_date FROM bbs ORDER BY rnum DESC;

-- 2. rnum이 idx DESC정렬과 일치하도록 해야한다.
--> ROW_NUMBER() OVER() : OVER()에 정렬 조건을 넣어서 rownum을 생성
SELECT ROW_NUMBER() OVER(ORDER BY idx DESC) AS rnum,idx,subject,bHit,reg_date 
    FROM bbs WHERE rnum BETWEEN 1 AND 5;
-- 3. rnum자체가 가상 테이블 이므로 bbs에서 사실 없는 컬럼
-- 데이터를 모아서 그 안에서 가져올수 있도록 해야한다.
-- (bbs를 가져오는데 rnum을 같이 가져와서 그안에서 처리)
-- FROM에 테이블 대신 서브쿼리로 데이터를 불러와 활용
SELECT idx,subject,bHit,reg_date FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY idx DESC) AS rnum,idx,subject,bHit,reg_date 
        FROM bbs
) WHERE rnum BETWEEN 1 AND 5;
[Controller]
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
	throws ServletException, IOException {

    //list.jsp에서 보낸 파라메터page받아옴
    String pageParam =  req.getParameter("page");
    System.out.println("page:"+pageParam);
    //한페이지 그룹 -> 1~10번
    int group =1;
    //list.jsp에서 보낸 page파라메터가 null이 아니면
    if(pageParam!=null) {
	group = Integer.parseInt(pageParam);
    }
		
    BoardService service = new BoardService();
    HashMap<String, Object> map = service.list(group);
    BoardDTO dto = new BoardDTO();
    req.setAttribute("maxPage", map.get("maxPage"));
    req.setAttribute("list",map.get("list"));
    req.setAttribute("currPage", group);
    //특정페이지로 보내기
    RequestDispatcher dis = req.getRequestDispatcher("list.jsp");
    dis.forward(req, resp);
}
public HashMap<String, Object> list(int page) {
		
    HashMap<String, Object> map = new HashMap<String, Object>();
    
    int pagePerCnt = 10;//한페이지에 보여줄 글 수
    int end = page*pagePerCnt;
    int start = end-(pagePerCnt-1);
    String sql ="SELECT idx,subject,bHit,reg_date FROM"
		+ "(SELECT ROW_NUMBER() OVER(ORDER BY idx DESC"
        	+ "AS rnum,idx,subject,bHit,reg_date FROM bbs)" 
		+ "WHERE rnum BETWEEN ? AND ?";
		
    ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();		
    try {
	ps = conn.prepareStatement(sql);
	ps.setInt(1, start);
	ps.setInt(2, end);
	rs = ps.executeQuery();
	while(rs.next()) {
	    BoardDTO dto = new BoardDTO();
	    dto.setIdx(rs.getInt("idx"));
	    dto.setSubject(rs.getString("subject"));
	    dto.setbHit(rs.getInt("bHit"));
	    dto.setReg_date(rs.getDate("reg_date"));
	    list.add(dto);
	}
	System.out.println("list size:"+list.size());
	BoardDTO dto = new BoardDTO();
        //최대 페이지를 보여주는 함수호출
	int maxPage= getMaxPage(pagePerCnt);
	map.put("list",list);
	map.put("maxPage",maxPage);
	System.out.println("maxPage: "+ maxPage);
    } catch (SQLException e) {
	e.printStackTrace();
    } finally {
	resClose();
    }
    return map;
}
	
private int getMaxPage(int pagePerCnt) {
    //전체 글 수를 가져오기
    String sql = "SELECT COUNT(idx) FROM bbs";
    int max=0;
    try {
	ps = conn.prepareStatement(sql);
	rs = ps.executeQuery();
	if(rs.next()) {
	    int cnt = rs.getInt(1);
            //전체 페이지가 몇개가 나올지 계산
	    max = (int) Math.ceil(cnt/(double)pagePerCnt);
	}
    } catch (SQLException e) {
	e.printStackTrace();
    }
    return max;
}
[list.jsp]
<div class="pageArea">
    <span>
        <!--현재페이지가 1이면 이전페이지 비활성화-->
	<c:if test="${currPage==1}">이전</c:if>
	<c:if test="${currPage>1}">
	    <a href='./?page=${currPage-1}'>이전</a>
	</c:if>
	</span>
	<span id="page">${currPage}</span>
	<span>
        <!--현재페이지가 마지막페이지면 다음페이지 비활성화-->
	<c:if test="${currPage == maxPage}">다음</c:if>
        <c:if test="${currPage < maxPage}">
             <a href="./?page=${currPage+1}">다음</a></c:if>
    </span>
</div>
profile
개발이좋아요

0개의 댓글

Powered by GraphCDN, the GraphQL CDN