티스토리 뷰
WebMarket Board(게시판) 을 통한 mvc 패턴 / CRUD
lsit.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.*"%>
<%@ page import="mvc.model.BoardDTO"%>
<%
//Object->String으로 캐스팅
String sessionId = (String) session.getAttribute("sessionId");
//Stirng->Lisg,Integer로 캐스팅
List boardList = (List) request.getAttribute("boardlist");
int total_record = ((Integer) request.getAttribute("total_record")).intValue();
int pageNum = ((Integer) request.getAttribute("pageNum")).intValue();
int total_page = ((Integer) request.getAttribute("total_page")).intValue();
%>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<title>Board</title>
<script type="text/javascript">
function checkForm() {
/* sessionId가 없을 경우 로그인 요청 */
if (${sessionId==null}) {
alert("로그인 해주세요.");
return false;
}
location.href = "./BoardWriteForm.do?id=<%=sessionId%>"
}
</script>
</head>
<body>
<jsp:include page="../menu2.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">게시판</h1>
</div>
</div>
<div class="container">
<form action="<c:url value="./BoardListAction.do"/>" method="post">
<div>
<div class="text-right">
<span class="badge badge-success">전체 <%=total_record%>건 </span>
</div>
</div>
<div style="padding-top: 50px">
<table class="table table-hover">
<tr>
<th>번호</th>
<th>제목</th>
<th>작성일</th>
<th>조회</th>
<th>글쓴이</th>
</tr>
<%
for (int j = 0; j < boardList.size(); j++) {
BoardDTO notice = (BoardDTO) boardList.get(j);
%>
<tr>
<td><%=notice.getNum()%></td>
<td><a href="./BoardViewAction.do?num=<%=notice.getNum()%>&pageNum=<%=pageNum%>"><%=notice.getSubject()%></a></td>
<td><%=notice.getRegist_day()%></td>
<td><%=notice.getHit()%></td>
<td><%=notice.getName()%></td>
</tr>
<%
}
%>
</table>
</div>
<div align="center">
<c:set var="pageNum" value="<%=pageNum%>" />
<c:forEach var="i" begin="1" end="<%=total_page%>">
<a href="<c:url value="./BoardListAction.do?pageNum=${i}" /> ">
<c:choose>
<c:when test="${pageNum==i}">
<font color='4C5317'><b> [${i}]</b></font>
</c:when>
<c:otherwise>
<font color='4C5317'> [${i}]</font>
</c:otherwise>
</c:choose>
</a>
</c:forEach>
</div>
<div align="left">
<table>
<tr>
<td width="100%" align="left">
<select name="items" class="txt">
<option value="subject">제목에서</option>
<option value="content">본문에서</option>
<option value="name">글쓴이에서</option>
</select> <input name="text" type="text" /> <input type="submit" id="btnAdd" class="btn btn-primary " value="검색 " />
</td>
<td width="100%" align="right">
<a href="#" onclick="checkForm(); return false;" class="btn btn-primary">«글쓰기</a>
</td>
</tr>
</table>
</div>
</form>
<hr>
</div>
<jsp:include page="../footer.jsp" />
</body>
</html>
list.jsp 페이지에서 user가 입력하는 값을 request에 넣고 지정한 action을 통해서 method 방식으로 이동을 한다.
writeForm.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String name = (String) request.getAttribute("name");
%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>Board</title>
</head>
<script type="text/javascript">
function checkForm() {
if (!document.newWrite.name.value) {
alert("성명을 입력하세요.);
return false;
}
if (!document.newWrite.subject.value) {
alert("제목을 입력하세요.);
return false;
}
if (!document.newWrite.content.value) {
alert("내용을 입력하세요.");
return false;
}
}
</script>
<body>
<jsp:include page="/menu2.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">게시판</h1>
</div>
</div>
<div class="container">
<form name="newWrite" action="./BoardWriteAction.do"
class="form-horizontal" method="post" onsubmit="return checkForm()">
<input name="id" type="hidden" class="form-control"
value="${sessionId}">
<div class="form-group row">
<label class="col-sm-2 control-label" >성명</label>
<div class="col-sm-3">
<input name="name" type="text" class="form-control" value="<%=name %>"
placeholder="name">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label" >제목</label>
<div class="col-sm-5">
<input name="subject" type="text" class="form-control"
placeholder="subject">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label" >내용</label>
<div class="col-sm-8">
<textarea name="content" cols="50" rows="5" class="form-control"
placeholder="content"></textarea>
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-2 col-sm-10 ">
<input type="submit" class="btn btn-primary " value="등록 ">
<input type="reset" class="btn btn-primary " value="취소 ">
</div>
</div>
</form>
<hr>
</div>
<jsp:include page="../footer.jsp" />
</body>
</html>
view.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="mvc.model.BoardDTO"%>
<%
// 값들을 가지고와서 변수에 저장.
// num,page의 값들을 정수형으로 바꿔 맞는 타입의 변수에 저장
BoardDTO notice = (BoardDTO) request.getAttribute("board");
int num = ((Integer) request.getAttribute("num")).intValue();
int nowpage = ((Integer) request.getAttribute("page")).intValue();
%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>Board</title>
</head>
<body>
<jsp:include page="/menu2.jsp" />
<div class="jumbotron">
<div class="container">
<h1 class="display-3">게시판</h1>
</div>
</div>
<div class="container">
<form name="newUpdate"
action="BoardUpdateAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>"
class="form-horizontal" method="post">
<div class="form-group row">
<label class="col-sm-2 control-label" >성명</label>
<div class="col-sm-3">
<input name="name" class="form-control" value=" <%=notice.getName()%>">
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label" >제목</label>
<div class="col-sm-5">
<input name="subject" class="form-control" value=" <%=notice.getSubject()%>" >
</div>
</div>
<div class="form-group row">
<label class="col-sm-2 control-label" >내용</label>
<div class="col-sm-8" style="word-break: break-all;">
<textarea name="content" class="form-control" cols="50" rows="5"> <%=notice.getContent()%></textarea>
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-2 col-sm-10 ">
<c:set var="userId" value="<%=notice.getId()%>" />
<c:if test="${sessionId==userId}">
<p>
<a href="./BoardDeleteAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" class="btn btn-danger"> 삭제</a>
<input type="submit" class="btn btn-success" value="수정 ">
</c:if>
<a href="./BoardListAction.do?pageNum=<%=nowpage%>" class="btn btn-primary"> 목록</a>
</div>
</div>
</form>
<hr>
</div>
<jsp:include page="../footer.jsp" />
</body>
</html>
web.xml
<servlet>
<servlet-name>BoardController</servlet-name>
<servlet-class>mvc.controller.BoardController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BoardController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
mapping으로 지정된 경로가 서블릿 클래스로 이동할 수 있도록 지정을 한다.
BoardController.java[controller & servlet program]
package mvc.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import mvc.model.BoardDAO;
import mvc.model.BoardDTO;
public class BoardController extends HttpServlet {
private static final long serialVersionUID = 1L;
static final int LISTCOUNT = 5;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String RequestURI = request.getRequestURI();
System.out.println("RequestURI : "+ RequestURI);
String contextPath = request.getContextPath();
System.out.println("contextPath : " + contextPath);
String command = RequestURI.substring(contextPath.length());
System.out.println("command : " + command);
response.setContentType("text/html; charset=utf-8");
request.setCharacterEncoding("utf-8");
if (command.equals("/BoardListAction.do")) {
requestBoardList(request);
RequestDispatcher rd = request.getRequestDispatcher("./board/list.jsp");
rd.forward(request, response);
} else if (command.equals("/BoardWriteForm.do")) {
requestLoginName(request);
RequestDispatcher rd = request.getRequestDispatcher("./board/writeForm.jsp");
rd.forward(request, response);
} else if (command.equals("/BoardWriteAction.do")) {
requestBoardWrite(request);
RequestDispatcher rd = request.getRequestDispatcher("/BoardListAction.do");
rd.forward(request, response);
} else if (command.equals("/BoardViewAction.do")) {
requestBoardView(request);
RequestDispatcher rd = request.getRequestDispatcher("/BoardView.do");
rd.forward(request, response);
} else if (command.equals("/BoardView.do")) {
RequestDispatcher rd = request.getRequestDispatcher("./board/view.jsp");
rd.forward(request, response);
} else if (command.equals("/BoardUpdateAction.do")) {
requestBoardUpdate(request);
RequestDispatcher rd = request.getRequestDispatcher("/BoardListAction.do");
rd.forward(request, response);
}else if (command.equals("/BoardDeleteAction.do")) {
requestBoardDelete(request);
RequestDispatcher rd = request.getRequestDispatcher("/BoardListAction.do");
rd.forward(request, response);
}
}
public void requestBoardList(HttpServletRequest request){
BoardDAO dao = BoardDAO.getInstance();
List<BoardDTO> boardlist = new ArrayList<BoardDTO>();
int pageNum=1;
int limit=LISTCOUNT;
if(request.getParameter("pageNum")!=null)
//정수로 바꾸기
pageNum=Integer.parseInt(request.getParameter("pageNum"));
String items = request.getParameter("items");
String text = request.getParameter("text");
int total_record=dao.getListCount(items, text);
boardlist = dao.getBoardList(pageNum,limit, items, text);
int total_page;
//Math.floor() 소숫점을 없애주는 함수
if (total_record % limit == 0){
total_page =total_record/limit;
Math.floor(total_page);
}
else{
total_page =total_record/limit;
Math.floor(total_page);
total_page = total_page + 1;
}
request.setAttribute("pageNum", pageNum);
request.setAttribute("total_page", total_page);
request.setAttribute("total_record",total_record);
request.setAttribute("boardlist", boardlist);
}
public void requestLoginName(HttpServletRequest request){
String id = request.getParameter("id");
BoardDAO dao = BoardDAO.getInstance();
String name = dao.getLoginNameById(id);
request.setAttribute("name", name);
}
public void requestBoardWrite(HttpServletRequest request){
BoardDAO dao = BoardDAO.getInstance();
BoardDTO board = new BoardDTO();
board.setId(request.getParameter("id"));
board.setName(request.getParameter("name"));
board.setSubject(request.getParameter("subject"));
board.setContent(request.getParameter("content"));
System.out.println(request.getParameter("name"));
System.out.println(request.getParameter("subject"));
System.out.println(request.getParameter("content"));
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy/MM/dd(HH:mm:ss)");
String regist_day = formatter.format(new java.util.Date());
board.setHit(0);
board.setRegist_day(regist_day);
board.setIp(request.getRemoteAddr());
dao.insertBoard(board);
}
public void requestBoardView(HttpServletRequest request){
BoardDAO dao = BoardDAO.getInstance();
int num = Integer.parseInt(request.getParameter("num"));
int pageNum = Integer.parseInt(request.getParameter("pageNum"));
BoardDTO board = new BoardDTO();
board = dao.getBoardByNum(num, pageNum);
request.setAttribute("num", num);
request.setAttribute("page", pageNum);
request.setAttribute("board", board);
}
public void requestBoardUpdate(HttpServletRequest request){
int num = Integer.parseInt(request.getParameter("num"));
int pageNum = Integer.parseInt(request.getParameter("pageNum"));
BoardDAO dao = BoardDAO.getInstance();
BoardDTO board = new BoardDTO();
board.setNum(num);
board.setName(request.getParameter("name"));
board.setSubject(request.getParameter("subject"));
board.setContent(request.getParameter("content"));
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy/MM/dd(HH:mm:ss)");
String regist_day = formatter.format(new java.util.Date());
board.setHit(0);
board.setRegist_day(regist_day);
board.setIp(request.getRemoteAddr());
dao.updateBoard(board);
}
public void requestBoardDelete(HttpServletRequest request){
int num = Integer.parseInt(request.getParameter("num"));
int pageNum = Integer.parseInt(request.getParameter("pageNum"));
BoardDAO dao = BoardDAO.getInstance();
dao.deleteBoard(num);
}
}
controller인 Boardcontroller에서 이동을 한 뒤에 경로에 따라 if문에 지정된 메서드로 이동. 이동한 메서드를 통해 datebase연결을 위한 비즈니스 로직으로 이동하게 된다.
DAO.java[business logic]
호출에 따른 DAO 메서드로 이동한 뒤 database에서 처리해주어야 할 처리가 이루어 진 후에 controller로 다시 이동을 하게 된다.
이동 한 뒤에 값을 다시 가지고 가기 위해 Requestdispatcher 메서드를 이용하고, 지정한 경로로 가지고 이동을 하게 된다. 여기서 수정, 삭제와 관련된 처리도 입력된 값에 따라 action or <a>태그를 통한 이동을 하고, web.xml에 따라 controller로 이동한 뒤에 처리가 이루어 지게 된다.