오늘이라도

[Web] 30. 회원 관리 & 게시판 만들기 ⑤ : 게시글 등록, 전체 글 목록 조회, 페이징 본문

취업성공패키지 SW 개발자 교육/Web

[Web] 30. 회원 관리 & 게시판 만들기 ⑤ : 게시글 등록, 전체 글 목록 조회, 페이징

upcake_ 2020. 6. 19. 12:32
반응형

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. 

gif 파일은 클릭해서 보는 것이 정확합니다.


 - 회원 관리 & 게시판 만들기 ⑤ :  게시글 등록, 전체 글 목록 조회, 페이징 -

▲작동 화면

 

package com.board.action;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.board.study.BoardDAO;
import com.board.study.BoardDTO;
import com.commons.action.Action;
import com.commons.action.ActionForward;

public class BoardListAction implements Action {
	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		String id = (String) session.getAttribute("id");
		
		BoardDAO dao = new BoardDAO();
		int listCount = dao.getListCount();	//글의 총 개수
		System.out.println("listCount : " + listCount);
		
		int page = 1;	//시작 페이지 번호
		int limit = 10;	//한 페이지에 표시되는 페이지 개수
		if(request.getParameter("page") != null) {
			page = Integer.parseInt(request.getParameter("page"));
		}
		ArrayList<BoardDTO> list = new ArrayList<>();
		list = dao.getBoardList(page, limit);	//전체 글 목록
		
		int maxPage = (int) ((float)listCount / 10 + 0.95);	//최대 페이지수
		//현재 페이지에 보여줄 시작 페이지 수 (1, 11, 11, 21 ~~)
		int startPage = (((int)((float) page / 10 + 0.9)) - 1) * 10 + 1;
		
		//현재 페이지에 보여줄 마지막 페이지 수(10, 20, 30 ~~)
		int endPage = maxPage;
		if(endPage > startPage + 10 - 1) {
			endPage = startPage + 10 - 1;
		}
		
		request.setAttribute("page", page); 			//현재 페이지 수
		request.setAttribute("maxPage", maxPage);		//최대 페이지 수
		request.setAttribute("startPage", startPage);	//현재 페이지에 표시할 첫 페이지 수
		request.setAttribute("endPage", endPage);		//현재 페이지에 표시할 끝 페이지 수
		request.setAttribute("listCount", listCount);	//글의 개수
		request.setAttribute("list", list);				//전체 글 목록
		
		
		ActionForward forward = new ActionForward();
		//id 세션이 안만들어진 비정상적인 접근의 경우 로그인 화면으로 돌려보낸다
		if(id == null) {
			forward.setPath("memberLogin.me");
			forward.setRedirect(true); //가져갈게 없으므로 sendRedirect
			return forward;
		}
		forward.setPath("board/board_list.jsp");
		forward.setRedirect(false);
		return forward;
	}
}

▲BoardListAction.java

 

package com.board.study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BoardDAO {
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception!!!");
		}
		return conn;
	} //getConn()

	//게시글 등록
	public int boardInsert(BoardDTO dto) {
		conn = getConn();
		String sql = "";
		int b_num = 0;
		int succ = 0;
		try {
			//글 번호를 검색한 후 등록할 글 번호(b_num)를 결정
			sql = "SELECT MAX(board_num) FROM memberBoard";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			if(rs.next()) { //글이 있으면 (글 갯수 + 1)번
				b_num = rs.getInt(1);
				b_num += 1;
			} else { // 글이 없으면 1번
				b_num = 1;
			}
			
			//글 등록
			sql = "INSERT INTO memberBoard VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, sysdate)";
			ps = conn.prepareStatement(sql);
			ps.setInt(1, b_num);
			ps.setString(2, dto.getBoard_id());
			ps.setString(3, dto.getBoard_subject());
			ps.setString(4, dto.getBoard_content());
			ps.setString(5, dto.getBoard_file());
			ps.setInt(6, b_num); //댓글을 쓰기 위한 그룹 번호
			ps.setInt(7, 0); //댓글이 없으니 0
			ps.setInt(8, 0);
			ps.setInt(9, 0);
			succ = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("boardInsert() Exception!!!");
		} finally {
			dbClose();
		}
		return succ;
	} //boardInsert()
	
	//등록된 글의 총 개수
	public int getListCount() {
		conn = getConn();
		String sql = "SELECT COUNT(*) FROM memberBoard";
		//NULL이 들어갈 수 있는 필드도 있으므로 모든 필드를 센 다음에 가장 많이 나온 필드를 기준으로 한다.
		int listCount = 0;
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if(rs.next()) {
				listCount = rs.getInt(1);	//board_num 필드는 NULL값이 들어올 수 없으니 board_num을 가져온다.
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getListCount() Exception!!!");
		} finally {
			dbClose();
		}
		return listCount;
	} //getListCount()
	
	//전체 글 목록 조회(Feat : 페이징 
	public ArrayList<BoardDTO> getBoardList(int page, int limit) {
		conn = getConn();
		String sql = "SELECT * FROM";
		sql += " (SELECT ROWNUM rnum, board_num, board_id,";
		sql	+= " board_subject, board_content, board_file, board_re_ref,";
		sql += " board_re_lev, board_re_seq, board_readcount, board_date";
		sql	+= " FROM (SELECT * FROM memberBoard ORDER BY";
		sql += " board_num DESC, board_re_seq ASC))";
		sql += "WHERE rnum >= ? and rnum <= ?";
		int startRow = (page - 1) * 10 + 1; //읽기 시작할 rownum
		int endRow = startRow + limit - 1;	//읽을 마지막 rownum
		ArrayList<BoardDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, startRow);
			ps.setInt(2, endRow);
			rs = ps.executeQuery();
			
			while(rs.next()) {
				BoardDTO dto = new BoardDTO();
				dto.setBoard_num(rs.getInt("board_num"));
				dto.setBoard_id(rs.getString("board_id"));
				dto.setBoard_subject(rs.getString("board_subject"));
				dto.setBoard_content(rs.getString("board_content"));
				dto.setBoard_file(rs.getString("board_file"));
				dto.setBoard_re_ref(rs.getInt("board_re_ref"));
				dto.setBoard_re_lev(rs.getInt("board_re_lev"));;
				dto.setBoard_readcount(rs.getInt("board_readcount"));
				dto.setBoard_date(rs.getString("board_date"));
				list.add(dto);
				
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getBoardList() Exception!!!");
		} finally {
			dbClose();
		}
		return list;
		
	}

	//DB 종료
		public void dbClose() {
			try {
				if(rs != null) rs.close();
				if(ps != null) ps.close();
				if(conn != null) conn.close();
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("dbClose() Exception!!!");
			}
		} //dbClose()

} //class

▲BoardDAO.java

 

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.board.study.BoardDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.member.study.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String id = (String) session.getAttribute("id"); //JSP는 session이 내장 객체라 바로 사용 가능하다.
MemberDAO dao = new MemberDAO();
String member_pw = dao.getMember_pw(id);
Integer nowPage = (Integer)request.getAttribute("page");
Integer maxPage = (Integer)request.getAttribute("maxPage");
Integer startPage = (Integer) request.getAttribute("startPage");
Integer endPage = (Integer) request.getAttribute("endPage");
Integer listCount = (Integer) request.getAttribute("listCount");
ArrayList<BoardDTO> list = new ArrayList<>();
list = (ArrayList<BoardDTO>)request.getAttribute("list");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>board list JSP</title>
<script type="text/javascript">
function fnModify(id, member_pw) {
	//alert("id : " + id);
	var pw = prompt("비밀번호를 입력하세요","");
	//alert("member_pw : " + member_pw + "\npw : " + pw);
	//member_pw : dto에 저장되어있던 비밀번호
	//pw : 방금 사용자로부터 입력받은 비밀번호
	if(member_pw == pw) { //맞는 비밀번호를 입력하면 URL이 바뀐다
		//alert("비밀번호 일치합니다.")
		location.href = "memberDetailAction.me?member_id=" + id;
	} else {
		alert("비밀번호가 일치하지 않습니다.");
	}
}
</script>
</head>
<body>
<div align="center">
	<h3>[자유 게시판]</h3>
	<table border= "1">
		<tr align="center";>
			<th>번호</th>
			<th width="200">제목</th>
			<th>작성자</th>
			<th>작성일</th>
			<th>조회수</th>
		</tr>
		<%for(int i = 0; i < list.size(); i++) { 
			BoardDTO dto = list.get(i);%>
			<tr align="center">
				<td><%=dto.getBoard_num() %></td>
				<td><a href="boardDeatilAction.bo?board_num=<%=dto.getBoard_num() %>"><%=dto.getBoard_subject() %></a></td>
				<td><%=dto.getBoard_id() %></td>
				<td><%=dto.getBoard_date().substring(0, 10) %></td>
				<td><%=dto.getBoard_readcount() %></td>
							
			</tr>
		<%} %>
	
		<tr align="center">
			<td colspan="5">
				<%if(nowPage <= 1) { %>
					[이전]&nbsp;
				<%} else { %>
					<a href="boardList.bo?page=<%=nowPage - 1 %>">[이전]</a>&nbsp;
				<%} %>
				
				<%for(int i = startPage; i <= endPage; i++) { %>
					<%if(i == nowPage) { %>
						[<%=i %>]&nbsp;
					<%} else { %>
						<a href="boardList.bo?page=<%=i %>">[<%=i %>]</a>&nbsp;
					<%} %>
				<%} %>
				
				<%if(nowPage >= maxPage) { %>
					[다음]&nbsp;
				<%} else { %>
					<a href="boardList.bo?page=<%=nowPage + 1 %>">[다음]</a>&nbsp;
				<%} %>
			</td>
		</tr>
	
		<tr align="center">
			<td colspan="5">
				<%if(id != null && id.equals("admin")) { %>
					<input type="button" value="회원 관리" onclick="location.href='memberListAction.me'" />
				<%} %>
				<input type="button" value="로그아웃" onclick="location.href='memberLogout.me'"/>
				<input type="button" value="글쓰기" onclick="location.href='boardWrite.bo'" />
				<input type="button" value="회원 정보 수정" onclick="fnModify('<%=id%>', '<%=member_pw %>')"/>
			</td>
		</tr>
	</table>
</div>
</body>
</html>

▲board_list.jsp

반응형