본문 바로가기
Project/myweb_JAVA

03. 답변형 게시판 ① (테이블 생성, DTO, DAO, 게시글 쓰기, 유효성 검사)

by 개발개발빈이 2022. 7. 20.

○ SQL

    - 테이블(tb_bbs) 생성

create table tb_bbs(
  bbsno    number(5)       not null           -- 일련번호 -99999~99999
 ,wname    varchar2(20)    not null           -- 작성자
 ,subject  varchar2(100)   not null           -- 글제목
 ,content  varchar2(2000)  not null           -- 글내용
 ,passwd   varchar2(10)    not null           -- 글비밀번호
 ,readcnt  number(5)       default 0 not null -- 글조회수
 ,regdt    date            default  sysdate   -- 글작성일
 ,grpno    number(5)       not null           -- 글 그룹번호
 ,indent   number(5)       default 0          -- 들여쓰기	
 ,ansnum   number(5)       default 0          -- 글순서
 ,ip       varchar2(15)    not null           -- 글 IP
 ,primary key(bbsno)                          -- bbsno 기본키 
);

    - 시퀀스(bbs_seq) 생성

create sequence bbs_seq;

 

데이터 전송 객체 (DTO; Data Transfer Object)

package net.bbs;

public class BbsDTO {//전송객체

	//멤버변수 field (tb_bbs테이블 칼럼명 기준) 
	private int bbsno;
	private String wname;
	private String subject;
	private String content;
	private String passwd;
	private int readcnt;
  	private String regdt;
  	private int grpno;
  	private int indent; 	
  	private int ansnum;
  	private String ip;
  	
  	//생성자함수 constructor
	public BbsDTO() {	}
	
	//getters and setters
	public int getBbsno() {
		return bbsno;
	}
	public void setBbsno(int bbsno) {
		this.bbsno = bbsno;
	}
	public String getWname() {
		return wname;
	}
	public void setWname(String wname) {
		this.wname = wname;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public int getReadcnt() {
		return readcnt;
	}
	public void setReadcnt(int readcnt) {
		this.readcnt = readcnt;
	}
	public String getRegdt() {
		return regdt;
	}
	public void setRegdt(String regdt) {
		this.regdt = regdt;
	}
	public int getGrpno() {
		return grpno;
	}
	public void setGrpno(int grpno) {
		this.grpno = grpno;
	}
	public int getIndent() {
		return indent;
	}
	public void setIndent(int indent) {
		this.indent = indent;
	}
	public int getAnsnum() {
		return ansnum;
	}
	public void setAnsnum(int ansnum) {
		this.ansnum = ansnum;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	@Override
	public String toString() {
		return "BbsDTO [bbsno=" + bbsno + ", wname=" + wname + ", subject=" + subject 
        		+ ", content=" + content + ", passwd=" + passwd + ", readcnt=" + readcnt 
        		+ ", regdt=" + regdt + ", grpno=" + grpno + ", indent=" + indent 
        		+ ", ansnum=" + ansnum + ", ip=" + ip + "]";
	}	
			
}//class end

 

 데이터 접근 객체 (DAO; Data Access Object)

package net.bbs;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import net.utility.DBclose;
import net.utility.DBopen;

public class BbsDAO {//데이터베이스 관련 작업

    private DBopen dbopen=null;
    private Connection con=null;
    private PreparedStatement pstmt=null;
    private ResultSet rs=null;
    private StringBuilder sql=null;
		
    public BbsDAO() {
        dbopen=new DBopen();
    }//default constructor	
	
    public int create(BbsDTO dto) {
      int cnt=0; //성공 또는 실패 여부 반환
      try {
        con=dbopen.getConnection();//DB연결
        sql=new StringBuilder();
        sql.append(" INSERT INTO tb_bbs(bbsno, wname, subject, content, passwd, ip, grpno) ");
        sql.append(" VALUES(bbs_seq.nextval, ?, ?, ?, ?, ?, (SELECT NVL(MAX(bbsno), 0)+1 FROM tb_bbs)) ");
        pstmt = con.prepareStatement(sql.toString());
        pstmt.setString(1, dto.getWname());
        pstmt.setString(2, dto.getSubject());
        pstmt.setString(3, dto.getContent());
        pstmt.setString(4, dto.getPasswd());
        pstmt.setString(5, dto.getIp());
        cnt=pstmt.executeUpdate();
      } catch (Exception e) {
        System.out.println("행추가 실패: " + e);
      }finally{
        DBclose.close(con, pstmt);
      }//try end
      return cnt;
    }//create() end
    
}//class end

 

공통 코드 (ssi.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%-- ssi.jsp 공통코드 --%>

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="net.bbs.*" %>

<jsp:useBean id="dao" class="net.bbs.BbsDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.bbs.BbsDTO" scope="page"></jsp:useBean>

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

 

○ 게시글 쓰기

    ① 게시글 작성폼 (bbsForm.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsForm.jsp -->
<img src="../images/bbsForm.png" style="margin: auto;" >
<p><a href="bbsList.jsp">[글목록]</a></p>
<div class="container">
  <form name="bbsfrm" id="bbsfrm" method="post" action="bbsIns.jsp" onsubmit="return bbsCheck()">
    <table class="table">
    <tr>
      <th>작성자</th>
      <td>
        <input type="text" name="wname" id="wname" class="form-control" 
        	maxlength="20" required>
      </td>
    </tr>
    <tr>
      <th>제목</th>
      <td>
        <input type="text" name="subject" id="subject" class="form-control" 
        	maxlength="100" required>
      </td>
    </tr>
    <tr>
      <th>내용</th>
      <td>
        <textarea rows="5"  class="form-control" name="content" id="content"></textarea>
      </td>
    </tr>
    <tr>
      <th>비밀번호</th>
      <td>
        <input type="password" name="passwd" id="passwd" class="form-control" 
        	maxlength="10" required>
      </td>
    </tr>
    <tr>
      <td colspan="2" align="center">
        <input id="bbsBtn" type="submit" value="쓰기" class="btn">
        <input id="bbsBtn" type="reset"  value="취소" class="btn">
      </td> 
    </tr>
    </table> 	
  </form>
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

    ② 게시글 작성 프로세스 (bbsIns.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsIns.jsp -->
<h3> 글 작 성 결 과</h3>
<p><a href="bbsForm.jsp">[글쓰기]</a></p>
<p><a href="bbsList.jsp">[글목록]</a></p>
<% 
	//사용자가 입력 요청한 정보를 가져오기
	String wname 	= request.getParameter("wname").trim();
	String subject 	= request.getParameter("subject").trim();
	String content 	= request.getParameter("content").trim();
	String passwd 	= request.getParameter("passwd").trim();
	String ip       = request.getRemoteAddr();  //요청 PC의 IP

	//dto 객체에 담기
	dto.setWname(wname);
	dto.setSubject(subject);
	dto.setContent(content);
	dto.setPasswd(passwd);
	dto.setIp(ip);
	
	int cnt=dao.create(dto);	
	if(cnt==0){
		out.println("<p>글 작성이 실패했습니다</p>");
		out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
	}else{
		out.println("<script>");
		out.println("    alert('게시글이 추가되었습니다');");
		out.println("    location.href='bbsList.jsp';");
		out.println("</script>");
	}//if end
%>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

    ③ 게시글 작성 유효성 검사 (myscript.js)

function bbsCheck(){//게시판 유효성 검사

    //1) 작성자 2글자 이상 입력
    var wname=document.getElementById("wname").value;   //작성자 가져오기
    wname=wname.trim();                                 //좌우 공백 제거하기
    if(wname.length<2){
        alert("작성자는 2글자 이상 입력해 주세요");
        document.getElementById("wname").focus();       //작성자 칸에 커서 생성
        return false;                                   //전송하지 않음
    }//if end    

    //2) 제목 2글자 이상 입력
    var subject=document.getElementById("subject").value;   //제목 가져오기
    subject=subject.trim();                                 //좌우 공백 제거하기
    if(subject.length<2){
        alert("제목은 2글자 이상 입력해 주세요");
        document.getElementById("subject").focus();         //제목 칸에 커서 생성
        return false;                                       //전송하지 않음
    }//if end

    //3) 내용 2글자 이상 입력
    var content=document.getElementById("content").value;   //내용 가져오기
    content=content.trim();                                 //좌우 공백 제거하기
    if(content.length<2){
        alert("제목은 2글자 이상 입력해 주세요");
        document.getElementById("content").focus();         //내용 칸에 커서 생성
        return false;                                       //전송하지 않음
    }//if end

    //4) 비밀번호는 4글자 이상이면서, 숫자형 기호만 입력
	var passwd=document.getElementById("passwd").value;
    passwd=passwd.trim();
    if(passwd.length<4 || isNaN(passwd)){
        alert("비밀번호는 4글자 이상 숫자로 입력해 주세요");
        document.getElementById("passwd").focus();         //비밀번호 칸에 커서 생성
        return false;   
    }//if end

    return true;    //onsubmit 이벤트에서 서버로 전송
	
}//bbsCheck() end

댓글