본문 바로가기
카테고리 없음

JSP게시판 - BoardWriteProc, 게시글 등록

by avvin 2019. 5. 8.

JSP게시판 - BoardWriteProc, 게시글 등록


[게시글 쓰기] 작성 순서


글쓰기 > 글쓰기 처리 > 글쓰기 저장 > 전체게시글 보기


작성한 내용을 jsp에서 읽어들이고 boardDAO로 넘겨 게시글을 등록하기





BoardWriteProc 페이지에서 입력한 데이터를 DB에 저장하는 boardDAO.insertBoard ( BoardBean boardbean ) 메서드를 호출한다.



BoardWriteProc.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@page import="model.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
 
    <!-- 게시글 작성한 데이터를 한번에 읽어들임 (1:1 맵핑) 없는 요소는 null로 들어감-->
 
    <jsp:useBean id="boardbean" class="model.BoardBean">
        <jsp:setProperty name="boardbean" property="*" />
    </jsp:useBean>
 
    <%
        //데이터베이스쪽으로 빈클래스 넘겨주기
        //DAO객체 생성
        BoardDAO bdao = new BoardDAO();
        //데이터 저장(게시판 정보 삽입) 메서드 호출
        bdao.insertBoard(boardbean);
    %>
</body>
</html>
cs




insertBoard()에서는 

boardbean이 null로 맵핑한 필드들을 알맞은 값으로 초기화해줘야한다.


ref 글 그룹(NUMBER) : 0으로 초기화, 쿼리를 실행시켜서 가장 큰 ref 값에 +1 더하여 글 그룹 번호 부여

re_step 글 스텝(NUMBER) : 1로 초기화, 새 글 = 최상위 글이니 1부터 시작

re_level 글 레벨(NUMBER) : 1로 초기화 


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
package model;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
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");
            // 데이터소스 객체(javax.sql.DataSource)를 선언
            // server.xml Context Resource에서 설정한 name을 매개값으로 준다.
            DataSource ds = (DataSource) envctx.lookup("jdbc/pool");
            // Resource이름을 매개값으로 주어 DataResource객체를 리턴
 
            // 외부에서 데이터를 읽어들이는 Context 객체를 생성
            // 그 객체의 lookup메서드로 톰캣서버정보를 읽어들이고
            // 톰캣서버정보를 읽어들인 객체의 lookup메서드 리소스이름을 매개값으로 주어
            // 데이터소스객체(커넥션풀 사용할때 쓰기로한 객체)를 얻는다
            // (커넥션풀)데이터소스를 이용하여 접속
            con = ds.getConnection();
 
        } catch (Exception e) {
 
            e.printStackTrace();
        }
 
    }
    
    //하나의 새로운 게시글이 넘어와서 저장되는 메서드
    public void insertBoard(BoardBean boardbean) {
        
        getCon();
        //빈클래스에 넘어오지 않았던 데이터들을 초기화해주어야한다.
        //글 그룹: 쿼리를 실행시켜서 가장 큰 red 값에 +1 더하여 글 그룹 번호 부여하면 된다.
        int ref = 0
        //글 
        int re_step=1;
        int re_level =1;
        
        try {
            //가장 큰 ref값을 읽어오는 쿼리 준비
            String refsql = "select max(ref) from board";
            //쿼리 실행 객체
            pstmt = con.prepareStatement(refsql);
            //쿼리 실행 후 결과 리턴, 리턴받은 결과는 ResultSet 객체로 받는다.
            rs = pstmt.executeQuery();
            if(rs.next()) { //쿼리 결과값이 있다면
                //DB에 있는 ref 최대값에 1더하여 글그룹 NUMBER 부여
                ref = rs.getInt(1)+1
            }
            //실제로 게시글 전체값을 테이블에 저장
            //만들어둔 board_seq 시퀀스  사용, 
            //NEXTVALUE : 시퀀스에 들어가 있는 값에 자동으로 1씩(설정한 만큼) 증가시켜 다음 값에 저장
            //sysdate : 현재 시스템에서 읽은 날짜 데이터
            // ref, re_step, re_level을 ? 대신 넣는게 아니라 pstmt로 데이터 set시켜줘야함
            //readcount는 초기값인 0을 준다. //????
            String sql = "insert into board values(board_seq.NEXTVAL,?,?,?,?, sysdate,?,?,?,0,?)";
            pstmt = con.prepareStatement(sql);
            //?에 값을 맵핑
            pstmt.setString(1,boardbean.getWriter());
            pstmt.setString(2,boardbean.getEmail());
            pstmt.setString(3,boardbean.getSubject());
            pstmt.setString(4,boardbean.getPassword());
            pstmt.setInt(5,ref);
            pstmt.setInt(6,re_step);
            pstmt.setInt(7,re_level);
            pstmt.setString(8, boardbean.getContent());
            //쿼리 실행
            //쿼리 실행 후 결과 리턴은 executeQuery(), 
            //데이터 업데이트는 executeUpdate()
            pstmt.executeUpdate();
            //자원 반납
            con.close();
            
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
 
}
cs