-
게시물Paging+페이지블럭(jsp버전),DAOJAVA 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번호() %>. <a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a> <%= 수집된게시물.get작성일().toString() %> <%= 수집된게시물.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번호() %>. <a href="상세보기.jsp?no=<%= 수집된게시물.get번호() %>"><%= 수집된게시물.get제목() %></a> <%= 수집된게시물.get작성일().toString() %> <%= 수집된게시물.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