답변글이 어떤 글에 대한 답변인지 구분하기 위해서는 원글과 답변글이 같은 값을 가지고 있으면 된다.
또 연두색 답변글에 대한 답변글(주황색)을 또 달았다면 연두색 답변글이 원글, 주황색 답변글이 그에 대한 답변글이 된다.
이렇게 나타나는 글들을 구분하기 위해 테이블 설계 시 grpno, indent, ansnum 칼럼을 만들었다.
[답변쓰기 알고리즘]
- 새글 쓰기 : 최초의 부모글
- 답변 쓰기 : 자식글
- 그룹번호(grpno) : 부모글 그룹번호와 동일하게
- 들여쓰기(indent) : 부모글 들여쓰기 + 1
- 글순서(ansnum) : 부모글 글순서 + 1 한뒤, 글순서 재조정(update)
번호 제목 그룹번호 들여쓰기 글순서
1 제주 1 0 0 --그룹번호 입력시점에는 번호(bbsno)가 입력전이므로 1
2 서울 2 0 0
▶종로 2 1 1
▶▶관철동 2 2 2
▶▶▶보신각 2 3 3
▶▶인사동 2 2 4(2->3->4)
▶강남 2 1 5(1->2->3->4->5)
▶▶도곡동 2 2 6
▶▶역삼동 2 2 7(6->7)
▶마포 2 1 8(7->8)
3 부산 3 0 0
1 제주 1 0 0
2 서울 2 0 0
▶종로 2 1 1
▶▶관철동 2 2 2
▶▶▶보신각 2 3 3
▶▶인사동 2 2 4
▶강남 2 1 5
▶▶도곡동 2 2 6
▶▶역삼동 2 2 6->7
▶마포 2 1 7->8
3 부산 3 0 0
- 글순서(ansnum) 재조정
update tb_bbs
set ansnum=ansnum+1
where grno=2 and ansnum>=6
먼저 답글 기호부터 추가하자
bbsList.jsp
//오늘 날짜를 문자열 "2022-10-22" 만들기
String today = Utility.getDate();
for(int i=0; i<list.size(); i++) {
dto = list.get(i);
%>
<tr>
<td style="text-align: left">
<%
//답변이미지 출력
for(int n=1; n<=dto.getIndent(); n++){
out.println("<img src='../images/reply.gif'>");
}//for end
%>
<a href="bbsRead.jsp?bbsno=<%=dto.getBbsno()%>"><%=dto.getSubject()%></a>
<%
//오늘 작성한 글제목 뒤에 new 이미지 출력
//작성일(regdt)에서 "년월일"만 자르기
이제 답변글을 작성하는 페이지를 만들자
bbsReply.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../header.jsp"%>
<!-- 본문 시작 bbsReply.jsp-->
<h3>* 답변쓰기 *</h3>
<p><a href="bbsList.jsp">[글목록]</a></p>
<form name="bbsfrm" id="bbsfrm" method="post" action="bbsReplyProc.jsp" onsubmit="return bbsCheck()"><!-- myscript.js -->
<!-- 부모글번호 -->
<input type="hidden" name="bbsno" value="<%=request.getParameter("bbsno")%>">
<table class="table">
<tr>
<th class="success">작성자</th>
<td><input type="text" name="wname" id="wname" class="form-control" maxlength="20" required></td>
</tr>
<tr>
<th class="success">제목</th>
<td><input type="text" name="subject" id="subject" class="form-control" maxlength="100" required></td>
</tr>
<tr>
<th class="success">내용</th>
<td><textarea rows="5" class="form-control" name="content" id="content"></textarea></td>
</tr>
<tr>
<th class="success">비밀번호</th>
<td><input type="password" name="passwd" id="passwd" class="form-control" maxlength="10" required></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="답변쓰기" class="btn btn-success">
<input type="reset" value="취소" class="btn btn-danger">
</td>
</table>
</form>
<!-- 본문 끝 -->
<%@ 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-->
<%
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.setBbsno(bbsno);
dto.setWname(wname);
dto.setSubject(subject);
dto.setContent(content);
dto.setPasswd(passwd);
dto.setIp(ip);
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"%>
BbsDAO.java
public int reply(BbsDTO dto) {
int cnt = 0;
try {
con = dbopen.getConection();
sql = new StringBuilder();
//1)부모글 정보 가져오기(select문)
int grpno=0;//부모글 그룹번호
int indent=0;//부모글 들여쓰기
int ansnum=0;//부모글 글순서
sql.append(" SELECT 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);
}
return cnt;
}//reply() end
'웹개발 교육 > jsp' 카테고리의 다른 글
[54일] jsp (21) - myweb 프로젝트(페이징) (0) | 2022.10.14 |
---|---|
[53~54일] jsp (20) - myweb 프로젝트(게시판-검색) (0) | 2022.10.13 |
[51~52일] jsp (18) - myweb 프로젝트(게시판) (0) | 2022.10.11 |
[51일] jsp (17) - myweb 프로젝트(인트로 화면) (0) | 2022.10.11 |
[50일] jsp (16) - 성적 데이터베이스 관련 비즈니스 로직 구현 (0) | 2022.10.07 |