D+32::(FinalProject)게시판_댓글 만들기

Am.Vinch·2022년 8월 9일
0
post-thumbnail

20220809_Tue

  • 오늘 실습내용
    -게시글수정/삭제/조회수증가
    -권한(글수정 및 삭제는 작성자 혹은 관리자만 가능)
    -댓글 등록(로그인한 회원만 가능)
    -댓글 목록 조회
    -댓글 삭제(본인 혹은 관리자만 가능)
    ----> 댓글은 모두 게시글 상세보기화면에서만
    -비밀글관련작업

프로젝트명: FinalProject
어제와 이어서 계속 진행...
어제와 달리 댓글 창을 만들면서 수정된 부분이 많음!!!

  • 인덱스 파일 가장 먼저 생성하기

  • 보드컨트롤러


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dto.BoardDTO;
import dto.MemberDTO;
import dto.ReplyDTO;
import service.BoardService;
import service.BoardServiceImpl;
import service.MemberService;
import service.ReplyServiceImpl;

@WebServlet("*.bo")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	//BoardServiceImpl에서 만들고 이를 생성해줘야 사용가능하다!!
	private BoardServiceImpl boardService =new BoardServiceImpl();
	private ReplyServiceImpl replyService =new ReplyServiceImpl();
	private List<BoardDTO> boardList = new ArrayList<>();
	private BoardDTO board;

private String boardNum;
	
    public BoardController() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//한글 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
	
		String requestURI = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = requestURI.substring(contextPath.length());
		System.out.println("command = " + command);
		
		//고정된 화면:template.jsp
		//(실제화면)가장 첫번째 화면 페이지
		String page = "template.jsp";
		//계속 변하는 화면:contentPage
		//내부화면
		String contentPage ="";
		boolean isRediect = false;
		
		// 게시판 목록 페이지
		if(command.equals("/boardList.bo")) {
			List<BoardDTO> boardList = boardService.selectBoardList();
		   // boardService.updateReadCnt();
			request.setAttribute("boardList", boardList);
			contentPage="board_list.jsp";
		}
		
		
		//글등록 양식페이지로 이동
		else if(command.equals("/writeBoardForm.bo")) {
			contentPage="write_board_form.jsp";
		}
		//글등록
		else if(command.equals("/writeBoard.bo")) {
			String title = request.getParameter("title");
			String content =request.getParameter("content");
			String isPrivate =request.getParameter("isPrivate");
			String boardPw =request.getParameter("boardPw");
			//매퍼에서 만든 쿼리문을 보고 데이터가져온다
			BoardDTO boardDTO = new BoardDTO();
			boardDTO.setTitle(title);
			boardDTO.setContent(content);
			boardDTO.setBoardPw(boardPw);
			boardDTO.setIsPrivate(isPrivate);
			//문제)writer는 어떻게 가져와야할까?
				//답)
				//게시글 작성자 writer 는 로그인한 사람의 id값이다
				//이미 멤버컨트롤러에 로그인성공하면 로그인정보를 저장하는 세션을 만들어놨다.
				//loginInfo에는 이미 id값과 name 정보가 저장되어있다. 이를 이용한다.
				//사용하기위해 HttpSession라는 인터페이스를 사용한다. 그래서 세션객체 불러온다.
			//1번
				HttpSession session = request.getSession(); //세션을만들어서 데이터받기
	
				//getAttribute의 자료형(리턴타입)은 object이다. 
				//그런데 실제로는loginInfo라는 인자를 넣는것이기때문에 이에 해당하는 자료형을 넣어주면된다.
				//그래서 oginInfo의 자료형 MemberDTO을 넣어주기위해 형변환으로 MemberDTO 자료형 바꿈
			//2번
				MemberDTO loginInfo = (MemberDTO)session.getAttribute("loginInfo");
	
				loginInfo.getMemId();//로그인한 사람의 아이디를 로그인정보에 넣어주기.
				
				//(참고)세션을 사용하는 방법....
				// session); session.setMaxInactiveInterval(10);
				// session.removeAttribute("loginInfo");
	   			//session.invalidate();
			//3번
			boardDTO.setWriter(loginInfo.getMemId());
			
			boardService.insertBoard(boardDTO);
			
			//글등록 완료 alret을 띄우러 갈거기때문에 contentPage가 아닌 page로 만든다
			page="insert_board_result.jsp";
		}
		
		//게시글 상세페이지 이동(댓글 목록도 여기에 작성한다!!)
		else if(command.equals("/boardDetail.bo")) {
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			//상세게시글 정보 조회 
			BoardDTO board = boardService.selectDetailBoard(boardNum);
			request.setAttribute("board", board);
			
			//조회수1증가(쿼리먼저작성!)
			boardService.updateReadCnt(boardNum);
			
			//댓글 목록 조회
			List<ReplyDTO> replyList = replyService.selectReplyList(boardNum);
			request.setAttribute("replyList", replyList);
			
			contentPage="board_detail.jsp";
		}
		
		//게시글 수정 양식 페이지
		else if(command.equals("/boardUpdateForm.bo")) {
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			BoardDTO board = boardService.selectDetailBoard(boardNum);
			request.setAttribute("board", board);
			contentPage="board_update_form.jsp";

		}
		
		//게시글 수정 페이지
		else if(command.equals("/boardUpdate.bo")) {
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			String title = request.getParameter("title");
			String content = request.getParameter("content");
			String boardPw = request.getParameter("boardPw");
			String isPrivate = request.getParameter("isPrivate");

			BoardDTO board = new BoardDTO();
			board.setBoardNum(boardNum);
			board.setTitle(title);
			board.setContent(content);
			board.setBoardPw(boardPw);
			board.setIsPrivate(isPrivate);
			
			boardService.updateBoard(board);
			
			page="boardDetail.bo?boardNum="+ boardNum;
			isRediect = true;

		}
		
		//게시글 삭제페이지(자바스크립트 이용)
		else if(command.equals("/boardDelete.bo")) {
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			int result = boardService.deleteBoard(boardNum);
//			int사용안하고 void 넣었을때: boardService.deleteBoard(boardNum);
			request.setAttribute("result", result);
			page="delete_result.jsp";
			
		}
		//게시글 비밀글관리
		else if(command.equals("/.re")) {
		String isPrivate = request.getParameter("isPrivate");
		int	boardNum = Integer.parseInt(request.getParameter("boardNum"));
		
		BoardDTO baordDTO = new BoardDTO();
		baordDTO.setIsPrivate(isPrivate);
		baordDTO.setBoardNum(boardNum);
		
		boardService.selectBoardList();
		page="boardDetail.bo?boardNum="+ boardNum;
		isRediect = true;
		
		}
		
		request.setAttribute("contentPage", contentPage);
		
		//페이지이동에 사용되는 if문
		if(isRediect) {
			response.sendRedirect(page);
		}
		else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(page);
			dispatcher.forward(request, response);
		}
	}

}
  • 보드 맵퍼
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 해당 파일에 모든 쿼리문을 작성한다. -->
<mapper namespace="boardMapper">
	<resultMap type="dto.BoardDTO" id="board"><!--dto라는 패키지안에있는 자료형 BoardDTO / board는 resultmap의 모든것을 지칭하는 이름  -->
		<id column="BOARD_NUM" 			property="boardNum"/><!--컬럼을 property 변수명으로 가져오겠다. property: dto에 담긴 변수명을 뜻함  --> 
		<result column="TITLE" 			property="title"/>
		<result column="WRITER" 		property="writer"/>
		<result column="CONTENT" 		property="content"/>
		<result column="CREATE_DATE" 	property="createDate"/>
		<result column="READ_CNT" 		property="readCnt"/>
		<result column="IS_PRIVATE" 	property="isPrivate"/>
		<result column="BOARD_PW" 		property="boardPw"/>
	</resultMap>
<!--글쓰기 등록  -->
<!-- 쿼리는 항상 디비에서 먼저 작성후 성공하면 복붙한다!! -->
	<insert id="insertBoard">
		INSERT INTO FINAL_BOARD (
			BOARD_NUM<!--기본키이기때문에 들고다녀야한다  -->
			, TITLE
			, CONTENT
			, WRITER<!-- 외래키이기때문에 들고다닌다 -->
			, IS_PRIVATE
			, BOARD_PW
		) VALUES (<!-- 데이터 받아올 것들 적는다  -->
			<!--해석:게시판테이블에서 가장큰 게시판 글번호 +1한 값을 조회하는데, 아무것도 없으면 NULL이 되기때문에 NVL함수를 이용해서 NULL이 아닌 0값을 넣어준다.   		
			게시판번호가 하나도없을때는 NULL값이 나오기때문에 1을 더하면 1이아닌NULL값이 나오기때문에 NVL함수사용한다
		 	 지금들고있는 가장 큰번호에서  +1 해야 자동번호순서대로 생김 -->
			(SELECT NVL(MAX(BOARD_NUM),0) + 1 FROM FINAL_BOARD )
			, #{title}
			, #{content}
			, #{writer}
			, #{isPrivate}
			, #{boardPw}
		)
	</insert>
	
	<!--글 목록 조회  -->
	<select id="selectBoardList" resultMap="board">
		SELECT BOARD_NUM
			, TITLE
			, WRITER
			, TO_CHAR(CREATE_DATE,'YYYY-MM-DD') AS CREATE_DATE<!-- 주의!! 별칭 반드시  -->
			, READ_CNT
			, IS_PRIVATE
		FROM FINAL_BOARD
		ORDER BY BOARD_NUM DESC 
	</select>
	
	<!-- 상세보기조회 -->
	<select id="selectDetailBoard" resultMap="board">
		SELECT BOARD_NUM
			, TITLE
			, CONTENT
			, WRITER
			, TO_CHAR(CREATE_DATE,'YYYY-MM-DD') AS CREATE_DATE
			, READ_CNT
			, IS_PRIVATE
			, BOARD_PW
		FROM FINAL_BOARD
		WHERE BOARD_NUM = #{boardNum}
	</select>
	
	<!-- 수정  -->
	<update id="updateBoard">
		UPDATE FINAL_BOARD
		SET 
		CONTENT = #{content}
			, TITLE = #{title}
			, IS_PRIVATE = #{isPrivate}
			, BOARD_PW = #{boardPw}
		WHERE BOARD_NUM = #{boardNum}
	</update>
	
	<!-- 삭제 -->
	<delete id="deleteBoard">
		DELETE FINAL_BOARD
		WHERE BOARD_NUM = #{boardNum}
	</delete>
	
	<!--  조회수 증가-->
	<update id="updateReadCnt">
		UPDATE FINAL_BOARD
		SET
		READ_CNT = READ_CNT + 1
		WHERE BOARD_NUM = #{boardNum}
	</update>
	
</mapper>
  • 보드 서비스
//쿼리를 만들면 실행시키는 메소드 만드는 곳:인터페이스
import java.util.List;

import dto.BoardDTO;
import dto.MemberDTO;

//메소드 정의만 올 수 있다.
public interface BoardService {

	 //글등록
	int insertBoard(BoardDTO boardDTO);
	//글목록조회
	List<BoardDTO> selectBoardList();
		
	//조회수 증가
	int updateReadCnt(int readCnt);
	
	//상세보기
	BoardDTO selectDetailBoard(int boardNum);
	
	//수정
	int updateBoard(BoardDTO boardDTO);
	
	//삭제(굳이 int 사용안해도된다면 void 그대로 사용 가능)
	int deleteBoard(int boardNum);
//	void deleteBoard(int boardNum);
}
  • 보드 서비스impl

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import dto.BoardDTO;
import dto.MemberDTO;
import sqlmap.SqlSessionManager;

//쿼리메소드를 구현하는 곳


public class BoardServiceImpl implements BoardService{//보드서비스를 구현하겠다.
	   //쿼리 실행하는 객체
	   SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
	   SqlSession sqlSession = sqlSessionFactory.openSession();

	   //글쓰기등록
	@Override
	public int insertBoard(BoardDTO boardDTO) {
		//쿼리를 실행하려면 위에서 생성한 sqlsession을 가져온다
		//가져온 세션에 글쓰등록을 하는 insert문을 가져온다.
		//매개변수는 우리가 방금 만든 쿼리문id가 있는 "mapper명.쿼리문"을 적고 
		//이들은 우리가 메소드명만들면서 매개변수에 적은 매개변수 dto를 넣는다.
		//자료형은 int이며 이를 담는 이름을 result라 한다.
		//이를 다른곳들에 사용하려면 데이터를 던져야하기때문에 리턴값으로 돌려준다.
		//아까만든 result를 사용하여 리턴값으로 돌려준다.
		//주의) 이들을 사용하려면 BoardServiceImpl 를 컨트롤러에서 맨처음 생성해줘야한다!!
		int result = sqlSession.insert("boardMapper.insertBoard",boardDTO);
		sqlSession.commit();
		return result;
	}
	   //글목록 조회
	@Override
	public List<BoardDTO> selectBoardList( ) {
		//전체 게시글 조회이기때문에 selectList를 해줘야한다!!
		List<BoardDTO> result = sqlSession.selectList("boardMapper.selectBoardList");
		sqlSession.commit();//그냥 반드시 한다.

		return result;
	}
	//조회수 증가
	@Override
	public int updateReadCnt(int boardNum) {
		int result = sqlSession.delete("boardMapper.updateReadCnt", boardNum);
		sqlSession.commit();//그냥 반드시 한다.

		return result;
	}
	//상세보기
	@Override
	public BoardDTO selectDetailBoard(int boardNum) {
		BoardDTO result = sqlSession.selectOne("boardMapper.selectDetailBoard", boardNum);
		sqlSession.commit();//그냥 반드시 한다.
		return result;
	}
	//수정
	@Override
	public int updateBoard(BoardDTO boardDTO) {
		int result = sqlSession.update("boardMapper.updateBoard", boardDTO);
		sqlSession.commit();//그냥 반드시 한다.

		return result;
	}
	//삭제
	@Override
	public int deleteBoard(int boardNum) {
		//외래키참조때문에 부모-자식 관계가 성립한다.
		//게시판이 부모 - 댓글 자식 
		//그래서 함부로 게시글을 삭제하려하면 오류가 발생한다.
		
		//해결방법은?
		//1.지우려고 하는 게시글에 댓글을 먼저 지운다 > 댓글을 지운 후 해당 게시글을 삭제한다.
		//2.댓글이 달려있으면 삭제를 금지한다.
		int result = sqlSession.update("boardMapper.deleteBoard", boardNum);
		sqlSession.commit();//그냥 반드시 한다.
		return result;
	}
	//글삭제 다른 방법) int 말고 void 사용할때  
//	public deleteBoard(int boardNum) {
//	sqlSession.update("boardMapper.deleteBoard", boardNum);
	}

게시글 상세보기 페이지에서 한번에 댓글화면 모두 보이게 만들기

  • 댓글 화면 구현 전 미리 DB에서 관리자 임의로 1인 지정해주기
    : 실제 페이지에서 회원가입 한 회원 중 'abc'라는 MEM_ID를 가진 회원을 관리자로 설정함
    그래서 id값 abc만 IS_ADMIN 'Y'값으로 출력된다.

  • 게시판 상세보기 jsp

    	pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
    .replyDiv{
    	margin-top: 20px;
    }
    .replyList > div{/* 댓글하나하나 */
    	border-bottom: 1px solid #eeeeee;
    	padding-top: 10px;/* 안쪽 여백 */
    	padding-bottom: 10px;/* 안쪽 여백 */
    }
    .replyList > div> div:nth-child(1){
    	font-size: 15px;
    	font-weight: 2px;
    }
    .replyList > div> div:nth-child(2){
    	font-size: 14px;
    	font-weight: 1px;
    	color: gray;
    	margin-bottom: 6px;
    }
    textarea{
    	resize: none;
    }
    table {
    	width: 100%;
    	margin: 0 auto;
    	text-align: center;
    	border-collapse: collapse;
    }
    table>thead>tr>td {
    	background-color: #f7f7f7;
    	border-collapse: collapse;
    	border-top: 3px solid #01579b;
    	border-bottom: 1px solid #bbbbbb;
    }
    tbody>tr, tbody>tr>td { /* 제목줄  */
    	border-bottom: 1px solid #bbbbbb;
    }
    tbody>tr>td:nth-child(2) {
    	text-align: left;
    }
    table>tbody>tr:hover {
    	background-color: #fbfbfb;
    }
    tr, td {
    	padding: 8px;
    }
    .btn {
    	text-align: center;
    	margin-top: 20px;
    }
    </style>
    <script type="text/javascript">
    /* 자바스크립트 사용하기 */
    function goDelete(boardNum){/* 매개변수읮 자료형은 자바스크립트에서는 필요없다 */
    	var result=confirm('정말 삭제하시겠습니까?');
    	/* alert와 같지만 확인/취소 두가지 버튼이 나온다. 확인이면 true,취소면 false를준다.
    	가장먼저 첫번째 줄에 작성을 하면 팝업창만 보이고 나머지 밑에 작성된 내용코드들은 보이지않는다.*/
    	if(result){/* 삭제를 하고싶을 때 확인버튼을 누르면 서블릿으로 이동한다. */
    		location.href='boardDelete.bo?boardNum=' + boardNum;
    	}
    }
    </script>
    </head>
    <body>
    
    	<form action="boardDetail.bo" method="post">
    		<table>
    			<tr>
    				<td>글번호</td>
    				<td>${board.boardNum}</td>
    			</tr>
    			<tr>
    				<td>조회수</td>
    				<td>${board.readCnt }</td>
    			</tr>
    			<tr>
    				<td>제목</td>
    				<td>${board.title }</td>
    			</tr>
    			<tr>
    				<td>작성자</td>
    				<td>${board.writer }</td>
    			</tr>
    			<tr>
    				<td>작성일</td>
    				<td>${board.createDate }</td>
    			</tr>
    			<tr>
    				<td>내용</td>
    				<td>${board.content }</td>
    			</tr>
    			<tr>
    				<td>비밀키여부</td>
    				<td>${board.isPrivate }</td>
    			</tr>
    			<tr>
    				<td>게시글비밀번호</td>
    				<td>${board.boardPw }</td>
    			</tr>
    		</table>
    		<div class="btn">
    			<input type="button" value="뒤로가기"
    				onclick="location.href='boardList.bo';">
    			<!--글작성자 or 관리자 일때만 게시글 수정삭제 가능하도록 -->
    			<c:if test="${sessionScope.loginInfo.isAdmin eq 'Y' or sessionScope.loginInfo.memId eq board.writer}">
    				<!-- 삭제버튼 자바스크립트 사용한다면(확인팝업창을 사용하기위해) 
    				자바스크립트(위에)서 만든 메소드goDelete를 jsp파일에서 만든 ${board.boardNum} 이행문의 글번호를 매개변수로 넣어 사용하기-->
    				<input type="button" value="삭제"
    					onclick="goDelete(${board.boardNum});">
    				<input type="button" value="수정"
    					onclick="location.href='boardUpdateForm.bo?boardNum=${board.boardNum}';">
    			</c:if>
    			<!-- <input type="button" value="댓글"> -->
    		</div>
    </form>
    <!-- 로그인한 작성자의 댓글 등록 창 -->	
    <div class="replyDiv">
    	<div class="replyform">
    		<form action="insertReply.re" method="post">
    			<input type="hidden" name="boardNum" value="${board.boardNum}">			
    			<div>
    				<textarea rows="5" cols="230" name="content"></textarea>
    			</div>
    			<div align="center">
    				<input type="submit" value="등록">
    			</div>
    		</form>
    	</div>
    <!-- 댓글 목록창 -->
    	<div class="replyList">
    		<c:forEach var="reply" items="${replyList}">
    			<div><!-- 댓글 하나의 div -->
    					<div>${reply.writer }</div>
    					<div>${reply.createDate }</div>
    					<div>${reply.content}</div>
    					<c:if test="${sessionScope.loginInfo.isAdmin eq 'Y' or sessionScope.loginInfo.memId eq reply.writer}">
    						<div>
    							<input type="button" value="삭제" onclick="location.href='deleteReply.re?boardNum=${board.boardNum}&replyNum=${reply.replyNum}';"> 
    						</div>
    					</c:if>
    			</div>
    		</c:forEach>
    	</div>
    </div>
    </body>
    </html>
  • 게시판 목록페이지(첫화면)

       pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri= "http://java.sun.com/jsp/jstl/core" %> 	
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
    table{
    	width: 100%;
    	margin: 0 auto;
    	text-align: center;
    	border-collapse: collapse;
    }
    table>thead>tr>td{
    	background-color: #f7f7f7;
    	border-collapse: collapse;
    	border-top: 3px solid #01579b;
    	border-bottom: 1px solid #bbbbbb;
    }
    tbody > tr, tbody >tr >td {/* 제목줄  */
    	border-bottom:1px solid #bbbbbb;
    }
    tbody> tr >td:nth-child(2) {
    	text-align: left;
    }
    table > tbody > tr:hover {
    	background-color: #fbfbfb;	
    }
    tr,td{
    	padding : 8px;
    }
    .btndiv{
    	text-align: center;
    	margin-top: 20px;
    }
    input[type="button"]{
    background-color: gray;
    }
    </style>
    </head>
    <body>
    <form action="boardList.bo" method="post">
    <div>
    	<div>
    		<table >
    			<colgroup>
    				<col width= "10%">
    				<col width= "*%">
    				<col width= "15%">
    				<col width= "15%">
    				<col width= "10%">
    			</colgroup>
    			<thead>
    			<tr>
    				<td>글번호 </td>
    				<td>제목 </td>
    				<td>작성자 </td>
    				<td>작성일 </td>
    				<td>조회수 </td>
    			</tr>
    			</thead>
    			<tbody>
    			<c:choose>
    				<c:when test="${boardList.size() eq 0 }">
    					<tr>
    						<td colspan="5">등록된 게시글이 없습니다.</td>
    					</tr>
    				</c:when>
    				<c:otherwise>
    					<c:forEach var="board" items="${boardList}">
    					<tr>
    						<td>${board.boardNum } </td>
    						<td>
    						<!-- 주의할점! MAPPER에서 쿼리로 조회한 데이터만 가져올수있다!!! -->
    							<c:if test="${board.isPrivate eq 'Y' }">
    								<img src="자물쇠.png" width="30px">
    							</c:if>
    							
    								<a href='boardDetail.bo?boardNum=${board.boardNum}'>${board.title }</a>
    						
    						</td>
    						<td>${board.writer } </td>
    						<td>${board.createDate } </td>
    						<td>${board.readCnt } </td>
    					</tr>
    					</c:forEach>
    				</c:otherwise>
    			</c:choose>
    			</tbody>
    		</table>
    	</div>
    </div>
    <div class="btndiv">
    <!-- 로그인 안하면 글쓰기 버튼 보이게 하기 -반복문사용 -->
    	<c:if test="${not empty sessionScope.loginInfo }"><!-- 세션의 로그인정보를 불러오는 방법: sessionScope.loginInfo  -->
    			<input type="button" value="글쓰기" onclick="location.href='writeBoardForm.bo';">
    	</c:if>
    </div>
    </form>
    </body>
    </html>
    
  • 게시글 수정 양식 jsp

      pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri= "http://java.sun.com/jsp/jstl/core" %> 	
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
    table{
    	width: 100%;
    	margin: 0 auto;
    	text-align: center;
    	border-collapse: collapse;
    }
    table>thead>tr>td{
    	background-color: #f7f7f7;
    	border-collapse: collapse;
    	border-top: 3px solid #01579b;
    	border-bottom: 1px solid #bbbbbb;
    }
    tbody > tr, tbody >tr >td {/* 제목줄  */
    	border-bottom:1px solid #bbbbbb;
    }
    tbody> tr >td:nth-child(2) {
    	text-align: left;
    }
    table > tbody > tr:hover {
    	background-color: #fbfbfb;	
    }
    tr,td{
    	padding : 8px;
    }
    .btn{
    	text-align: center;
    	margin-top: 20px;
    }
    </style>
    </head>
    <body>
    <form action="boardUpdate.bo" method="post"> 
    	<input type="hidden" name="boardNum" value="${board.boardNum}"> 
    	<table>
    		<tr>
    			<td>글번호</td>
    			<td>${board.boardNum}</td>
    		</tr>
    		<tr>
    			<td>조회수</td>
    			<td>${board.readCnt }</td>
    		</tr>
    		<tr>
    			<td>제목</td>
    			<td><input type="text" name="title" value="${board.title }" required="required"></td>
    		</tr>
    		<tr>
    			<td>작성자</td>
    			<td>${board.writer }</td>
    		</tr>
    		<tr>
    			<td>작성일</td>
    			<td>${board.createDate }</td>
    		</tr>
    		<tr>
    			<td>내용</td>
    			<td><textarea rows="5" cols="50">${board.content }</textarea></td>
    		</tr>
    		<tr>
    			<td>비밀글 여부</td>
    			<td>
    			<!-- radio타입 데이터가져오는 방법 -->
    			<!-- 방법 1번 -->
    				<c:choose>
    					<c:when test="${board.isPrivate eq 'Y'}">
    						<input type="radio" name="isPrivate"  >아니오
    						<input type="radio" name="isPrivate" checked="checked"></c:when>
    					<c:otherwise>
    						<input type="radio" name="isPrivate" checked="checked">아니오
    						<input type="radio" name="isPrivate" ></c:otherwise>
    				</c:choose>
    				<!-- 방법 2번 -->
    					<input type="radio" name="isPrivate" value="N" <c:if test="${board.isPrivate eq 'N'}">checked</c:if>>아니오
    					<input type="radio" name="isPrivate" value="Y" <c:if test="${board.isPrivate eq 'Y'}">checked</c:if>>네	
    			</td>
    		</tr>
    		<tr>
    			<td>게시글비밀번호</td>
    			<td><input type="password" name="boardPw"value="${board.boardPw }"></td>
    		</tr>
    	</table>
    	<div class="btn">
    		<input type="submit" value="수정완료">
    	</div>
    </form>
    </body>
    </html>
  • 게시글 삭제 완료 팝업창 jsp
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	alert('삭제되었습니다.');
	location.href='boardList.bo';
</script>
</head>
<body>

</body>
</html> 

  • reply 컨트롤러
package controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dto.BoardDTO;
import dto.MemberDTO;
import dto.ReplyDTO;
import service.BoardServiceImpl;
import service.ReplyServiceImpl;
@WebServlet("*.re")
public class ReplyController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private ReplyServiceImpl replyService = new ReplyServiceImpl();
	private List<ReplyDTO> replyList = new ArrayList<>();
	private ReplyDTO replyDTO;
	private String boardNum;
	
	
    public ReplyController() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//한글 인코딩 처리
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
	
		String requestURI = request.getRequestURI();
		String contextPath = request.getContextPath();
		String command = requestURI.substring(contextPath.length());
		System.out.println("command = " + command);
		
		String page = "";
		boolean isRediect = false;
		
		//댓글 등록
		if(command.equals("/insertReply.re")) {
			String content = request.getParameter("content");
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			HttpSession session = request.getSession();
			MemberDTO loginInfo = (MemberDTO)session.getAttribute("loginInfo");
			String writer = loginInfo.getMemId();
			
			ReplyDTO replyDTO = new ReplyDTO();
			replyDTO.setContent(content);
			replyDTO.setBoardNum(boardNum);
			replyDTO.setWriter(writer);
			
			replyService.insertReply(replyDTO);
			page="boardDetail.bo?boardNum=" + boardNum;
			isRediect = true;
		}
		//댓글 목록조회
		//>>>게시글 목록 조회가 있는 보드컨트롤러에서 작성해야한다!!!

		//댓글 삭제 
		else if(command.equals("/deleteReply.re")) {
			int replyNum = Integer.parseInt(request.getParameter("replyNum"));
			int boardNum = Integer.parseInt(request.getParameter("boardNum"));
			
			replyService.deleteReply(replyNum);
			page="boardDetail.bo?boardNum=" + boardNum;
			isRediect = true;
			
		}
		
		
		
		//페이지이동에 사용되는 if문
		if(isRediect) {
			response.sendRedirect(page);
		}
		else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(page);
			dispatcher.forward(request, response);
		}
	}
}
  • reply 매퍼
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 해당 파일에 모든 쿼리문을 작성한다. 
오타를 반드시 주의해야하는 부분!!!
데이터베이스에서 복붙하기-->
<mapper namespace="replyMapper">
	<resultMap type="dto.ReplyDTO" id="reply">
		<id column="REPLY_NUM" property="replyNum"></id>
		<result column="CONTENT" property="content"/>
		<result column="WRITER" property="writer"/>
		<result column="CREATE_DATE" property="createDate"/>
		<result column="BOARD_NUM" property="boardNum"/>
	
	</resultMap>
	<!--댓글등록  -->
	<insert id="insertReply"><!-- board_num 게시글번호 반드시 넣어주기!!! -->
	INSERT INTO BOARD_REPLY (
		REPLY_NUM
		, CONTENT
		, WRITER
		, BOARD_NUM	
	) values (
		(SELECT NVL(MAX(REPLY_NUM), 0) + 1 FROM BOARD_REPLY)
		, #{content}
		, #{writer}
		, #{boardNum}
	)
	</insert>
	<!--댓글목록조회  
	PK(boardNum)는 무조건 눈에 안보이더라도 항상 입력한다!!!-->
	<select id="selectReplyList" resultMap="reply">
	SELECT WRITER
		, CONTENT
		, TO_CHAR(CREATE_DATE,'YYYY-MM-DD HH24:MI') AS CREATE_DATE
		, REPLY_NUM
	FROM BOARD_REPLY 
	WHERE BOARD_NUM = #{boardNum}
	ORDER BY REPLY_NUM DESC
	</select>
	
	<update id="updateReply">
	UPDATE BOARD_REPLY
	SET
	WHERE REPLY_NUM =#{REPLYNUM}
	AND BOARD_NUM =#{BOARDNUM}
	</update>
	
	<delete id="deleteReply">
	DELETE BOARD_REPLY
	WHERE REPLY_NUM =#{replyNum}
	</delete>
</mapper>

  • reply 서비스 package service;
    import java.util.List;
    import dto.BoardDTO;
    import dto.ReplyDTO;
    public interface ReplyService {
    //댓글 등록(int 대신 void 사용)
    void insertReply(ReplyDTO replyDTO);
    //이것도 가능하다>>> void insertReply1(BoardDTO boardDTODTO);
    //댓글 목록조회
    List selectReplyList(int boardNum);
    //댓글 삭제
    void deleteReply(int replyNum);
    //댓글 상세보기
    ReplyDTO selectReply(int replyNum);
    //댓글 조회수 증가
    void updateReadCnt(int replyNum);
    }
  • reply 서비스 impl
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import dto.BoardDTO;
import dto.ReplyDTO;
import sqlmap.SqlSessionManager;
//쿼리작업하는 곳
public class ReplyServiceImpl implements ReplyService{//서비스를 구현하겠다.
	   //쿼리 실행하는 객체
	   SqlSessionFactory sqlSessionFactory = SqlSessionManager.getSqlSession();
	   SqlSession sqlSession = sqlSessionFactory.openSession();
	@Override
	public void insertReply(ReplyDTO replyDTO) {
		sqlSession.insert("replyMapper.insertReply",replyDTO);
		sqlSession.commit();
	}
	@Override
	public List<ReplyDTO> selectReplyList(int boardNum) {
		List<ReplyDTO> result =sqlSession.selectList("replyMapper.selectReplyList",boardNum);
		sqlSession.commit();
		return result;
	}
	@Override
	public void deleteReply(int replyNum) {
		sqlSession.delete("replyMapper.deleteReply",replyNum);
		sqlSession.commit();
	}
	@Override
	public ReplyDTO selectReply(int replyNum) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void updateReadCnt(int replyNum) {
		// TODO Auto-generated method stub
	}
}

  • reply 목록 페이지
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri= "http://java.sun.com/jsp/jstl/core" %> 	
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>작성자</div>
<div>${board.writer}</div>
<div>댓글내용</div>
<div><textarea rows="5" cols="50" name="content"></textarea> </div>
<div><input type="button" value="수정" onclick="'location.href=updateReply.bo';"> </div>

<c:choose>
	<c:when test="${boardList.size() eq 0}" >
		<div>등록된 댓글이 없습니다.</div>
	</c:when>
	<c:otherwise>
		<c:forEach var="board" items="${boardList}">
			<div>댓글번호</div>
			<div>${board.replyNum}</div>
			<div>작성일</div>
			<div>${board.createDate}</div>
			<div>작성자</div>
			<div>${board.writer}</div>
			<div>댓글내용</div>
			<div>${board.content}</div>
		</c:forEach>
		
	</c:otherwise>
</c:choose>


<div><input type="button" value="수정" onclick="'location.href=updateReply.bo';"> </div>
<div><input type="button" value="삭제" onclick="'location.href=deleteReply.bo';"> </div>
</body>
</html>
profile
Dev.Vinch

0개의 댓글