오늘의코드
로그인시 댓글 작성 및 수정 및 삭제 가능하도록 수정
<%@page import="edu.web.domain.BoardVO"%>
<%@ 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">
<script src="https://code.jquery.com/jquery-3.7.1.js">
</script>
<%
BoardVO boardvo = (BoardVO) request.getAttribute("boardvo");
%>
<title>게시글 상세조회</title>
</head>
<body>
<form id="updateForm" action="" method="post">
<input type="hidden" id="boardId" name="boardId" value="${boardvo.boardId }">
<h2>게시글 상세조회 <button onclick="listForm()">뒤로가기</button></h2>
<label for="memberId">게시글 작성자:</label>
<input type="text" name="memberId" value="${boardvo.memberId }" readonly required> <br>
<label for="boardtitle">게시글 제목:</label>
<input type="text" id="boardtitle" name="boardtitle" value="${boardvo.boardTitle }" readonly required> <br>
<label for="boardcontent">게시글 내용:</label><br>
<textarea id="boardcontent" name="boardcontent" rows="4" cols="50" readonly>${boardvo.boardContent }</textarea>
<br>
<label for="boardDate">게시및수정 된 날짜:</label><br>
<input type="text" id="boardDate" name="boardDate" value="${boardvo.boardDateCreated }" readonly="readonly" required> <br>
<br>
<c:if test="${sessionScope.memberId == boardvo.memberId }">
<button onclick="updateForm()">게시글 수정하기</button>
<button onclick="deleteForm()">게시글 삭제하기</button>
</c:if>
</form> <br>
<c:if test="${empty sessionScope.memberId }">
* 댓글은 로그인이 필요한 서비스입니다.
<a href="login.go?boardId=${boardvo.boardId }">로그인하기</a>
</c:if>
<c:if test="${not empty sessionScope.memberId }">
${sessionScope.memberId }님, 이제 댓글을 작성할 수 있어요!
<div style="text-align: center;">
<input type="text" id="memberId" value="${sessionScope.memberId }" readonly>
<input type="text" id="replyContent">
<button id="btnAdd">작성</button>
</div>
</c:if>
<hr>
<div style="text-align: center;">
<div id="replies"></div>
</div>
<div>
<br><br><br><br><br><br><br><br>
</div>
<script type="text/javascript">
$(document).ready(function(){
getAllReplies(); // 함수 호출 코드 추가
$('#btnAdd').click(function(){
let boardId = $('#boardId').val(); // 게시판 번호 데이터
let memberId = $('#memberId').val(); // 작성자 데이터
let replyContent = $('#replyContent').val(); // 댓글 내용
let obj = {
'boardId' : boardId,
'memberId' : memberId,
'replyContent' : replyContent
};
console.log(obj);
// $.ajax로 송수신
$.ajax({
type : 'POST',
url : 'replies/add',
data : {'obj' : JSON.stringify(obj)}, // JSON으로 변환
success : function(result) {
console.log(result);
getAllReplies(); // 함수 호출 코드 추가
}
});
});
// 게시판 댓글 전체 가져오기
function getAllReplies() {
// 댓글을 가져오기 위해 boardId 필요
let boardId = $('#boardId').val();
// url에 boardId 전송
let url = 'replies/all?boardId=' + boardId;
let memberId = "${sessionScope.memberId }";
// 가져올 데이터가 JSON이므로
// getJSON으로 파싱하는게 편리함
$.getJSON(
url,
function(data) {
// data : 서버에서 전송받은 list 데이터가 저장되어 있음.
// getJSON()에서 json 데이터는
// javascript object로 자동 parsing됨
console.log(data); // data의 타입은 object
let list = ''; // 댓글 데이터를 HTML에 표현할 문자열 변수
// $(컬렉션).each() : 컬렉션데이터를 반복문으로 꺼내는 함수
$(data).each(function(){
// this : 컬렉션의 각 인덱스 데이터를 의미
console.log(this);
// String을 date 타입으로 변경
let replyDataCreated = new Date(this.replyDateCreated);
let disabled = '';
let readonly = '';
if(memberId != this.memberId) {
disabled = 'disabled';
readonly = 'readonly';
}
list += '<div class="reply_item">'
+ '<pre>'
+ '<input type="hidden" id="replyId" value="' + this.replyId +'">'
+ this.memberId
+ ' ' // 공백
+ '<input type="text" id="replyContent" '+ readonly +' value="' + this.replyContent + '">'
+ ' '
+ replyDataCreated
+ '<button class="btn_update" '+disabled+'>수정</button>'
+ '<button class="btn_delete" '+disabled+'>삭제</button>'
+ '</pre>'
+ '</div>';
}); // end each()
$('#replies').html(list);
}
); // end getJSON
} // end getAllReplies()
// 수정 버튼을 클릭하면 선택된 댓글 수정
// on메서드를 사용해서 class이름이 같아도 찾아감
$('#replies').on('click', '.reply_item .btn_update', function(){
console.log(this);
// 선택된 댓글의 replyId, replyContent 값을 저장
// prevAll() : 선택된 노드 이전에 있는 모든 형제 노드를 접근
let replyId = $(this).prevAll('#replyId').val();
let replyContent = $(this).prevAll('#replyContent').val();
console.log("선택된 댓글 번호 : " + replyId + ", 댓글 내용 : " + replyContent);
// ajax로 데이터 전송하여
// 댓글 수정 기능 수행하고
// 수행 결과를 리턴하는 코드
// ajax 요청
$.ajax({
type : 'POST',
url : 'replies/update',
data : {
'replyId' : replyId,
'replyContent' : replyContent
},
success : function(result) {
console.log(result);
getAllReplies();
}
}); // end ajax()
}); // end #replies.on()
// 삭제 버튼을 클릭하면 선택된 댓글 삭제
$('#replies').on('click', '.reply_item .btn_delete', function(){
console.log(this);
// 선택된 댓글의 replyId, replyContent 값을 저장
// prevAll() : 선택된 노드 이전에 있는 모든 형제 노드를 접근
let replyId = $(this).prevAll('#replyId').val();
$.ajax({
type : 'POST',
url : 'replies/delete',
data : {
'replyId' : replyId,
},
success : function(result) {
console.log(result);
getAllReplies();
}
}); // end ajax()
}); // end #replies.on()
}); // end document
function listForm() {
let form = document.getElementById("updateForm");
form.method = "GET";
form.action = "list.do";
form.submit();
}
function updateForm() {
let form = document.getElementById("updateForm");
form.method = "GET";
form.action = "update.do";
form.submit();
}
function deleteForm() {
if (confirm('정말로 삭제 하시겠습니까?')) {
let form = document.getElementById("updateForm");
form.method = "POST";
form.action = "delete.do";
form.submit();
} else {
form.method = "GET";
location.href = "detail.do";
}
}
</script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="edu.web.domain.BoardVO" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<style type="text/css">
table, th, td {
border-style : solid;
border-width : 1px;
text-align : center;
}
ul {
list-style-type : none;
}
li {
display : inline-block;
}
</style>
<head>
<title>게시판 목록</title>
</head>
<body>
<h1>게시판 목록 <button onclick="location.href='register.do'">글 작성하기</button></h1>
<c:if test="${empty sessionScope.memberId }">
<a href="login.go"><input type="button" value="로그인"></a>
</c:if>
<c:if test="${not empty sessionScope.memberId }">
<a href="logout.go"><input type="button" value="로그아웃"></a>
</c:if>
<a href="register.do"><input type="button" value="글 작성"></a>
<table>
<thead>
<tr>
<th>ID</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
</tr>
</thead>
<tbody>
<c:forEach var="vo" items="${boardList }">
<tr>
<td>${vo.boardId }</td>
<td><a href="detail.do?boardId=${vo.boardId }">${vo.boardTitle }</a></td>
<td>${vo.memberId }</td>
<td>${vo.boardDateCreated }</td>
</tr>
</c:forEach>
<%-- <%
List<BoardVO> boardList = (List<BoardVO>) request.getAttribute("boardList");
if (boardList != null) {
for (BoardVO board : boardList) {
%>
<tr>
<td><%= board.getBoardId() %></td>
<td><a href="detail.do?boardId=<%=board.getBoardId() %>"> <%=board.getBoardTitle() %> </a></td>
<td><%= board.getMemberId() %></td>
<td><%= board.getBoardDateCreated() %></td>
</tr>
<%
}
}
%> --%>
</tbody>
</table>
<ul>
<c:if test="${pageMaker.hasPrev }">
<li><a href="list.do?page=${pageMaker.startPageNo - 1 }">이전</a></li>
</c:if>
<c:forEach begin="${pageMaker.startPageNo }" end="${pageMaker.endPageNo }"
var="num">
<li><a href="list.do?page=${num }">${num }</a></li>
</c:forEach>
<c:if test="${pageMaker.hasNext }">
<li><a href="list.do?page=${pageMaker.endPageNo + 1 }">다음</a></li>
</c:if>
</ul>
</body>
</html>
package edu.web.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import edu.web.domain.BoardVO;
import edu.web.persistence.BoardDAO;
import edu.web.persistence.BoardDAOImple;
import edu.web.util.PageCriteria;
import edu.web.util.PageMaker;
@WebServlet("*.do") // *.do : ~.do로 선언된 HTTP 호출에 대해 반응
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String BOARD_URL = "WEB-INF/board/";
private static final String MAIN = "index";
private static final String LIST = "list";
private static final String REGISTER = "register";
private static final String DETAIL = "detail";
private static final String UPDATE = "update";
private static final String DELETE = "delete";
private static final String EXTENSION = ".jsp";
private static final String SERVER_EXTENSION = ".do";
private static BoardDAO dao;
public BoardController() {
dao = BoardDAOImple.getInstance();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI = request.getRequestURI();
String requestMethod = request.getMethod();
System.out.println("호출 경로 : " + requestURI);
System.out.println("호출 방식 : " + requestMethod);
if (requestURI.contains(LIST + SERVER_EXTENSION)) {
System.out.println("list 호출 확인");
list(request, response);
} else if (requestURI.contains(REGISTER + SERVER_EXTENSION)) {
System.out.println("register 호출 확인");
if (requestMethod.equals("GET")) { // GET 방식(페이지 불러오기)
registerGET(request, response);
} else if (requestMethod.equals("POST")) { // POST 방식(DB에 저장)
registerPOST(request, response);
}
} else if (requestURI.contains(DETAIL + SERVER_EXTENSION)) {
System.out.println("detail 호출 확인");
detail(request, response);
} else if (requestURI.contains(UPDATE + SERVER_EXTENSION)) {
System.out.println("update 호출 확인");
if (requestMethod.equals("GET")) { // GET 방식(페이지 불러오기)
updateGET(request, response);
} else if (requestMethod.equals("POST")) { // POST 방식(DB에 저장)
updatePOST(request, response);
}
} else if (requestURI.contains(DELETE + SERVER_EXTENSION)) {
System.out.println("delete 호출 확인");
if (requestMethod.equals("POST")) {
deletePOST(request, response);
}
}
} // end service()
// TODO : 전체 게시판 내용(list)을 DB에서 가져오고, 그 데이터를 list.jsp 페이지에 전송
private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("list()");
String path = BOARD_URL + LIST + EXTENSION;
// List<BoardVO> boardList = dao.select();
// List<BoardVO> boardList = dao.select(1, 3);
// int page = Integer.parseInt(request.getParameter("page"));
// null이여도 상관이 없게 된다.
String page = request.getParameter("page");
PageCriteria criteria = new PageCriteria();
if (page != null) {
criteria.setPage(Integer.parseInt(page));
}
List<BoardVO> boardList = dao.select(criteria);
request.setAttribute("boardList", boardList);
PageMaker pageMaker = new PageMaker();
pageMaker.setCriteria(criteria);
int totalCount = dao.getTotalCount();
pageMaker.setTotalCount(totalCount);
pageMaker.setPageData();
System.out.println("전체 게시글 수 : " + pageMaker.getTotalCount());
System.out.println("현제 선택된 페이지 : " + criteria.getPage());
System.out.println("한 페이지당 게시글 수 : " + criteria.getNumsPerPage());
System.out.println("페이지 링크 번호 개수 : " + pageMaker.getNumsOfPageLinks());
System.out.println("시작 페이지 링크 번호 : " + pageMaker.getStartPageNo());
System.out.println("끝 페이지 링크 번호 : " + pageMaker.getEndPageNo());
request.setAttribute("pageMaker", pageMaker);
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
} // end list()
// TODO : register.jsp 페이지 호출
private void registerGET(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// 로그인 세션 체크
HttpSession session = request.getSession();
String memberId = (String) session.getAttribute("memberId");
if(memberId != null) { // 로그인 상태
System.out.println("registerGET()");
String path = BOARD_URL + REGISTER + EXTENSION;
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
} else { // 로그아웃 상태
// 쿠키에 targetURL 정보를 저장
// targetURL = register.do
// Cookie urlCookie = new Cookie("targetURL", REGISTER + SERVER_EXTENSION);
// response.addCookie(urlCookie);
// 로그인 페이지로 이동
response.sendRedirect("login.go?targetURL="+ REGISTER + SERVER_EXTENSION);
}
} // end registerGET()
// TODO : register.jsp form으로 전송된 데이터를 DB 테이블에 등록
// TODO : index.jsp로 이동
private void registerPOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("registerPOST()");
String memberid = request.getParameter("memberid");
String boardtitle = request.getParameter("boardtitle");
String boardcontent = request.getParameter("boardcontent");
BoardVO board = new BoardVO(0, boardtitle, boardcontent, memberid, null);
int result = dao.insert(board);
System.out.println(result);
response.sendRedirect("index.jsp");
} // end registerPOST()
// TODO : DB 테이블에서 상세 조회 데이터를 가져와서, detail.jsp로 전송 및 페이지 출력
private void detail(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("detail()");
String path = BOARD_URL + DETAIL + EXTENSION;
int boardId = Integer.parseInt(request.getParameter("boardId"));
System.out.println(boardId);
BoardVO boardvo = dao.select(boardId);
request.setAttribute("boardvo", boardvo);
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
} // end detail()
// TODO : DB 테이블에서 상세 조회한 게시글 데이터를 전송하고, update.jsp 페이지로 호출
private void updateGET(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("updateGET()");
String path = BOARD_URL + UPDATE + EXTENSION;
int boardId = Integer.parseInt(request.getParameter("boardId"));
System.out.println(boardId);
BoardVO boardvo = dao.select(boardId);
request.setAttribute("boardvo", boardvo);
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
} // end updateGET()
// TODO : update.jsp에서 전송된 수정할 데이터를 DB로 전송하여 테이블 수정 수행
// TODO : 수정이 완료되면, detail.jsp로 이동(이동할 때 어떤 값을 전송해야 할걸?ㅎ)
private void updatePOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("updatePOST()");
String path = DETAIL + SERVER_EXTENSION;
int boardId = Integer.parseInt(request.getParameter("boardId"));
String boardtitle = request.getParameter("boardtitle");
String boardcontent = request.getParameter("boardcontent");
String memberId = request.getParameter("memberId");
BoardVO board = new BoardVO(boardId, boardtitle, boardcontent, memberId, null);
System.out.println(boardId);
int result = dao.update(board);
if (result == 1) {
System.out.println(result);
request.setAttribute("boardId", boardId);
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
}
} // end updatePOST()
// TODO : 게시글 번호를 전송받아서, DB 테이블에서 데이터 삭제
// TODO : 삭제가 완료되면, index.jap로 이동
private void deletePOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
System.out.println("deletePOST()");
String path = MAIN + EXTENSION;
int boardId = Integer.parseInt(request.getParameter("boardId"));
int result = dao.delete(boardId);
if (result == 1) {
RequestDispatcher dis = request.getRequestDispatcher(path);
dis.forward(request, response);
}
} // end deletePOST()
}
package edu.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("*.go")
public class LoginController extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String LOGIN_URL = "WEB-INF/login/";
private static final String LOGIN = "login";
private static final String LOGOUT = "logout";
private static final String BOARD = "board";
private static final String EXTENSION = ".jsp";
private static final String SERVER_EXTENSION = ".go";
public LoginController() {
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String requestURI = request.getRequestURI();
String requestMethod = request.getMethod();
System.out.println("호출 경로 : " + requestURI);
System.out.println("호출 방식 : " + requestMethod);
if (requestURI.contains(LOGIN)) {
System.out.println("login 호출 확인");
if (requestMethod.equals("GET")) { // GET 방식(페이지 불러오기)
loginGET(request, response);
} else if (requestMethod.equals("POST")) { // POST 방식(DB에 저장)
loginPOST(request, response);
}
} else if (requestURI.contains(LOGOUT)) {
System.out.println("logout 호출 확인");
logout(request, response);
} else if (requestURI.contains(BOARD)) {
System.out.println("board 호출 확인");
if (requestMethod.equals("POST")) { // GET 방식(페이지 불러오기)
boardPOST(request, response);
}
}
} // end service()
private void boardPOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("loginboardPOST()");
HttpSession session = request.getSession();
String memberId = request.getParameter("memberId");
String password = request.getParameter("password");
String boardId = request.getParameter("boardId");
System.out.println("memberId : " + memberId);
System.out.println("password : " + password);
// * loginPOST를 수행하는 상황
// - index.jsp에서 login 버튼 클릭 - 로그인 페이지 - 로그인 성공 - index.jsp 이동
// - 글 작성 버튼(register.do) 클릭 - 로그인 페이지 - 로그인 성공 - register.do 이동
if (memberId.contains("test") && password.equals("1234")) { // 포함 되면 => contains
session.setAttribute("memberId", memberId);
session.setMaxInactiveInterval(60); // 60초
request.setAttribute("boardId", boardId);
String path = "detail.do";
request.getRequestDispatcher(path).forward(request, response);
}
}
private void logout(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("loginPOST()");
HttpSession session = request.getSession();
if(session.getAttribute("memberId") != null) {
session.removeAttribute("memberId");
response.sendRedirect("index.jsp");
}
}
private void loginGET(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("loginGET() 호출");
String boardId = request.getParameter("boardId");
String targetURL = request.getParameter("targetURL");
request.setAttribute("targetURL", targetURL);
request.setAttribute("boardId", boardId);
String path = LOGIN_URL + LOGIN + EXTENSION;
request.getRequestDispatcher(path).forward(request, response);
} // end loginGET()
private void loginPOST(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("loginPOST()");
HttpSession session = request.getSession();
String memberId = request.getParameter("memberId");
String password = request.getParameter("password");
String targetURL = request.getParameter("targetURL");
System.out.println("memberId : " + memberId);
System.out.println("password : " + password);
// * loginPOST를 수행하는 상황
// - index.jsp에서 login 버튼 클릭 - 로그인 페이지 - 로그인 성공 - index.jsp 이동
// - 글 작성 버튼(register.do) 클릭 - 로그인 페이지 - 로그인 성공 - register.do 이동
if (memberId.contains("test") && password.equals("1234")) { // 포함 되면 => contains
session.setAttribute("memberId", memberId);
session.setMaxInactiveInterval(60); // 60초
// Cookie[] cookies = request.getCookies();
//
// // targetURL 존재 유무에 따른 경로 설정
// if(cookies != null) {
// targetURL = "index.jsp";
// for(Cookie cookie : cookies) {
// if(cookie.getName().equals("targetURL")) {
// // targetURL 정보를 가져와서
// // index.jsp => targetURL(register.do)로 변경
// // targetURL 정보는 삭제
// targetURL = cookie.getValue();
// cookie.setMaxAge(0);
// response.addCookie(cookie);
// }
// }
// }
if(!targetURL.equals("") && targetURL != null) {
response.sendRedirect(targetURL);
} else {
response.sendRedirect("index.jsp");
}
} else {
System.out.println("아이디나 비번이 틀렸습니다.");
response.sendRedirect("login.go");
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.7.1.js">
</script>
<title>Insert title here</title>
</head>
<body>
<form action="" method="post" id="loginboardForm">
<input type="hidden" name="boardId" id="boardId" value="${boardId }">
<input type="hidden" name="targetURL" id="targetURL" value="${targetURL }">
id : <input type="text" name="memberId" required autofocus>
pw : <input type="text" name="password" required><br>
<br> <input type="button" value="확인" id="check">
</form>
<script type="text/javascript">
$(document).ready(function() {
$('#check').click(function() {
console.log(this);
if("${boardId }" == "") {
loginForm();
} else {
boardForm();
}
}); // end #replies.on()
}); // end document
function loginForm() {
let form = document.getElementById("loginboardForm");
form.method = "POST";
form.action = "login.go";
form.submit();
}
function boardForm() {
let form = document.getElementById("loginboardForm");
form.method = "POST";
form.action = "board.go";
form.submit();
}
</script>
</body>
</html>