09009

[JSP] 게시판 만들기 (3) 본문

JSP/게시판
[JSP] 게시판 만들기 (3)
09009 2023. 4. 22.

게시글 상세 보기 페이지로 이동시키는 액션 클래스

게시글 리스트 화면에서 제목 링크를 클릭하면 게시글 상세보기 화면으로 이동한다.

게시글 제목을 클릭하면 "BoardServlet?command=board_view&num=${board.num}"이 요청됨 -  get 방식으로 BoardServlet 요청 - 게시글 상세 보기 페이지로 이동해야함.

✍ controller\action\BoardViewAction.java

package controller.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.BoardDAO;
import dto.BoardVO;

public class BoardViewAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String url="/board/boardView.jsp";
		String num=request.getParameter("num");
		
		BoardDAO bDao=BoardDAO.getInstance();
		bDao.updateReadCount(num); // 게시글 상세보기를 클릭하여 조회수가 증가함
		BoardVO bVo=bDao.selectOneBoardByNum(num);
		request.setAttribute("board", bVo);
		
		RequestDispatcher dispatcher=request.getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}
}

command 패턴으로 작업 처리를 위한 명령 처리 클래스 ActionFactory 수정

✍ controller\ActionFactory.java

	public Action getAction(String command) {
		Action action = null;
		System.out.println("ActionFactory : " + command);
		if (command.equals("board_list")) {
			action = new BoardListAction();
		} else if (command.equals("board_write_form")) {
			action = new BoardWriteFormAction();
		} else if (command.equals("board_write")) {
			action = new BoardWriteAction();
		} else if (command.equals("board_view")) {
			action = new BoardViewAction();
	    }
		return action;
	}

 

→ BoardServlet.java에 있는 doGet() 메서드에서 ActionFactory.java의 getAction() 메서드 호출

→ ActionFactory.java의 getAction() 메서드에서 command가 "board_view"와 일치하는 조건이 존재하므로 BoardViewAction 인스턴스를 생성하여 반환

→ BoardServlet.java로 돌아가서 선언한 action이 null이 아니므로 BoardViewAction 인스턴스가 execute 메서드를 실행할 수 있는 권한을 받음 → JSP 페이지로 이동

 

게시글 상세보기를 위한 JSP 페이지

✍ board/boardView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게시판</title>
<link rel="stylesheet" type="text/css" href="css/shopping.css">
<script type="text/javascript" src="script/board.js"></script>
</head>
<body>
	<div id="wrap" align="center">
		<h1>게시글 상세보기</h1>
		<table>
			<tr>
				<th>작성자</th>
				<td>${board.name}</td>
				<th>이메일</th>
				<td>${board.email}</td>
			</tr>
			<tr>
				<th>작성일</th>
				<td><fmt:formatDate value="${board.writedate}" /></td>
				<th>조회수</th>
				<td>${board.readcount }</td>
			</tr>
			<tr>
				<th>제목</th>
				<td colspan="3">${board.title }</td>
			</tr>
			<tr>
				<th>내용</th>
				<td colspan="3"><pre>${board.content}</pre></td>
			</tr>
		</table>
		<br> <br> 
		<input type="button" value="게시글 수정"
			onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'update')">
		<input type="button" value="게시글 삭제"
			onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'delete')">
		<input type="button" value="게시글 리스트"
			onclick="location.href='BoardServlet?command=board_list'"> 
		<input type="button" value="댓글 작성"
			onclick="location.href='BoardServlet?command=board_reply_form&num=${board.num}'">
	</div>
</body>
</html>

<게시글 수정>을 클릭하면 창이 뜨고 게시글을 등록했을 당시 입력하였던 게시글 비밀번호를 묻게 된다.

팝업창은 자바스크립트 함수은 window.open() 함수를 사용한다.

window.open(url, name, "width=500, height=230");

 window.open() 함수의 첫 번째 매개변수에 비밀번호 입력을 위한 폼을 띄우는 요청을 한다.

 

 

비밀번호 입력 화면으로 이동하게 하는 액션 클래스

<게시글 수정>을 클릭하면 비밀번호를 재확인하는 창을 띄워야 한다.

그러기 위해서 일단 비밀번호 입력 화면(boardCheckPass.jsp)으로 이동할 수 있게 해주는 클래스를 생성해야 한다.

✍  board/boardView.jsp

게시글 수정을 클릭하면 "BoardServlet?command=board_check_pass_form&num=${board.num}"이 요청됨 -  get 방식으로 BoardServlet 요청 - 비밀번호 입력 화면으로 이동해야함.

 

게시글 수정을 클릭하면 "BoardServlet?command=board_check_pass_form&num=${board.num}"이 요청됨 -  get 방식으로 BoardServlet 요청 

→ BoardServlet.java에 있는 doGet() 메서드에서 ActionFactory.java의 getAction() 메서드 호출

→ ActionFactory.java의 getAction() 메서드의 조건문에서 command가 "board_check_pass_form"과 일치하는 조건이 존재하므로 BoardCheckPassFormAction 인스턴스를 생성하여 반환

→ BoardServlet.java로 돌아가서 선언한 action이 null이 아니므로  BoardCheckPassFormAction 인스턴스가 execute 메서드를 실행할 수 있는 권한을 받음 → 비밀번호 입력 JSP 페이지로 이동

 

✍ controller\action\BoardCheckPassFormAction.java

package controller.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BoardCheckPassFormAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String url = "/board/boardCheckPass.jsp";
		
		RequestDispatcher dispatcher = request.getRequestDispatcher(url);
		dispatcher.forward(request, response);	
	}
}

 

command 패턴으로 작업 처리를 위한 명령 처리 클래스 ActionFactory 수정

✍ controller\ActionFactory.java

	public Action getAction(String command) {
		Action action = null;
		System.out.println("ActionFactory : " + command);
		if (command.equals("board_list")) {
			action = new BoardListAction();
		} else if (command.equals("board_write_form")) {
			action = new BoardWriteFormAction();
		} else if (command.equals("board_write")) {
			action = new BoardWriteAction();
		} else if (command.equals("board_view")) {
			action = new BoardViewAction();
		} else if (command.equals("board_check_pass_form")) {
			action = new BoardCheckPassFormAction();
		} 
		return action;
	}

 

 

비밀번호 입력 화면으로 이동하게 하였으므로 이제 비밀번호 입력 화면을 만들어야 한다.

 

비밀번호 입력 화면을 위한 JSP 페이지

✍ board/boardCheckPass.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>게시판</title>
<link rel="stylesheet" href="css/shopping.css">
<script type="text/javascript" src="script/board.js"></script>
</head>
<body>
	<div align="center">
		<h1>비밀번호 확인</h1>
		<form action="BoardServlet" name="frm" method="get">
			<input type="hidden" name="command" value="board_check_pass">
			<input type="hidden" name="num" value="${param.num}">
			<table style="width: 80%">
				<tr>
					<th>비밀번호</th>
					<td><input type="password" name="pass" size="20"></td>
				</tr>
			</table>
			<br> <input type="submit" value=" 확 인 "
				onclick="return passCheck()"> <br>
			<br>${message}
		</form>
	</div>
</body>
</html>

비밀번호를 입력하고 <확인> 버튼을 클릭하면 <form> 태그에 action="BoardServlet"을 지정하였으므로 서블릿이 요청을 받아 처리한다.

command 방식으로 작업을 처리하기 때문에 히든 태그로 command 파라미터를 서블릿에 전달한다.

 

위에서 비밀번호 입력 화면을 만들었으니 이 화면에서 비밀번호의 일치 여부를 확인하기 위한 액션 클래스를 생성해야 한다.

비밀번호를 입력하고 <확인> 버튼을 클릭할 때 비밀번호 일치 여부를 확인해주는 액션 클래스를 생성해야 한다.

 

비밀번호를 입력하고 <확인> 버튼을 클릭하면 get 방식으로 BoardServlet 요청 

→ BoardServlet.java에 있는 doGet() 메서드에서 ActionFactory.java의 getAction() 메서드 호출

→ ActionFactory.java의 getAction() 메서드의 조건문에서 command가 "board_check_pass"와 일치하는 조건이 존재하므로 BoardCheckPassAction 인스턴스를 생성하여 반환

→ BoardServlet.java로 돌아가서 선언한 action이 null이 아니므로  BoardCheckPassAction 인스턴스가 execute 메서드를 실행할 수 있는 권한을 받음 → 비밀번호 일치 여부 확인

 

command 패턴으로 작업 처리를 위한 명령 처리 클래스 ActionFactory 수정

✍ controller\ActionFactory.java

	public Action getAction(String command) {
		Action action = null;
		System.out.println("ActionFactory : " + command);
		if (command.equals("board_list")) {
			action = new BoardListAction();
		} else if (command.equals("board_write_form")) {
			action = new BoardWriteFormAction();
		} else if (command.equals("board_write")) {
			action = new BoardWriteAction();
		} else if (command.equals("board_view")) {
			action = new BoardViewAction();
		} else if (command.equals("board_check_pass_form")) {
			action = new BoardCheckPassFormAction();
		} else if (command.equals("board_check_pass")) {
			action = new BoardCheckPassAction();
		}
		return action;
	}

 

게시글의 비밀번호를 확인하기 위한 액션 클래스

✍ controller\action\BoardCheckPassAction.java

package controller.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.BoardDAO;
import dto.BoardVO;

public class BoardCheckPassAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String url=null;
		
		String num=request.getParameter("num");
		String pass=request.getParameter("pass");
		
		BoardDAO bDao=BoardDAO.getInstance();
		BoardVO bVo=bDao.selectOneBoardByNum(num);
		
		if(bVo.getPass().equals(pass)) { // 성공
			url="/board/checkSuccess.jsp";
		}else { // 실패
			url="/board/boardCheckPass.jsp";
			request.setAttribute("message", "비밀번호가 틀렸습니다.");
		}
		RequestDispatcher dispatcher=request.getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}
}

 

게시글의 비밀번호가 일치할 경우 처리를 위한 JSP 페이지

✍ board/checkSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<script type="text/javascript">
	if(window.name=="update"){
		window.opener.parent.location.href="BoardServlet?command=board_update_form&num=${param.num}";
	}else if(window.name=="delete"){
		alert("삭제되었습니다.");
		window.opener.parent.location.href="BoardServlet?command=board_delete&num=${param.num}";
	}
	window.close();
</script>
</body>
</html>

 

'JSP > 게시판' 카테고리의 다른 글

[JSP] 게시판 만들기 (4)  (0) 2023.04.22
[JSP] 게시판 만들기 (2)  (0) 2023.04.22
[JSP] 게시판 만들기 (1)  (0) 2023.04.21