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);
}
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);
}
게시판 상세보기 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>
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>
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);
}
}
}
<!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>
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
}
}
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>