본문 바로가기

DB

0913 JSP - 자원해제 메서드-closeDB(), 페이징 처리 (1)

728x90
반응형
boardDAO.java
//자원해제 메서드-closeDB()
public void closeDB() {
	System.out.println("DAO : 디비연결자원해제");
try {
		if(rs!=null) rs.close();
		if(pstmt!=null) pstmt.close();
		if(con!=null) con.close();
	} catch (SQLException e) {
		e.printStackTrace();
	} 
}
//자원해제 메서드-closeDB()

(기본적으로 rs는 null임. 하지만 sql 쿼리를 실행했을 때, null 이 아니게 된다.)

rs, pstmt, con이 not null이라면, 자원 해제를 해라. 

 

객체를 쓰고 있을 수도 있으므로, 그냥 끄지 않고 확인 후 종료시키는 작업.

 

 

Finally 예외 처리

* 예외 : 예상하지 못한 상황 (비 정상적 종료)  에러와는 다름. 

 => 실행 후 확인 가능 (문제가 없다는 걸 전제 하에..) -> 메모리 관련 오류가 많음 

 

* 예외 처리 : 발생한 예외 때문에 프로그램을 종료하지 못함.

예외는 예외대로 처리하고 프로그램은 정상 실행하도록 처리

try {
        예외가 발생할지도 모르는 코드 작성 
} catch(Exception e){
        예외 발생 시 처리 구문 작성 (출력)
} finally {
       예외 발생 여부와 상관없이 무조건 한번 실행하는 구문 
}

 

 

1) throws 

예외 직접 처리 x , 메서드를 호출하는 대상에게 위임 

 

2) try-catch 

예외를 직접 처리하는 구문 

 

 

 

Try with 구문 

https://hianna.tistory.com/546

 

[Java] Try with resources 로 자원 반납하기

Java 7 버전 이전에는 다 사용하고 난 자원(resource)을 반납하기 위해서 try-catch-finally 구문을 사용했었습니다. Java 7버전 이후에 추가된 try with resources 기능은 try 구문에 리소스를 선언하고, 리소스..

hianna.tistory.com

 

-- limit 시작행-1,개수 
use jspdb;
select * from itwill_board limit 0,1;
select * from itwill_board limit 0,5;
select * from itwill board limit 5,5;
-- re_ref 내림차순 정렬, re_seq 오름차순 
select * from itwill_board order by re_ref desc,re_seq asc;

-- 최신 글 10개만 조회 
select * from itwill_board order by re_ref desc,re_seq asc limit 0,10;

 

 

 

저장된 전체 글의 개수 계산 

 

boardDAO 

 

// 전체 글의 개수 - getBoardCount()
	public int getBoardCount() {
		int cnt = 0;
		
		// 1.2. 디비연결 
		try {
			con = getConnection();
			// 3. sql 작성 & pstmt 객체 
			sql = "select count(*) from itwill_board";
			pstmt = con.prepareStatement(sql);
			
			// 4. sql 실행
			rs = pstmt.executeQuery();
			
			// 5. 데이터 처리
			if(rs.next()) {
				//cnt = rs.getInt("count(*)");
				cnt = rs.getInt(1);
			}
            System.out.println(" DAO : 전체 글의 개수 " + cnt + "개 ");
            
		} catch (Exception e) {

			e.printStackTrace();
		}
		
		return cnt;
	}
	
	// 전체 글의 개수 - getBoardCount()
} //class

 

 

 

BoardList 

저장된 전체 글의 개수 계산 

	int count = dao.getBoardCount();
 	System.out.println(" 글 개수 : " + count + "개 ");

페이징 처리 

 

한 페이지에 보여줄 글의 개수 

 

 

 

 현 페이지가 몇 페이지 인지 확인 

String pageNum = request.getParameter("pageNum");
if(pageNum == null){
   pageNum ="1";
 }

 

 

 

 

시작행 번호 계산하기 1번 -> 11번 -> 21번 -> 31번 -> 41번 ........ 

  int currentPage = Integer.parseInt(pageNum);
  int startRow = (currentPage-1)*pageSize + 1;

 

 

끝 행 번호 계산하기 10 20 30 40 ... 

 int endRow = currentPage * pageSize;

 

 

메서드 오버로딩 

 

boardDAO

 

하나 더 복사해서 넣어준다. 

// 글 정보 가져오기 - getBoardList(int startRow, int pageSize)
	public ArrayList getBoardList(int startRow, int pageSize) {
		System.out.println("DAO : getBoardList() 호출");
		// 글정보를 모두 저장하는 배열 만들기
		ArrayList boardList = new ArrayList();

		// 1.2. 디비 연결
		try {
			con = getConnection();
			// 3. sql 작성(select) & pstmt 객체
			sql = "select * from itwill_board order by re_ref desc,re_seq asc limit ?,?";
			pstmt = con.prepareStatement(sql);

			// ????
			pstmt.setInt(1, startRow - 1); // 시작행 -1
			pstmt.setInt(2, pageSize);// 개수

			// 4. sql 실행
			rs = pstmt.executeQuery();

			// 5. 데이터 처리(DB->DTO에 저장->list에 전달 & 저장)
			while (rs.next()) {
				BoardDTO dto = new BoardDTO();
				dto.setBno(rs.getInt("bno"));
				dto.setContent(rs.getString("content"));
				dto.setDate(rs.getDate("date"));
				dto.setFile(rs.getString("file"));
				dto.setName(rs.getString("name"));
				dto.setPass(rs.getString("pass"));
				dto.setRe_lev(rs.getInt("re_lev"));
				dto.setRe_ref(rs.getInt("re_ref"));
				dto.setRe_seq(rs.getInt("re_seq"));
				dto.setReadcount(rs.getInt("readcount"));
				dto.setSubject(rs.getString("subject"));
				dto.setIp(rs.getString("ip"));

				// DTO -> List
				boardList.add(dto);

			} // while
			System.out.println("DAO : 게시판 목록 저장 완료!");

		} catch (Exception e) {

			e.printStackTrace();
		} finally {
			closeDB();

			return boardList;

		}

		// 글 정보 가져오기 - getBoardList()
	}

 

 

boardList

게시판 정보를 가져오는 메서드 

	ArrayList boardList = dao.getBoardList(startRow, pageSize);

 

2페이지 출력 하기 

페이지 주소에 ?pageNum = 1, 2 넣어주기 

 

?pageNum = 1

?pageNum = 2

 

 

 

//http://localhost:8088/JSP/board/boardList.jsp?pageNum=2

 주석을 넣어주고, ctrl 키 누르면 링크가 걸림 

 

 주의! 서버가 켜져 있어야함 

 

 

 

 

 

boardList

과일박스랑 같은 로직.,.

 

if(count != 0) { //글이 있을 때 
		// 총 페이지 = 글 개수 (총량) / 페이지 당 출력
        
        }

55/10 = 5 (int 이기 때문에) 
 => 만약 나머지가 있을 때 페이지 1개 추가 


 

전체 페이지 수 

if(count != 0) { //글이 있을 때 
	// 총 페이지 = 글 개수 (총량) / 페이지 당 출력 
	// => 만약 나머지가 있을 때 페이지 1개 추가 
	
	// 전체 페이지 수 
	int pageCount = (count/pageSize) + (count%pageSize==0? 0:1);

 

 

한 화면에 보여줄 페이지 수 & 페이지 시작, 끝 번호 구하기 

if(count != 0) { //글이 있을 때 
		// 총 페이지 = 글 개수 (총량) / 페이지 당 출력 
		// => 만약 나머지가 있을 때 페이지 1개 추가 
		
		// 전체 페이지 수 
		int pageCount = (count/pageSize) + (count%pageSize==0? 0:1);
		
		// 한 화면에 보여줄 페이지 수
		int pageBlock = 10;
		
		// 페이지 블럭의 시작 번호 1~10 => 1 , 11~20 => 11 , 21~30 => 21
		int startPage = ((currentPage-1)/pageBlock)*pageBlock+1;
		
		// 페이지 블럭의 끝번호 
		int endPage = startPage + pageBlock -1;
        
        // 끝번호가 계산한 것 보다 작을 때
		if(endPage > pageCount){
			endPage = pageCount;
			
		}
	}

 

 [이전] 숫자 (페이지 링크) 1,2,3,....[다음]

 

 

 

[페이지 링크]

for(int i=startPage;i<=endPage;i++){
	%>
	<a href ="boardList.jsp?pageNum=<%=i%>"><%=i %></a>
	<% 
	}

pageBlock 이랑, pageNum 이랑 줄여보고, 실습해보기.

 

 

 

[이전] 

if(startPage > pageBlock){
			%>
			<a href ="boardList.jsp?pageNum=<%=startPage-pageBlock %>">[이전]</a>
			<%
		}
				
		// 숫자 (페이지 링크) 1,2,3,....
		for(int i=startPage;i<=endPage;i++){
			%>
			<a href ="boardList.jsp?pageNum=<%=i%>"><%=i %></a>
	<%
	}

 

 

[다음] 

	if (endPage < pageCount) {
%>

	<a href="boardList.jsp?pageNum=<%=startPage + pageBlock%>">[다음]</a>
<%
	}
	}

 

 

글 확인하기

 

<td><%=dto.getSubject() %></td>

아래와 같이 수정.

<td>
<a href = "boardContent.jsp"><%=dto.getSubject() %></a>
</td>

 

 

boardContent

게시판 글 정보를 가져와서 출력해야하는데, 어떤 글을 선택했는지 알수있게 해야함!

선택한 글 번호를 가져와야한다! 

 

+ 글 읽음 처리 - 조회수 1 증가 동작 

728x90
반응형

'DB' 카테고리의 다른 글

0920 DB - 형식문자  (1) 2022.09.20
0913 DB - 형 변환 함수  (2) 2022.09.13
0907 DB - 숫자, 날짜 함수  (0) 2022.09.07
0831 DB - 단일행 함수  (0) 2022.08.31
0830 DB - 오라클 데이터베이스 접속, 함수  (0) 2022.08.30