[게시판 설계 및 구축 --4] 게시판 글 수정, 글 삭제, 글 검색, 답글 작성 기능 구현
my code archive
article thumbnail
반응형
게시판 글 수정 기능 구현

 

BoardFrontController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
        
        //글 수정 비밀번호 확인 화면 제공
        if(cmdURI.equals("/boardUpdatePassword.bbs")){
            cmd = new BoardUpdatePasswordCmd();
            cmd.execute(request, response);
            viewPage = "boardUpdatePassword.jsp";
        }
         
        // 글 수정 비밀번호 확인 처리
        if(cmdURI.equals("/boardUpdateCheck.bbs")){
            cmd = new BoardUpdateCheckCmd();
            cmd.execute(request, response);
             
            BoardUpdateCheckCmd checkCmd = (BoardUpdateCheckCmd) cmd;
            if(checkCmd.password_check){
                viewPage = "boardUpdateForm.bbs";
            }else{
                viewPage = "boardUpdateError.bbs";
            }
        }
         
        // 글 수정 비밀번호 오류 화면 제공
        if(cmdURI.equals("/boardUpdateError.bbs")){
            viewPage = "boardUpdateError.jsp";
        }
         
     // 글 수정 화면 제공
        if(cmdURI.equals("/boardUpdateForm.bbs")){
            cmd = new BoardUpdateFormCmd();
            cmd.execute(request, response);
            viewPage = "boardUpdateForm.jsp";
        }
         
     // 글 수정 처리
        if(cmdURI.equals("/boardUpdate.bbs")){
            cmd = new BoardUpdateCmd();
            cmd.execute(request, response);
            viewPage = "boardList.bbs";
        }
        
 
          
        RequestDispatcher dis = request.getRequestDispatcher(viewPage);
        dis.forward(request, response);
    }
}
cs

 

BoardDAO.java

--boardUpdate : 글의 수정 기능 최종 수행
--boardPasswordCheck : 글의 수정 전 비밀번호 확인
--boardUpdateForm : 글의 수정 화면을 위한 기존 글 데이터 조회
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//게시글 수정 기능 수행
    public void boardUpdate(String inputNum, 
                            String inputSubject,
                            String inputContent,
                            String inputName,
                            String inputPassword){
        Connection conn = null;
        PreparedStatement pstmt = null;
         
        try{
            conn = ds.getConnection();
            String sql = "UPDATE BOARD SET subject=?, content=?, name=?, password=? "
                       + " WHERE num=?";
            pstmt = conn.prepareStatement(sql);
             
            pstmt.setString(1, inputSubject);
            pstmt.setString(2, inputContent);
            pstmt.setString(3, inputName);
            pstmt.setString(4, inputPassword);
            pstmt.setInt(5, Integer.parseInt(inputNum));
             
            pstmt.executeUpdate();
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
     
    // 게시글 수정 및 삭제를 위한 비밀번호 확인 기능 조회
    public boolean boardPasswordCheck(String inputNum, String inputPassword){
         
        boolean passwordOk = false;
        int passwordCheck = 0;
         
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int num = 1;
         
        try{
            conn = ds.getConnection();
            String sql = "SELECT COUNT(*) AS password_check FROM BOARD "
                       + " WHERE num=? and password=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, Integer.parseInt(inputNum));
            pstmt.setString(2, inputPassword);
            rs = pstmt.executeQuery();
             
            if(rs.next()) passwordCheck = rs.getInt("password_check");
             
            if(passwordCheck > 0) passwordOk = true;
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        return passwordOk;
    }
     
    //글 수정 화면에 필요한 원글 데이터 조회 기능
    public BoardDTO boardUpdateForm(String inputNum){
        BoardDTO writing = new BoardDTO();
         
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
         
        try{
            conn = ds.getConnection();
             
            String sql = "SELECT num, name, password, subject, content, write_date, "
                + "       write_time, ref, step, lev, read_cnt, child_cnt "
                + "  FROM BOARD "
                + " WHERE NUM=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, Integer.parseInt(inputNum));
            rs = pstmt.executeQuery();
             
            if(rs.next()){
                int     num         = rs.getInt     ("num"          );
                String  name        = rs.getString  ("name"         );
                String  password    = rs.getString  ("password"     );
                String  subject     = rs.getString  ("subject"      );
                String  content     = rs.getString  ("content"      );
                Date    writeDate   = rs.getDate    ("write_date"   );
                Time    writeTime   = rs.getTime    ("write_time"   );
                int     ref         = rs.getInt     ("ref"          );
                int     step        = rs.getInt     ("step"         );
                int     lev         = rs.getInt     ("lev"          );
                int     readCnt     = rs.getInt     ("read_cnt"     );
                int     childCnt    = rs.getInt     ("child_cnt"    );
                 
                writing.setNum(num);
                writing.setName(name);
                writing.setPassword(password);
                writing.setSubject(subject);
                writing.setContent(content);
                writing.setWriteDate(writeDate);
                writing.setWriteTime(writeTime);
                writing.setRef(ref);
                writing.setStep(step);
                writing.setLev(lev);
                writing.setReadCnt(readCnt);
                writing.setChildCnt(childCnt); 
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        return writing;
    }
cs
BoardUpdatePasswordCmd.java

--비밀번호 체크를 위한 기존 글의 번호를 전송
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class BoardUpdatePasswordCmd implements BoardCmd{
    
    //수정 대상이 될 글 번호 전달
 
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        String inputNum=request.getParameter("num");
        request.setAttribute("num", inputNum);
        
    }
    
 
}
cs

 

BoardUpdateCheckCmd.java

--비밀번호 검사 지시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
 
public class BoardUpdateCheckCmd implements BoardCmd {
    
    public boolean password_check;
 
    //비밀번호 확인 후 password_check 변수를 통해 boardfrontcontroller 서블릿 처리 여부를 결정하기 위한 boolean 값 설정
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        String inputNum = request.getParameter("num");
        String inputPassword = request.getParameter("password");
        
        request.setAttribute("num", inputNum);
        
        BoardDAO dao = new BoardDAO();
        password_check=dao.boardPasswordCheck(inputNum, inputPassword);
        
    }
 
}
 
cs

 

BoardUpdateFormCmd.java

--글 수정 화면 내 원본 글의 데이터 조회 지시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
import board.model.BoardDTO;
 
public class BoardUpdateFormCmd implements BoardCmd {
 
    //글 수정 비밀번호가 올바르게 입력되었을 경우 boardupdateform 메서드를 사용하여 대상 원본 글의 데이터를 writing 인스턴스에 대입
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        String inputNum = request.getParameter("num");
        BoardDAO dao = new BoardDAO();
        BoardDTO writing = dao.boardUpdateForm(inputNum);
        
        request.setAttribute("boardUpdateForm", writing);
        
    }
 
}
 
cs

 

BoardUpdateCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
 
public class BoardUpdateCmd implements BoardCmd{
    
    //최종 글 수정 지시
 
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        String inputNum = request.getParameter("num");
        String inputSubject =request.getParameter("subject");
        String inputContent = request.getParameter("content");
        String inputName = request.getParameter("name");
        String inputPassword = request.getParameter("password");
        
        BoardDAO dao = new BoardDAO();
        dao.boardUpdate(inputNum, inputSubject, inputContent, inputName, inputPassword);
        
    }
 
}
 
cs

 

boardUpdatePassword.jsp

--글 열람 화면에서 [수정]을 클릭했을 때 비밀번호를 입력받기 위한 페이지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>비밀번호 확인</title>
    <!-- 게시글 수정을 위해 비밀번호 입력하는 페이지 -->
</head>
<body>
    <h3>게시글 수정을 위한 비밀번호 확인</h3>
    <form action="boardUpdateCheck.bbs" method="post">
        <input type="password" name="password">
        <input type="hidden" name="num" value="${num }">
        <input type="submit" value="입력">
    </form>
</body>
</html>
cs

 

boardUpdateError.jsp

--입력한 비밀번호가 틀렸을 경우 출력될 페이지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판 글 수정 에러</title>
</head>
<body>
    <h3>비밀번호가 맞지 않아 수정할 수 없습니다.</h3>
    <a href="boardList.bbs">[목록으로]</a>
</body>
</html>
cs

 

boardUpdateForm.jsp

--입력한 비밀번호가 맞을 경우 글 수정을 위해 출력될 페이지
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판 글 수정</title>
</head>
<body>
    <h3>게시판 글 수정</h3>
    <form action="boardUpdate.bbs" method="post">
        <table>
            <tr>
                <td colspan="4" align="right">
                <input type="hidden" name="num" value="${boardUpdateForm.num }">
                <a href="boardList.bbs">[목록으로]</a>
                </td>
            </tr>
            <tr>
                <td>글 제목</td>
                <td colspan="3"><input type="text" name="subject" maxlength="50" size="50" value="${boardUpdateForm.subject }">
                </td>
            </tr>
            <tr>
                <td>작성자</td>
                <td><input type="text" name="name" maxlength="20" size="20" value="${boardUpdateForm.name }">
                </td>
                <td>비밀번호</td>
                <td><input type="password" name="password" maxlength="20" size="12">
                </td>
            </tr>
            <tr>
                <td>본문</td>
                <td colspan="3"><textarea name="content" rows="8" cols="45">${boardUpdateForm.content }</textarea>
                </td>
            </tr>
            <tr>
                <td colspan="4" align="right">
                <input type="submit" value="수정 완료">
                </td>
            </tr>
         </table>
    </form>
</body>
</html>
cs
<실행 화면>

비밀번호 틀렸을 때
비밀번호 일치할 때

 

게시판 글 삭제 기능 구현

 

BoardFrontController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 // 글 삭제 비밀번호 확인 화면 제공
          if(cmdURI.equals("/boardDeletePassword.bbs")){
              cmd = new BoardDeletePasswordCmd();
              cmd.execute(request, response);            
              viewPage = "boardDeletePassword.jsp";
          }
          
          // 글 삭제 비밀번호 확인 처리
          if(cmdURI.equals("/boardDeleteCheck.bbs")){
              cmd = new BoardDeleteCheckCmd();
              cmd.execute(request, response);
              
              BoardDeleteCheckCmd checkCmd = (BoardDeleteCheckCmd) cmd;
              if (checkCmd.password_check && checkCmd.reply_check){
                  viewPage = "boardDelete.bbs";                
              } else {
                  viewPage = "boardDeleteError.bbs";
              }
          }
          
          // 글 삭제 비밀번호 오류 화면 제공
          if(cmdURI.equals("/boardDeleteError.bbs")){
              viewPage = "boardDeleteError.jsp";
          }
          
          //글 삭제 처리
          if(cmdURI.equals("/boardDelete.bbs")){
              cmd = new BoardDeleteCmd();
              cmd.execute(request, response);
              viewPage = "boardList.bbs";
          }
          
          
        RequestDispatcher dis = request.getRequestDispatcher(viewPage);
        dis.forward(request, response);
    }
}
cs

 

BoardDAO.java

--boardDelete : 글 번호 입력 파라미터를 받아 실제 글을 DELETE문을 통해 삭제
--boardDeleteChildCntUpdate : 삭제 수행 전 대상 글들의 답글 수 컬럼의 값을 1 줄여줌.
--boardReplyCheck : 삭제하려는 글에 답글이 달려있는지 여부 검사,
                           답글이 달려있는 경우 글의 삭제가 이루어지지 않음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//삭제 대상인 게시글에 답글의 존재 유무를 검사
    public boolean boardReplyCheck(String inputNum){
        boolean replyCheck = false;
        int replyCnt = 0;
         
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
         
        try{
            conn = ds.getConnection();
            String sql = "SELECT child_cnt AS reply_check FROM BOARD WHERE num=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, Integer.parseInt(inputNum));
             
            rs = pstmt.executeQuery();
             
            if(rs.next()) replyCnt = rs.getInt("reply_check");
            if(replyCnt == 0) replyCheck = true;
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        return replyCheck;
    }
    
    // 게시글 삭제 기능 수행
    public void boardDelete(String inputNum){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
         
        try{
            conn = ds.getConnection();
             
            String sql = "SELECT ref, lev, step FROM BOARD WHERE num=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,  Integer.parseInt(inputNum));
            rs = pstmt.executeQuery();
             
            if(rs.next()){
                int ref = rs.getInt(1);
                int lev = rs.getInt(2);
                int step = rs.getInt(3);
                boardDeleteChildCntUpdate(ref, lev, step);
            }
             
            sql = "DELETE FROM BOARD WHERE num=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, Integer.parseInt(inputNum));
             
            pstmt.executeUpdate();
                     
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
    
    // 게시글이 답글일 경우 원글들의 답글 개수를 줄여주는 기능 수행
    public void boardDeleteChildCntUpdate(int ref, int lev, int step){
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String sql = null;
         
        try{
            conn = ds.getConnection();
            for(int updateLev = lev-1 ; updateLev >=0 ; updateLev--){
                sql = "SELECT MAX(step) FROM BOARD WHERE ref=? and lev=? and step <?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, ref);
                pstmt.setInt(2, updateLev);
                pstmt.setInt(3, step);
                 
                rs = pstmt.executeQuery();
                int maxStep = 0;
                 
                if(rs.next()) maxStep = rs.getInt(1);
                sql = "UPDATE BOARD SET child_cnt = child_cnt - 1 "
                    + " WHERE ref=? and lev=? and step=?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, ref);
                pstmt.setInt(2, updateLev);
                pstmt.setInt(3, maxStep);
                pstmt.executeUpdate();
            }
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(rs!=null) rs.close();
                if(pstmt!=null) pstmt.close();
                if(conn!=null) conn.close();
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
    }
cs

 

BoardDeletePasswordCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class BoardDeletePasswordCmd implements BoardCmd{
    
    public boolean password_check;
 
    //삭제 대상 글 번호 전달
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        String inputNum=request.getParameter("num");
        request.setAttribute("num", inputNum);
        
    }
 
}
 
cs

 

BoardDeleteCheckCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
 
public class BoardDeleteCheckCmd implements BoardCmd{
 
    public boolean password_check;
    public boolean reply_check;
    
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        String inputNum = request.getParameter("num");
        String inputPssword = request.getParameter("password");
        
        request.setAttribute("num", inputNum);
        
        BoardDAO dao = new BoardDAO();
        
        //삭제 글 번호와 사용자가 입력한 비밀번호를 BoardDAO 클래스 내 boardPasswordCheck 메서드에 입력 파라미터로 사용하여 비밀번호를 확인.
        password_check = dao.boardPasswordCheck(inputNum, inputPssword);
        //현재 삭제하려는 글에 답글의 존재 유무를 파악 -> 사용자의 입력 비밀번호가 올바르고 답글이 달려있지 않은 글일 경우 삭제 가능
        reply_check = dao.boardReplyCheck(inputNum);
        
        System.out.println("password_check : "+password_check);
        System.out.println("reply_check : "+reply_check);
        
    }
 
}
 
cs

 

BoardDeleteCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
 
public class BoardDeleteCmd implements BoardCmd {
 
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        String inputNum = request.getParameter("num");
        
        BoardDAO dao = new BoardDAO();
        dao.boardDelete(inputNum);
        
    }
 
}
 
cs

 

boardDeletePassword.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>비밀번호 확인</title>
</head>
<body>
    <h3>게시글 삭제를 위한 비밀번호 확인</h3>
    <form action="boardDeleteCheck.bbs" method="post">
        <input type="password" name="password">
        <input type="hidden" name="num" value="${num }">
        <input type="submit" value="입력">
    </form>
</body>
</html>
cs

 

boardDeleteError.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판 글 삭제 에러</title>
</head>
<body>
    <h3>비밀번호가 맞지 않거나, 답글이 존재할 경우 삭제할 수 없습니다.</h3>
    <a href="boardList.bbs">[목록으로]</a>
</body>
</html>
cs

 

<실행 화면>

 

게시판 글 검색 기능 구현

 

BoardFrontController.java
1
2
3
4
5
6
7
8
9
10
11
12
//글 검색 처리
        if(cmdURI.equals("/boardSearch.bbs")){
            cmd = new BoardSearchCmd();
            cmd.execute(request, response);
            viewPage = "boardSearchList.jsp";
        }
        
        RequestDispatcher dis = request.getRequestDispatcher(viewPage);
        dis.forward(request, response);
    }
}
 
cs

 

BoardDAO.java

--WHERE 문으로 검색 조건 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 // 검색 기능 수행(검색 조건 설정)
      public ArrayList<BoardDTO> boardSearch(String searchOption, String searchWord){
          ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
          
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          
          try{
              conn = ds.getConnection();
              String sql = "SELECT num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt "
                           + "FROM BOARD";
              
              if(searchOption.equals("subject")){
                  sql += " WHERE subject LIKE ?";
                  sql += " ORDER BY ref desc, step asc";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setString(1"%" + searchWord + "%");
 
              }else if(searchOption.equals("content")){
                  sql += " WHERE content LIKE ?";
                  sql += " ORDER BY ref desc, step asc";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setString(1"%" + searchWord + "%");
                  
              }else if(searchOption.equals("name")){
                  sql += " WHERE name LIKE ?";
                  sql += " ORDER BY ref desc, step asc";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setString(1"%" + searchWord + "%");
                  
              }else if(searchOption.equals("both")){
                  sql += " WHERE subject LIKE ? OR content LIKE ? ";
                  sql += " ORDER BY ref desc, step asc";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setString(1"%" + searchWord + "%");
                  pstmt.setString(2"%" + searchWord + "%");
              }
              
              rs = pstmt.executeQuery();
              
              while(rs.next()){
              
                  int num = rs.getInt("num");
                  String name = rs.getString("name");
                  String password = rs.getString("password");
                  String subject = rs.getString("subject");
                  String content = rs.getString("content");
                  Date writeDate = rs.getDate("write_date");
                  Time writeTime = rs.getTime("write_time");
                  int ref = rs.getInt("ref");
                  int step = rs.getInt("step");
                  int lev = rs.getInt("lev");
                  int readCnt = rs.getInt("read_cnt");
                  int childCnt = rs.getInt("child_cnt");
                  
                  BoardDTO writing = new BoardDTO();
                  writing.setNum(num);
                  writing.setName(name);
                  writing.setPassword(password);
                  writing.setSubject(subject);
                  writing.setContent(content);
                  writing.setWriteDate(writeDate);
                  writing.setWriteTime(writeTime);
                  writing.setRef(ref);
                  writing.setStep(step);
                  writing.setLev(lev);
                  writing.setReadCnt(readCnt);
                  writing.setChildCnt(childCnt);
                  
                  list.add(writing);
              }
          } catch (Exception e){
              e.printStackTrace();
          }finally{
              try{
                  if(rs != null) rs.close();
                  if(pstmt != null) pstmt.close();
                  if(conn != null) conn.close();
              }catch (SQLException e){
                  e.printStackTrace();
              }
          }
          return list;
      }   
cs

 

BoardSearchCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package board.command;
 
import java.util.ArrayList;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
import board.model.BoardDTO;
 
public class BoardSearchCmd implements BoardCmd {
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        BoardDAO dao = new BoardDAO();
        String searchOption = request.getParameter("searchOption"); //검색 옵션
        String searchWord = request.getParameter("searchWord");        //검색 단어
        
        //글 목록을 ArrayList를 사용하여 저장한 후 boardList 애트리뷰트로 지정(검색된 글의 목록을 출력)
        
        ArrayList<BoardDTO> list = dao.boardSearch(searchOption, searchWord);
        request.setAttribute("boardlist", list);
        
    }
 
}
 
cs

 

boardSearchList.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판 검색 결과 조회</title>
</head>
<body>
    <h3>게시판 검색 결과 조회</h3>
    
    <table border="1">
        <tr>
            <td colspan="7" align="right">
                <a href="boardWriteForm.bbs">[새글쓰기]</a>
            </td>
        </tr>
        <tr>
            <td>글 번호</td>
            <td>글 제목</td>
            <td>작성자</td>
            <td>작성일</td>
            <td>작성시간</td>
            <td>조회수</td>
            <td>답글수</td>
        </tr>
        <c:forEach items="${boardList }" var="dto">
            <tr>
                <td><a href="boardRead.bbs?num=${dto.num }">${dto.num }</a>
                </td>
                
                <td>
                    <c:forEach begin="1" end="${dto.lev }">
                        <%= "&nbsp;nbsp;" %>
                    </c:forEach>
                    <a href="boardRead.bbs?num=${dto.num }">${dto.subject }</a>
                </td>
                    <td>${dto.name }</td>
                    <td>${dto.writeDate }</td>
                    <td>${dto.writeTime }</td>
                    <td>${dto.readCnt }</td>
                    <td>${dto.childCnt }</td>
            </tr>
        </c:forEach>
            <tr>
                <td colspan="7" aligh="center">
                    <a href="boardList.bbs">[첫 페이지로]</a>
                </td>
            </tr>
    </table>
</body>
</html>
cs

 

<실행 화면>

 

게시판 답글 작성 기능 구현

 

BoardFrontController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        //답글 작성 
        if(cmdURI.equals("/boardReplyForm.bbs")) {
            cmd = new BoardReplyFormCmd();
            cmd.execute(request, response);
            viewPage = "boardReply.jsp";
        }
        
        //답글 작성 처리
        if(cmdURI.equals("/boardReply.bbs")) {
            cmd = new BoardReplyCmd();
            cmd.execute(request, response);
            viewPage = "boardList.bbs";
        }
          
        RequestDispatcher dis = request.getRequestDispatcher(viewPage);
        dis.forward(request, response);
    }
}
 
cs

 

BoardDAO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
//답글 작성에 필요한 원글 데이터 조회 기능
      public BoardDTO boardReplyForm(String inputNum) {
          BoardDTO writing = new BoardDTO();
          
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          
          try {
              conn = ds.getConnection();
              String sql = "SELECT num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt FROM BOARD WHERE NUM =?";
              pstmt = conn.prepareStatement(sql);
              pstmt.setInt(1, Integer.parseInt(inputNum));
              rs = pstmt.executeQuery();
              
              if(rs.next()) {
                  int num = rs.getInt("num");
                  String name = rs.getString("name");
                  String password = rs.getString("password");
               String subject = "RE:" +rs.getString("subject");
                  Date writeDate = rs.getDate("write_date");
                  Time writeTime = rs.getTime("write_time");
★ String content = "[원문 :"+ writeDate +""+writeTime + "작성됨]\n"+rs.getString("content");
                  int ref = rs.getInt("ref");
                  int step = rs.getInt("step");
                  int lev = rs.getInt("lev");
                  int readCnt = rs.getInt("read_cnt");
                  int childCnt = rs.getInt("child_cnt");
 
                  writing.setNum(num);
                  writing.setPassword(password);
                  writing.setSubject(subject);
                  
                  writing.setContent(content);
                  writing.setWriteDate(writeDate);
                  writing.setWriteTime(writeTime);
                  writing.setRef(ref);
                  writing.setStep(step);
                  writing.setLev(lev);
                  writing.setReadCnt(readCnt);
                  writing.setChildCnt(childCnt);
              }
              
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }finally {
              try {
                  if (rs != null)
                      rs.close();
                  if (pstmt != null)
                      pstmt.close();
                  if (conn != null)
                      conn.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
          return writing;
      }
      //답글 등록 기능 수행
      public void boardReply(String num, String name, String subject, String content, String password, String ref, String step, String lev) {
          
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          
          int replyNum = 0;
          int replyStep = 0;
          String sql = null;
          
          try {
              conn=ds.getConnection();
              
              replyStep = boardReplySearchStep(ref, lev, step);
              //답글이 위치할 step 값을 가져옴.
              
              if(replyStep>0) {
                  sql = "UPDATE BOARD SET step = step + 1 where ref = ? and step >=?";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setInt(1, Integer.parseInt(ref));
                  pstmt.setInt(2, replyStep);
                  pstmt.executeUpdate();
              }else {
                  sql += "SELECT MAX(STEP) FROM BOARD WHERE ref = ?";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setInt(1, Integer.parseInt(ref));
                  rs = pstmt.executeQuery();
                  if(rs.next()) replyStep = rs.getInt(1+ 1;
              }
              
              sql = "SELECT MAX(num) +1 AS NUM FROM BOARD";
              pstmt = conn.prepareStatement(sql);
              rs = pstmt.executeQuery();
              if(rs.next()) replyNum = rs.getInt("num");
              
              sql = "INSERT INTO BOARD";
              sql += "(num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt)";
              sql += "values(?, ?, ?, ?, ?, curdate(), curtime(), ?, ?, ?, 0, 0)";
              
              pstmt = conn.prepareStatement(sql);
              pstmt.setInt(1, replyNum);
              pstmt.setString(2, name);
              pstmt.setString(3, password);
              pstmt.setString(4, subject);
              pstmt.setString(5, content);
              pstmt.setInt(6, Integer.parseInt(ref));
              pstmt.setInt(7, replyStep);
              pstmt.setInt(8, Integer.parseInt(lev)+1);
              pstmt.executeUpdate();
              boardReplyChildCntUpdate(ref, lev, replyStep);
              
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }finally {
              try {
                  if (rs != null)
                      rs.close();
                  if (pstmt != null)
                      pstmt.close();
                  if (conn != null)
                      conn.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
          
      }
      //답글의 출력 위치(step) 선정 기능 수행
      public int boardReplySearchStep(String ref, String lev, String step) {
          
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          int replyStep = 0;
          
          try {
              conn=ds.getConnection();
              String sql = "SELECT IFNULL (MIN(step), 0) from BOARD WHERE ref = ? and lev <= ? and step > ?";
              pstmt = conn.prepareStatement(sql);
              pstmt.setInt(1, Integer.parseInt(ref));
              pstmt.setInt(2, Integer.parseInt(lev));
              pstmt.setInt(3, Integer.parseInt(step));
              rs = pstmt.executeQuery();
              
              if(rs.next()) replyStep = rs.getInt(1);
              
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }finally {
              try {
                  if (rs != null)
                      rs.close();
                  if (pstmt != null)
                      pstmt.close();
                  if (conn != null)
                      conn.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
          
          return replyStep;
      }
      
      //답글 작성 후 원글들의 답글 개수를 늘려주는 기능 수행
      public void boardReplyChildCntUpdate(String ref, String lev, int replyStep) {
          Connection conn = null;
          PreparedStatement pstmt = null;
          ResultSet rs = null;
          String sql = null;
          
          try {
              conn = ds.getConnection();
              for(int updateLev = Integer.parseInt(lev) ; updateLev >= 0 ; updateLev--) {
                  sql = "SELECT MAX(step) FROM BOARD WHERE ref = ? and lev = ? and step < ?";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setInt(1, Integer.parseInt(ref));
                  pstmt.setInt(2, updateLev);
                  pstmt.setInt(3, replyStep);
                  
                  rs = pstmt.executeQuery();
                  int maxStep = 0;
                  
                  if(rs.next()) maxStep = rs.getInt(1);
                  sql = "UPDATE BOARD SET child_cnt = child_cnt + 1 where ref = ? and lev = ? and step = ?";
                  pstmt = conn.prepareStatement(sql);
                  pstmt.setInt(1, Integer.parseInt(ref));
                  pstmt.setInt(2, updateLev);
                  pstmt.setInt(3, maxStep);
                  pstmt.executeUpdate();
              }
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }finally {
              try {
                  if (rs != null)
                      rs.close();
                  if (pstmt != null)
                      pstmt.close();
                  if (conn != null)
                      conn.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
          }
      }
    
}
  cs

 

BoardReplyFormCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
import board.model.BoardDTO;
 
public class BoardReplyFormCmd implements BoardCmd {
 
    //답글 기능 수행
    //답변글 작성 화면에 필요한 원글의 데이터를 BoardDTO 인스턴스에 저장.
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        String inputNum = request.getParameter("num");
        BoardDAO dao = new BoardDAO();
        
        BoardDTO writing = dao.boardReplyForm(inputNum);
        request.setAttribute("boardReplyForm", writing);
        
    }
 
}
 
cs

 

BoardReplyCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package board.command;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import board.model.BoardDAO;
 
public class BoardReplyCmd implements BoardCmd {
 
    
    //답변 글 작성이 완료되었을 때 사용
    //답변 글의 INSERT 및 답변글과 관련된 다른 글들의 값 조정
    
    @Override
    public void execute(HttpServletRequest request, HttpServletResponse response) {
        
        
        String num = request.getParameter("num");
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        String subject = request.getParameter("subject");
        String content = request.getParameter("content");
        String ref = request.getParameter("ref");
        String lev = request.getParameter("lev");
        String step = request.getParameter("step");
        
        BoardDAO dao = new BoardDAO();
        dao.boardReply(num, name, subject, content, password, ref, step, lev);
        
    }
 
}
 
cs

 

boardReply.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시판 답글 작성</title>
</head>
<body>
    <h3>게시판 답글 작성</h3>
    <form action="boardReply.bbs" method="post">
        <table>
            <tr>
                <td colspan="4" align="right">
                    <input type="hidden" name="num" value="${boardReplyForm.num }">
                    <input type="hidden" name="ref" value="${boardReplyForm.ref }">
                    <input type="hidden" name="step" value="${boardReplyForm.step }">
                    <input type="hidden" name="lev" value="${boardReplyForm.lev }">
                    <a href="boardList.bbs">[목록으로]</a>
                </td>
            </tr>
            <tr>
                <td>글 제목</td>
                <td colspan="3"><input type="text" name="subject" maxlength="50" size="50" value="${boardReplyForm.subject }">
                </td>
            </tr>
            <tr>
                <td>작성자</td>
                <td><input type="text" name="name" maxlength="20" size="20">
                </td>
                <td>비밀번호</td>
                <td><input type="password" name="password" maxlength="20" size="12">
                </td>
            </tr>
            <tr>
                <td>본문</td>
                <td colspan="3"><textarea name="content" rows="8" cols="45">${boardReplyForm.content }</textarea>
                </td>
            </tr>
            <tr>
                <td colspan="4" align="right">
                    <input type="submit" value="답글 올리기">
                </td>
            </tr>    
        </table>
    </form>
</body>
</html>
cs

 

<실행 화면>

 

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형