본문 바로가기
DEV Heart

[ MVC 1 게시판 ] #2 글쓰기 (WriteForm)

by 로띠 2021. 9. 8.

Q1. 게시판 글쓰기

DB연동으로 게시판에서 작성한 글이 저장되게 한다 

 

 

[ 게시판 구성 파일 ] 

 글쓰기에 필요한 1~5까지 사용

 

 1. Board.sql 

 2. DataBean.java_(class)

 3. DBBean.java _(class)

 4. writeForm.jsp

 5. writePro.jsp

 

 

 


 

 

1. Board.sql 

 

    게시물 작성 시 필요항목들로 구성된 table을 생성 (오라클)

 

-- 테이블 board 생성
create table board(
num number(4) primary key,
writer varchar2(10) not null,
email varchar2(30),
subject varchar2(50) not null,
passwd varchar2(12) not null,
reg_date date not null,
readcount number(4) DEFAULT 0,
ref number(2) not null,
re_step number(2) not null,
re_level number(2) not null,
content varchar2(500) not null,
ip varchar2(20) not null
);


-- 시퀀스 seq_board 생성 (게시판 num값 순차적으로 번호 할당)
create sequence seq_board
increment by 1
start with 1
nocycle;

 

 

 

 2. DataBean.java_(class)

 

    view에서 클라이언트가 입력할 항목 및 시스템 시간 등 선언

package board;

import java.sql.Timestamp;

public class BoardDataBean {
	private int num;
	private String writer;
	private String subject;
	private String email;
	private String content;
	private String passwd;
	private Timestamp reg_date;
	private int readcount;
	private String ip;
	private int ref;
	private int re_step;
	private int re_level;
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
// getter setter 생략. 위 getNum 과 setNum처럼 모두 생성
// source -> getter / setter .... -> select all
}

 

 

 

 

 3. DBBean.java _(class)

 

    커넥션 풀을 이용한 DB연동

    web.xml 등 사전 정의를 해두어야 lookup으로 찾을 수 있다.

 

package board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BoardDBBean {
	
    private static BoardDBBean instance = new BoardDBBean();
    //.jsp페이지에서 DB연동빈인 BoardDBBean클래스의 메소드에 접근시 필요
    public static BoardDBBean getInstance() {
        return instance;
    }
    
    private BoardDBBean() {}
    
    //커넥션풀로부터 Connection객체를 얻어냄
    private Connection getConnection() throws Exception {
        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
        DataSource ds = (DataSource)envCtx.lookup("jdbc/basicjsp");
        return ds.getConnection();
    }
 
    //board테이블에 글을 추가(inset문)<=writePro.jsp페이지에서 사용
    public void insertArticle(BoardDataBean article) 
            throws Exception {
        Connection conn = null;
        PreparedStatement pstmt = null;
		ResultSet rs = null;

		int num=article.getNum();
		int ref=article.getRef();
		int re_step=article.getRe_step();
		int re_level=article.getRe_level();
		int number=0;
        String sql="";

        try {
            conn = getConnection();

            pstmt = conn.prepareStatement("select max(num) from board");
			rs = pstmt.executeQuery();
			
			if (rs.next())
		      number=rs.getInt(1)+1;
		    else
		      number=1; 
		   
		    if (num!=0) {  
		      sql="update board2 set re_step=re_step+1 ";
		      sql += "where ref= ? and re_step> ?";
              pstmt = conn.prepareStatement(sql);
              pstmt.setInt(1, ref);
			  pstmt.setInt(2, re_step);
			  pstmt.executeUpdate();
			  re_step=re_step+1;
			  re_level=re_level+1;
		     }else{
		  	  ref=number;
			  re_step=0;
			  re_level=0;
		     }	 
            // 쿼리를 작성
            sql = "insert into board(num,writer,email,subject,passwd,reg_date,";
		    sql+="ref,re_step,re_level,content,ip) values(seq_board.nextval,?,?,?,?,?,?,?,?,?,?)";

            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, article.getWriter());
            pstmt.setString(2, article.getEmail());
            pstmt.setString(3, article.getSubject());
            pstmt.setString(4, article.getPasswd());
			pstmt.setTimestamp(5, article.getReg_date());
            pstmt.setInt(6, ref);
            pstmt.setInt(7, re_step);
            pstmt.setInt(8, re_level);
			pstmt.setString(9, article.getContent());
			pstmt.setString(10, article.getIp());
			
            pstmt.executeUpdate();
        } catch(Exception e) {
        	System.out.println("insertArticle(BoardDataBean article) 익셉션 발생");
            e.printStackTrace();
        } finally {
			if (rs != null) try { rs.close(); } catch(SQLException ex) {}
            if (pstmt != null) try { pstmt.clearParameters(); } catch(SQLException ex) {}
            if (conn != null) try { conn.close(); } catch(SQLException ex) {}
        }
    }
}

 

 

 

 

 4. writeForm.jsp

 

     클라이언트에게 보여질 form

     게시글 번호 등을 위한 java문이 섞여있다 <% %>

     action="write.pro.jsp" 이기 때문에 처리하는 로직은 그 곳에서 한다

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>게시판</title>
</head>

<body>
    <% 
      int num = 0, ref = 1, re_step = 0, re_level = 0;
      String strV = "";
      try{
        if(request.getParameter("num")!=null){
           num=Integer.parseInt(request.getParameter("num"));
           ref=Integer.parseInt(request.getParameter("ref"));
           re_step=Integer.parseInt(request.getParameter("re_step"));
           re_level=Integer.parseInt(request.getParameter("re_level"));
        }
    %>
<p>글쓰기</p>
    <form method="post" name="writeform" action="writePro.jsp" onsubmit="return writeSave()">
        <input type="hidden" name="num" value="<%=num%>">
        <input type="hidden" name="ref" value="<%=ref%>">
        <input type="hidden" name="re_step" value="<%=re_step%>">
        <input type="hidden" name="re_level" value="<%=re_level%>">

        <table>
            <tr>
                <td align="right" colspan="2">
                	<a href="list.jsp"> 글목록</a> 
                </td>
            </tr>
	    <tr>
                <td  width="70" align="center">이 름</td>
                <td  width="330" align="left">
                	<input type="text" size="10" maxlength="10" name="writer" >
                </td>
            </tr>
	    <tr>
                <td  width="70" align="center" >제 목</td>
                <td  width="330" align="left">
                    <%
                      if(request.getParameter("num")==null) 
                         strV = "";
                      else
                         strV = "[답변]";
                    %>
		  <input type="text" size="40" maxlength="50" name="subject" value="<%=strV%>">
                </td>	
			</tr>
            <tr>
                <td  width="70" align="center">Email</td>
                <td  width="330" align="left">
		  <input type="text" size="40" maxlength="30" name="email"> </td>
            </tr>
            <tr>
                <td  width="70" align="center" >내 용</td>
                <td  width="330" align="left">
		  <textarea name="content" rows="13" cols="40"> </textarea> </td>
            </tr>
            <tr>
                <td  width="70" align="center" >비밀번호</td>
                <td  width="330" align="left">
                  <input type="password" size="8" maxlength="12" name="passwd">
                </td>
            </tr>
            <tr>      
                <td colspan=2 align="center"> 
                    <input type="submit" value="글쓰기" >  
                    <input type="reset" value="다시작성">
                    <input type="button" value="목록보기" OnClick="window.location='list.jsp'">
                </td>
            </tr>
        </table>    
        <%
          }catch(Exception e){}
        %>     
	</form>    
</body>
</html>

 

 

 

 5. writePro.jsp

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "board.BoardDBBean" %>
<%@ page import = "java.sql.Timestamp" %>

<%
request.setCharacterEncoding("utf-8");
%>

<jsp:useBean id="article" scope="page" class="board.BoardDataBean">
   <jsp:setProperty name="article" property="*"/>
</jsp:useBean>
 
<%
 article.setReg_date(new Timestamp(System.currentTimeMillis()) );
 	article.setIp(request.getRemoteAddr());

 	 BoardDBBean dbPro = BoardDBBean.getInstance();
     dbPro.insertArticle(article); 

     response.sendRedirect("list.jsp");
 %>