관리 메뉴

me made it !

[JSP] 20230321 JSP 게시판 페이징 본문

TIL/JSP

[JSP] 20230321 JSP 게시판 페이징

yeoney 2023. 3. 21. 11:28
반응형
package example1230.domain;

public class PageMaker {
//페이지 네비게이션을 사용하기 위한 기능이 담긴 클래스 
	
	private int displayPageNum = 10;	//페이지 네비게이션에 나타나는 페이징 수 	1 2 3
	private int startPage; 	//페이징의 시작점 
	private int endPage;		//페이징의 끝점
	private int totalCount; 	//전체 게시물 수 
	
	private boolean prev;	//이전버튼
	private boolean next;	//다음버튼
	
	private Criteria cri;
	
	
	public int getDisplayPageNum() {
		return displayPageNum;
	}


	public void setDisplayPageNum(int displayPageNum) {
		this.displayPageNum = displayPageNum;
	}


	public int getStartPage() {
		return startPage;
	}


	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}


	public int getEndPage() {
		return endPage;
	}


	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}


	public int getTotalCount() {
		return totalCount;
	}


	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
		calcData();		//페이징 계산식
	}


	public boolean isPrev() {
		return prev;
	}


	public void setPrev(boolean prev) {
		this.prev = prev;
	}


	public boolean isNext() {
		return next;
	}


	public void setNext(boolean next) {
		this.next = next;
	}


	public Criteria getCri() {
		return cri;
	}


	public void setCri(Criteria cri) {
		this.cri = cri;
	}

	public void calcData() {
		// 시작 페이지 번호
		// 끝 페이지 번호
		// 이전 다음 버튼 보여주기
		
		
		endPage = (int)(Math.ceil(cri.getPage()/(double)displayPageNum) * displayPageNum);
		
		startPage = (endPage - displayPageNum)+1 ;
		
		//실제 페이지
		int tempEndPage= (int)(Math.ceil(totalCount / (double)cri.getPerPageNum()));
		
		if(endPage > tempEndPage) {
			endPage = tempEndPage;
		}
		
		prev = (startPage == 1 ? false: true);	//false 이면 나타내지 않기
		next = (endPage*cri.getPerPageNum() >= totalCount ? false : true);

	}

	
}
package example1230.domain;

public class Criteria {
	//페이지 번호를 넘기는 기능을 하기 위한 클래스 
	
	private int page;
	private int perPageNum;		//화면에 출력되는 리스트 수
	
	
	public Criteria(){
		this.page= 1;
		this.perPageNum=15;
	}


	public int getPage() {
		return page;
	}


	public void setPage(int page) {
		this.page = page;
	}


	public int getPerPageNum() {
		return perPageNum;
	}


	public void setPerPageNum(int perPageNum) {
		this.perPageNum = perPageNum;
	}
	
	
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>      
 <%@ page import ="java.util.*" %>
 <%@ page import ="example1230.domain.*" %>
 <%
 ArrayList<BoardVo>  blist = (ArrayList<BoardVo>) request.getAttribute("blist");
 PageMaker pm =(PageMaker)request.getAttribute("pm");

 %>    
       
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
a:link{
text-decoration:none;
}

</style>
</head>
<body>
게시판 목록
<form name="frm" action="<%=request.getContextPath() %>/board/boardList.do" method="post">
<table  style="text-align:left;width:800px;border:0;">
<tr>
<td style="width:600px;"></td>
<td>
<select name="searchType">
<option value="subject">제목</option>
<option value="writer">작성자</option>
</select>
</td>
<td><input type="text" name="keyword" size="10"></td>
<td><input type="submit" name="submit" value="검색"></td>
</tr>
</table>
</form>
<table border=1 style="text-align:left;width:800px;">
<tr>
<td>게시물번호</td>
<td>제목</td>
<td>작성자</td>
<td>날짜</td>
</tr>
<%for(BoardVo bv: blist){ %>
<tr>
<td>
<%=bv.getBidx() %></td>
<td>
<%for(int i = 1; i<=bv.getLevel_(); i++){
		out.println("&nbsp;&nbsp;");
		if(i==bv.getLevel_()){
			out.println("ㄴ");
		}
	
	
} %>

<a href="<%=request.getContextPath()%>/board/boardContents.do?bidx=<%=bv.getBidx() %>"><%=bv.getSubject() %></a></td>
<td><%=bv.getWriter() %></td>
<td><%=bv.getWriteday().substring(0,10)  %></td>
</tr>
<%} %>



</table>
<table style="border:0, width:300px;width:800px;">
<tr>
<td style="text-align:right;">
<%if (pm.isPrev()){ %>
◀
<%} %>
</td>
<td style="text-align:center;width:300px;">
<%
for (int i= pm.getStartPage(); i <=pm.getEndPage(); i++){

	out.println(i+"&nbsp;&nbsp;");
	
}
%>
</td>
<td style="width:200px;text-align:left;">
<%if (pm.isNext()&&pm.getEndPage() > 0){ %>
▶
<%} %>
</td>
</tr>
</table>

<a href="<%=request.getContextPath()%>/board/boardWrite.do">글쓰기</a>
</body>
</html>

BoardController

	if(str.equals("/board/boardList.do")) {
			System.out.println("boardList.do 들어옴");
			
			String page =request.getParameter("page");
			if (page == null) {
				page = "1";
			}
			
			Criteria cri = new Criteria();
			cri.setPage(Integer.parseInt(page));	//넘어온 page 값을 cri에 담는다.
			

			BoardDao bd =  new BoardDao();
			ArrayList<BoardVo> blist = bd.boardSelectAll(cri);	
			int cnt = bd.boardTotal();
			
			PageMaker pm = new PageMaker();
			pm.setCri(cri);
			pm.setTotalCount(cnt);
			
			
			request.setAttribute("blist", blist);
			request.setAttribute("pm", pm);
			
			RequestDispatcher rd = request.getRequestDispatcher("/board/boardList.jsp");
			rd.forward(request, response);		//forward 방식 : 같은 영역안에 있는 다른 공간에 정보를 넘겨줌
	public int boardTotal() {
		int value = 0;
		String sql ="select count(*) as cnt from board1230 where delyn='n'";
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int cnt = 0;
		try {
			pstmt =conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				cnt = rs.getInt("cnt");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return cnt;
	}

반응형