-
Spring_댓글등록_댓글리스트조회Spring 2022. 6. 14. 02:31
<댓글등록>
1)boardDetailView.jsp
<head> <style> .replyTable{margin:auto; width: 500px;} </style> </head> <body> <table class="replyTable"> <tr> <td><textarea row="3" cols="55" id="replyContent"></textarea></td> <td><button id="rSubmit">등록하기</button></td> </tr> </table> <table class="replyTable" id="rtb"> <thead> <tr> <td colspan="2"><b id="rCount"></b></td> </tr> </thead> <tbody></tbody> </table> <script> //댓글등록 $('#rSubmit').click(function(){ var rContent = $('#replyContent').val(); var refBId = ${board.boardId}; $.ajax({ url: 'addReply.bo', data: {replyContent:rContent, refBoardId:refBId}, success: function(data){ console.log(data); if(data == 'success'){ $('#replyContent').val('');//데이터 전송 후 입력창은 비워준다. } }, error: function(data){ console.log(data); } }); }); //리스트조회 function getReplyList(){ $.ajax({ url: 'rList.bo', data: {bId:${board.boardId}}, success: function(data){ console.log(data); $tableBody = $('#rtb tbody'); $tableBody.html(''); var $tr; var $writer; var $content; var $date; $('#rCount').text('댓글('+ data.length + ')'); if(data.length > 0){ for(var i in data){ $tr = $('<tr>') $writer = $('<td>').css('width', '100px').text(data[i].nickName) $content = $('<td>').text(data[i].replyContent); $date = $('<td width="100px">').text(data[i].replyCreateDate); $tr.append($writer); $tr.append($content); $tr.append($date); $tableBody.append($tr); } } else { $tr = $('<tr>'); $content = $('<td colspan="3">').text('등록된 댓글이 없습니다.'); $tr.append($content); $tableBody.append($tr); } }, error: function(data){ console.log(data); } }); } //다른 사용자가 댓글을 쓸 수 있어서 5000(5초) $(function(){ getReplyList(); setInterval(function(){ getReplyList(); }, 5000); }); </script> </body>
setInterval()를 사용하여 일정한 시간간격(5000(5초))을 두고 펑션함수를 실행시킨다.
2) BoardControllelr(댓글 insert)
@RequestMapping("addReply.bo") @ResponseBody public String addReply(@ModelAttribute Reply r, HttpSession session) { //Model 또는 session을 통해 댓글을 누가 썼는지 알아야하기때문에 id도 알아야한다. String id = ((Member)session.getAttribute("logUser")).getId(); r.setReplyWriter(id); int result = bService.insertReply(r); if(result > 0){ return "success"; } else { throw new BoardException("댓글 등록에 실패하였습니다."); } }
댓글 저장에 성공했으면 "success" 반환, 실패했으면 에러 발생 : 댓글 등록에 실패하였습니다.
view에서 success를 반환받으면 댓글 등록 창에 적은 댓글은 지우기
**반환을 String으로 success로 보내기때문에 뷰리졸버가 success라는 jsp에 넘길 수 있으니 @ResponseBody를 추가해서 데이터를 넘기고 있다고 알려준다.
3) BoardService(interFace)
public interface BoardService { int insertReply(Reply r); }
4) BoardServiceImpl
@Service("bService") public class BoardServiceImpl implements BoardService{ @Override public int insertReply(Reply r) { return bDAO.insertReply(sqlSession, r); } }
5) BoardDAO
@Repository("bDAO") public class BoardDAO { public int insertReply(SqlSessionTemplate sqlSession, Reply r) { return sqlSession.update("boardMapper.insertReply", r); } }
6) board-mapper
<mapper namespace="boardMapper"> <insert id="insertReply"> insert into reply values(seq_rid.nextval, #{replyContent}, #{refBoardId}, #{replyWriter}, sysdate, sysdate, default) </insert> </mapper>
댓글 등록쿼리를 작성한다.
<댓글리스트조회>
1) 위와 동일
2-방법1) BoardControllelr-gson사용
@RequestMapping("rList.bo") public void getReplyList(@RequestParam("bId") int bId, HttpServletResponse response) { ArrayList<Reply> list = bService.selectReplyList(bId); response.setContentType("application/json; charset=UTF-8"); Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create try{ gson.toJson(list, response.getWriter()); } catch (IOException e){ e.printStackTrace(); } }
setContentType를 통해 인코딩을 진행한다.
gson.toJson을 통해 list를 넘겨준다. + setDateFormat("yyyy-MM-dd")를 사용하여 날짜 세팅 지정!
2-방법2) BoardControllelr-JSON사용
@RequestMapping(value="rList.bo", produces="application/json; charset=UTF-8") @ResponseBody public String getReplyList(@RequestParam("bId") int bId) { JSONArry jArr = new JSONArray(); for(Reply r : list) { JSONObject job = new JSONObject(); job.put("replyId", r.getRefBoardId()); job.put("replyContent", r.getReplyContent()); job.put("replyWriter", r.getReplyWriter()); job.put("nickName", r.getNickName()); job.put("refBoardId", r.getRefBoardId()); job.put("replyCreateDate", r.getReplyCreateDate()); job.put("replyModifyDate", r.getReplyModifyDate()); job.put("replyStatus", r.getReplyStatus()); jArr.put(job); } return jArr.toString(); }
@ResponseBody : View Resolver에게 뷰에 대한 경로를 넘기지 않고 데이터로 담아서 보낼 수 있다.
-->리턴이 스트링이기 때문에 @ResponseBody를 사용해준다.
value="rList.bo", produces="application/json; charset=UTF-8"
JSONObject() : 댓글 담기
JSONArray() : JSONObject();를 담을 수 있다.-->여러개를 가져올거기 때문에 JSONArray를 사용한다.
제이슨 사용시 라이브러리 추가해줘야한다.(pom.xml파일에)
3) BoardService(interface)
public interface BoardService { ArrayList<Reply> selectReplyList(int bId); }
4) BoardServiceImpl
@Service("bService") public class BoardServiceImpl implements BoardService{ @Override public ArrayList<Reply> selectReplyList(int bId) { return bDAO.selectReplyList(sqlSession, bId); } }
5) BoardDAO
@Repository("bDAO") public class BoardDAO { public ArrayList<Reply> selectReplyList(sqlSessionTemplate sqlSession, int bId) { return (ArrayList)sqlSession.selectList("boardMapper.selectReplyList", bId); } }
6) board-mapper
<select id="selectReplyList" resultMap="replyResultSet"> select * from reply join member on (reply_writer = id) where ref_board_id=#{bId} and reply_status = 'Y' order by reply_id desc </select> <resultMap type="Reply" id="replyResultSet"> <id property="replyId" column="REPLY_ID"/> <result property="replyContent" column="REPLY_CONTENT"/> <result property="refBoardId" column="REF_BOARD_ID"/> <result property="replyWriter" column="REPLY_WRITER"/> <result property="nickName" column="NICKNAME"/> <result property="replyCreateDate" column="REPLY_CREATE_DATE"/> <result property="replyModifyDate" column="REPLY_MODIFY_DATE"/> <result property="replyStatus" column="REPLY_STATUS"/> </resultMap>
닉네임을 가져와야하기때문에 member와 조인해준다!
7) mybatis-config.xml
<typeAliases> <typeAlias type="com.ioi.spring.board.model.vo.Reply" alias="Reply"/> </typeAliases>
mapper에서 resultMap에 type="Reply"를 사용하려면 mtbatis-config에서 선언해줘야한다.
'Spring' 카테고리의 다른 글
Interceptor_개념 (0) 2022.06.16 Spring_Controller_파라미터 전송&&데이터 받아오는 방법 정리 (0) 2022.06.15 Spring_Ajax_아이디 중복 확인 (0) 2022.06.14 Spring_파일게시글_페이징처리 (0) 2022.06.10 Spring_로그인_암호화 (0) 2022.06.08