스프링링링
611
2021-03-26 13:36:12 작성 2021-03-26 13:44:13 수정됨
21
350

스프링 게시판 댓글작성에 대해 여쭤볼게있습니다!


안녕하세요, 질문을 하나 올렸었는데 해결이 되지않아 하나 더 작성하겠습니다!

제가 초보라서 한번 읽어봐주시면 감사할 것 같습니다 (ㅠㅠ)

일단 제가 댓글 작성 예제를 연습하고 있는데


reply 데이터베이스고 외래키로 board의 idx와 reply의 idx를 설정해주었습니다.


replymapper.xml

    <!-- 댓글 입력 -->
    <insert id="insertReply">
        INSERT INTO tbl_reply (idx, replytext, replyer)
        VALUES (#{idx}, #{replytext}, #{replyer})
    </insert>
    
    <!-- 댓글 목록 -->
    <select id="listReply" resultType="com.__.spring.model.board.dto.ReplyVO">
        SELECT rno, idx, replytext, replyer, user_name AS userName, r.wdate, r.updatedate
        FROM tbl_reply r, tbl_member m
        WHERE  r.replyer = m.user_id AND idx=#{idx}
        ORDER BY rno
    </select>

이렇게 작성해주었구요,


replylist.jsp

<td>
<input type="hidden" name="idx" value="${dto.idx}">
  ${row.userName}(<fmt:formatDate value="${row.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/>)
  <br>
${row.replytext}
</td>

jsp는 이렇게 작성해주었습니다.


replycontroller.java

    @RequestMapping("listJson.do")
    @ResponseBody
    public List<ReplyVO> listJson(@RequestParam int idx){
        List<ReplyVO> list = replyService.list(idx);
        return list;

컨트롤러 댓글목록 부분입니다.



제가 생각한것은 board의 idx를 댓글 idx에서도 받아와서 

굳이 idx를 작성하지않아도 

이러한 댓글 작성 창을 입력하면 idx가 저절로 올라가게 되는걸 생각했는데

오류가 idx 칼럼이 null값으로 떠서 idx에 null값을 가능하게 설정하니까 댓글 작성은 되었다고 뜨는데

idx가 0으로 올라가서 게시글에서 댓글이 보이지 않더라구요.

어떤점이 잘못되었는지 잘 모르겠어서 ... 혹시 한번 봐주실 수 있으면 감사하겠습니다 !




+) 댓글작성 클릭 이벤트 내용입니다!


    $("#btnReply").click(function(){
        var replytext=$("#replytext").val();
        var idx="${dto.idx}"
        var param="replytext="+replytext+"&idx="+idx;
        $.ajax({                
            type: "post",
            url: "${path}/reply/insert.do",
            data: param,
            success: function(){
                alert("댓글이 등록되었습니다.");
                listReply2();
            }
        });
    });


0
  • 답변 21

  • 이핫
    178
    2021-03-26 13:54:39 작성 2021-03-26 13:58:51 수정됨

    ajax 바로 위에 console.log(param); 이거 찍으면 idx 값이 있나요??...

    아래처럼 한번 바꿔보실래요??...


        @RequestMapping("/listJson.do")
        @ResponseBody
        public List<ReplyVO> listJson(@RequestParam ReplyVO replyVo){
    List<ReplyVO> list = replyService.list(replyVo);
    return list;


        $("#btnReply").click(function(){
            var replytext=$("#replytext").val();
            var idx="${dto.idx}"
            var param="replytext="+replytext+"&idx="+idx;
            $.ajax({                
                type: "post",
                url: "${path}/reply/insert.do?"+param,
                success: function(){
                    alert("댓글이 등록되었습니다.");
                    listReply2();
                }
            });
        });
  • 스프링링링
    611
    2021-03-26 14:01:49

    @이핫님 //

    아니요 ㅠㅠ

    Uncaught ReferenceError: param is not defined

    콘솔 창 보니까 안뜨네요 ,,

  • 이핫
    178
    2021-03-26 14:04:39

    스프링링링

    그러면... 이부분만 세미콜론 찍고나서 idx만 콘솔 한번 찍어보실래요??...

    var idx="${dto.idx}";
  • 스프링링링
    611
    2021-03-26 14:13:44

    흠 idx 없다고 나오네요 ㅠㅠ 값을 못받아오는거인가봐요 ㅠㅠ

  • 이핫
    178
    2021-03-26 14:16:59

    스프링링링

    그러면 dto.idx자체에 값이 없는거일거 같네요...ㅎㅎㅎ

    컨트롤러에서 jsp로 내려줄때 model에 dto라는 key값으로 vo내려주셨나요??


  • 스프링링링
    611
    2021-03-26 14:19:26


    public class ReplyVO {
        private Integer rno;       
        private Integer idx;        
        private String replytext;    
        private String replyer;       
        private String userName;    
        private Date wdate;   
        private Date updatedate; 

    선생님! dto에 이렇게 넣어주고 getter/setter랑 tostring 해줬는데 여기서 잘못된걸까요?_?

  • 이핫
    178
    2021-03-26 14:21:37

    스프링링링

    VO쪽이 문제가 아니라 화면 집입할때 데이터를 제대로 내려줬는지를 봐야될거 같아요...

    지금 작업하시는 화면으로 진입하는 컨트롤러를 긁어서 올려주시겠어요??..

  • 스프링링링
    611
    2021-03-26 14:24:13

    @이핫님 // reply controller 입니다 !

    @RequestMapping("/reply/*")
    public class ReplyController {
        
        @Inject
        ReplyService replyService;
        
        @RequestMapping("insert.do")
        public void insert(@ModelAttribute ReplyVO vo, HttpSession session){
            String userId = (String) session.getAttribute("userId");
            vo.setReplyer(userId);
            replyService.create(vo);
        }
        
        @RequestMapping("list.do")
        public ModelAndView list(@RequestParam int idx, ModelAndView mav){
            List<ReplyVO> list = replyService.list(idx);
            mav.setViewName("board/replyList");
            mav.addObject("list", list);
            return mav;
        }
        
        @RequestMapping("listJson.do")
        @ResponseBody 
        public List<ReplyVO> listJson(@RequestParam int idx){
            List<ReplyVO> list = replyService.list(idx);
            return list;
        }
    }


  • 스프링링링
    611
    2021-03-26 14:25:42

    jsp에서 댓글목록 view입니다!

    	// Controller방식
    	// **댓글 목록1
    	function listReply() {
    		$.ajax({
    			type : "get",
    			url : "${path}/reply/list.do?idx=${dto.idx}",
    			success : function(result) {
    				// responseText가 result에 저장됨.
    				$("#listReply").html(result);
    			}
    		});
    	}
    	// RestController방식 (Json)
    	// **댓글 목록2 (json)
    	function listReply2() {
    		$.ajax({
    			type : "get",
    			//contentType: "application/json", ==> 생략가능(RestController이기때문에 가능)
    			url : "${path}/reply/listJson.do?idx=${dto.idx}",
    			success : function(result) {
    				console.log(result);
    				var output = "<table>";
    				for ( var i in result) {
    					output += "<tr>";
    					output += "<td>" + result[i].userName;
    					output += "(" + changeDate(result[i].regdate) + ")<br>";
    					output += result[i].replytext + "</td>";
    					output += "<tr>";
    				}
    				output += "</table>";
    				$("#listReply").html(output);
    			}
    		});
    	}


  • 이핫
    178
    2021-03-26 14:29:42 작성 2021-03-26 14:38:42 수정됨

    스프링링링

    리플을 상세화면에서 다는게 아니라 list에서 바로 다나요??

    list에서 바로 단다고 하면...


    아래 코드 루트 돌리는 foreach문을 통째로 좀 봐야될거 같네요....

    <td>
    <input type="hidden" name="idx" value="${dto.idx}">
      ${row.userName}(<fmt:formatDate value="${row.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/>)
      <br>
    ${row.replytext}
    </td>


    foreach에 변수를 아래처럼 row로 줘서 돌렸으면 "${row.idx}"로 해야 나올거 같네요...

    <c:forEach var="row" items="${list}" varStatus="status">

    </c:forEach>


    이부분도  jquery로 셀렉터로 뽑아서 넣으셔야 될겁니다...

    var idx="${dto.idx}".;
  • 스프링링링
    611
    2021-03-26 14:33:35

    아 저거 상세화면(view.jsp)에서 가져온거에요! 

    view에서 댓글목록 화면이구 , 


    replylist.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <%@ include file="../include/header.jsp" %>
    </head>
    <body>
        <table style="width:700px">
            <c:forEach var="row" items="${list}">
            <tr>    
                <td>
                    ${row.userName}(<fmt:formatDate value="${row.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/>)
                    <br>
                    ${row.replytext}
                </td>
            </tr>
            </c:forEach>
        </table>
    </body>
    </html>

    요렇게 해줬습니다!

  • 스프링링링
    611
    2021-03-26 14:39:41


                <input type="hidden" name="idx" value="${row.idx}">
                    ${row.userName}(<fmt:formatDate value="${row.regdate}" pattern="yyyy-MM-dd HH:mm:ss"/>)
                    <br>
                    ${row.replytext}

    흠 제가 코드를 맞게했는지도 잘 모르겠어요 idx를 가져와야하니까 일단 hidden값으로 넣긴했는데

    칼럼이 null값이라는 오류는 제대로 못받아오는거겠죠 ㅠㅠ

  • 이핫
    178
    2021-03-26 14:55:31 작성 2021-03-26 14:55:41 수정됨

    스프링링링

    흐음... 일단 정리를 좀 해야겠는데요...ㅋㅋㅋ

    view.jsp로 가는 함수랑 controller를 봐야될거 같네요....


    일단 프로세스 정리를 좀 하면

    list.jsp쪽 tr에 idx를 심어주고

    list tr을 클릭하면 idx값을 가지고 view.jsp이동 컨트롤러로 보내고

    view.jsp이동 컨트롤러에서는 mav.addObject("dto", replyVo); 이런식으로 모델에 값을 넣고

    view.jsp에서는 dto.idx값으로 listJson.do에 값을 넘긴다 이거조..??


  • 스프링링링
    611
    2021-03-26 15:02:02 작성 2021-03-26 15:02:59 수정됨

    네 !! 얼추 맞는거같아요

    지금 초보라서 게시판 만들기 연습하고있는데

    블로그 보면서 따라하고있거든요 그래서 모르는점이 많아요 (ㅠㅠ)

    mav.addObject("dto", boardService.read(idx));

    컨트롤러에는 이렇게 넣어줬어요 


    list.jsp tr에는

    <td>${row.idx}</td>

    이렇게 넣어줬구요!

  • 이핫
    178
    2021-03-26 15:18:40 작성 2021-03-26 15:20:01 수정됨

    스프링링링

    리스트에서 view로 idx가 안넘어가서 생기는 거같네요...

    list에서 idx값은 row.idx로 이제 찍히니까 view로 넘기는 쪽에 idx값을 넘겨주면 되는데...

    view.jsp로 가는 컨트롤러랑 view.do 호출하는 javascript부분하고 list td쪽만 잡아드리면 될거 같네요..

    이 세부분 소스 긁어서 올려주시면 수정하면서 주석으로 설명 달아드릴게요...

  • 스프링링링
    611
    2021-03-26 15:25:10

    컨트롤러

        @RequestMapping("list.do")
        public ModelAndView list(@RequestParam(defaultValue="title") String searchOption,
                                 @RequestParam(defaultValue="") String keyword,
                                 @RequestParam(defaultValue="1") int curPage) throws Exception{
    
            int count = boardService.countArticle(searchOption, keyword);
            
            BoardPager boardPager = new BoardPager(count, curPage);
            int start = boardPager.getPageBegin();
            int end = boardPager.getPageEnd();
            
            List<BoardVO> list = boardService.listAll(start, end, searchOption, keyword);
            
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("list", list); 
            map.put("count", count); 
            map.put("searchOption", searchOption); 
            map.put("keyword", keyword); 
            map.put("boardPager", boardPager);
            
            ModelAndView mav = new ModelAndView();
            
            mav.addObject("map", map);
            mav.setViewName("board/list");
            return mav; // list.jsp로 List가 전달된다.
        }
        @RequestMapping(value="view.do", method=RequestMethod.GET)
        public ModelAndView view(@RequestParam int idx, HttpSession session) throws Exception{
            boardService.increaseViewcnt(idx, session);
            ModelAndView mav = new ModelAndView();
            mav.setViewName("board/view");
            mav.addObject("dto", boardService.read(idx));
            return mav;


    list.jsp

        <table border="1" width="600px">
            <tr>
                <th>번호</th>
                <th>제목</th>
                <th>이름</th>
                <th>작성일</th>
                <th>조회수</th>
            </tr>
            <c:forEach var="row" items="${map.list}">
            <tr>
                <td>${row.idx}</td>
                <td><a href="${path}/board/view.do?idx=${row.idx}&curPage=${map.boardPager.curPage}&searchOption=${map.searchOption}&keyword=${map.keyword}">${row.title}
                        <c:if test="${row.recnt > 0}">
                        <span style="color: red;">(${row.recnt})
                        </span>
                        </c:if>
                    </a>
                </td>
                <td>${row.userName}</td>
                <td>
                    <!-- 원하는 날짜형식으로 출력하기 위해 fmt태그 사용 -->
                    <fmt:formatDate value="${row.wdate}" pattern="yyyy-MM-dd HH:mm:ss"/>
                </td>
                <td>${row.hit}</td>
            </tr>

    list.jsp 는 일부분만 보여드렸는데 다 보여드려야 할까요?!

    감사합니다 선생님 ㅠㅠ

  • 이핫
    178
    2021-03-26 15:35:16 작성 2021-03-26 15:36:58 수정됨

    아 a태그로 클릭해서 넘기시는군요.. 저렇게 넣은거면 view로도 idx값은 넘어갔을거고...

    view에서는 dto로 idx값만 잘 내려갔으면 문제 없을텐데...


    이부분 쿼리에서 idx값을 조회를 안하는거 같은데요??...

    boardService.read(idx)

    쿼리문이랑 vo 전체 구조 한번 올려주실래요??...



     public ModelAndView view(@RequestParam int idx, HttpSession session) throws Exception{
    
            system.out.println(idx);  // 이거 한줄 넣어서 idx 제대로 넘어오는지 한번 체크해 주시구요...
    
    
            boardService.increaseViewcnt(idx, session);
            ModelAndView mav = new ModelAndView();
            mav.setViewName("board/view");
            mav.addObject("dto", boardService.read(idx));
            return mav;
  • 스프링링링
    611
    2021-03-26 15:47:34

    vo

    package com.~.model.board.dto;
     
    import java.util.Date;
     
    public class BoardVO {
        private int idx;            
        private String title;      
        private String content;    
        private String writer;      
        private Date wdate;      
        private int hit;       
        private String userName;
        private int recnt;
        
        
        //getter/setter
    	public int getIdx() {
    		return idx;
    	}
    	public void setIdx(int idx) {
    		this.idx = idx;
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	public String getContent() {
    		return content;
    	}
    	public void setContent(String content) {
    		this.content = content;
    	}
    	public String getWriter() {
    		return writer;
    	}
    	public void setWriter(String writer) {
    		this.writer = writer;
    	}
    	public Date getWdate() {
    		return wdate;
    	}
    	public void setWdate(Date wdate) {
    		this.wdate = wdate;
    	}
    	public int getHit() {
    		return hit;
    	}
    	public void setHit(int hit) {
    		this.hit = hit;
    	}
    	
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public int getRecnt() {
    		return recnt;
    	}
    	public void setRecnt(int recnt) {
    		this.recnt = recnt;
    	}
    	
    	@Override
    	public String toString() {
    		return "BoardVO [idx=" + idx + ", title=" + title + ", content=" + content + ", writer=" + writer + ", wdate="
    				+ wdate + ", hit=" + hit + ", userName=" + userName + ", recnt=" + recnt + "]";
    	}
    }
    	
    	
        
    



    쿼리문이 어디 올려드리면 될까요? 

    컨트롤러에서 idx 찍어보는건 해봤는데 콘솔창에 아무것도 안뜨네용 ,,

  • 이핫
    178
    2021-03-26 15:51:21

    컨트롤러에 idx 안올라 왔다면...


    <a href="${path}/board/view.do?idx=${row.idx}"> // 이렇게 바꿔보시구요...


    쿼리문도 긁어서 그냥 복사해서 올려주시면 될거 같아요..ㅎㅎ

  • 스프링링링
    611
    2021-03-26 17:33:00

    선생님 감사합니다

    ${dto.idx} 로 출력해보면 값 잘 나오는데 ,,, 댓글작성 버튼만 누르면 그러네요

    hidden값도 주고 다 확인한거가은데 도대체 왜이러는지 모르겠네요 ㅠ

  • 이핫
    178
    2021-03-26 18:02:51 작성 2021-03-26 18:10:27 수정됨

    흐음...


        @RequestMapping(value="view.do", method=RequestMethod.GET)
        public ModelAndView view(@RequestParam int idx, HttpSession session) throws Exception{
            system.out.println(idx); // 이부분이 정상이면...
    
            boardService.increaseViewcnt(idx, session);
            ModelAndView mav = new ModelAndView();
            mav.setViewName("board/view");
            mav.addObject("dto", boardService.read(idx));
            
            system.out.println(boardService.read(idx).toString()); //이부분에 idx값 있는지 봐야될거 같고...
    
            요기에도 정상으로 찍히면...
    
            return mav;


    view.jsp에서 

    <input type="hidden" id="idx" value="${dto.idx}"> // name을 ID로 바꿔서

    선언하고...


        $("#btnReply").click(function(){
            var replytext=$("#replytext").val();
            var idx= $("#idx").val(); // 이렇게 값 뽑아보시고...
            var param="replytext="+replytext+"&idx="+idx;
            $.ajax({                
                type: "post",
                url: "${path}/reply/insert.do?"+param,
                success: function(){
                    alert("댓글이 등록되었습니다.");
                    listReply2();
                }
            });
        });

    이렇게 전송하시고...


        @RequestMapping("insert.do")
        public void insert(@RequestParam ReplyVO vo, HttpSession session){  // RequestParam으로 바꾸고..
            system.out.println(vo.toString()); // 이거 한번 찍어보시고...
            String userId = (String) session.getAttribute("userId");
            vo.setReplyer(userId);
            replyService.create(vo);
        }


    이거도 안되면...

        var param = {
        replytext : $("#replytext").val(),
        idx : $("#idx").val()
    }   // json구조로 넘기는 방법으로 변수 이렇게 하시고...
    
        $("#btnReply").click(function(){
    
            $.ajax({                
                type: "post",
                url: "${path}/reply/insert.do",
                data: JSON.stringify(param), // 이렇게 json 파싱하신 다음에...
                success: function(){
                    alert("댓글이 등록되었습니다.");
                    listReply2();
                }
            });
        });



        @RequestMapping("insert.do")
        public void insert(@RequestBody ReplyVO vo, HttpSession session){ // RequestBody로 받아보세요...
            system.out.println(vo.toString()); // 이거 한번 찍어보시고요...
            String userId = (String) session.getAttribute("userId");
            vo.setReplyer(userId);
            replyService.create(vo);
        }


    오늘은 일단 이렇게까지 밖에 정리를 못해드리겠네요...ㅠㅠㅠ


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