ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시물Paging+페이지블럭(jsp버전),DAO
    JAVA 2021. 7. 25. 00:18

    페이지 블럭

    블럭당페이지수 = 10개

    1. 페이지 블럭 1 : 1..10 ------------> 1~10

    1부터 10을 아무거나 눌러도 1~10페이지가 아래에 나와 있어야 함.

    페이지 블럭 2 : 11..20 ------------> 11~20

    페이지 블럭 3 : 21..30 ------------> 21~30

    .....

    1. 입력한 페이지의 페이지블럭을 알아낸다.

    페이지블럭 = (int)((입력한페이지블럭 - 1) / 블럭당페이지수 + 1) + 1;

    -1 : 하지않는다면 1번째 블럭의 마지막페이지인 10의 페이지블럭을 구할 때 몫이 1이 나와 2블럭이 되버린다.

    +1 : 기본적으로 페이지당블럭수가 나누면 몫이 0부터 시작한다.

    2. 그 페이지블럭의 시작페이지번호 알아낸다.

    시작페이지번호 = (페이지블럭 - 1) * 블럭당페이지수 + 1;

    위의 페이지블럭의 식을 조금 손봐야한다.

    페이지블럭이 2블럭이면 시작페이지번호는 11이다.

    '블럭당페이지수 * n블럭' 이면 시작페이지번호일 거 같지만 그러면

    1블럭 -- 10, 2블럭 -- 20 (X)

    (시작이 11, 21도 아님 나중에 +1 해줘야 함)

    1블럭 -- 1, 2블럭 -- 11 , 이렇게 되야한다.

    '블럭당페이지수 * (n블럭 - 1) + 1

    을 해주면 된다.

     

    3. 그 페이지블럭의 마지막페이지번호를 알아낸다.

    마지막페이지번호 = 시작페이지번호 + 블럭당페이지수 - 1;

    >> 게시물목록.jsp

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@page import="java.util.*"%>
    <%@ page import="boardmanage.게시물"%>
    <%@ page import="control.ConnectionInfo" %>
    <%
    	String str페이지 = request.getParameter("page");
    	int 페이지 = (str페이지 == null)? 1 : Integer.valueOf(str페이지);
    
    // 2. 데이터수집
    int 페이지당게시물수 = 10;
    int 시작일련번호 = (페이지-1) * 페이지당게시물수;	//zero-base: 시작을 0으로 본다.
    int 총게시물수 = 0;
    ArrayList<게시물> array게시물 = new ArrayList<게시물>();
    
    try {
    	Class.forName("com.mysql.cj.jdbc.Driver");
    
    	Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName)
    																		,ConnectionInfo.UID , ConnectionInfo.PASSWORD);
    
    	Statement 명령전달자 = DB연결관리자.createStatement();
    
    	System.out.println("연결 성공");
    
    	// 2-1. 총 게시물수 구하기
    		String 총개시물수SQL = "select count(*) as 갯수 from 게시물";
    		ResultSet 수집된갯수표관리자 = 명령전달자.executeQuery(총개시물수SQL);
    		수집된갯수표관리자.next();
    		총게시물수 = 수집된갯수표관리자.getInt("갯수");
    		수집된갯수표관리자.close();
    
    	// 2-2. 페이지당 게시물들 가져오기
    	String 수집SQL = String.format("select 번호,제목,작성일,조회수 from 게시물 order by 작성일 desc limit %d, %d" ,시작일련번호,페이지당게시물수);
    	ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
    	
    		while (수집된표관리자.next()) {
    			
    	int 게시물번호 = 수집된표관리자.getInt("번호");
    	String 제목 = 수집된표관리자.getString("제목");
    	java.sql.Date 작성일 = 수집된표관리자.getDate("작성일");
    	int 조회수 = 수집된표관리자.getInt("조회수");
    	
    	게시물 게시물1 = new 게시물();
    
    	게시물1.set번호(게시물번호);
    	게시물1.set제목(제목);
    	게시물1.set작성일(작성일);
    	게시물1.set조회수(조회수);
    
    	array게시물.add(게시물1);
    		}
    		
    	수집된표관리자.close();
    	DB연결관리자.close();
    } catch (Exception e) {
    	e.printStackTrace();
    }
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<center>
    		<!-- 3. 목록출력 -->
    		<h1>게시물목록</h1>
    		<ul style="list-style: none">
    			<%
    				for(int i = 0; i<array게시물.size(); i++)
    				{
    					게시물 수집된게시물 = array게시물.get(i);
    			%>
    
    			<%-- 3-1. 게시물 1개출력 --%>
    			<li>
    			<%= 수집된게시물.get번호() %>. &nbsp;&nbsp;
    			<a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a>
    			<%= 수집된게시물.get작성일().toString() %>&nbsp;&nbsp; 
    			<%= 수집된게시물.get조회수() %> 
    			</li>
    <%
     	}
     %>
    <br><a href="게시물등록준비.jsp">글쓰기</a><br>
    
    <%-- 3.2 페이지번호들 출력 --%>
    <%
    	int 페이지블럭당페이지수 = 10;
    
    	/* 입력한 페이지의 블럭을 알아내는 식 */
    	int 입력한페이지의블럭 = (int)((페이지 - 1) / 페이지블럭당페이지수) + 1;
    	
    	/* 그 페이지 블럭의 시작페이지번호(시작페이지번호부터 항상 나와있기 때문에) */
    	int 시작페이지번호 = (입력한페이지의블럭 - 1) * 페이지블럭당페이지수 + 1;
    	
    	/* 블럭당 마지막페이지 번호 알아내기(시작페이지에서 9만 더하면 되지만 
    	만약 맨마지막 블럭의 페이지가 블럭당페이지수보다 적을 경우. 전체페이지가 블럭당 마지막페이지번호가 된다. */
    	int 마지막페이지번호 = (int)Math.ceil((float)총게시물수 / 페이지당게시물수);
    	int 블럭당마지막페이지번호 = 시작페이지번호 + 페이지블럭당페이지수 - 1;
    	
    	if(블럭당마지막페이지번호 > 마지막페이지번호){
    		블럭당마지막페이지번호 = 마지막페이지번호;
    	}
    %>
    <!-- 이전출력 -->
    <%if(시작페이지번호 > 1){ %>
    <a href="게시물목록.jsp?page=<%=시작페이지번호 - 1%>"> << </a> 
    <%} %>
    <%
    	for(int 출력페이지번호 = 시작페이지번호; 출력페이지번호 <= 블럭당마지막페이지번호; 출력페이지번호++){
    
    		if(출력페이지번호 == 페이지){
    %>
    
    	<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" ><b>[<%= 출력페이지번호%>]</b></a>
    
    <%
    	}else{
    %>
    
    <a href="게시물목록.jsp?page=<%= 출력페이지번호%>" >[<%= 출력페이지번호%>]</a>
    
    <% 	
    	}
    }
    %>
    <!-- 이후출력 -->
    <%if(블럭당마지막페이지번호 < 마지막페이지번호){ %>
    <a href="게시물목록.jsp?page=<%=블럭당마지막페이지번호 + 1%>"> >> </a> 
    <%} %>
    </ul>
    </center>
    
    </body>
    </html>

    DAO ( Data Access Object)

    데이터 접근 객체 ( 공통 모듈 )

    : 실질적으로 DB에 접근하는 객체 (아주아주 중요. 앞으로도 계속 쓰일 예정)

    Entity 모델

    DB 에서는 MySQL로 보면 Models에서 쓰는 EER모델 같은거?(테이블을 네모칸으로 정리하는 거 )

    Server 에서는 다른 의미이다.

    DB의 테이블 데이터를 DB처리하는 것이 일체 돼있는 어려운 개념이라 요즘은 배우지 않는다. ( 큰 회사에서는 사용한다. )

    >> 게시물DAO.java

     

    import java.sql.*;
    import control.ConnectionInfo;
    
    public class 게시물DAO {
    	public void 저장한다(게시물 새게시물) {
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,ConnectionInfo.DBPORT,ConnectionInfo.DBName)
    																				,ConnectionInfo.UID , ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    			System.out.println("연결 성공");
    			
    			String 삽입SQL = "insert into 게시물(제목,내용) values('" + 새게시물.get제목() + "','" + 새게시물.get내용() + "');";
    			명령전달자.executeUpdate(삽입SQL); // 명령전달자가 보낸다.
    
    			DB연결관리자.close();
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
        
        public ArrayList<게시물> 수집하다(int 페이지, int 페이지당게시물수, RefInteger 총게시물수) {
    
    		int 시작일련번호 = (페이지 - 1) * 페이지당게시물수; // zero-base: 시작을 0으로 본다.
    		ArrayList<게시물> array게시물 = new ArrayList<게시물>();
    
    		try {
    			Class.forName("com.mysql.cj.jdbc.Driver");
    
    			Connection DB연결관리자 = DriverManager
    					.getConnection(
    							String.format("jdbc:mysql://%s:%s/%s?useUnicode=true", ConnectionInfo.DBIP,
    									ConnectionInfo.DBPORT, ConnectionInfo.DBName),
    							ConnectionInfo.UID, ConnectionInfo.PASSWORD);
    
    			Statement 명령전달자 = DB연결관리자.createStatement();
    
    			System.out.println("연결 성공");
    
    			// 2-1. 총 게시물수 구하기
    			String 총개시물수SQL = "select count(*) as 갯수 from 게시물";
    			ResultSet 수집된갯수표관리자 = 명령전달자.executeQuery(총개시물수SQL);
    			수집된갯수표관리자.next();
    			총게시물수.value = 수집된갯수표관리자.getInt("갯수");
    			수집된갯수표관리자.close();
    
    			// 2-2. 페이지당 게시물들 가져오기
    			String 수집SQL = String.format("select 번호,제목,작성일,조회수 from 게시물 order by 작성일 desc limit %d, %d", 시작일련번호,
    					페이지당게시물수);
    			ResultSet 수집된표관리자 = 명령전달자.executeQuery(수집SQL);
    
    			while (수집된표관리자.next()) {
    
    				int 게시물번호 = 수집된표관리자.getInt("번호");
    				String 제목 = 수집된표관리자.getString("제목");
    				java.sql.Date 작성일 = 수집된표관리자.getDate("작성일");
    				int 조회수 = 수집된표관리자.getInt("조회수");
    
    				게시물 게시물1 = new 게시물();
    
    				게시물1.set번호(게시물번호);
    				게시물1.set제목(제목);
    				게시물1.set작성일(작성일);
    				게시물1.set조회수(조회수);
    
    				array게시물.add(게시물1);
    			}
    
    			수집된표관리자.close();
    			DB연결관리자.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
    		return array게시물;
    	}
    
    }

    >> 게시물목록.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@page import="java.util.*"%>
    <%@ page import="boardmanage.*"%>
    <%@ page import="util.*"%>
    <%@ page import="control.ConnectionInfo" %>
    <%
    	String str페이지 = request.getParameter("page");
    	int 페이지 = (str페이지 == null)? 1 : Integer.valueOf(str페이지);
    	int 페이지당게시물수 = 10;
    	
    // 2. 데이터수집
    	게시물DAO dao = new 게시물DAO();
    	RefInteger 총게시물수 = new RefInteger();
    	ArrayList<게시물> array게시물 = dao.수집하다(/*in*/페이지,/*in*/ 페이지당게시물수,/*out*/총게시물수);
    	
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<center>
    		<!-- 3. 목록출력 -->
    		<h1>게시물목록</h1>
    		<ul style="list-style: none">
    			<%
    				for(int i = 0; i<array게시물.size(); i++)
    				{
    					게시물 수집된게시물 = array게시물.get(i);
    			%>
    
    			<%-- 3-1. 게시물 1개출력 --%>
    			<li>
    			<%= 수집된게시물.get번호() %>. &nbsp;&nbsp;
    			<a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a>
    			<%= 수집된게시물.get작성일().toString() %>&nbsp;&nbsp; 
    			<%= 수집된게시물.get조회수() %> 
    			</li>
    <%
     	}
     %>
    <br><a href="게시물등록준비.jsp">글쓰기</a><br>
    
    <%-- 3.2 페이지번호들 출력 --%>
    <%
    	int 페이지블럭당페이지수 = 10;
    	/* 입력한 페이지의 블럭을 알아내는 식 */
    	int 입력한페이지의블럭 = (int)((페이지 - 1) / 페이지블럭당페이지수) + 1;
    	
    	/* 그 페이지 블럭의 시작페이지번호(시작페이지번호부터 항상 나와있기 때문에) */
    	int 시작페이지번호 = (입력한페이지의블럭 - 1) * 페이지블럭당페이지수 + 1;
    	
    	/* 블럭당 마지막페이지 번호 알아내기(시작페이지에서 9만 더하면 되지만 
    	만약 맨마지막 블럭의 페이지가 블럭당페이지수보다 적을 경우. 전체페이지가 블럭당 마지막페이지번호가 된다. */
    	int 마지막페이지번호 = (int)Math.ceil((float)총게시물수.value / 페이지당게시물수);
    	int 블럭당마지막페이지번호 = 시작페이지번호 + 페이지블럭당페이지수 - 1;
    	
    	if(블럭당마지막페이지번호 > 마지막페이지번호){
    		블럭당마지막페이지번호 = 마지막페이지번호;
    	}
    %>
    <!-- 이전출력 -->
    <%if(시작페이지번호 > 1){ %>
    <a href="게시물목록.jsp?page=<%=시작페이지번호 - 1%>"> << </a> 
    <%} %>
    <%
    	for(int 출력페이지번호 = 시작페이지번호; 출력페이지번호 <= 블럭당마지막페이지번호; 출력페이지번호++){
    
    		if(출력페이지번호 == 페이지){
    %>
    
    	<a href="게시물목록.jsp?page=<%= 출력페이지번호%>" ><b>[<%= 출력페이지번호%>]</b></a>
    
    <%
    	}else{
    %>
    
    <a href="게시물목록.jsp?page=<%= 출력페이지번호%>" >[<%= 출력페이지번호%>]</a>
    
    <% 	
    	}
    }
    %>
    <!-- 이후출력 -->
    <%if(블럭당마지막페이지번호 < 마지막페이지번호){ %>
    <a href="게시물목록.jsp?page=<%=블럭당마지막페이지번호 + 1%>"> >> </a> 
    <%} %>
    </ul>
    </center>
    
    </body>
    </html>

    'JAVA' 카테고리의 다른 글

    회원등록.ver2,PreparedStatement(jsp버전)  (0) 2021.07.25
    회원등록(jsp버전)  (0) 2021.07.25
    게시물목록,상세보기,Paging(jsp버전)  (0) 2021.07.25
    게시물목록(jsp버전)  (0) 2021.07.25
    JSP-MySQL,게시물등록(jsp버전)  (0) 2021.07.24

    댓글

Designed by Tistory.