본문 바로가기
개발 공부 Today I Learned

[국비 46일차 TIL ] 댓글 삭제 수정 기능 구현

by 개발자신입 2024. 1. 24.
반응형

 

- 댓글 삭제 기능

del() : 글 삭제하는 함수. alert창을 띄우고 확인을 누르면 글을 삭제함.

댓글을 삭제하면 화면에서 사라지지만, 실제로 데이터에서는 남아있음.

 

$(".commentDelete").click() : "댓글 삭제"버튼을 클릭했을 때 동작하는 함수

 

- 댓글 수정 기능

update() : 글 수정을 확인하는 함수. 수정을 누르면 수정할거냐는 alert이 뜨고 확인을 누르면 댓글 창이 다시 열리면서 수정할 수 있게 변함.

하지만 아직 수정되는 기능은 구현하지 않음.

 

$(".commentEdit").click() : "댓글 수정"버튼을 클릭했을 때 동작하는 함수.

 

- 댓글 글자수 제한

$("commentcontent").keyup() : 글자수가 100자 이상 넘어가면 alert이 뜨도록.

 


detail.jsp

 

<script type="text/javascript">

function del(){var ch = confirm("글을 삭제하시겠습니까?");if(ch){location.href="./delete?no=${detail.no }";}}
function update(){if(confirm("수정하시겠습니까?")){location.href="./update?no=${detail.no }";}}
//function commentDel(cno){if(confirm("댓글을 삭제하시겠습니까?")){location.href='./commentDel?no=${detail.no}&cno='+cno;}}

$(document).ready(function(){
  $(".commentEdit").click(function(){
    if(confirm('수정하시겠습니까?')){ 
      // 필요한 cno값 잡기 & 수정한 내용 + 로그인 == 서블릿에서 정리 
      let cno = $(this).siblings(".cno").val();
      let comment = $(this).parents(".chead").next();
      $(this).prev().hide();
      $(this).hide();
      comment.css('height', '110');
      comment.css('padding-top', '10px');
      comment.css('backgroundColor', '#FFD8E0');
      let commentChange = comment.html().replaceAll("<br>", "\r\n");
      
      // alert(cno + " : " + commentChange);
      
      let recommentBox = '<div class="recommentBox">';
      recommentBox += '<form action="./cedit" method="post">';
      recommentBox += '<textarea class="commentcontent" name="comment">' + commentChange + '</textarea>';
      recommentBox += '<input type="hidden" name="cno" value="' + cno + '">';
      recommentBox += '<button class="comment-btn" type="submit">댓글 수정</button>';
      recommentBox += '</form></div>';
      
      comment.html(recommentBox);
    }
  });

	//댓글 삭제 버튼을 눌렀습니다.
	$(".commentDelete").click(function(){
		// alert("삭제버튼을 눌렀습니다");
		// 부모객체 찾아가기 = this
		// $(this).parent(".cname").css('color', 'green');
		// let text = $(this).parent(".cname").text(); //val()? text() html()
		// 자식 요소 찾기
		// $(this).parent(".cname").children();
		// 형제 요소 찾기 .siblings() .prev()바로 이전 .next() 바로 다음
		// let cno = $(this).prev().val();
		
		if(confirm("삭제하시겠습니까?")){
			
        // Ajax
		let point=$(this).closest(".comment");
        $.ajax({
			url : './commentDel',   //주소
			type : 'post',          //get, post
			dataType : 'text',		//수신타입 json
			data: {no : cno},        //보낼 값
			success:function(result){
                //alert("서버에서 온 값 : " + result);
                if(result == 1){
                	// 정상 삭제: this의 부모(.comment)를 찾아서 삭제해야함.
					point.remove();
                } else {
                	alert("삭제 불가. 관리자에게 문의하세요!!!!");
                }
            },
            error: function(request, status, error){ // 통신오류
                alert("문제 발생?!!???!?!?! 도대체 왜?!?!?");
            }
        }); // end ajax

		}
});
	
	//댓글쓰기 버튼을 누르면 댓글창 나오게 하기 2024-01-24
	$(".comment-write").hide();//원래는 ready 바로 아래 두시는 것을 추천....
	$(".xi-comment-o").click(function(){
		$(".xi-comment-o").hide();
		//$(".comment-write").show();
		$(".comment-write").slideToggle('slow');
	});
	
	+
	$("#comment-button").click(function(){
		let content = $("#commentcontent").val();
		let bno = ${detail.no };
		if(content.length < 5){
			alert("댓글은 다섯글자 이상으로 적어주세요.");
			$("#commentcontent").focus();
		} else {
			let form = $('<form></form>');
			form.attr('name', 'form');
			form.attr('method', 'post');
			form.attr('action', './comment');
			form.append($('<input/>', {type:'hidden', name:'commentcontent', value:content}));//json
			form.append($('<input/>', {type:'hidden', name:'bno', value:bno}));
			form.appendTo("body");
			form.submit();
		}
	});//댓글쓰기 동적생성 끝
    	
	//id="commentcontent"
	//id="comment-btn"
	//댓글쓰기 창에 쓸 수 있는 글자 표시해주고 넘어가면 더이상 입력 불가로 바꾸기
	$("#commentcontent").keyup(function(){
        let text = $(this).val();
        if(text.length > 100){
           alert("100자 넘었으니 그만쓰세요^^!");
           $(this).val(  text.substr(0, 100)   );   
        }
        $("#comment-btn").text("글쓰기 " + text.length +  "/100");
     });
});
});
</script>

 

 

detail.jsp

 

<!-- 2024-01-22 댓글쓰는 창 만들기 (댓글 작성자, 댓글 내용) -->

<div class="comment-write">
	<div class="comment-form"> <!-- form태그 필요없음. 위에서 동작가능 -->
		<textarea id="commentcontent" name="commentcontent"></textarea>
		<button id="comment-button" id="list_button">댓글쓰기</button>
	</div>
</div>
</c:if>

 

 

commentDel.java

 

doPost에 추가

 

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
        // 세션 가져오기
        HttpSession session = request.getSession();
		
        // 작업 결과를 저장할 변수를 초기화하기
        int result = 0;
        
        // 만약 사용자가 로그인된 상태라면
		if(session.getAttribute("mid") != null && Util.intCheck2(request.getParameter("no"))) {
			
            // 조건이 충족되면 commentDTO를 생성하고 속성을 설정함
			CommentDTO dto = new CommentDTO();
			dto.setMid((String)session.getAttribute("mid")); // mid가져와서 Mid에 저장해
			dto.setCno(Util.str2Int2(request.getParameter("no"))); // no 정수 변환 후 Cno에 저장해
			
            // CommentDAO의 인스턴스 생성
			CommentDAO dao = new CommentDAO();
            
            // commentDelete 메소드 호출하과 DTO에 전달 -> 결과 'result' 변수에 저장
			result = dao.commentDelete(dto);				
		}
		PrintWriter pw = response.getWriter();
		pw.print(result);
	}

 

 

반응형

댓글