디지털 컨버전스/Project

[BoardProject] 페이지 네비게이터

gimyeondong 2020. 5. 7. 12:14

연습용 Main 클래스 만들기

다이나믹웹프로젝트 안의 파일이지만 네이티브로도 실행 가능

package kh.backend.controller;

public class Main {

	public static String getpageNavi() {
		
		//총 몇개의 글이 있는가? 한페이지에 몇개의 글을 보여줄 것인가?
		int recordTotalCount = 147; // 총 게시물의 개수
		
		int recordCountPerPage = 10;// 한 페이지에 게시글 몇개를 보여줄 것인가?
		int naviCountPerPage = 10; //한 페이지에 네비게이터 몇개를 보여줄 것인가?
		
		int pageTotalCount = 0; // 전체 페이지의 개수
		
		
		if(recordTotalCount % recordCountPerPage > 0) {
			pageTotalCount = recordTotalCount / recordCountPerPage + 1;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 있으면 한페이지를 더한다.
			// ex) 147개의 글이 있다면 10글 짜리 14페이지 + 7글짜리 1페이지 -> 총 15페이지 필요
		}else {
			pageTotalCount = recordTotalCount / recordCountPerPage;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 없으면 더할 필요없다.
			// ex) 140개의 글이 있다면 10글 짜리 14페이지로 끝.
		}
		
		int currentPage = 12; //현재 내가 위치한 페이지 번호, 1~pageTotalCount까지의 범위를 가진다.
		if(currentPage < 1) {
			currentPage = 1;
		}else if(currentPage > pageTotalCount) {
			currentPage = pageTotalCount;
		} // 공격자가 currentPage 값을 변조할 경우에 대한 보안 코드
		
		int startNavi = (currentPage - 1) / naviCountPerPage * naviCountPerPage + 1 ;
		int endNavi = startNavi + naviCountPerPage - 1 ;
		
		if(endNavi > pageTotalCount) {
			endNavi = pageTotalCount;
		}

		boolean needPrev = true;
		boolean needNext = true;
		
		if(startNavi == 1) {needPrev = false;}
		if(endNavi == pageTotalCount) {needNext = false;}
		
		System.out.println("총 페이지 개수 : " + pageTotalCount);
		System.out.println("현재 페이지 : " + currentPage);
		System.out.println("네비게이터 시작 : " + startNavi);
		System.out.println("네비게이터 끝 : " + endNavi);
		
		if(needPrev) {
			System.out.print("< ");
		}
		for (int i = startNavi;i <= endNavi;i++) {
			System.out.print(i+" ");
		}
		if(needNext) {
			System.out.print(">");
		}
		return "";
	}

	public static void main(String[] args) {
		getpageNavi();
	}

}

DAO로 이동

sysout말고 스트링으로 조립해야함

 

StringBuilder sd = new StringBuilder();

package kh.backend.controller;

public class Main {

	public static String getpageNavi() {
		
		//총 몇개의 글이 있는가? 한페이지에 몇개의 글을 보여줄 것인가?
		int recordTotalCount = 147; // 총 게시물의 개수
		
		int recordCountPerPage = 10;// 한 페이지에 게시글 몇개를 보여줄 것인가?
		int naviCountPerPage = 10; //한 페이지에 네비게이터 몇개를 보여줄 것인가?
		
		int pageTotalCount = 0; // 전체 페이지의 개수
		
		
		if(recordTotalCount % recordCountPerPage > 0) {
			pageTotalCount = recordTotalCount / recordCountPerPage + 1;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 있으면 한페이지를 더한다.
			// ex) 147개의 글이 있다면 10글 짜리 14페이지 + 7글짜리 1페이지 -> 총 15페이지 필요
		}else {
			pageTotalCount = recordTotalCount / recordCountPerPage;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 없으면 더할 필요없다.
			// ex) 140개의 글이 있다면 10글 짜리 14페이지로 끝.
		}
		
		int currentPage = 12; //현재 내가 위치한 페이지 번호, 1~pageTotalCount까지의 범위를 가진다.
		if(currentPage < 1) {
			currentPage = 1;
		}else if(currentPage > pageTotalCount) {
			currentPage = pageTotalCount;
		} // 공격자가 currentPage 값을 변조할 경우에 대한 보안 코드
		
		int startNavi = (currentPage - 1) / naviCountPerPage * naviCountPerPage + 1 ;
		int endNavi = startNavi + naviCountPerPage - 1 ;
		
		if(endNavi > pageTotalCount) {
			endNavi = pageTotalCount;
		}

		boolean needPrev = true;
		boolean needNext = true;
		
		if(startNavi == 1) {needPrev = false;}
		if(endNavi == pageTotalCount) {needNext = false;}
		
		System.out.println("총 페이지 개수 : " + pageTotalCount);
		System.out.println("현재 페이지 : " + currentPage);
		System.out.println("네비게이터 시작 : " + startNavi);
		System.out.println("네비게이터 끝 : " + endNavi);
		
		
		StringBuilder sb = new StringBuilder();
		
		
		if(needPrev) {
			sb.append("< ");
		}
		for (int i = startNavi;i <= endNavi;i++) {
			sb.append(i+" ");
		}
		if(needNext) {
			sb.append(">");
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		String naviString = getpageNavi();
		System.out.println(naviString);
	}

}


currentPage는 JSP에서 클라이언트가 클릭한 값이 컨트롤러로 들어와서 정해져야함

-> 매개변수

package kh.backend.controller;

public class Main {

	public static String getpageNavi(int currentPage) {
		
		//총 몇개의 글이 있는가? 한페이지에 몇개의 글을 보여줄 것인가?
		int recordTotalCount = 147; // 총 게시물의 개수
		
		int recordCountPerPage = 10;// 한 페이지에 게시글 몇개를 보여줄 것인가?
		int naviCountPerPage = 10; //한 페이지에 네비게이터 몇개를 보여줄 것인가?
		
		int pageTotalCount = 0; // 전체 페이지의 개수
		
		
		if(recordTotalCount % recordCountPerPage > 0) {
			pageTotalCount = recordTotalCount / recordCountPerPage + 1;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 있으면 한페이지를 더한다.
			// ex) 147개의 글이 있다면 10글 짜리 14페이지 + 7글짜리 1페이지 -> 총 15페이지 필요
		}else {
			pageTotalCount = recordTotalCount / recordCountPerPage;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 없으면 더할 필요없다.
			// ex) 140개의 글이 있다면 10글 짜리 14페이지로 끝.
		}
		
		 //현재 내가 위치한 페이지 번호, 1~pageTotalCount까지의 범위를 가진다.
		if(currentPage < 1) {
			currentPage = 1;
		}else if(currentPage > pageTotalCount) {
			currentPage = pageTotalCount;
		} // 공격자가 currentPage 값을 변조할 경우에 대한 보안 코드
		
		int startNavi = (currentPage - 1) / naviCountPerPage * naviCountPerPage + 1 ;
		int endNavi = startNavi + naviCountPerPage - 1 ;
		
		if(endNavi > pageTotalCount) {
			endNavi = pageTotalCount;
		}

		boolean needPrev = true;
		boolean needNext = true;
		
		if(startNavi == 1) {needPrev = false;}
		if(endNavi == pageTotalCount) {needNext = false;}
		
		System.out.println("총 페이지 개수 : " + pageTotalCount);
		System.out.println("현재 페이지 : " + currentPage);
		System.out.println("네비게이터 시작 : " + startNavi);
		System.out.println("네비게이터 끝 : " + endNavi);
		
		
		StringBuilder sb = new StringBuilder();
		
		
		if(needPrev) {
			sb.append("< ");
		}
		for (int i = startNavi;i <= endNavi;i++) {
			sb.append(i+" ");
		}
		if(needNext) {
			sb.append(">");
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		String naviString = getpageNavi(2);
		System.out.println(naviString);
	}

}

DAO

	public String getpageNavi(int currentPage) throws Exception {
		//총 몇개의 글이 있는가? 한페이지에 몇개의 글을 보여줄 것인가?
		int recordTotalCount = this.getArticleCount(); // 총 게시물의 개수
		int recordCountPerPage = 10;// 한 페이지에 게시글 몇개를 보여줄 것인가?
		int naviCountPerPage = 10; //한 페이지에 네비게이터 몇개를 보여줄 것인가?
		int pageTotalCount = 0; // 전체 페이지의 개수
		if(recordTotalCount % recordCountPerPage > 0) {
			pageTotalCount = recordTotalCount / recordCountPerPage + 1;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 있으면 한페이지를 더한다.
			// ex) 147개의 글이 있다면 10글 짜리 14페이지 + 7글짜리 1페이지 -> 총 15페이지 필요
		}else {
			pageTotalCount = recordTotalCount / recordCountPerPage;
			// 게시글 개수를 페이지당 게시글로 나누어 나머지 값이 없으면 더할 필요없다.
			// ex) 140개의 글이 있다면 10글 짜리 14페이지로 끝.
		}
		//현재 내가 위치한 페이지 번호, 1~pageTotalCount까지의 범위를 가진다.
		if(currentPage < 1) {
			currentPage = 1;
		}else if(currentPage > pageTotalCount) {
			currentPage = pageTotalCount;
		} // 공격자가 currentPage 값을 변조할 경우에 대한 보안 코드
		int startNavi = (currentPage - 1) / Configuration.naviCountPerPage * Configuration.naviCountPerPage + 1 ;
		int endNavi = startNavi + naviCountPerPage - 1 ;
		if(endNavi > pageTotalCount) {
			endNavi = pageTotalCount;
		}
		boolean needPrev = true;
		boolean needNext = true;
		if(startNavi == 1) {needPrev = false;}
		if(endNavi == pageTotalCount) {needNext = false;}

		StringBuilder sb = new StringBuilder(); // 리턴할 스트링 조합
		if(needPrev) {
			sb.append("<li><a href='toBoard.boa?cpage="+(startNavi-1)+"'><</a></li>");
		}
		for (int i = startNavi;i <= endNavi;i++) {
			sb.append("<li><a href='toBoard.boa?cpage="+i+"'>"+i+"</a></li>");
		}
		if(needNext) {
			sb.append("<li><a href='toBoard.boa?cpage="+(endNavi+1)+"'>></a></li>");
		}
		return sb.toString();
	}
	public int getArticleCount() throws Exception{
		String sql = "select count(*) from board";
		try(Connection con = this.getConnection();	
				PreparedStatement pstat = con.prepareStatement(sql);
				ResultSet rs = pstat.executeQuery();){
			rs.next(); // 안쓰면 헤더를 가르키는 상태
			return rs.getInt(1);
		}
	}

String 상수값을 하나의 클래스로 묶어둘것

package kh.member.statics;

public class Configuration {
public static int naviConfiguration =10;
public static int naviCountPerPage =10;
public static int recordCountPerpage =10;
}