본문으로 바로가기

[JSP개발] 게시판 - 글쓰기 구현

category 코딩/JSP 2016. 12. 11. 14:08







1. 개요







기존에 만든 소스 코드에 게시판을 추가할 것이다. 이전까지의 소스 코드는 위의 지난 포스팅 링크에서 다운로드 받을 수 있다. 




화면 구성은 위와 같다. 먼저 로그인 후 상단의 게시판 메뉴를 클릭하면 글목록이 나타난다. 여기에서 글쓰기 버튼을 클릭하면 글쓰기 화면으로 이동한다. 단, 글쓰기 버튼은 로그인한 경우에만 보인다. 


그리고 소스 코드 작성전에 공통부분을 분리하였다. 회원관리 부분과 게시판 부분 모두 사용하는 클래스들은 jsp.common이라는 패키지로 이동시켰다. 그 외 새로 추가된 부분은 아래와 같다.



■ jsp.common 패키지

  •  jsp.common.action : 공통적으로 사용하는 Action과 ActionForward를 모아둔 패키지이다.

  •  jsp.common.util : 모든 DAO에서 사용하는 DBConnetion 클래스를 넣어두었다.


 JSP

  • BoardListForm.jsp : 게시글 목록을 보여주는 JSP, 지금은 글쓰기만 구현할 것이므로 글 목록을 보여주는 JSP는 틀만 만들어 둔다.

  • BoardWriteForm.jsp : 글쓰기 화면


 Java

  • BoardBean.java : 게시글의 데이터를 담을 자바빈

  • BoardDAO.java : 게시판의 DAO

  • BoardController.java : 게시판 관련 Controller 

  • BoardFormChangeAction.java : 화면전환을 처리하는 Action

  • BoardWriteAction.java : 글 등록을 처리하는 Action


 properties

  • BoardCommand.properties : 게시판 관련 명령어를 가지고 있는 프로퍼티 파일


 jar 파일

  • 파일 업로드를 위해  jar 파일을 추가해야 한다. 아래의 파일을 다운로드 후 압축을 풀고 lib 폴더에 집어넣는다.

파일업로드 JAR.zip




2. 소스 코드



■ 쿼리


테이블 쿼리를 실행해서 게시판 테이블을 생성한다. 그리고 게시판 시퀀스를 만든다. 시퀀스의 역할은 자동으로 게시글을 글 번호를 부여하는 것이다. 그리고 Member_Board 테이블에서 board_id 값은 회원 테이블의 ID 값을 참조하기 위해 외래키 제약조건을 추가해 준다.


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
-- 게시판 테이블
 
CREATE TABLE Member_Board 
(
  board_num NUMBER NOT NULL,
  board_id VARCHAR2(50),
  board_subject VARCHAR2(100),
  board_content VARCHAR2(2000),
  board_file VARCHAR2(100),
  Board_re_ref NUMBER,
  Board_re_lev NUMBER,
  Board_re_seq NUMBER,
  Board_count NUMBER,
  Board_date DATE,
  CONSTRAINT PK_Member_Board PRIMARY KEY(board_num)
);
 
-- board_num : 게시물 글번호
-- board_id : 글작성자 ID
-- board_subject : 글 제목
-- board_content : 글 내용
-- board_file : 첨부파일 이름
-- Board_re_ref : 글 그룹번호
-- Board_re_lev : 답변글 깊이
-- Board_re_seq : 답변글 순서
-- Board_count : 글 조회수
-- Board_date 작성날짜
 
 
-- 게시판 시퀀스
 
create sequence BOARD_NUM; 
 
-- 제약조건 추가
 
alter table MEMBER_BOARD
add constraint pk_board_id foreign key(board_id)
REFERENCES JSP_MEMBER(id);
cs




■ Header.jsp


단 메뉴에는 게시판 메뉴를 추가해 준다.




게시판 메뉴 버튼을 추가해 준다.



그리고 버튼 클릭 시 BoardListForm.jsp 로 이동하도록 기존 function에 추가해 준다. 명령어(BoardListForm.bo)에 관한 부분은 Controller 와 web.xml 소스 코드를 설명하는 부분에서 설명할 것이다. 일단은 위와 같이 추가를 해주면 된다.



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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    
<html>
<head>
    <title>상단 영역</title>
    
    <link rel="stylesheet" href="css/bootstrap.min.css">
    
    <style type="text/css">
        #wrap{
            text-align: center;
            width: 800px;
            height: 150px;
        }
    </style>
    
    <script type="text/javascript">
        
        function changeView(value){
            
            if(value == "0"// HOME 버튼 클릭시 첫화면으로 이동
            {
                location.href="MainForm.do";
            }
            else if(value == "1"// 로그인 버튼 클릭시 로그인 화면으로 이동
            {
                location.href="LoginForm.do";
            }
            else if(value == "2"// 회원가입 버튼 클릭시 회원가입 화면으로 이동
            {
                location.href="JoinForm.do";
            }
            else if(value == "3"// 로그아웃 버튼 클릭시 로그아웃 처리
            {
                location.href="MemberLogoutAction.do";
            }
            else if(value == "4"// 내정보 버튼 클릭시 회원정보 보여주는 화면으로 이동
            {
                location.href="MemberInfoAction.do";
            }
            else if(value == "5")
            {
                location.href="MemberListAction.do";
            }
            else if(value == "6")
            {
                location.href="BoardListForm.bo";
            }
        }
    </script>
    
</head>
<body>
    <div id = "wrap">
        <p>
            <button class="btn btn-success" onclick="changeView(0)">HOME</button>
 
        <!-- // 로그인 안되었을 경우 - 로그인, 회원가입 버튼을 보여준다. -->
        <c:if test="${sessionScope.sessionID==null}">
            <button id="loginBtn" class="btn btn-primary" onclick="changeView(1)">로그인</button>
            <button id="joinBtn" class="btn btn-primary" onclick="changeView(2)">회원가입</button>
        </c:if>
    
        <!-- // 로그인 되었을 경우 - 로그아웃, 내정보 버튼을 보여준다. -->
        <c:if test="${sessionScope.sessionID!=null}">
            <button id="logoutBtn" class="btn btn-primary" onclick="changeView(3)">로그아웃</button>
            <button id="updateBtn" class="btn btn-primary" onclick="changeView(4)">내정보</button>
 
        </c:if>
        
            <button id="joinBtn" class="btn btn-info" onclick="changeView(6)">게시판</button>
            
        <!--  관리자 로그인 -->
        <c:if test="${sessionScope.sessionID !=null && sessionScope.sessionID=='admin'}">
            <button id="memberViewBtn" class="btn btn-warning" onclick="changeView(5)">회원보기</button>
        </c:if>
                
        </p>
    </div>
</body>
</html>
cs



■ BoardListForm.jsp


글목록을 보여주는 JSP이다. 지금은 글쓰기 화면으로 이동하기 위한 역할만 한다. 추후 글목록 및 검색 기능을 구현할 것이다.



  • 39 ~ 41 줄

로그인했을 경우만 글쓰기 버튼을 보여준다.

  • 28 ~ 30 줄

글쓰기 버튼 클릭 시 글쓰기 화면으로 이동하는 함수이다.



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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>        
<html>
<head>
    <title>전체 게시글</title>
    
    <style type="text/css">
        #wrap {
            width: 800px;
            margin: 0 auto 0 auto;
        }
        #topForm{
            text-align :right;
        }
        #board, #pageForm, #searchForm{
            text-align :center;
        }
        
        #bList{
            text-align :center;
        }
    </style>
    
    <script type="text/javascript">
        function writeForm(){
            location.href="BoardWriteForm.bo";
        }
    </script>
    
</head>
<body>    
 
<div id="wrap">
    <br>
    <div id="topForm">
        <c:if test="${sessionScope.sessionID!=null}">
            <input type="button" value="글쓰기" onclick="writeForm()">
        </c:if>    
    </div>
    <br>
    <div id="board">
        <table id="bList" width="800" border="3" bordercolor="lightgray">
            <tr heigh="30">
                <td>글번호</td>
                <td>제목</td>
                <td>작성자</td>
                <td>작성일</td>
                <td>조회수</td>
            </tr>    
            <tr>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
                <td>1</td>
            </tr>
        </table>
    </div>
    <br>
    <div id="pageForm">
        페이지 번호
    </div>
    <br>
    <div id="searchForm">
        <form>
            <select name="opt">
                <option value="0">제목</option>
                <option value="1">내용</option>
                <option value="2">제목+내용</option>
                <option value="3">글쓴이</option>
            </select>
            <input type="text" size="20" name="condition"/>&nbsp;
            <input type="submit" value="검색"/>
        </form>    
    </div>
</div>    
 
</body>
</html>
cs



■ BoardWriteForm.jsp


글쓰기 화면이다. 아이디의 경우 로그인한 유저의 아이디를 가져와서 보여준다.



  • 23 줄

입력된 값 전송을 위한 <form>태그이다. 여기서 파일 업로드 기능을 구현하려면 entype 이란 부분을 꼭 입력해야 한다. 그렇지 않을 경우 오류가 발생하게 된다.

  • 24 줄

글을 등록할 때 글쓴이의 아이디를 저장해야 한다. 그러기 위해서 아이디도 같이 넘겨주기 위해 보이지 않는 hidden을 사용하였다.

  • 28줄

글 작성자를 보여주기 위해 세션에서 아이디를 가져온다.


  • 51줄

파일 업로드를 위해서는 <input> 태그의 타입을 file로 지정해야 한다.




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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<html>
<head>
    <title>게시판 - 글쓰기</title>
    
    <style type="text/css">
        #title{
            height : 16;
            font-family :'돋움';
            font-size : 12;
            text-align :center;
        }
    </style>
    
</head>
<body>
 
    <br>
    <b><font size="6" color="gray">글쓰기</font></b>
    <br>
    
    <form method="post" action="BoardWriteAction.bo" name="boardForm" enctype="multipart/form-data">
    <input type="hidden" name="board_id" value="${sessionScope.sessionID}">
    <table width="700" border="3" bordercolor="lightgray" align="center">
        <tr>
            <td id="title">작성자</td>
            <td>${sessionScope.sessionID}</td>
        </tr>
            <tr>
            <td id="title">
                제 목
            </td>
            <td>
                <input name="board_subject" type="text" size="70" maxlength="100" value=""/>
            </td>        
        </tr>
        <tr>
            <td id="title">
                내 용
            </td>
            <td>
                <textarea name="board_content" cols="72" rows="20"></textarea>            
            </td>        
        </tr>
        <tr>
            <td id="title">
                파일첨부
            </td>
            <td>
                <input type="file" name="board_file" />
            </td>    
        </tr>
 
        <tr align="center" valign="middle">
            <td colspan="5">
                <input type="reset" value="작성취소" >
                <input type="submit" value="등록" >
                <input type="button" value="목록" >            
            </td>
        </tr>
    </table>    
    </form>
    
</body>
</html>
cs



■ web.xml




web.xml에는 <servlet>과 <servlet-mapping>을 추가해준다. 명령어는 회원관리와 달리 *.bo로 지정한다.



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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         id="WebApp_ID" version="2.5">
 <display-name>JSP_create</display-name>
 
     <servlet>
        <description>Controller</description>
        <display-name>MemberController</display-name>
        <servlet-name>MemberController</servlet-name>
        <servlet-class>jsp.member.action.MemberController</servlet-class>
    </servlet>
    
     <servlet>
        <description>Controller</description>
        <display-name>BoardController</display-name>
        <servlet-name>BoardController</servlet-name>
        <servlet-class>jsp.board.action.BoardController</servlet-class>
    </servlet>
 
     <servlet-mapping>
        <servlet-name>MemberController</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>BoardController</servlet-name>
        <url-pattern>*.bo</url-pattern>
    </servlet-mapping>
 
     <listener>
        <listener-class>jsp.visit.action.VisitSessionListener</listener-class>
    </listener>
 
    <resource-ref>
         <description>connection</description>
         <res-ref-name>jdbc/orcl</res-ref-name>
         <res-type>javax.sql.DataSource</res-type>
         <res-auth>Container</res-auth>
    </resource-ref>
 
</web-app>
cs



■ BoardController.java


jsp.board.action 패키지를 생성 후 BoardController.java를 생성한다.




프로퍼티 파일의 경로를 지정하는 부분만 MemberController와 차이가 난다. 그 외 소스 코드는 동일하다.



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
package jsp.board.action;
 
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.ResourceBundle;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import jsp.common.action.Action;
import jsp.common.action.ActionForward;
 
public class BoardController extends HttpServlet
{
    private static final long serialVersionUID = 1L;
    private HashMap<String,Action> commandMap;
    
    /**
     * 최초 실행 init
     */
    public void init(ServletConfig config) throws ServletException {    
        loadProperties("jsp/board/properties/BoardCommand");
    }
    
    /**
     * 프로퍼티 파일에서 키값과 클래스 정보를 추출하여 그것을 Map에 저장한다.
     * @param filePath 프로퍼티 파일의 경로
     */
    private void loadProperties(String filePath) 
    {
        commandMap = new HashMap<String, Action>();
        
        ResourceBundle rb = ResourceBundle.getBundle(filePath);
        Enumeration<String> actionEnum = rb.getKeys(); // 키값을 가져온다.
         
        while (actionEnum.hasMoreElements()) 
        {
            // 명령어를 가져온다.
            String command = actionEnum.nextElement(); 
            // 명령어에 해당하는 Action 클래스 이름을 가져온다.
            String className = rb.getString(command); 
            
            try {
                 Class actionClass = Class.forName(className); // 클래스 생성
                 Action actionInstance = (Action)actionClass.newInstance(); // 클래스의 객체를 생성
                 
                 // 화면전환 Action 인지 확인한다. 화면전환 Action이면 명령어를 전달한다.
                 if(className.equals("jsp.board.action.BoardFormChangeAction")){
                     BoardFormChangeAction bf = (BoardFormChangeAction)actionInstance;
                     bf.setCommand(command);
                 }
                 
                 // 맵에 명령어와 Action을 담는다.
                 commandMap.put(command, actionInstance);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * GET 방식일 경우 doGet()
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
            doProcess(request,response);
    }      
        
    /**
     * POST 방식일 경우 doPost()
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
            doProcess(request,response);
    }
 
    /**
     * 명령어에 따른 해당 Action을 지정해 준다.
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    private void doProcess(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        
        // 넘어온 커맨드를 추출하는 과정
        String requestURI = request.getRequestURI();
        int cmdIdx = requestURI.lastIndexOf("/"+ 1;
        String command = requestURI.substring(cmdIdx);
 
        // URI, command 확인
        // System.out.println("requestURI : "+requestURI);
        System.out.println("Board cmd : "+command);
        
        ActionForward forward = null;
        Action action = null;
        
        try {
            // 맵에서 명령어에 해당하는 Action을 가져온다.
            action = commandMap.get(command);
            
            if (action == null) {
                System.out.println("명령어 : "+command+"는 잘못된 명령입니다.");
                return;
            }
 
            forward = action.execute(request, response);
            
            /*
             * 화면이동 - isRedirext() 값에 따라 sendRedirect 또는 forward를 사용
             * sendRedirect : 새로운 페이지에서는 request와 response객체가 새롭게 생성된다.
             * forward : 현재 실행중인 페이지와 forwad에 의해 호출될 페이지는 request와 response 객체를 공유
             */
            if(forward != null){
                if (forward.isRedirect()) {
                    response.sendRedirect(forward.getNextPath());
                } else {
                    RequestDispatcher dispatcher = request
                            .getRequestDispatcher(forward.getNextPath());
                    dispatcher.forward(request, response);
                }
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    } // end doProcess                    
}
 
cs



BoardFormChangeAction.java


게시판 관련 화면전환을 처리하는 Action이다. MemberFormChangeAction과 소스 코드는 동일하다.


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
package jsp.board.action;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import jsp.common.action.Action;
import jsp.common.action.ActionForward;
 
/**
 * 화면 전환을 처리하는 Action
 *
 */
public class BoardFormChangeAction implements Action
{
    private String form = "MainForm.jsp?contentPage=board/";
    private String path;
    
    /**
     * 명령어로부터 다음 이동할 페이지 경로를 생성한다.
     * @param command 명령어
     */
    public void setCommand(String command){
        int idx = command.indexOf(".");
        path = command.substring(0, idx)+".jsp";
    }
 
    @Override
    public ActionForward execute(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        
        ActionForward forward = new ActionForward();
        
        forward.setRedirect(false);
        
        // 메인화면일 경우 MainForm.jsp만 경로로 지정한다.
        if(path.equals("MainForm.jsp"))
            forward.setNextPath(path);
        else
            forward.setNextPath(form+path);
        
        return forward;
    }
}
 
cs



 BoardWriteAction.java


글 등록을 처리하는 Action 클래스이다.




업로드할 파일의 최대 크기와 업로드한 파일이 저장될 경로를 가져온다.




그리고 MultipartRequest 객체를 생성한다. 객체 생성 시 request, 업로드할 경로, 파일 크기, 인코딩 정보가 필요하다.




MultipartRequest 객체를 생성했다면 파일 이름을 가져온다. 먼저 모든 파일 이름을 Enumeration로 가져온다. 그리고 Enumeration에 값이 있는지 검사한다. 만약 값이 있다면 거기서 파일 이름을 추출한다.




글 작성 화면에서 넘겨받은 값을 BoardBean에 담는다. 이때 넘겨받은 값을 가져오기 위해서는 MultipartRequest 객체를 통해서 가져와야 한다. MultipartRequest 객체를 생성할 시 생성자의 인자로 request를 넘겨받았기 때문이다.


그리고 글 번호의 경우 시퀀스 값을 가져와서 지정해준다. BoardBean에 값을 모두 담은 후 DAO로 넘겨주어 저장을 한다. 그리고 결과를 넘겨받는다. 정상적으로 저장이 되었다면 다음으로 이동할 화면을 지정해 준다.



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
package jsp.board.action;
 
import java.util.Enumeration;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
 
import jsp.board.model.BoardBean;
import jsp.board.model.BoardDAO;
import jsp.common.action.Action;
import jsp.common.action.ActionForward;
 
public class BoardWriteAction implements Action
{
 
    @Override
    public ActionForward execute(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        
        ActionForward forward = new ActionForward();
                
        // 업로드 파일 사이즈
        int fileSize= 5*1024*1024;
        // 업로드될 폴더 경로
        String uploadPath = request.getServletContext().getRealPath("/UploadFolder");
 
        try {
            
            // 파일업로드 
            MultipartRequest multi = new MultipartRequest
                    (request, uploadPath, fileSize, "euc-kr"new DefaultFileRenamePolicy());
 
            // 파일이름 가져오기
            String fileName = "";
            Enumeration<String> names = multi.getFileNames();
            if(names.hasMoreElements())
            {
                String name = names.nextElement();
                fileName = multi.getFilesystemName(name);
            }
            
            BoardDAO dao = BoardDAO.getInstance();
            BoardBean borderData = new BoardBean();
            
            borderData.setBoard_num(dao.getSeq()); // 시퀀스값 가져와 세팅
            borderData.setBoard_id(multi.getParameter("board_id")); // 히든값
            borderData.setBoard_subject(multi.getParameter("board_subject"));
            borderData.setBoard_content(multi.getParameter("board_content"));
            borderData.setBoard_file(multi.getParameter("board_file"));
        
            boolean result = dao.boardInsert(borderData);
            
            if(result){
                forward.setRedirect(true);
                forward.setNextPath("BoardListForm.bo");
            }
            
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("글 작성 오류 : " + e.getMessage());
        }
        return forward;
    }
}
 
cs



 BoardBean.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
package jsp.board.model;
 
import java.sql.Date;
 
public class BoardBean 
{
    private int board_num;          // 글번호
    private String board_id;         // 글 작성자
    private String board_subject;     // 글 제목
    private String board_content;     // 글 내용
    private String board_file;         // 첨부파일 이름
    private int board_re_ref;         // 글 그룹번호
    private int board_re_lev;         // 답변글 깊이
    private int board_re_seq;         // 답변글 순서
    private int board_count;         // 글 조회수
    private Date board_date;         // 글 작성일
    
    public int getBoard_num() {
        return board_num;
    }
    public void setBoard_num(int board_num) {
        this.board_num = board_num;
    }
    public String getBoard_id() {
        return board_id;
    }
    public void setBoard_id(String board_id) {
        this.board_id = board_id;
    }
    public String getBoard_subject() {
        return board_subject;
    }
    public void setBoard_subject(String board_subject) {
        this.board_subject = board_subject;
    }
    public String getBoard_content() {
        return board_content;
    }
    public void setBoard_content(String board_content) {
        this.board_content = board_content;
    }
    public String getBoard_file() {
        return board_file;
    }
    public void setBoard_file(String board_file) {
        this.board_file = board_file;
    }
    public int getBoard_re_ref() {
        return board_re_ref;
    }
    public void setBoard_re_ref(int board_re_ref) {
        this.board_re_ref = board_re_ref;
    }
    public int getBoard_re_lev() {
        return board_re_lev;
    }
    public void setBoard_re_lev(int board_re_lev) {
        this.board_re_lev = board_re_lev;
    }
    public int getBoard_re_seq() {
        return board_re_seq;
    }
    public void setBoard_re_seq(int board_re_seq) {
        this.board_re_seq = board_re_seq;
    }
    public int getBoard_count() {
        return board_count;
    }
    public void setBoard_count(int board_count) {
        this.board_count = board_count;
    }
    public Date getBoard_date() {
        return board_date;
    }
    public void setBoard_date(Date board_date) {
        this.board_date = board_date;
    }
}
 
cs



 BoardDAO.java


게시판 테이블의 DAO이다. 




위는 DAO에서 시퀀스를 가져오는 부분이다. 시퀀스 값은 자동적으로 계속 증가하기 때문에 글 번호로 이용한다. 여기서는 별도로 시퀀스를 가져오는 메서드를 만들었다.



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
package jsp.board.model;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
 
import jsp.common.util.DBConnection;
 
 
public class BoardDAO 
{
    private Connection conn;
    private PreparedStatement pstmt;
    private ResultSet rs;
    
    private static BoardDAO instance;
    
    private BoardDAO(){}
    public static BoardDAO getInstance(){
        if(instance==null)
            instance=new BoardDAO();
        return instance;
    }
    
    // 시퀀스를 가져온다.
    public int getSeq()
    {
        int result = 1;
        
        try {
            conn = DBConnection.getConnection();
            
            // 시퀀스 값을 가져온다. (DUAL : 시퀀스 값을 가져오기위한 임시 테이블)
            StringBuffer sql = new StringBuffer();
            sql.append("SELECT BOARD_NUM.NEXTVAL FROM DUAL");
            
            pstmt = conn.prepareStatement(sql.toString());
            // 쿼리 실행
            rs = pstmt.executeQuery();
            
            if(rs.next())    result = rs.getInt(1);
 
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        
        close();
        return result;    
    } // end getSeq
    
    // 글 삽입
    public boolean boardInsert(BoardBean board)
    {
        boolean result = false;
        
        try {
            conn = DBConnection.getConnection();
            
            StringBuffer sql = new StringBuffer();
            sql.append("INSERT INTO MEMBER_BOARD");
            sql.append("(BOARD_NUM, BOARD_ID, BOARD_SUBJECT, BOARD_CONTENT, BOARD_FILE");
            sql.append(", BOARD_RE_REF, BOARD_RE_LEV, BOARD_RE_SEQ, BOARD_COUNT, BOARD_DATE)");
            sql.append(" VALUES(?,?,?,?,?,?,?,?,?,sysdate)");
 
            // 시퀀스 값을 글번호와 그룹번호로 사용
            int num = board.getBoard_num();
 
            pstmt = conn.prepareStatement(sql.toString());
            pstmt.setInt(1, num);
            pstmt.setString(2, board.getBoard_id());
            pstmt.setString(3, board.getBoard_subject());
            pstmt.setString(4, board.getBoard_content());
            pstmt.setString(5, board.getBoard_file());
            pstmt.setInt(6, num);
            pstmt.setInt(70);
            pstmt.setInt(80);
            pstmt.setInt(90);
            
            int flag = pstmt.executeUpdate();
            if(flag > 0){
  result = true;
  conn.commit();
            }

        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        close();
        return result;    
    } // end boardInsert();
    
    // DB 자원해제
    private void close()
    {
        try {
            if ( pstmt != null ){ pstmt.close(); pstmt=null; }
            if ( conn != null ){ conn.close(); conn=null;    }
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    } // end close()
}
 cs



 BoardCommand.properties


게시판의 명령어를 담아두는 프로퍼티이다. jsp.board.properties 패키지에 프로퍼티 파일을 생성한다.


  • BoardListForm.bo : 상단의 게시판 메뉴를 클릭 시 글목록 화면으로 이동하기 위한 명령어이다.

  • BoardWriteForm.bo : 글쓰기 버튼을 클릭 시 글 작성 화면으로 이동하는 명령어이다.

  • BoardWriteAction.bo : 글 작성 화면에서 등록을 클릭 시 실행되는 명령어이다.


1
2
3
4
5
6
# Form Change
BoardWriteForm.bo=jsp.board.action.BoardFormChangeAction
BoardListForm.bo=jsp.board.action.BoardFormChangeAction
 
BoardWriteAction.bo=jsp.board.action.BoardWriteAction
 
cs




3. 실행결과










4. 소스코드 다운로드 (war 파일)


JSP_DEV.war


RSS구독 링크추가 트위터 이메일 구독