차근차근 개발자 되기

Spring

99일차: Spring Ajax 댓글 게시판(2)_2021.11.08

wellow 2021. 11. 8. 16:38

 

목차

- Spring Ajax 댓글 기능 게시판

 

 

▶ Spring Ajax 댓글 기능 게시판  

 

1) 댓글 작성

- 데이터를 입력할 때, 키 값을 가져와서 증가시켜서 입력하거나 혹은 입력 후에 증가된 키 값을 가져올 수 있다. 게시글의 상세 페이지에서 댓글을 작성(insert)을 작성할 때 댓글 번호 값을 1 증가시켜야 하는데, MyBatis에서 제공하는 selectKey를 이용하면 별도의 쿼리 로직을 등록할 필요 없이 해당 메소드에서 일괄 처리할 수 있다.

 

• selectKey

- insert 문에서만 사용이 가능하다.

- 하나의 insert문에 하나의 selectKey만 사용 가능하다.

- selectKey는 insert 구문이 실행되기 전(before) 또는 후(after)로 나누어서 사용할 수 있다.

 

• selectKey 엘리먼트 속성

keyProperty: selectKey구문의 결과가 저장될 대상 프로퍼티

order: berfore또는 after를 세팅할 수 있다. berfore로 설정하면 키를 먼저 조회하고 그 값을 keyProperty에 저장한 뒤 insert 구문을 실행한다. after로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다.

resultType: 반환되는 결과의 타입.

keyColumn: 리턴되는 결과셋의 컬럼명은 프로퍼티와 일치한다. 여러개의 컬럼을 사용한다면 컬럼명의 목록은 콤마를 사용해서 구분한다.

statementType: statement, prepared 또는 callable 중 하나를 선택할 수 있다. 디폴트는 prepared이다.

 

예시

1
2
3
4
5
6
7
<insert id="insert" parameterType="rb">
    <selectKey keyProperty="rno" order="BEFORE" resultType="int">    <!-- order="BEFORE" : 먼저 실행 -->
        select nvl(max(rno),0) + 1 from replyBoard
    </selectKey>
        insert into replyBoard values (#{rno},#{bno},#{replytext},
            #{replyer},sysdate,sysdate)
</insert>
cs

 

 

2) 댓글 수정/삭제

- ‘수정’ 버튼을 누르면 댓글이 출력되었던 공간이 textarea로 바뀌면서 내용이 담기도록 한다.

- ‘삭제’ 버튼을 누르면 부모글인 게시글의 번호와 댓글의 번호를 전달해서 삭제한다.

- 수정과 삭제 후에는 다시 댓글 목록을 호출해서 보이도록 한다.

 

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp"%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    $(function() {
        $('.edit1').click(function() {
            var id  = $(this).attr('id');  // rno
            var txt = $('#td_'+id).text(); // replytext
            $('#td_'+id).html("<textarea rows='3' cols='30' id='tt_"+id+"'>"+txt
                +"</textarea>");
            $('#btn_'+id).html(
               "<input type='button' value='확인' onclick='up("+id+")'> "
              +"<input type='button' value='취소' onclick='lst()'>");
        });
    });
    function up(id) {
        var replytext = $('#tt_'+id).val();
        var formData = "rno="+id+'&replytext='+replytext
            +"&bno=${board.num}";
        $.post('${path}/repUpdate',formData, function(data) {
            $('#slist').html(data);
        });
    }
    function lst() {
        $('#slist').load('${path}/slist/num/${board.num}');
    }
    function del(rno,bno) {
        var formData="rno="+rno+"&bno="+bno;
        $.post("${path}/repDelete",formData, function(data) {
            $('#slist').html(data);
        });
    }
</script>
</head>
<body>
    <div class="container" align="center">
        <h2 class="text-primary">댓글</h2>
        <table class="table table-bordered">
            <tr>
                <td>작성자</td>
                <td>내용</td>
                <td>수정일</td>
                <td></td>
            </tr>
            <c:forEach var="rb" items="${slist}">
                <tr>
                    <td>${rb.replyer}</td>
                    <td id="td_${rb.rno}">${rb.replytext}</td>
                    <td>${rb.updatedate }</td>
                    <td id="btn_${rb.rno}">
                        <c:if test="${rb.replyer==board.writer }">
                            <input type="button" value="수정" class="edit1" id="${rb.rno}">
                            <input type="button" value="삭제"     onclick="del(${rb.rno},${rb.bno})">
                        </c:if></td>
                </tr>
            </c:forEach>
        </table>
    </div>
</body>
</html>
cs