Back End/JSP & Servlet

JSP 게시판 만들기 - 13강_01 게시판 글 수정

yuns94 2022. 2. 23. 10:57

이전 글에 이어 이번에는 게시판 글에 대해 수정과 삭제하는 기능을 구현해보자

BbsDAO 클래스로 이동

[소스코드 1]

package bbs;

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

public class BbsDAO {

	private Connection conn;
	private ResultSet rs;
	
	
	//기본 생성자
	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS";
			String dbID = "root";
			String dbPassword = "1004";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) { // 트라이 켓치 예외처리하고 오류가 무엇인지 알수있게한다.
			e.printStackTrace();
		}
	}
	
	// 현재 시간을 가져오는 함수, 게시판의 글을 작성할  현재 서버의 시간을 넣어주는 역할을 한다.
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
				rs = pstmt.executeQuery();
				if (rs.next()) {
					return rs.getString(1);
				}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	// 게시글 번호는 하나씩 늘어나므로 마지막에 쓰인 글을 가져와서 +1을 하면 다음 번호가 된다.
	public int getNext() { 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
				PreparedStatement pstmt = conn.prepareStatement(SQL);
				rs = pstmt.executeQuery();
				if (rs.next()) {
					return rs.getInt(1) + 1;
				}
				return 1; // 첫 번째 게시물인 경우
		} catch (Exception e) {
				e.printStackTrace();
		}
		return -1; // 데이터베이스 오류
	}
	
	// 실제로 글을 작성하는 함수
	public int write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
				PreparedStatement pstmt = conn.prepareStatement(SQL);
				pstmt.setInt(1, getNext());
				pstmt.setString(2, bbsTitle);
				pstmt.setString(3, userID);
				pstmt.setString(4, getDate());
				pstmt.setString(5, bbsContent);
				pstmt.setInt(6, 1 ); //글의 유효번호
				return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류
	}
	
	// 게시글 리스트 메소드 
	public ArrayList<Bbs> getlist(int pageNumber) { // 현재 페이지의 게스글 목록을 리스트 형태로 받아옴.
		// sql문 : 모든 게시글을 조회한다.현재 유효번호 존재하고 새롭게 작성될 게시글 번호보다 작은 모든 게시글 번호를 내림차순 정렬로 조회한다. 
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
        
        
        ArrayList<Bbs> list = new ArrayList<Bbs>();
        try {
            PreparedStatement pstmt = conn.prepareStatement(SQL);
            
            //만약 현재 글이 5개라면 getNext()=6,1페이지이기 때문에 결과값은 6이 나온다.
            //6보다 작은 5개의 게시글이 출력
            pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
            rs = pstmt.executeQuery();
            while (rs.next()) {  
           // while(rs.next()) 결과값이 존재하는 동안 각각의 요소를 담아 하나의 리스트를 완성하여 'getList'로 'return" 한다.
                Bbs bbs = new Bbs();
                bbs.setBbsID(rs.getInt(1));
                bbs.setBbsTitle(rs.getString(2));
                bbs.setUserID(rs.getString(3));
                bbs.setBbsDate(rs.getString(4));
                bbs.setBbsContent(rs.getString(5));
                bbs.setBbsAvailable(rs.getInt(6));
                list.add(bbs);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
	}
	// 페이징 처리 메소
	public boolean nextPage(int pageNumber) {
        String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
        try {
            PreparedStatement pstmt = conn.prepareStatement(SQL);
            pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
            rs = pstmt.executeQuery();
            if (rs.next()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
}

	public Bbs getBbs(int bbsID) {
		String SQL = "SELECT * FROM BBS WHERE bbsID = ?";
        try {
            PreparedStatement pstmt = conn.prepareStatement(SQL);
            pstmt.setInt(1, bbsID);
            rs = pstmt.executeQuery();
            if (rs.next()) {
            	Bbs bbs = new Bbs();
                bbs.setBbsID(rs.getInt(1));
                bbs.setBbsTitle(rs.getString(2));
                bbs.setUserID(rs.getString(3));
                bbs.setBbsDate(rs.getString(4));
                bbs.setBbsContent(rs.getString(5));
                bbs.setBbsAvailable(rs.getInt(6));
                return bbs;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
		
	}
	// 글 수정 하는 함수
	public int update(int bbsID, String bbsTitle, String bbsContent) {
		String SQL = "UPDATE BBS SET bbsTitle = ?, bbsContent = ? WHERE bbsID = ? ";
		try {
				PreparedStatement pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1, bbsTitle);
				pstmt.setString(2, bbsContent);
				pstmt.setInt(3, bbsID);
				return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류
	}
	//게시판 글 삭제 
	public int delete(int bbsID) { 
		String SQL = "UPDATE BBS SET bbsAvailable = 0 WHERE bbsID = ? ";
		try {
				PreparedStatement pstmt = conn.prepareStatement(SQL);
				pstmt.setInt(1, bbsID);
				return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return -1; // 데이터베이스 오류
	}
}

update 함수를 만들어 준다.

특정한 번호에 제목과 내용을 받아 수정해주는 것이다.

 

다음으로 update.jsp로 넘어가겠다.

[소스코드 2]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="bbs.Bbs" %>
<%@ page import="bbs.BbsDAO" %>
<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		String userID = null;
		if (session.getAttribute("userID") != null) {
			userID = (String) session.getAttribute("userID");
		}
		
		// 로그인이 안되어있을때 로그인페이지로 이동한다.
		if (userID == null) { 
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('로그인을 하세요.')");
			script.println("location.href = 'login.jsp'");
			script.println("</script>");
		}
		// 글에 번호가 들어오지 않았다면 
		int bbsID = 0;
		if (request.getParameter("bbsID") != null) {
			bbsID = Integer.parseInt(request.getParameter("bbsID"));
		}
		// 유효하지 않은 글입니다 라고 표시가 뜸 
		if (bbsID == 0) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('유효하지 않은 글 입니다.')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
		}
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		if (!userID.equals(bbs.getUserID())) { // 글을 작성한 사람과 세션에 있는걸 비교해 동일하지 않으면
 
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('권한이 없습니다..')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
		}
		
	%>
	<nav class="navbar navbar-default">  <!--  네게이션 -->
		<div class="navbar-header">
			<!--  네비게이션 상단 박스 영역 -->
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<!--  이 3줄 버튼을 화면이 좁아지면 우측에 나타난다. -->
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<!--  상단 바에 제목이 나타나고 클릭하면 main 페이지로 이동한다. -->
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		
		<!--  게시판 제목 이름 옆에 나타나는 메뉴영 -->
		<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a></li>
				<li class="active"><a href="bbs.jsp">게시판</a></li>
			</ul>
			
			
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle"
						data-toggle="dropdown" role="button" aria-haspopup="true"
						aria-expanded="false">회원관리<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul>
				</li>
			</ul>
		</div>
	</nav>
	<!--  네비게이션 영역 끝  -->
	
	<!--  게시글 수정 양식 영역 시작 -->
	<div class="container">
		<div class="row">
			<form method="post" action="updateAction.jsp?bbsID=<%= bbsID %>">
				<table class="table table-striped" style="text-align: center; border: 1px solid #dddddd">
					<thead>
						<tr>
							<th colspan="2" style="background-color: #eeeeee; text-align: center;">게시판 글수정</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>
								<input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50" value="<%= bbs.getBbsTitle() %>">
							</td>
						</tr>
						<tr>
							<td>
								<textarea class="form-control" placeholder="글 내용"  name="bbsContent" maxlength="2048" style="height: 350px;"> <%= bbs.getBbsContent() %>"></textarea>
							</td>
						</tr>
					</tbody>
				</table>
				<input type="submit" class="btn btn-primary pull-right" value="글수정">
			</form>
		</div>
	</div>
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>

bbs.Bbs 와 bbs.BbsDAO를 추가해준다.

 

만약에 userID가 null값이라면 로그인을 안했다는 거니 로그인 하라고 한다.

bbsID를 0을 넣어주고 

bbsID를 파라미터로 받아와 null이 아니라면 int타입으로 변형해 bbsID에 넣어준다.

 

만약에 bbsID가 들어오지 않았다면 유효하지 않는 글이라고 나타낸다.

세션에 있는 아이디 값과 이 글을 작성한 사람의 값을 비교해 동일하다면 수정이 가능하지만 같지 않다면 권한이 없다고

나타낸다.

 

[소스코드 3]

update.jsp

 

글 수정하기에 알맞게 코드를 수정한다.

'수정하기' 버튼을 눌렀을 때 이전의 제목과 내용을 불러오도록 한다.

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="bbs.Bbs" %>
<%@ page import="bbs.BbsDAO" %>
<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%
		String userID = null;
		if (session.getAttribute("userID") != null) {
			userID = (String) session.getAttribute("userID");
		}
		
		// 로그인이 안되어있을때 로그인페이지로 이동한다.
		if (userID == null) { 
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('로그인을 하세요.')");
			script.println("location.href = 'login.jsp'");
			script.println("</script>");
		}
		// 글에 번호가 들어오지 않았다면 
		int bbsID = 0;
		if (request.getParameter("bbsID") != null) {
			bbsID = Integer.parseInt(request.getParameter("bbsID"));
		}
		// 유효하지 않은 글입니다 라고 표시가 뜸 
		if (bbsID == 0) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('유효하지 않은 글 입니다.')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
		}
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		if (!userID.equals(bbs.getUserID())) { // 글을 작성한 사람과 세션에 있는걸 비교해 동일하지 않으면
 
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('권한이 없습니다..')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
		}
		
	%>
	<nav class="navbar navbar-default">  <!--  네게이션 -->
		<div class="navbar-header">
			<!--  네비게이션 상단 박스 영역 -->
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<!--  이 3줄 버튼을 화면이 좁아지면 우측에 나타난다. -->
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<!--  상단 바에 제목이 나타나고 클릭하면 main 페이지로 이동한다. -->
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		
		<!--  게시판 제목 이름 옆에 나타나는 메뉴영 -->
		<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a></li>
				<li class="active"><a href="bbs.jsp">게시판</a></li>
			</ul>
			
			
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle"
						data-toggle="dropdown" role="button" aria-haspopup="true"
						aria-expanded="false">회원관리<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul>
				</li>
			</ul>
		</div>
	</nav>
	<!--  네비게이션 영역 끝  -->
	
	<!--  게시글 수정 양식 영역 시작 -->
	<div class="container">
		<div class="row">
			<form method="post" action="updateAction.jsp?bbsID=<%= bbsID %>">
				<table class="table table-striped" style="text-align: center; border: 1px solid #dddddd">
					<thead>
						<tr>
							<th colspan="2" style="background-color: #eeeeee; text-align: center;">게시판 글수정</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>
								<input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50" value="<%= bbs.getBbsTitle() %>">
							</td>
						</tr>
						<tr>
							<td>
								<textarea class="form-control" placeholder="글 내용"  name="bbsContent" maxlength="2048" style="height: 350px;"> <%= bbs.getBbsContent() %>"></textarea>
							</td>
						</tr>
					</tbody>
				</table>
				<input type="submit" class="btn btn-primary pull-right" value="글수정">
			</form>
		</div>
	</div>
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>

 

# 글 수정 화면 테스트

 

[실행화면 01]

 

'수정' 버튼을 클릭한다.

 

[실행화면 02]

화면이 바뀌고 글 제목과 글 내용에 기존 게시글의 내용을 잘 전달받고 아래 '수정하기'버튼으로 바뀌어 있으면 정상적으로

게시글을 수정하는 화면이 작동하는것이다.

 

 

 

updateAction.jsp

실제 글 수정하는 로직을 처리해줄 페이지를 하나 만든다.

 

writeAction.jsp 를 복사해 -> updateAction.jsp 페이지를 생성한다.

 

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

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<%	
		//현재 세션 상태를 체크한다.
		String userID = null;
		if (session.getAttribute("userID") != null) {
			userID = (String) session.getAttribute("userID");
		}
		// 로그인을 한 사람만 글을 쓸 수 있도록 코드를 수정한다.
		if(userID == null) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('로그인을 하세요.')");
			script.println("location.href = 'login.jsp'");
			script.println("</script>");
		} 
		// 글에 번호가 들어오지 않았다면 
		int bbsID = 0;
		if (request.getParameter("bbsID") != null) {
			bbsID = Integer.parseInt(request.getParameter("bbsID"));
		}
		// 유효하지 않은 글입니다 라고 표시가 뜸 
		if (bbsID == 0) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('유효하지 않은 글 입니다.')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
		}
		
		// 해당 'bbsID'에 대한 게시글을 가져온 다음 세션을 통해 작성자 본인이 맞는지 체한
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		if (!userID.equals(bbs.getUserID())) {  
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('권한이 없습니다..')");
				script.println("location.href = 'bbs.jsp'");
				script.println("</script>");
		} else {
			// 입력이 안 됐거나 빈 값이 있는지 체크한다.
			if (request.getParameter("bbsTitle") == null || request.getParameter("bbsContent") == null
					|| request.getParameter("bbsTitle").equals("") || request.getParameter("bbsContent").equals("bbsContent")) {
					PrintWriter script = response.getWriter();
					script.println("<script>");
					script.println("alert('입력이 안 된 사항이 있습니다.')");
					script.println("history.back()");
					script.println("</script");
				} else {
					// 정상적으로 입력이 되었다면 글 수정 로직을 수행한다.
					BbsDAO bbsDAO = new BbsDAO();
					int result = bbsDAO.update(bbsID, request.getParameter("bbsTitle"), request.getParameter("bbsContent"));
					if (result == -1) {
						PrintWriter script = response.getWriter();
						script.println("<script>");
						script.println("alert('글 수정 실패했습니다.')");
						script.println("history.back()");
						script.println("</script>");
					
						// 글 수정이 정상적으로 실행되면 알림창을 띄우고 게시판 메인으로 이동한다.
					}
					else {
						PrintWriter script = response.getWriter();
						script.println("<script>");
						script.println("location.href = 'bbs.jsp'");
						script.println("</script>");
					}
				}
		}
	%>
</body>
</html>

 

- 페이지 설정 영역에서 기존 자바빈즈는 다 지워주고 필요한 것만 import 해준다.

- 게시글 번호인 'bbsID' 를 전달받아 캐스팅 하는 코드와 해당 게시글을 쓴 사람이 작성자 본인이 맞는지

체크하는 코드를 추가하고 입력이 되지 않았거나 빈 값이 있을 때 처리하는 코드까지 추가해준다.

 

 

# 글 수정하기 기능 테스트

 

[실행화면 03]

하나의 게시글을 '수정' 버튼을 눌러 내용을 고친 후 '수정하기' 버튼을 눌러준다.

 

[실행화면 04]

수정한 제목이 정상적으로 나오는 것을 확인할 수 있다.

 

https://www.youtube.com/watch?v=W9NLm_RNMvI&list=PLRx0vPvlEmdAZv_okJzox5wj2gG_fNh_6&index=13