19.05.25 jsp 게시판 쓰기 (model 2 동영상 16강)

Back-End/JSP 2019. 5. 25. 20:19
728x90
반응형

게시판 글쓰기 구현




BoardWriteForm.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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
    <center>
        <h2>게시글 쓰기</h2>
        <!-- 컨트롤러가 읽어들이게끔 페이지 이동시킴 -->
        <form action="BoardWriteProcCon.do" method="post">
            <table width="600" border="1" bordercolor="gray" bgcolor="skyblue">
                <!-- bordercolor는 선색깔 지정 -->
                <tr height="40">
                    <td align="center" width="150">작성자</td>
                    <!-- ref는 데이터베이스에서 처리하기 때문에 따로 받지 않는다. -->
                    <td width="450"><input type="text" name="writer" size="60"></td>
                </tr>
 
                <tr height="40">
                    <td align="center" width="150">제목</td>
                    <td width="450"><input type="text" name="subject" size="60"></td>
                </tr>
 
                <tr height="40">
                    <td align="center" width="150">이메일</td>
                    <td width="450"><input type="text" name="email" size="60"></td>
                </tr>
 
                <tr height="40">
                    <td align="center" width="150">비밀번호</td>
                    <td width="450"><input type="password" name="password"
                        size="61"></td>
                </tr>
 
                <tr height="40">
                    <td align="center" width="150">글내용</td>
                    <td width="450"><textarea rows="10" cols="50" name="content"></textarea></td>
                </tr>
 
                <tr height="40">
                    <td align="center" colspan="2"><input type="submit"
                        value="글쓰기"> &nbsp;&nbsp; <input type="reset" value="다시작성">
                        &nbsp;&nbsp;
                        <button onclick="location.href='BoardListCon.do'">전체 게시글 보기</button>
                        <!-- 클릭하면 BoardList.jsp페이지로 넘어가는 버튼--></td>
                </tr>
            </table>
        </form>
    </center>
</body>
</html>
 
cs



BoardWriteProcCon.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
package control;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import model.BoardBean;
import model.BoardDAO;
 
/**
 * Servlet implementation class BoardWriteProcCon
 */
// 글쓰기 처리 서블릿 선언
@WebServlet("/BoardWriteProcCon.do")
public class BoardWriteProcCon extends HttpServlet {
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("euc-kr");
        // 빈 클래스로 데이터를 읽어들인다.
        BoardBean bean = new BoardBean();
 
        // 5개의 값을 빈 클래스에 저장시킨다.
        bean.setWriter(request.getParameter("writer"));
        bean.setSubject(request.getParameter("subject"));
        bean.setEmail(request.getParameter("email"));
        bean.setPassword(request.getParameter("password"));
        bean.setContent(request.getParameter("content"));
 
        BoardDAO bdao = new BoardDAO();
        // insert메소드에 매개값으로 빈클래스가 가지고있는 값들을 넣어준다.
        bdao.insertBoard(bean);
 
        // BoardListCon.do로 request, response를 전달한다.
        RequestDispatcher dis = request.getRequestDispatcher("BoardListCon.do");
        dis.forward(request, response);
    }
}
 
cs



BoardListCon.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 control;
 
import java.io.IOException;
import java.util.Vector;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import model.BoardBean;
import model.BoardDAO;
 
/**
 * Servlet implementation class BoardListCon
 */
//웹 서블릿 url 설정
@WebServlet("/BoardListCon.do")
public class BoardListCon extends HttpServlet {
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        reqPro(request, response);
    }
 
    protected void reqPro(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // jsp쪽에서 출력되게끔 자료를 넘겨주어야 한다.
 
        // 화면에 보여질 게시글의 개수를 지정
        int pageSize = 10;
 
        // 현재 보여지고 있는 페이지의 넘버값을 읽어들인다.
        String pageNum = request.getParameter("pageNum");
 
        // null 처리
        if (pageNum == null) {
            pageNum = "1";
        }
        // 전체 게시글의 갯수
        int count = 0;
        // jsp 페이지 내에서 보여질 넘버링 숫자값을 저장하는 변수 선언
        int number = 0;
 
        // 현재 보여지고 있는 페이지 문자를 숫자로 변환
        int currentPage = Integer.parseInt(pageNum);
        // 전체 게시글의 갯수를 가져와야 하기에 데이터베이스 객체 생성
        BoardDAO bdao = new BoardDAO();
        count = bdao.getAllCount();
 
        // 현재 보여질 페이지 시작 번호를 설정
        int startRow = (currentPage - 1* pageSize + 1;
        int endRow = currentPage * pageSize;
 
        // 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출
        Vector<BoardBean> v = bdao.getAllBoard(startRow, endRow);
        number = count - (currentPage - 1* pageSize;
 
        // BoardList.jsp 쪽으로 request 객체에 담아서 넘겨준다.
        request.setAttribute("v", v);
        request.setAttribute("number", number);
        request.setAttribute("pageSize", pageSize);
        request.setAttribute("count", count);
        request.setAttribute("currentPage", currentPage);
 
        // BoardList를 통해 forward를 시킨다.
        RequestDispatcher dis = request.getRequestDispatcher("BoardList.jsp");
        dis.forward(request, response);
 
    }
}
 
cs



BoardDAO.java (DB연결)

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
package model;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
 
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
public class BoardDAO {
 
    Connection con;
    PreparedStatement pstmt;
    ResultSet rs;
 
    // 데이터 베이스에 연결 메소드
    public void getCon() {
        try {
            Context initctx = new InitialContext();
            Context envctx = (Context) initctx.lookup("java:comp/env");
            // 타입이 데이터 소스이므로 데이터소스로 (타입변환해서) 받는다.
            DataSource ds = (DataSource) envctx.lookup("jdbc/pool");
            // 얻은 데이터소스를 사용해 연결한다.
            con = ds.getConnection(); // 커넥션 연결 해주는 메소드
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 전체 게시글의 갯수를 리턴하는 메소드
    public int getAllCount() {
        getCon();
        // 개시글의 갯수를 세야하기 때문에 카운트 변수를 추가하고 초기값을 선언한다.
        int count = 0;
 
        try {
            // sql 쿼리 준비함
            String sql = "select count(*) from board";
            pstmt = con.prepareStatement(sql);
            // ?표가 없으므로 바로 결과실행후 리턴시켜주면 된다.
            rs = pstmt.executeQuery();
            // 전체게시글은 한칸에서 밖에 출력이 되지 않으므로 1칸만 있으면 된다. 반복문 말고 if문으로 사용한다.
            if (rs.next()) { // 데이터가 있다면 카운트에 넣는다.
                // 전체 게시글 수
                count = rs.getInt(1);
            }
            con.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }
 
    // 화면에 보여질 데이터를 10개씩 추출해서 리턴하는 메소드
    public Vector<BoardBean> getAllBoard(int startRow, int endRow) {
        // 리턴할객체 선언
        getCon();
        Vector<BoardBean> v = new Vector<>();
        try {
            // 쿼리 작성
            String sql = "select * from (select A.*, Rownum Rnum from (select * from board order by ref desc, re_step asc)A)"
                    + "where Rnum >= ? and Rnum <= ?";
            // 쿼리 실행할 객체를 선언
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, startRow);
            pstmt.setInt(2, endRow);
            // 쿼리실행후 결과 저장
            rs = pstmt.executeQuery();
            // 데이터 개수가 몇개인지 모르기에 반복문을 이용하여 데이터를 추출
            while (rs.next()) {
                // 데이터를 패키징 ( BoardBean 클래스를 이용) 해줌
                BoardBean bean = new BoardBean();
                bean.setNum(rs.getInt(1));
                bean.setWriter(rs.getString(2));
                bean.setEmail(rs.getString(3));
                bean.setSubject(rs.getString(4));
                bean.setPassword(rs.getString(5));
                bean.setReg_date(rs.getDate(6).toString());
                bean.setRef(rs.getInt(7));
                bean.setRe_step(rs.getInt(8));
                bean.setRe_level(rs.getInt(9));
                bean.setReadcount(rs.getInt(10));
                bean.setContent(rs.getString(11));
                // 패키징한 데이터를 벡터에 저장
                v.add(bean);
            }
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }
 
    // 하나의 게시글을 저장하는 메소드 호출
    public void insertBoard(BoardBean bean) {
 
        getCon();
        // 초기값 지정
        int ref = 0;
        int re_step = 1;// 새글이기에
        int re_level = 1;// 새글이기에
 
        try {
            // 쿼리 작성
            // 이 sql에서 1만 더하면 되기때문에 가장큰값을 검색
            String refsql = "select max(ref) from board";
            pstmt = con.prepareStatement(refsql);
            // 쿼리 실행후 결과를 리턴
            rs = pstmt.executeQuery();
            if (rs.next()) {
                ref = rs.getInt(1+ 1// ref가장 큰 값에 1을 더해줌
                // 최신글은 글번호가 가장 크기 때문에 원래 있던 글에서 1을 더해줌
 
            }
            // 데이터를 삽입하는 쿼리
            String sql = "insert into board values(board_seq.NEXTVAL,?,?,?,?,sysdate,?,?,?,0,?)";
            pstmt = con.prepareStatement(sql);
            // ?에 값을 매핑한다.
            pstmt.setString(1, bean.getWriter());
            pstmt.setString(2, bean.getEmail());
            pstmt.setString(3, bean.getSubject());
            pstmt.setString(4, bean.getPassword());
            pstmt.setInt(5, ref);
            pstmt.setInt(6, re_step);
            pstmt.setInt(7, re_level);
            pstmt.setString(8, bean.getContent());
 
            pstmt.executeUpdate();
            con.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}
cs



728x90
반응형
: