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"%>