• DBCP 방식 사용,
  • 액션태그 사용 (useBean, setProperty)
  • DTO, DAO 클래스
  • 페이징 처리 (inline view)

 

 

프로그램 구조

 

Java Resources >
src > board
DTO 클래스 BoardDataDTO.java  
DAO 클래스 BoardDBBean.java  
WebContent > board board writeForm.jsp  
writePro.jsp  
list.jsp  
content.jsp  
updateForm.jsp  
updatePro.jsp  
deleteFrom.jsp  
deletePro.jsp  
META-INF context.xml 커넥션 풀 환경설정 파일
WEB-INF > lib ojdbc6.jar  
  web.xml 프로젝트 환경설정 파일

 

 

 

 

 

1. wirteform 수정

 

이전에 생성해둔 게시판폼인 writeForm 파일에서 submit 실행시 넘어갈 페이지인

form 태그의 action값을 writePro.jsp로 수정했다.

 

 

 

 

 

2. writePro.jsp 생성

 

한글 값이 잘 넘어올 수 있도록 인코딩 설정을 제일 먼저 페이지 태그 하단에 하고,

usebean 액션 태그로 DTO 객체를 생성 (heap 메모리에 프로퍼티가 저장될 수 있는 공간을 생성), 

setProperty로 private 프로퍼티에 접근 가능하도록 설정한다.

property는 전체 프로퍼티값을 가져올 수 있는 *, name값은 usebean 액션 태그에서 설정한 이름인 board

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>

<jsp:useBean id="board" class="board.BoardDataBean"/>
<jsp:setProperty property="*" name="board"/>

 

 

 

 

3. IP

 

글을 작성한 사용자의 IP 주소를 구해오는 메소드를 setProperty 하단에 추가한다.

 

<%
	String ip = request.getRemoteAddr();
	board.setIp(ip);
%>

 

 

그리고 같은 스크립틀릿 태그 안에 insert SQL문의 실행 결과에 따라 값을 전달받는

조건문을 추가한다.

insert SQL 문이 잘 실행되면 1을 result 변수에 돌려받는데,

그러면 "글 작성 성공"이라는 메시지를 출력하고, 그렇지 못하면 "글 작성 실패" 메시지가 나온다.

아래 캡쳐에서 int result 선언 코드에 에러가 발생한 이유는 DAO에 아직 insert 메소드를 작성하지 않았기 때문이다.

 

 

 

 

4. DAO에 Insert 메소드 생성

형식은 회원관리에서 만들었던 메소드들과 똑같다.

 

	public int insert(BoardDataBean board) {
		int result = 0;
		Connection con = null;
		PreparedStatement pstmt = null;
		
		try {
			con = getConnection(); // DB연결
			
			String sql = "insert into board0 ";
					sql += " values(board0_seq.nextval,?,?,?,?,sysdate,?,?,?)";
					
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, board.getWriter());
			pstmt.setString(2, board.getEmail());
			pstmt.setString(3, board.getSubject());
			pstmt.setString(4, board.getPasswd());
			pstmt.setInt(5, board.getReadcount());	// 또는 getReadcount대신 0
			pstmt.setString(6, board.getContent());
			pstmt.setString(7, board.getIp());
			
			result = pstmt.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null) try { pstmt.close();} catch (Exception e) {}
			if (con != null) try { con.close();} catch (Exception e) {}
		}
		
		return result;
	}

 

 

 

5. 인라인 뷰 생성을 위한 임의 데이터 생성

이제 게시판에 글을 작성하면 테이블에 저장이 된다.

인라인 뷰 생성 실습을 위해 임의로 데이터를 100개 이상 집어넣었다.

 

 

 

 

6. list.jsp

스크립틀릿 태그를 열고

 

 

 

1) 변수를 선언, 한 화면에 출력할 개수를 지정한다.

페이지 값을 request 객체로 가져와 pageNum 변수에 저장하는데

만약 pageNum의 값이 없다면 페이지 번호를 "1" 로 지정한다.

 

	int page_size = 10;

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

 

 

 

 

 

2) 현재 페이지 번호

 

 

startRow : 각 page에 출력할 데이터 시작번호
endRow : 각 page에 출력할 데이터 끝번호

 

page = 1 : startRow=1, endRow=10
page = 2 : startRow=11, endRow=20
page = 3 : startRow=21, endRow=30

 

	int currentPage = Integer.parseInt(pageNum);

	int startRow = (currentPage - 1) * page_size + 1;
	int endRow = currentPage * page_size;

 

 

 

 

 

 

3) 총 데이터 개수

 

	int count = 0;
	
	BoardDBBean dao = BoardDBBean.getInstance();
	count = dao.getCount();

 

 

 

 

getCount 메소드를 생성한다.

 

	public int getCount() {
		int result = 0;
			
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			con = getConnection();
			
			String sql = "select count(*) from board0";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
//				result = rs.getInt(1);
				result = rs.getInt("count(*)");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null) try { rs.close();} catch (Exception e) {}
			if (pstmt != null) try { pstmt.close();} catch (Exception e) {}
			if (con != null) try { con.close();} catch (Exception e) {}
		}
		return result;
	}

 

 

 

 

list.jsp를 실행해보면 등록된 데이터 개수가 나온다.

브라우저에는 출력되지 않지만 콘솔창에 제대로 출력된다면 상관없다.

게시판 글을 대량으로 임의 등록했기 때문에 많은 양의 데이터 개수가 나온다.

 

 

 

 

 

 

7. 게시판 목록 출력

 

list.jsp에 다음 코드를 작성한다.

DB의 데이터를 리스트에 저장, 차례대로 불러오기 위한 코드이다.

 

	List<BoardDataBean> list = null;
	if(count > 0 ) {
		//게시판 목록
		list = dao.getList(startRow, endRow);
	}
	System.out.println("list: "+ list);
	
	if ( count == 0 ) {
%>
	작성된 글이 없습니다.
<% } else { %>
	<br><br>
	<right> 글 개수: <%= count %></right>
	<table border=1 width=700 align=center>
		<caption> 게 시 판 목 록 </caption>
		<tr>
			<th>글번호</th>
			<th>글제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회수</th>
			<th>ip주소</th>
		</tr>
<%
	// 각 페이지에 출력될 시작번호
	int number = count - (currentPage-1) * page_size;

	SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			
	for (int i=0; i<list.size(); i++) {
		BoardDataBean board = list.get(i);
%>
	<tr>
		<td><%= number-- %></td>
		<td><%= board.getSubject() %></td>
		<td><%= board.getWriter() %></td>
		<td><%= sd.format(board.getReg_date()) %></td>
		<td><%= board.getReadcount() %></td>
		<td><%= board.getIp() %></td>
	</tr>
<% } //for end	
%>
	</table>
	<br><br><br>
	<a href="writeForm.jsp">글작성</a>
<% } %>

 

 

아직은 글 목록만 나타나고

링크를 누르면 글 내용을 볼 수 있도록 이동하거나

게시판 페이지를 이동할 수 있도록 출력하지는 못했다.

 

 

 

 

 

 

8. 페이지 출력

 

다음과 같이 페이지 처리를 할 계획이다.

<<, >> 는 10개 페이지 단위로 이동할 예정이다.

 

 

 

 

 

1) 총 페이지 수

 

		int pageCount = count / page_size + (( count%page_size == 0 ) ? 0 : 1);

 

한 페이지에 출력되는 글 개수는 10이다.

10의 배수가 아닐 때, 1 페이지를 증가 시킨다.

 

 

 

 

 

2)  블럭, 시작 페이지, 끝 페이지

 

1개 블럭의 크기 : 10개의 페이지로 구성되어 있다.

startPage : 각 블럭의 시작 페이지 번호. 1, 11, 21...

endPage : 각 블럭의 끝 페이지 번호. 10, 20, 30...

 


		int block = 10;
		int startPage = ((currentPage - 1) / 10) * 10 + 1;
		int endPage = startPage + block - 1;

 

 

 

 

 

3)  10개의 페이지를 이동할 수 있는 링크 출력

 

		for (int i=startPage; i<=endPage; i++) {
			if (i == currentPage ) {	// 현재 페이지 %>
				[<%= i %>]
<%			} else { %>
				<a href = "list.jsp?page=<%= i %>">[<%= i %>]</a>
<%			}
		} // for end 
		
	} 
%>

 

 

1부터 10까지는 잘 출력된다.

 

 

 

 

아직은 블럭을 이동할 수 없지만 주소창에 페이지 번호를 적어넣으면 블럭 이동이 가능하니

11부터 20까지 잘 나오는지 확인해본다.

 

 

 

 

 

5) 가장 최신 페이지로 이동 (무조건 1페이지로)

 

		<a href="list.jsp?page=1" style="text-decoration:none"><b> << </b></a>

 

 

6) 가장 마지막 페이지로 이동

 

		<a href="list.jsp?page=<%= pageCount %>" style="text-decoration:none"> >> </a>

 

여기까지 페이지 처리를 하면 한가지 문제가 생긴다.

글이 존재하는 가장 마지막 페이지는 26페이지인데,

아무것도 없는 27, 28, 29, 30 페이지가 같이 출력되는 문제이다.

 

 

 

 

10개 페이지 단위로 루프를 돌리다보니 생긴 문제인데 ( 3)의 for문 )

for문 위쪽에 조건문을 하나 추가한다.

 

endPage가 30이고, pageCount는 26인 상황인데,

이 때, 마지막 페이지와 pageCount가 일치하는 조건문이다.

 

		if(endPage > pageCount) {
			endPage = pageCount;
		}

 

마지막 글이 있는 페이지까지만 출력이 된다.

 

 

 

 

 

 

7) 블럭 단위로 이동할 수 있는 버튼 [이전], [다음] 에 링크를 걸어 출력해본다.

 

		if(startPage > 10) { 
			<a href="list.jsp?page=<%= startPage-10 %>">[이전]</a>
		} 

		if(endPage<pageCount) { 
			<a href="list.jsp?page=<%= startPage+10 %>">[다음]</a>
		}

 

 

 

[이전] 버튼이 필요 없는 첫번째 블럭 (1~10페이지) 에서는 [다음]만 출력된다.

 

 

 

 

[이전]과 [다음]이 모두 필요한 두번째 블럭 (11~20페이지) 에서는 둘 다 출력이 된다.

 

 

 

 

 

[다음]만 필요한 마지막 블럭 (21~26페이지) 에서는 [이전]이 출력되지 않는다.

 

 

 

 

+ Recent posts