19.05.09 계층형 게시판 (게시물 쓰기 구현)-책

Back-End/JSP 2019. 5. 9. 23:54
728x90
반응형

-계층형 게시판의 전체적인 구조-

 

브라우저 <-> jsp 파일 <-> 자바&빈즈 <-> 데이터베이스

(<->는 요청과 응답)

 

 

 

-소스파일 목록-

 

JSP

 * list.jsp (리스트 페이지)

 * post.jsp (쓰기 페이지)

 * read.jsp (읽기 페이지)

 * download.jsp (첨부파일 다운로드 페이지)

 * delete.jsp (삭제 페이지)

 * update.jsp (수정 페이지)

 * reply.jsp (답변 페이지)

서블릿

 

 * BoardPostServlet.java (쓰기 처리 서블릿)

 * BoardUpdatetServlet.java (수정 처리 서블릿)

 * BoardReplyServlet.java (답변 처리 서블릿)

 

기타 파일

 * style.css (스타일 시트 파일)

자바와 빈즈 

 

 1. BoardBean.java (게시판 자바 빈즈)

 2. BoardMgr.java (게시판 SQL문 처리 자바 파일)

 3. DBConnectionMgr.java (데이터베이스 연결 Connectionpool 자바 파일)

 4. UtilMgr.java (유틸 자바 파일)

 

 (컴파일 순서 : 1 -> 2 -> 3 -> 4)

 

 

 

 

-테이블 설계-

 

 칼럼명

데이터타입 

 

설명

 

num

 int(11)

 게시물의 유일성을 보장하는 게시번호를 저장하는 칼럼입니다.

 num값은 유일한 값 이므로 주키(primary key)와 자동적으로 증가하는

 auto_increment 속성으로 지정하였음

name

 varchar(20)

 게시물의 작성자 이름을 저장하는 칼럼입니다

subject

 varchar(50) 

 게시물의 제목을 저장하는 칼럼입니다. 

content 

 text 

 게시물의 본문 내용을 저장하는 칼럼입니다. 

pos 

 smallint(7) unsigned

 게시물의 상대적인 위치 값을 저장하여 화면에 순서대로 뿌려주는 

 역할을 담당하는 칼럼 입니다. 

ref 

 smallint(7)

 게시물이 답변 글일 경우 소속된 부모 글을 가리키는 번호를 저장하는 칼럼 입니다.

depth 

 smallint(7) unsigned

 게시물이 작성된 날짜를 저장하는 칼럼입니다.

regdate 

 date

 회원의 주소를 저장하는 칼럼입니다.

pass

 varchar(15) 

 게시물 작성자의 패스워드를 저장하는 칼럼입니다.

ip 

 varchar(15) 

 게시물을 저장할 때 작성자의 IP주소를 저장하는 칼럼입니다.

count 

 smallint(7) unsigned 

 게시물의 조회수를 저장하는 칼럼입니다.

filename 

 varchar(30) 

 업로드 된 파일의 이름을 저장하는 칼럼입니다.

filesize

 int(11) 

 업로드 된 파일의 크기를 저장하는 칼럼입니다.

 

 

 

  AUTO-IN CREMENT

 

  mysql에서 정수형으로 선언된 칼럼의 값이 한 행이 입력될 때 마다 자동적으로 증가하여 저장이 되는 속성입니다.

  기본값은 초기 값이 1이고 증가 값도 1입니다.

  AUTO_INCREMENT 속성으로 지정된 테이블은 INSERT 문에서 칼럼을 지정하지 않아도 자동으로 입력됩니다. (카운트되는 속성에 사용)

 

 

 

-mysql 테이블 생성-

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE tblBoard(
num INT(11NOT NULL AUTO_INCREMENT,
name VARCHAR(20),
subject VARCHAR(50),
content TEXT,
pos SMALLINT(7UNSIGNED,
ref SMALLINT(7),
depth SMALLINT(7UNSIGNED,
regdate DATE,
pass VARCHAR(15),
ip VARCHAR(15),
COUNT SMALLINT(7UNSIGNED,
filename VARCHAR(30),
filesize INT(11),
PRIMARY KEY(num)
);
cs

 

 

한글 깨짐 방지를 위한 문자셋 수정추가함

1
2
ALTER TABLE tblBoard
COLLATE UTF8_GENERAL_CI;
cs

 

 

 

-게시판의 쓰기, 읽기, 삭제 기능 구현-

 

 쓰기

   1. post.jsp 페이지에서 게시물을 입력하고,

   2. BoardPostServlet.java 서블릿에서 데이터베이스에 저장되는 부분을 처리함

   3. 게시물의 저장이 완료되면 자동적으로 게시판 읽기 기능을 담당하는 list.jsp 페이지로 이동

 읽기

   4. list.jsp 페이지에서 게시물의 제목을 클릭하면 게시판 읽기 기능을 담당하는 read.jsp 페이지로 이동

 삭제

   5. read.jsp 페이지에서 삭제를 클릭하여 delete.jsp 페이지로 이동하면 게시물의 비밀번호 입력란이 나오는데

      입력한 비밀번호가 일치하면 데이터베이스에 저장되어 있는 게시물을 삭제되고 list.jsp 페이지로 이동

      하지만, 일치하지 않으면 다시 비밀번호를 물어본다.

 

 

 

 

  -enctype 속성-

 

  <form> 태그의 속성인 method, action, enctype 등은 입력받은 데이터를 어떻게 처리할 것인지 세부적으로 설정하는데 사용된다.

  method는 전송 방식, action은 전송 목적지, enctype는 전송되는 데이터 형식을 설정한다.

 

  enctype 속성은 다음 세가지의 값으로 지정될 수 있다.

 

 

  1. application/www-form-urlencoded

 

  디폴트 값이다. enctype을 따로 설정하지 않으면 이 값이 설정된다.

  폼데이터는 서버로 전송되기 전에 URL-Encode 된다.

 

  2. multipart/form-data

 

  파일이나 이미지를 서버로 전송할 경우 이 방식을 사용한다.

  그렇게 하지 않으면 웹 서버로 데이터를 넘길때 파일의 경로명만 전송되고 파일 내용이 전송되지 않기 때문이다.

  그리고 이때 메소드는 post 값으로 지정해줘야 한다.

 

  3. text/plain

 

  이 형식은 인코딩을 하지 않은 문자 상태로 전송한다. 

 

 

 

 

게시물 쓰기 기능 구현

 

 

post.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
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>JSP Board</title>
<link href="style.css" rel="stylesheet" type="text/css">
<!-- 게시글 입력창 디자인 설정 -->
</head>
<body bgcolor="#FFFFCC">
    <div align="center">
        <br />
        <br />
        <table width="600" cellpadding="3">
            <tr>
                <td bgcolor="84F399" height="25" align="center">글쓰기</td>
            </tr>
        </table>
        <form name="postFrm" method="post" action="boardPost"
            enctype="multipart/form-data">
            <!-- 서블릿 BoardPostServlet의 매핑으로 설정된 boardPost 호출 -->
            <table width="600" cellpadding="3" align="center">
                <!-- cellpadding는 셀과 글의 사이 간격을 지정 -->
                <tr>
                    <td align=center>
                        <table align="center">
                            <tr>
                                <td width="20%">성 명</td>
                                <td width="80%"><input name="name" size="10" maxlength="8"></td>
                                <!-- 성명안에 들어갈수 있는 문자의 길이를 8칸으로 한다. -->
                            </tr>
 
                            <tr>
                                <td>제 목</td>
                                <td><input name="subject" size="50" maxlength="30"></td>
                                <!-- 제목안에 들어갈수 있는 문자의 길이를 30칸으로 한다. -->
                            </tr>
 
                            <tr>
                                <td>내 용</td>
                                <td><textarea name="content" rows="10" cols="50"></textarea></td>
                            </tr>
 
                            <tr>
                                <td>비밀 번호</td>
                                <td><input type="password" name="pass" size="15"
                                    maxlength="30"></td>
                            </tr>
 
                            <tr>
                                <td>파일 찾기</td>
                                <td><input type="file" name="filename" size="50"
                                    maxlength="50"></td>
                            </tr>
                            <!-- file는 파일 불러오기 창을 띄우는 기능을 제공한다.-->
                            <tr>
                                <td>내용 타입</td>
                                <!-- 내용의 타입을 HTML과 TEXT를 선택할수 있도록 만들어준다. -->
                                <td>HTML<input type=radio name="contentType" value="HTTP">&nbsp;&nbsp;&nbsp;
                                    TEXT<input type=radio name="contentType" value="TEXT" checked>
                                </td>
                            </tr>
                            <tr>
                                <td colspan="2"><hr /></td>
                            </tr>
                            <tr>
                                <td colspan="2">
                                    <!-- 하단에 다른페이지로 넘어갈 버튼들을 만든다. --> <input type="submit"
                                    value="등록"> <input type="reset" value="다시쓰기"> <input
                                    type="button" value="리스트"
                                    onClick="javascript:location.href='list.jsp'">
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
            <input type="hidden" name="ip" value="<%=request.getRemoteAddr()%>">
            <!-- 게시물을 등록한 사용자의 ip주소를 가져온다. -->
        </form>
    </div>
</body>
</html>
cs

 

 

BoardPostServlet.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 ch15;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
                                        //게시물 쓰기 처리 서블릿
@WebServlet("/ch15/boardPost")//서블릿을 사용하기 위한 맵핑 이름을 선언한다.
public class BoardPostServlet extends HttpServlet{//HttpServlet를 상속받음
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException{//post.jsp에서 form의 method가 post이기 때문에 서블릿의

                                                        doPost를 호출

        request.setCharacterEncoding("EUC-KR"); //post.jsp 에서 입력받은 문자열의 한글 인코딩 설정
        BoardMgr bMgr = new BoardMgr(); //문자를 입력하기 위해 BoardMgr 객체를 생성하고 insert메소드를 호출
        bMgr.insertBoard(request);
        response.sendRedirect("list.jsp"); //tblBoard 테이블에 저장후에 list.jsp 페이지로 응답한다.    
    }
}
 

cs

 

 

 

-------미완성-----

728x90
반응형
: