67. spring으로 댓글쓰기

hanahana·2022년 9월 16일
0

Spring 학원수강

목록 보기
25/45
post-thumbnail

jsp로 댓글창 만들기

댓글창은 게시물 상세페이지에서 작성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${board.boardTitle }</title>

</head>
<body>
	<header>
		<jsp:include page="../home.jsp" />
	</header>

	<table align="center" border="1" width="500">
		<tr>
			<td>제목</td>
			<td>${board.boardTitle }</td>
		</tr>
		<tr>
			<td>작성자</td>
			<td>${board.boardWirter }</td>

		</tr>
		<tr>
			<td>작성일</td>
			<td>${board.bCreateDate }</td>
		</tr>
		<tr>
			<td>내용</td>

			<td>${board.boardContents } <br> <c:if
					test="${board.boardRename ne null}">
					<img alt="본문이미지"
						src="/resources/buploadFiles/${board.boardRename }">

				</c:if>
			</td>
		</tr>

		<tr>
			<td colspan="2">
				<!--검색/일반의 경우 목록주소 --> <!-- 일반으로 상세 진입시 목록 --> <c:if
					test="${empty searchValue  }">
					<input type="button" value="수정"
						onclick="location.href='/board/modifyView.kh?boardNo=${board.boardNo}&page=${pageNow }';">
					<button type="button"
						onclick="location.href='/board/list.kh?page=${pageNow }';">목록</button>
				</c:if> <!-- 검색 으로 상세 진입시 --> <c:if test="${searchValue ne null }">
					<input type="button" value="수정"
						onclick="location.href='/board/modifyView.kh?boardNo=${board.boardNo}&searchCondition=${searchCondition }&searchValue=${searchValue}&page=${pageNow }';">
					<button type="button"
						onclick="location.href='/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${pageNow }';">목록</button>
				</c:if> <!-- 목록주소 태그 종료 -->

				<button type="button" onclick="remove()">삭제</button>
			</td>
		</tr>

	</table>
	

	<!--  댓글 목록 -->
	
	<form action="/board/addReply.kh" method="post">
	<input type="hidden" name="refBoardNo" value="${board.boardNo }">
		<table align="center" width="500" border="1">
			<tr>
				<td>
				<textarea rows="3" cols="55" placeholder="내용을 작성하세요" name="replyContents" required="required"></textarea>
				</td>
				<td>
					<button>등록하기</button>
				</td>
			</tr>

		</table>

	<table align="center" width="500" border="1">
	<tr>
	<td width="100">내용</td>
	<td>작성자</td>
	<td>작성일</td>
	<td><a href="#">수정</a> <a href="#">삭제</a>
	</tr>
	</table>

	</form>

	<script>
		function remove() {
			event.preventDefault(); // 하이퍼링크 이동방지
			if (window.confirm("게시물을 삭제하시겠습니까?")) {
				location.href = '/board/remove.kh?page=${pageNow}';

			}

		}
	</script>

</body>
</html>
  • 게시물 상세 페이지 밑에 댓글창을 만들었다.
    • 여기서 확인해야 할것은 댓글의 입력 name이 무엇인지
      • textarea의 name은 replyContents이다.
    • 입력받는값은 무엇인지이다.
    • boardNo를 hidden으로 입력받고있다.
    • 작성자를 입력받지 않는다.

댓글 테이블을 만들고 vo클래스를 작성한다.

테이블

create table reply_tbl(
reply_no number primary key,
ref_board number not null,
reply_contents varchar2(500) not null,
reply_writer varchar2(30) not null,
r_create_date date default sysdate,
r_update_date date default sysdate,
r_status varchar2(2) default 'Y'
);

create sequence seq_reply_no;
  • 이런 테이블과 시퀀스를 만들었다.
    • 테이블 컬럼을 확인하자!
    • reply_no는 시퀀스로 들어갈것이다.
    • ref_board는 boardNo값이다!
    • reply_contents는 jsp에서 replyContents의 값이 들어갈것이다.
    • reply_wirte는 작성자다
    • 아래에는 오늘날짜가 디폴트이며 status는 삭제여부를 표시하며 기본 Y이다,.

VO클래스

	private int replyNo;
	private int refBoardNo;
	private String replyContents;
	private String replyWirter;
	private Date rCreateDate;
	private Date rUpdateDate;
	prviate String rStatus;
  • 이렇게 변수를 선언하고 게터세터 메소드를 만들어주었다.
  • 여기서 확인할수있는건 jsp에서 받아 세터에 저장하는 변수는 replyContents뿐이라는것이다
  • 하지만 hidden으로 boardNo를 숨겨놨다, 그 값은 refBoardNo에 저장되겠지?

이제 드디어 Controller

/**
	 * 댓글등록
	 * @param mv
	 * @return
	 */
	@RequestMapping(value="/board/addReply.kh", method = RequestMethod.POST)
	public ModelAndView addBoardReply(ModelAndView mv, @ModelAttribute Reply reply,
			HttpSession session) {
//1		
		Member member= (Member)session.getAttribute("loginUser");
		String replyWriter = member.getMemberId();
		reply.setReplyWirter(replyWriter);
		int result = bService.registerReply(reply);
		try {
			int boardNo = reply.getRefBoardNo();
			mv.setViewName("redirect:/board/detail.kh?boardNo="+boardNo);
		} catch (Exception e) {
			mv.addObject("msg",e.getMessage());
		}
		return mv;
		
	}
  • 댓글을 입력한 replyContents 숨겨져있던 boardNo는 Reply reply에 저장됐다
  • 그렇다면 저장해야할 남은값은 무엇일까?
    • 글쓴이이다. 글쓴이는 session에 이미 저장된 loginUser에서 가져온다.(//1참고)

      		Member member= (Member)session.getAttribute("loginUser");
      		String replyWriter = member.getMemberId();
      		reply.setReplyWirter(replyWriter);
    • 댓글을 쓴 뒤 다시 돌아가야할 상세페이지는 boardNo를 통해 그 페이지로 돌아가기때문에 reply에서 getRefBoardNo로 가져온 뒤 mv를 통해 페이지에 연결해준다.

  • int result = bService.registerReply(reply); 저장한값을 해당 코드를 통해 Service클래스로 보냈다.

Service Store Mpper

Service

@Override
	public int registerReply(Reply reply) {
		int result =bStore.insertReply(session, reply);
		return result;
	}
  • 세션값과 함께 전달값을 Store로 보냈다.

Store

@Override
	public int insertReply(SqlSessionTemplate session, Reply reply) {
		int result = session.insert("BoardMapper.insertReply",reply);
				return result;
	}
  • mapper의 namespace와 id와 연결한 쿼리문을 reply값과 연결해서 데이터베이스에 전송!!!

Mapper

<insert id="insertReply">
		insert into reply_tbl values(seq_reply_no.nextval, #{refBoardNo},#{replyContents},#{replyWirter}, default, default, default)
	</insert>
  • 댓글이 정상적으로 입력된다.
  • 로그인을 하지 않으면 작성자값이 입력되지 않아 오류메세지가 뜬다,
profile
hello world

0개의 댓글