게시판마스터
90
2017-01-11 18:18:07.0
4
178

안녕하세요. 스프링 댓글에 대해 질문 남깁니다.^^~



<!-- 좌우측의 공간 확보 -->
					<table class="table table-condensed">
					</table>
					<table id="commentTable" class="table table-condensed"
						style="text-align: left;"></table>
					<table class="table table-condensed" style="text-align: left;">
						<tr>
						<c:forEach items="${list}" var="replyVO">
				
				<c:if test="value="<sec:authentication property="principal.username"/>>
							<td colspan="2"><strong>${replyVO.rep_content}</strong><a style="cursor: pointer;" name="pAdd" >답글</a> | <a style="cursor: pointer;" name="pDel">삭제</a>
									</td>
								</c:if> 
								</c:forEach>
						</tr>
						
							<tr>
								<td><span class="form-inline" role="form"> <sec:authorize
										access="isAuthenticated()">
										<form action="reply_insert.do" method="POST">
											<p>
											<div class="form-group">
												<input type="hidden" name="board_idx"
													value="${boardVO.board_idx}"> <input type="hidden"
													name="cate" value="${cate}"> <input type="text"
													id="commentParentName" name="name"
													class="form-control col-lg-2" data-rule-required="true"
													value="<sec:authentication property="principal.username"/>"
													readonly=true maxlength="10">
											</div>
											<div class="form-group">
												<button type="submit" name="Submit" class="btn btn-default">확인</button>
											</div>
											</p>
											<textarea id="commentParentText" name="content"
												class="form-control col-lg-12" style="width: 100%" rows="4"></textarea>
										</form>
									</sec:authorize> <sec:authorize access="isAnonymous()">
										<input type="text" id="commentParentName" name="name"
											class="form-control col-lg-12" data-rule-required="true"
											value="댓글은 로그인 후 가능합니다." style="width: 100%" readonly=true
											maxlength="10">
									</sec:authorize>
							</span></td>


						</tr>
					</table>
					<table class="table table-condensed">
						<thead>
							<tr>
								<td><span style='float: right'>
										<button type="button" id="list" class="btn btn-default">목록</button>
										<button type="button" id="modify" class="btn btn-default">수정</button>
										<button type="button" id="delete" class="btn btn-default">삭제</button>
										<c:choose>
											<c:when test="${cate eq '공지'}">
												<sec:authorize access="hasRole('ROLE_ADMIN')">
													<button type="button" id="write" class="btn btn-default">글쓰기</button>
												</sec:authorize>
											</c:when>
											<c:otherwise>
												<sec:authorize access="hasRole('ROLE_USER')">
													<button type="button" id="write" class="btn btn-default">글쓰기</button>
												</sec:authorize>
											</c:otherwise>
										</c:choose>
										<button type="button" id="re_write" class="btn btn-default">답글</button>
								</span></td>
							</tr>
						</thead>
					</table>
					<script>
			$(function() {
							
				//제일 하단에 있는 depth1의 댓글을 다는 이벤트
				$("#commentParentSubmit")
						.click(
								function(event) {
									//ajax로 저장하고 성공하면 저장한 데이터를 가져와 넣어야 하는데 여기서는 테스트라 그냥 입력값을 가져옴

									var pName = $("#commentParentName");
									var pText = $("#commentParentText");

									if ($.trim(pName.val()) == "") {
										alert("이름을 입력하세요.");
										pName.focus();
										return;												
									} else if ($.trim(pText.val()) == "") {
										alert("내용을 입력하세요.");
										pText.focus();
										return;
									}

									var commentParentText = '<tr id="r1" name="commentParentCode">'
											+ '<td colspan=2>'
											+ '<strong>'
											+ pName.val()
											+ '</strong> '
											+ ' <a style="cursor:pointer;" name="pAdd">답글</a> | <a style="cursor:pointer;" name="pDel">삭제</a><p>'
											+ pText.val().replace(
													/\n/g, "<br>")
											+ '</p>'
											+ '</td>'
											+ '</tr>';

									//테이블의 tr자식이 있으면 tr 뒤에 붙인다. 없으면 테이블 안에 tr을 붙인다.
									if ($('#commentTable')
											.contents().size() == 0) {
										$('#commentTable').append(
												commentParentText);
									} else {
										$('#commentTable tr:last')
												.after(
														commentParentText);
									}

									$("#commentParentName").val("");
									$("#commentParentText").val("");

								});


				//댓글의 댓글을 다는 이벤트
				$(document)
						.on(
								"click",
								"#commentChildSubmit",
								function() {

									var cName = $("#commentChildName");
									var cText = $("#commentChildText");

									if ($.trim(cName.val()) == "") {
										alert("이름을 입력하세요.");
										cName.focus();
										return;
									} else if ($.trim(cText.val()) == "") {
										alert("내용을 입력하세요.");
										cText.focus();
										return;
									}

									var commentChildText = '<tr name="commentChildCode">'
											+ '<td style="width:1%"><span class="glyphicon glyphicon-arrow-right"></span></td>'
											+ '<td style="width:99%">'
											+ '<strong>'
											+ cName.val()
											+ '</strong> '
											+ ' <a style="cursor:pointer;" name="cAdd">답글</a> | <a style="cursor:pointer;" name="cDel">삭제</a>'
											+ '<p>'
											+ cText.val().replace(
													/\n/g, "<br>")
											+ '</p>'
											+ '</td>'
											+ '</tr>';

									//앞의 tr노드 찾기
									var prevTr = $(this).parent()
											.parent().parent()
											.parent().prev();
									//댓글 적는 에디터 삭제
									$("#commentEditor").remove();//여기에서 삭제를 해줘야 에디터tr을 안 찾는다.

									//댓글을 타고 올라가며 부모 tr을 찾음
									while (prevTr.attr("name") != "commentParentCode") {
										prevTr = prevTr.prev();
									}
									//while를 타는지 체크
									var check = false;
									//다음 노드가 댓글(depth1)의 댓글인지 찾기위해 next
									var nextTr = prevTr.next();
									//뒤에 댓글(depth1)의 댓글(depth2_1)이 없다면 바로 붙인다.
									if (nextTr.attr("name") != "commentChildCode") {
										prevTr
												.after(commentChildText);
									} else {
										//댓글(depth1)의 댓글(depth2_n)이 있는경우 마지막까지 찾는다.
										while (nextTr.attr("name") == "commentChildCode") {
											nextTr = nextTr.next();
											check = true;
										}
									}

									if (check) {//댓글(depth1)의 댓글(depth2_n)이 있다면 그 댓글(depth2_n) 뒤에 댓글(depth2_n+1) 추가
										nextTr = nextTr.prev();//while문에서 검색하느라 next로 넘거갔던거 다시 앞으로 돌려줌
										nextTr.after(commentChildText);
									}
								});

				//답글링크를 눌렀을때 에디터 창을 뿌려주는 이벤트, 삭제링크를 눌렀을때 해당 댓글을 삭제하는 이벤트
				$(document)
						.on(
								"click",
								"table#commentTable a",
								function() {//동적으로 버튼이 생긴 경우 처리 방식

									if ($(this).attr("name") == "pDel") {
										if (confirm("답글을 삭제 하시면 밑에 답글도 모두 삭제 됩니다. 정말 삭제하시겠습니까?") == true) { //확인

											var delComment = $(this)
													.parent()
													.parent();
											var nextTr = delComment
													.next();
											var delTr;
											//댓글(depth1)의 댓글(depth2_1)이 있는지 검사하여 삭제
											while (nextTr
													.attr("name") == "commentCode") {
												nextTr = nextTr
														.next();
												delTr = nextTr
														.prev();//삭제하고 넘기면 삭제되서 없기 때문에 다음값을 가져오기 어려워 다시 앞으로 돌려서 찾은 다음 삭제
												delTr.remove();
											}

											delComment.remove();

										} else { //취소
											return;
										}
									} else if ($(this).attr("name") == "cDel") {
										if (confirm("정말 삭제하시겠습니까??") == true) { //확인
											$(this).parent()
													.parent()
													.remove();
										} else { //취소
											return;
										}
									} else {
										//자기 부모의 tr을 알아낸다.
										var parentElement = $(this)
												.parent().parent();
										//댓글달기 창을 없앤다.
										$("#commentEditor")
												.remove();
										//부모의 하단에 댓글달기 창을 삽입
										var commentEditor = '<tr id="commentEditor">'
												+ '<td style="width:1%"> </td>'
												+ '<td>'
												+ '<span class="form-inline" role="form">'
												+ '<p>'
												+ '<div class="form-group">'
												+ '<input type="text" id="commentChildName" name="commentChildName" class="form-control col-lg-2" data-rule-required="true" value="<sec:authentication property="principal.username"/>" readonly=true maxlength="10">'
												+ '</div>'																														+ '<div class="form-group">'
												+ '<input type="button" id="commentChildSubmit" class="btn btn-default">확인</input>'
												+ '</div>'
												+ '</p>'
												+ '<textarea id="commentChildText" name="commentChildText" class="form-control" style="width:98%" rows="4"></textarea>'
												+ '</span>'
												+ '</td>' + '</tr>';

										parentElement
												.after("reply_insert.do");
									}

								});

				$("#list").click(function(event) {
					location.href = 'list.do?cate=${cate}';
				});
$("#modify")
		.click(
				function(event) {
					location.href = 'update_form.do?board_idx=${boardVO.board_idx}&writer=${boardVO.mem_id}';
				});
$("#delete")
		.click(
				function(event) {
					location.href = 'delete.do?board_idx=${boardVO.board_idx}&writer=${boardVO.mem_id}&cate=${cate}';
				});
$("#write")
		.click(
				function(event) {
					location.href = 'insert.do?cate=${cate}';
				});
$("#re_write")
		.click(
				function(event) {
					location.href = 're_write_form.do?cate=${cate}&board_idx=${boardVO.board_idx}';
				});
			});
		</script>
				
			</div>
			</h2>
			<!-- ---------------------------끝--------------------------- -->

다름이 아니라 제가 스프링 웹게시판을 이용 댓글을 구현하고 있는데요.

막히는 부분이 있어 이렇게 양해를 구합니다.

제가 막히는 부분은 바로 댓글이 보여지는 것입니다.

List<VO>를 통해 

@RequestMapping(value = "reply_insertOk.do")

public ModelAndView repModelAndViewForm(@RequestParam(value="mem_id")String mem_id,

@RequestParam(value="rep_content")String rep_content,

Principal principal){

List<ReplyVO> list = repService.replylistService();

ModelAndView mv = new ModelAndView("board/content","list", list);

return mv;

}  


게시판에 있는 content를 클릭하면 content의 내용과 함께 댓글 입력창이 뜹니다.

댓글 입력창에서 댓글을 입력하면 insert문을 이용 Reply 테이블로 가게 됩니다.

하지만 CONTENT에서는 DB로 값이 등록된 댓글이 등록이 되질않습니다.

도움부탁하빈다!

0
0
  • 답변 4

  • gomonk
    752
    2017-01-11 18:30:01.0

    하지만 CONTENT에서는 DB로 값이 등록된 댓글이 등록이 되질않습니다.

    • 새로고침을 해도 안보임
    • 댓글을 달자마자 댓글이 뜨지 않음


    둘중 어떻게 했을 때 안보이시는건가요?


    0
  • 게시판마스터
    90
    2017-01-11 18:35:31.0

    아니요 둘 다 입니다..

     

    reply컨트롤러 소스 보여드리겠습니다

    package fm.spring.mvc.reply;
    
    
    
    import java.security.Principal;
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import fm.spring.mvc.member.service.MemberService;
    import fm.spring.mvc.model.ReplyVO;
    import fm.spring.mvc.reply.service.ReplyService;
    
    @Controller
    public class ReplyController {
    	@Autowired
    	private ReplyService repService;
    	@Autowired
    	private MemberService memService;
    	
    	@RequestMapping(value = "reply_insert.do")
    	public String reply(@RequestParam(value="name") String mem_id, 
    			@RequestParam(value="content") String rep_content, @RequestParam("board_idx") int board_idx,
    			Principal principal,
    			RedirectAttributes ra,
    			@RequestParam(value="cate")String cate) {
    		String pwd = memService.getPwdService(mem_id);
    		ReplyVO vo = new ReplyVO(-1,board_idx,mem_id,rep_content,null,pwd,0,0,0);
    		
    		repService.insertReply(vo);
    		ra.addAttribute("cate", cate);
    		ra.addAttribute("board_idx", board_idx);
    		return "redirect:/content.do";
    	}	
    	@RequestMapping(value = "reply_insertOk.do")
    		public ModelAndView repModelAndViewForm(@RequestParam(value="mem_id")String mem_id,
    												@RequestParam(value="rep_content")String rep_content,
    												Principal principal){
    			List<ReplyVO> list = repService.replylistService();
    			ModelAndView mv = new ModelAndView("board/content","list", list);
    					return mv;
    	}
    		

    <c:forEach items="${list}" var="replyVO">

    <td colspan="2">

    <strong>${replyVO.rep_content}</strong>

    <a style="cursor: pointer;" name="pAdd" >

    답글</a> | <a style="cursor: pointer;" name="pDel">삭제</a>

            </td>

    </c:forEach>


    이 content.jsp 안에 있는 foreach문을 통해 답글 리스트를 띄우고싶은데

    아직 초보라 접근법을 모르겠습니다


    0
  • 간달
    15
    2017-01-11 18:52:42.0
    <c:if test="value="<sec:authentication property="principal.username"/>>
    	<td colspan="2"><strong>${replyVO.rep_content}</strong><a style="cursor: pointer;" name="pAdd" >답글</a> | <a style="cursor: pointer;" name="pDel">삭제</a>
    									</td>
    </c:if> 
    	

    if 이상한건 아닌가요 ' ' 인지 " " 인지 확인해주시구

    if 없을때 확인해서 안나오면 데이터를 못받아오지않나싶네요

    0
  • 게시판마스터
    90
    2017-01-11 18:59:54.0

    c:if 문은 BOARD게시판의 CONTENT에서 사용한것이라 삭제했습니다 ㅠ

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.