웹개발 교육/jsp

[53일] jsp (19) - myweb 프로젝트(게시판-답변 쓰기)

ewok 2022. 10. 13. 16:14

답변글이 어떤 글에 대한 답변인지 구분하기 위해서는 원글과 답변글이 같은 값을 가지고 있으면 된다.

또 연두색 답변글에 대한 답변글(주황색)을 또 달았다면 연두색 답변글이 원글, 주황색 답변글이 그에 대한 답변글이 된다.

이렇게 나타나는 글들을 구분하기 위해 테이블 설계 시 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