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 증가 동작
'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 |