Project/myweb_JAVA

05. 답변형 게시판 ③ (게시글 삭제, 게시글 수정, 답변 쓰기)

개발개발빈이 2022. 7. 26. 16:52

○ 게시글 삭제

    ① DAO : BbsDAO.java

public int delete(BbsDTO dto) {
    int cnt=0;
    try {
        con=dbopen.getConnection();//DB연결
        sql=new StringBuilder();
        sql.append(" DELETE FROM tb_bbs ");
        sql.append(" WHERE bbsno=? AND passwd=? ");
        pstmt = con.prepareStatement(sql.toString());
        pstmt.setInt(1, dto.getBbsno());
        pstmt.setString(2, dto.getPasswd());
        cnt=pstmt.executeUpdate();
    }catch (Exception e) {
        System.out.println("삭제 실패: " + e);
    }finally{
        DBclose.close(con, pstmt);
    }//try end
    return cnt;
}//delete() end

 

    ② 뷰단 : bbsDel.jsp → 게시글 삭제 전에 비밀번호 확인하는 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsDel.jsp -->
<!-- 글번호(bbsno)와 비밀번호(passwd)가 일치하면 삭제 -->
<!-- bbsDel.jsp : 비밀번호 입력 페이지 작성 -->
<% 	
  //삭제하고자 하는 행번호
  int bbsno=Integer.parseInt(request.getParameter("bbsno"));
%>
<img src="../images/bbsDel.png" style="margin: auto;" >
<p>
  <a href="bbsList.jsp">[글목록]</a>
</p>
<div class="container">
  <form method="post" action="bbsDelProc.jsp" onsubmit="return pwCheck()">
    <input type="hidden" name="bbsno" value="<%=bbsno%>">
      <table class="table">
      <tr>
        <th>비밀번호</th>
        <td>
          <input type="password" class="form-control" name="passwd" id="passwd" required>
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <input id="bbsBtn" type="submit" value="삭제" class="btn">
        </td>
      </tr>
      </table>
    </form>
</div>

<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

    ③ 유효성체크 : myscript.js → 비밀번호 입력 관련 유효성 체크

function pwCheck(){

    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

    var message="삭제된 내용은 복구되지 않습니다.\n계속 진행할까요?";
    if(confirm(message)){//확인true, 취소flase
        return true;//서버로 전송
    }else{
        return false; 
    }//if end

}//pwCheck() end

 

    ④ 뷰단 : bbsDelProc.jsp → 비밀번호 일치 시 글 삭제 프로세스 실행

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsDelProc.jsp -->
<h3> 글 삭 제 결 과</h3>
<% 
  //사용자가 입력 요청한 정보를 가져오기
  String passwd = request.getParameter("passwd").trim();
  int    bbsno  = Integer.parseInt(request.getParameter("bbsno").trim());	

  //dto 객체에 담기
  dto.setBbsno(bbsno);
  dto.setPasswd(passwd);
	
  int cnt = dao.delete(dto);
  if(cnt==0){
    out.println("<p>비밀번호가 일치하지 않습니다</p>");
    out.println("<p><a href='bbsList.jsp'>[글목록]</a></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"%>

 

○ 게시글 수정

    ① DAO : BbsDAO.java

public int updateproc(BbsDTO dto) {
  int cnt=0; //성공 또는 실패 여부 반환
  try {
    con=dbopen.getConnection();//DB연결

    sql=new StringBuilder();
    sql.append(" UPDATE tb_bbs ");
    sql.append(" SET wname=?, subject=?, content=?, ip=? ");
    sql.append(" WHERE bbsno=? AND passwd=? ");

    pstmt = con.prepareStatement(sql.toString());
    pstmt.setString(1, dto.getWname());
    pstmt.setString(2, dto.getSubject());
    pstmt.setString(3, dto.getContent());
    pstmt.setString(4, dto.getIp());
    pstmt.setInt(5, dto.getBbsno());
    pstmt.setString(6, dto.getPasswd());

    cnt=pstmt.executeUpdate();
  } catch (Exception e) {
    System.out.println("글수정 실패: " + e);
  }finally{
    DBclose.close(con, pstmt);
  }//try end
  return cnt;
}//updateProc() end

 

    ② 뷰단 : bbsUpdate.jsp → 글번호가 일치하는 행을 가져와서 폼에 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsUpdate.jsp -->
<img src="../images/bbsUpdate.png" style="margin: auto;" >
<p><a href="bbsList.jsp">[글목록]</a></p>
<% 	
  //수정하고자 하는 행번호
  int bbsno=Integer.parseInt(request.getParameter("bbsno"));
  dto=dao.read(bbsno);
  if(dto==null){
    out.println("해당 글 없음");
  }else{
%>
  <div class="container">
    <form name="bbsfrm" id="bbsfrm" method="post" 
          action="bbsUpdateProc.jsp" onsubmit="return bbsCheck()"> 
      <input type="hidden" name="bbsno" value="<%=bbsno%>">	<!-- 수정하고자 하는 글 번호 -->
      <table class="table">
      <tr>
        <th>작성자</th>
        <td>
          <input type="text" name="wname" id="wname" class="form-control" maxlength="20" 
                 required value="<%=dto.getWname()%>">
        </td>
      </tr>
      <tr>
        <th>제목</th>
        <td>
          <input type="text" name="subject" id="subject" class="form-control" maxlength="100" 
                 required value="<%=dto.getSubject()%>">
        </td>
      </tr>
      <tr>
        <th>내용</th>
        <td>
          <textarea rows="5"  class="form-control" name="content" id="content">
            <%=dto.getContent()%>
          </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="submitBtn" type="submit" value="수정" class="btn btn-success">
          <input id="resetBtn" type="reset"  value="취소" class="btn btn-danger">
        </td>
      </tr>
      </table> 	
    </form>
  </div>
<%		
  }//if end
%>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

    ③ 뷰단 : bbsUpdateProc.jsp → 비밀번호 일치 시 글 수정 프로세스 실행

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsUpdateProc.jsp -->
<h3> 글 수 정 결 과</h3>
<% 
	//사용자가 수정한 정보를 가져오기
	int    bbsno   = Integer.parseInt(request.getParameter("bbsno"));
	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();

	//dto 객체에 담기
	dto.setBbsno(bbsno);
	dto.setWname(wname);
	dto.setSubject(subject);
	dto.setContent(content);
	dto.setPasswd(passwd);
	dto.setIp(ip);
	
	int cnt=dao.updateproc(dto);
	
	if(cnt==0){
		out.println("<p>비밀번호가 틀렸습니다</p>");
        out.println("<p><a href='bbsList.jsp'>[글목록]</a></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"%>

 

○ 답변 쓰기

    - 새글 쓰기 : 최초의 부모글

    - 답변 쓰기 : 자식글

        · 그룹번호(grpno) : 부모글 그룹번호와 동일하게

        · 들여쓰기(indent) : 부모글 들여쓰기 +1

        · 글순서(ansnum)  : 부모글 글순서 +1 한 후, 글순서 재조정

 

    ① DAO : BbsDAO.java

public int reply(BbsDTO dto) {
  int cnt=0; //성공 또는 실패 여부 반환
  try {
    con=dbopen.getConnection();//DB연결
    sql=new StringBuilder();

    //1)부모글 정보 가져오기(SELECT문)
    int grpno=0;   //부모글 그룹번호
    int indent=0;  //부모글 들여쓰기
    int ansnum=0;  //부모글 글순서
    sql.append(" SELECT bbsno, grpno, indent, ansnum ");
    sql.append(" FROM tb_bbs ");
    sql.append(" WHERE bbsno=? ");
    pstmt = con.prepareStatement(sql.toString());
    pstmt.setInt(1, dto.getBbsno());
    rs = pstmt.executeQuery();
    if(rs.next()) {
      //그룹번호 : 부모글그룹번호 그대로 가져오기
      grpno=rs.getInt("grpno");
      //들여쓰기 : 부모글들여쓰기 +1
      indent=rs.getInt("indent")+1;
      //글순서	: 부모글순서 + 1
      ansnum=rs.getInt("ansnum")+1;
    }//if end

    //2)글순서 재조정하기(UPDATE문)
    sql.delete(0, sql.length());	//1)단계에서 사용했던 Sql값 지우기
    sql.append(" UPDATE tb_bbs ");
    sql.append(" SET ansnum=ansnum+1 ");
    sql.append(" WHERE grpno=? AND ansnum>=? ");
    pstmt = con.prepareStatement(sql.toString());
    pstmt.setInt(1, grpno);
    pstmt.setInt(2, ansnum);
    pstmt.executeUpdate();

    //3)답변글 추가하기(INSERT문)
    sql.delete(0, sql.length());
    sql.append(" INSERT INTO tb_bbs(bbsno, wname, subject, content, passwd, ip, grpno, indent, ansnum) ");
    sql.append(" VALUES(bbs_seq.nextval, ?, ?, ?, ?, ?, ?, ?, ?) ");
    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());
    pstmt.setInt(6, grpno);	//1단계에서 만든 그룹번호
    pstmt.setInt(7, indent);//1단계에서 만든 들여쓰기
    pstmt.setInt(8, ansnum);//1단계에서 만든 글순서
    cnt=pstmt.executeUpdate();
  } catch (Exception e) {
    System.out.println("답변쓰기 실패: " + e);
  }finally{
    DBclose.close(con, pstmt, rs);
  }//try end
    return cnt;
}//reply() end

 

    ② 뷰단 : bbsReply.jsp → 부모글(원래글)의 번호 정보를 들고와서 답변글 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsReply.jsp -->
<img src="../images/bbsReply.png" style="margin: auto;" >
<p><a href="bbsList.jsp">[글목록]</a></p>
  <div class="container">
    <form name="bbsfrm" id="bbsfrm" method="post" action="bbsReplyProc.jsp" onsubmit="return bbsCheck()">
      <input type="hidden" name="bbsno" value="<%=request.getParameter("bbsno")%>">
        <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"%>

 

    ③ 뷰단 : bbsReplyProc.jsp → 답변 작성 프로세스 진행

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsReplyProc.jsp -->
<h3> 답 변 작 성 결 과</h3>
<% 
	//사용자가 입력 요청한 정보를 가져오기
	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();
	int    bbsno   = Integer.parseInt(request.getParameter("bbsno")); //부모글번호

	//dto 객체에 담기
	dto.setWname(wname);
	dto.setSubject(subject);
	dto.setContent(content);
	dto.setPasswd(passwd);
	dto.setIp(ip);
	dto.setBbsno(bbsno);
	
	int cnt=dao.reply(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"%>