@RestController // = @Controller + @ResponseBody
public class CommentController {
@Autowired
CommentService commentService;
// 게시물 번호를 받으면 그 게시물에 달린 모든 댓글을 반환하는 메서드
@RequestMapping("/comments") // comments?bno=1080
public ResponseEntity<List<CommentDto>> list(Integer bno) {
List<CommentDto> list = null;
try {
list = commentService.getList(bno);
return new ResponseEntity<List<CommentDto>>(list, HttpStatus.OK); // 200
} catch (Exception e) {
e.printStackTrace();
// 사용자가 잘못 요청해서 에러나니까 400번대를 날린다.
return new ResponseEntity<List<CommentDto>>(HttpStatus.BAD_REQUEST); // 400
}
}
...
@Controller
public class SimpleRestController {
@GetMapping("/test")
public String test() {
return "test";
}
...
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
</head>
<body>
<h2>commentTest</h2>
<button id="sendBtn" type="button">SEND</button>
<div id="commentList"></div> <!--댓글 목록을 보여줌(ajax를 이용해서 불러올꺼임)-->
<script>
// 임시로
let bno = 1;
let showList = function (bno) {
$.ajax({
type:'GET', // 요청 메서드
url: '/JTI/comments?bno=' + bno, // 요청 URI
dataType : 'json', // 전송받을 데이터의 타입, 생략해도 됨: 기본이 json
success : function(result) {
// result가 오면 commentList에 담기
// 댓글목록 가져온 것을 commmentList에 담게 됨
$("#commentList").html(result);
},
error : function(){ alert("error") } // 에러가 발생했을 때, 호출될 함수
}); // $.ajax()
}
$(document).ready(function(){
$("#sendBtn").click(function() {
showList(bno);
});
});
</script>
</body>
</html>
result
를 쳐본다.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
</head>
<body>
<h2>commentTest</h2>
<button id="sendBtn" type="button">SEND</button>
<div id="commentList"></div> <!--댓글 목록을 보여줌(ajax를 이용해서 불러올꺼임)-->
<script>
// 임시로
let bno = 1;
let showList = function (bno) {
$.ajax({
type:'GET', // 요청 메서드
url: '/JTI/comments?bno=' + bno, // 요청 URI
dataType : 'json', // 전송받을 데이터의 타입, 생략해도 됨: 기본이 json
success : function(result) {
// result가 오면 commentList에 담기
// 댓글목록 가져온 것을 commmentList에 담게 됨
// 들어오는 배열을 toHtml이라는 함수를 이용해서 <li>태그로 만든다음 그것을 commentList에 넣는다.
$("#commentList").html(toHtml(result));
},
error : function(){ alert("error") } // 에러가 발생했을 때, 호출될 함수
}); // $.ajax()
}
$(document).ready(function(){
$("#sendBtn").click(function() {
showList(bno);
});
});
// 배열들어온 것을 <li>태그를 이용해서 전체 <ul>를 구성한 다음에 그것을 넣을 것이다.
let toHtml = function (comments) {
let tmp = "<ul>";
// 댓글 하나하나 들고와서 tmp에 쌓는다.
comments.forEach(function (comment) {
tmp += '<li data-cno=' + comment.cno
tmp += ' data-pcno=' + comment.pcno
tmp += ' data-bno=' + comment.bno + '>'
// span태그에 넣어야 나중에 작성자만 따로 읽어오기 쉽다.
tmp += ' commenter=<span class="commenter">' + comment.commenter + '</span>'
tmp += ' comment=<span class="comment">' + comment.comment + '</span>';
tmp += ' up_date=' + comment.up_date
tmp += '</li>'
})
return tmp + "</ul>"; // ul을 html로 반환한다.
}
</script>
</body>
</html>
let toHtml = function (comments) {
let tmp = "<ul>";
// 댓글 하나하나 들고와서 tmp에 쌓는다.
comments.forEach(function (comment) {
tmp += '<li data-cno=' + comment.cno
tmp += ' data-pcno=' + comment.pcno
tmp += ' data-bno=' + comment.bno + '>'
// span태그에 넣어야 나중에 작성자만 따로 읽어오기 쉽다.
tmp += ' commenter=<span class="commenter">' + comment.commenter + '</span>'
tmp += ' comment=<span class="comment">' + comment.comment + '</span>';
tmp += ' up_date=' + comment.up_date
tmp += '<button class="delBtn">삭제</button>' <!-- 삭제추가-->
tmp += '</li>'
})
return tmp + "</ul>"; // ul을 html로 반환한다.
}
delBtn
을 class로 할 수밖에 없다. $(document).ready(function(){
$("#sendBtn").click(function() {
showList(bno);
});
$(".delBtn").click(function () {
alert("delete!!!")
});
});
<div id="commentList"></div>
에다가 이벤트 걸기 // $(".delBtn").click(function () {
$("#commentList").on("click", ".delBtn", function () {
alert("delete!!!")
});
이 시점에 delBtn은 없어도 commentList는 있다. 이 commentList안에있는 delBtn 클래스에다가 클릭 이벤트를 건다.
확인됐으니까 함수 만들면 됨!
// $(".delBtn").click(function () {
$("#commentList").on("click", ".delBtn", function () {
// li가 버튼의 부모
let cno = $(this).parent().attr("data-cno");
let bno = $(this).parent().attr("data-bno");
$.ajax({
type: 'DELETE',
url: '/JTI/comments/' + cno + '?bno=' + bno,
success : function (result) {
alert(result)
// 삭제된 다음에 새로 갱신되어야 함
showList(bno);
}
});
});
data-
를 붙이게 정해져 있다. 안붙여도 되는데 태그 하나하나에 속성이 되게 많아서 없는 줄 알고 썼다가 기존 속성과 충돌나면 안되니까 접두사에 data-
를 붙여준다.✔️
$0
: 내가 참조한 element에 대한 참조
➡️dir
로 해당 element에 대한 속성들을 볼 수 있다.
dir($0)
내부 안에 보니까 dataset
이라는 것이 있다.data-
로 시작하는 것들은 dataset이라는 속성안에 map형태로 쌓인다.<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
</head>
<body>
<h2>commentTest</h2>
<button id="sendBtn" type="button">SEND</button>
<div id="commentList"></div> <!--댓글 목록을 보여줌(ajax를 이용해서 불러올꺼임)-->
<script>
// 임시로
let bno = 1;
// 댓글 가져오기 함수
let showList = function (bno) {
$.ajax({
type:'GET', // 요청 메서드
url: '/JTI/comments?bno=' + bno, // 요청 URI
dataType : 'json', // 전송받을 데이터의 타입, 생략해도 됨: 기본이 json
success : function(result) {
// result가 오면 commentList에 담기
// 댓글목록 가져온 것을 commmentList에 담게 됨
// 들어오는 배열을 toHtml이라는 함수를 이용해서 <li>태그로 만든다음 그것을 commentList에 넣는다.
$("#commentList").html(toHtml(result));
},
error : function(){ alert("error") } // 에러가 발생했을 때, 호출될 함수
}); // $.ajax()
}
$(document).ready(function(){
$("#sendBtn").click(function() {
showList(bno);
});
// $(".delBtn").click(function () {
$("#commentList").on("click", ".delBtn", function () {
// li가 버튼의 부모
let cno = $(this).parent().attr("data-cno");
let bno = $(this).parent().attr("data-bno");
$.ajax({
type: 'DELETE',
url: '/JTI/comments/' + cno + '?bno=' + bno,
success : function (result) {
alert(result)
// 삭제된 다음에 새로 갱신되어야 함
showList(bno);
}
});
});
});
// 배열들어온 것을 <li>태그를 이용해서 전체 <ul>를 구성한 다음에 그것을 넣을 것이다.
let toHtml = function (comments) {
let tmp = "<ul>";
// 댓글 하나하나 들고와서 tmp에 쌓는다.
comments.forEach(function (comment) {
tmp += '<li data-cno=' + comment.cno
tmp += ' data-pcno=' + comment.pcno
tmp += ' data-bno=' + comment.bno + '>'
// span태그에 넣어야 나중에 작성자만 따로 읽어오기 쉽다.
tmp += ' commenter=<span class="commenter">' + comment.commenter + '</span>'
tmp += ' comment=<span class="comment">' + comment.comment + '</span>';
tmp += ' up_date=' + comment.up_date
tmp += '<button class="delBtn">삭제</button>'
tmp += '</li>'
})
return tmp + "</ul>"; // ul을 html로 반환한다.
}
</script>
</body>
</html>
$("#sendBtn").click(function() {
// input 태그의 내용을 comment에 담는다.
let comment = $("input[name=comment]").val();
// 댓글 공백 방지
if(comment.trim() == '') {
alert("댓글을 입력해주세요");
$("input[name=comment]").focus();
return;
}
// 쓰기
$.ajax({
type: 'POST',
url: '/JTI/comments?bno=' + bno,
headers: {"content-type" : "application/json"},
data : JSON.stringify({bno:bno, comment:comment}), // 전송할 데이터를 JSON으로!
success : function (result) {
alert(result)
showList(bno); // 쓰기가 성공했을 때 보여줄꺼임
}
});
});
입력할 내용을 보내주면 알림창뜨고 화면에 댓글 목록 보여줌. 댓글이 달렸으니까 갱신해줘야 함
input 태그의 내용을 comment에 담고 그 comment를 JSON으로 자바스크립트 객체로 만들어서 보낸다. 그럼 Controller가 받는다.
댓글에 공백으로는 전송하지 못하게 조건문을 넣는다.
$(document).ready(function(){
showList(bno);
...
tmp += '<button class="modBtn">수정</button>';
1️⃣ comment의 내용을 input 값에 넣어주기
2️⃣ Controller에 cno 전달하기
$("#commentList").on("click", ".modBtn", function () {
let cno = $(this).parent().attr("data-cno");
let comment = $("span.comment", $(this).parent()).text();
//1. comment의 내용을 input에 뿌려주기
$("input[name=comment]").val(comment);
//2. cno 번호를 전달하기
$("#modBtn").attr("data-cno", cno);
})
$("span.comment", $(this).parent()).text()
<li>
를 의미$("#modBtn").attr("data-cno", cno);
3️⃣ 댓글 수정 버튼 눌렀을 때, 처리하는 함수 만들기
$("#modBtn").click(function() {
let comment = $("input[name=comment]").val();
let cno = $(this).attr("data-cno");
if(comment.trim() == '') {
alert("댓글을 입력해주세요");
$("input[name=comment]").focus();
return;
}
// 쓰기
$.ajax({
type: 'PATCH',
url: '/JTI/comments' + cno,
headers: {"content-type" : "application/json"},
data : JSON.stringify({cno:cno, comment:comment}), // 전송할 데이터를 JSON으로!
success : function (result) {
alert(result);
showList(bno); // 수정이 성공했을 때 보여줄꺼임
},
error : function () {alert("error")}
});
});
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
</head>
<body>
<h2>commentTest</h2>
comment: <input type="text" name="comment"><br>
<button id="sendBtn" type="button">댓글쓰기</button>
<button id="modBtn" type="button">댓글수정</button>
<div id="commentList"></div> <!--댓글 목록을 보여줌(ajax를 이용해서 불러올꺼임)-->
<script>
// 임시로
let bno = 1;
// 댓글 가져오기 함수
let showList = function (bno) {
$.ajax({
type:'GET', // 요청 메서드
url: '/JTI/comments?bno=' + bno, // 요청 URI
dataType : 'json', // 전송받을 데이터의 타입, 생략해도 됨: 기본이 json
success : function(result) {
// result가 오면 commentList에 담기
// 댓글목록 가져온 것을 commmentList에 담게 됨
// 들어오는 배열을 toHtml이라는 함수를 이용해서 <li>태그로 만든다음 그것을 commentList에 넣는다.
$("#commentList").html(toHtml(result));
},
error : function(){ alert("error") } // 에러가 발생했을 때, 호출될 함수
}); // $.ajax()
}
// document 시작
$(document).ready(function(){
showList(bno);
$("#sendBtn").click(function() {
let comment = $("input[name=comment]").val();
if(comment.trim() == '') {
alert("댓글을 입력해주세요");
$("input[name=comment]").focus();
return;
}
// 쓰기
$.ajax({
type: 'POST',
url: '/JTI/comments?bno=' + bno,
headers: {"content-type" : "application/json"},
data : JSON.stringify({bno:bno, comment:comment}), // 전송할 데이터를 JSON으로!
success : function (result) {
alert(result);
showList(bno); // 쓰기가 성공했을 때 보여줄꺼임
},
error : function () {alert("error")}
});
});
// $(".delBtn").click(function () {
$("#commentList").on("click", ".delBtn", function () {
// li가 버튼의 부모
let cno = $(this).parent().attr("data-cno");
let bno = $(this).parent().attr("data-bno");
$.ajax({
type: 'DELETE',
url: '/JTI/comments/' + cno + '?bno=' + bno,
success : function (result) {
alert(result)
// 삭제된 다음에 새로 갱신되어야 함
showList(bno);
}
});
});
$("#commentList").on("click", ".modBtn", function () {
let cno = $(this).parent().attr("data-cno");
let comment = $("span.comment", $(this).parent()).text();
//1. comment의 내용을 input에 뿌려주기
$("input[name=comment]").val(comment);
//2. cno 번호를 전달하기
$("#modBtn").attr("data-cno", cno);
})
$("#modBtn").click(function() {
let comment = $("input[name=comment]").val();
let cno = $(this).attr("data-cno");
if(comment.trim() == '') {
alert("댓글을 입력해주세요");
$("input[name=comment]").focus();
return;
}
// 쓰기
$.ajax({
type: 'PATCH',
url: '/JTI/comments/' + cno,
headers: {"content-type" : "application/json"},
data : JSON.stringify({cno:cno, comment:comment}), // 전송할 데이터를 JSON으로!
success : function (result) {
alert(result);
showList(bno); // 수정이 성공했을 때 보여줄꺼임
},
error : function () {alert("error")}
});
});
});
// 배열들어온 것을 <li>태그를 이용해서 전체 <ul>를 구성한 다음에 그것을 넣을 것이다.
let toHtml = function (comments) {
let tmp = "<ul>";
// 댓글 하나하나 들고와서 tmp에 쌓는다.
comments.forEach(function (comment) {
tmp += '<li data-cno=' + comment.cno;
tmp += ' data-pcno=' + comment.pcno;
tmp += ' data-bno=' + comment.bno + '>';
// span태그에 넣어야 나중에 작성자만 따로 읽어오기 쉽다.
tmp += ' commenter=<span class="commenter">' + comment.commenter + '</span>';
tmp += ' comment=<span class="comment">' + comment.comment + '</span>';
tmp += ' up_date=' + comment.up_date;
tmp += '<button class="delBtn">삭제</button>';
tmp += '<button class="modBtn">수정</button>';
tmp += '</li>';
})
return tmp + "</ul>"; // ul을 html로 반환한다.
}
</script>
</body>
</html>
Reference
: https://fastcampus.co.kr/dev_academy_nks