-
댓글 등록 구현..
자꾸 댓글 할 때마다 복잡해져서 어디다 댓글 달지 말아야지.. 생각하게 된다..
public interface IReplyService {void replyRegist(ReplyVO vo);List<ReplyVO> getList(PageVO vo, int bno);int getTotal(int bno);int pwCheck(ReplyVO vo);void update(ReplyVO vo);void delete(int rno);댓글은 상세 페이지를 클릭했을 때 달 수 있는 거기 때문에..~ Detail로 와서 script를 작성해 줍니다.<script>$(document).ready(function() {$('#replyRegist').click(function() {const bno = '${article.bno}'; //컨트롤러에서 넘어온 게시글번호const reply = $('#reply').val(); //댓글 내용const replyId = $('#replyId').val(); //작성자const replyPw = $('#replyPw').val(); //비밀번호if(reply === '' || replyId === '' || replyPw === '') {alert('이름, 비밀번호, 내용을 입력하세요!');return;}$.ajax({type: 'post',url: '<c:url value="/reply/replyRegist" />',data: JSON.stringify({"bno":bno,"reply":reply,"replyId":replyId,"replyPw":replyPw}),dataType: 'text', //서버로부터 어떤 형식으로 받을지(생략 가능)contentType: 'application/json',success: function(data) {console.log('통신 성공! ' + data);$('#reply').val('');$('#replyId').val('');$('#replyPw').val('');getList(1, true); //등록 성공 후 댓글 목록 함수를 호출해서 비동기식으로 목록 표현.},error: function() {alert('등록에 실패했습니다. 관리자에게 문의하세요!');}});});//목록 요청let page = 1;let strAdd = '';getList(1, true);function getList(pageNum, reset) {const bno = '${article.bno}'; //게시글 번호$.getJSON("<c:url value='/reply/getList/' />" + bno + '/' + pageNum,function(data) {console.log(data);let total = data.total; //총 댓글수console.log('총 댓글수: ' + total);let replyList = data.list; //댓글 리스트if(reset === true) {strAdd = '';page = 1;}console.log('현재 페이지: ' + page);if(total <= page * 5) {$('#moreList').css('display', 'none');} else {$('#moreList').css('display', 'block');}if(replyList.length <= 0) {return;}for(let i=0; i<replyList.length; i++) {strAdd += "<div class='reply-wrap' style='display:none;'>";...(더 많은데 생략)}$('#replyList').html(strAdd);$('.reply-wrap').fadeIn(500);}); //end getJSON} // end getList()controller로 와서 명령 보낼 것을 작성해 줍니다@Autowiredprivate IReplyService service;//댓글 등록@PostMapping("/replyRegist")public String replyRegist(@RequestBody ReplyVO vo) {System.out.println("댓글 등록 요청이 들어옵니다.");service.replyRegist(vo);return "regSuccess";}//페이징이 추가된 댓글 목록@GetMapping("/getList/{bno}/{pageNum}")public Map<String, Object> getList(@PathVariable int bno, @PathVariable int pageNum){PageVO vo = new PageVO();vo.setPageNum(pageNum);vo.setCountPerPage(5);List<ReplyVO> list = service.getList(vo, bno);int total = service.getTotal(bno);Map<String, Object> map = new HashMap<String, Object>();map.put("list", list);map.put("total", total);return map;}mapper로 가서 sql문을 작성해 줍니다
<mapper namespace="com.spring.myweb.reply.mapper.IReplyMapper"><resultMap type="com.spring.myweb.command.ReplyVO" id="replyMap"><result property="replyId" column="reply_id" /><result property="replyPw" column="reply_pw" /><result property="replyDate" column="reply_date" /><result property="updateDate" column="update_date" /></resultMap><insert id="replyRegist">INSERT INTO freereply(rno, bno, reply, reply_id, reply_pw)VALUES(freereply_seq.NEXTVAL, #{bno}, #{reply}, #{replyId}, #{replyPw})</insert><select id="getList" resultMap="replyMap">SELECT * FROM(SELECT ROWNUM AS rn, tbl.* FROM(SELECT * FROM freereplyWHERE bno = #{bno}ORDER BY rno DESC) tbl)<![CDATA[WHERE rn > (#{paging.pageNum} - 1) * #{paging.countPerPage}AND rn <= #{paging.pageNum} * #{paging.countPerPage}]]></select><select id="getTotal" resultType="int">SELECT COUNT(*)FROM freereplyWHERE bno = #{bno}</select>댓글 페이징까지 했습니다!댓글 수정, 삭제//수정, 삭제$('#replyList').on('click', 'a', function(e) {e.preventDefault(); //태그의 고유 기능을 중지.//1. a태그가 두 개(수정, 삭제)이므로 버튼부터 확인.//수정, 삭제가 발생하는 댓글 번호가 몇 번인지의 여부도 확인.const rno = $(this).attr('href');$('#modalRno').val(rno);//2. 모달 창 하나를 이용해서 상황에 따라 수정 / 삭제 모달을 구분하기 위해//hasClass()는 클래스 이름에 매개값이 포함되어 있다면 true, 없으면 false.if($(this).hasClass('replyModify')) {//수정 버튼을 눌렀으므로 수정 모달 형식으로 변경.$('.modal-title').html('댓글 수정');$('#modalReply').css('display', 'inline');$('#modalModBtn').css('display', 'inline');$('#modalDelBtn').css('display', 'none'); //수정이므로 삭제버튼은 숨기자.$('#replyModal').modal('show');} else {$('.modal-title').html('댓글 삭제');$('#modalReply').css('display', 'none');$('#modalModBtn').css('display', 'none');$('#modalDelBtn').css('display', 'inline');$('#replyModal').modal('show');}}); //수정 or 삭제 버튼 클릭 이벤트 처리 끝.//수정 처리 함수 (수정 모달을 열어서 수정 내용을 작성 후 수정 버튼을 클릭했을 시)$('#modalModBtn').click(function() {const reply = $('#modalReply').val();const rno = $('#modalRno').val();const replyPw = $('#modalPw').val();if(reply === '' || replyPw === '') {alert('내용, 비밀번호를 확인하세요!');return;}$.ajax({type : "post",url : "<c:url value='/reply/update' />",contentType : 'application/json',data : JSON.stringify({'reply' : reply,'rno' : rno,'replyPw' : replyPw}),success : function(data) {if(data === 'modSuccess') {alert('정상 수정되었습니다.');$('#modalReply').val('');$('#modalPw').val('');$('#replyModal').modal('hide');getList(1, true);} else {alert('비밀번호를 확인하세요.');$('#modalPw').val('');}},error : function() {alert('수정에 실패했습니다. 관리자에게 문의하세요.');}}); //end ajax(수정)}); //수정 처리 이벤트 끝.//삭제함수$('#modalDelBtn').click(function() {const rno = $('#modalRno').val();const replyPw = $('#modalPw').val();if(replyPw === '') {alert('비밀번호를 확인하세요.');return;}$.ajax({type: 'post',url: "<c:url value='/reply/delete' />",data: JSON.stringify({'rno' : rno,'replyPw' : replyPw}),headers : {'Content-type' : 'application/json'},success : function(data) {if(data === 'delSuccess') {alert('댓글이 삭제되었습니다.');$('#modalPw').val(''); //비밀번호 초기화$('#replyModal').modal('hide'); //모달 내리기getList(1, true);} else {alert('비밀번호가 틀렸습니다.');}},error : function() {alert('삭제에 실패했습니다. 관리자에게 문의하세요.');}}); //삭제 비동기 통신 끝.}); //삭제 이벤트 끝.controller로 이동해서 명령을 작성합니다.유저의 비밀번호가 일치해야 댓글을 수정할 수 있게!@PostMapping("/update")public String update(@RequestBody ReplyVO vo) {//비밀번호 확인int result = service.pwCheck(vo);if(result == 1) { //비밀번호가 맞는 경우service.update(vo);return "modSuccess";} else {return "pwFail";}}@PostMapping("/delete")public String delete(@RequestBody ReplyVO vo) {int result = service.pwCheck(vo);if(result == 1) {service.delete(vo.getRno());return "delSuccess";} else {return "pwFail";}}}mapper 작성을 해 줍니다<select id="pwCheck" resultType="int">SELECT COUNT(*) FROM freereplyWHERE rno = #{rno} AND reply_pw = #{replyPw}</select><update id="update">UPDATE freereplySET reply = #{reply}, update_date = sysdateWHERE rno = #{rno}</update><delete id="delete">DELETE FROM freereplyWHERE rno = #{rno}</delete>service도 수정해 주면 댓글 완료!'SPRING' 카테고리의 다른 글
MyWeb (0) 2022.02.17 MyWeb (0) 2022.02.15 mywebproject (0) 2022.02.11 springwebmvcproject (0) 2022.02.10 springwebmvcproject (0) 2022.02.09