본 글은 victolee님의 포스팅을 보고 따라 학습하며 내용을 정리한 포스팅 입니다.
Model2 - Servlet Controller
방명록 페이지 개요
- 방명록을 작성하는 입력 form 페이지
- 게시글 리스트 페잊
- 삭제하기 위해 비밀번호를 입력하는 페이지
CREATE TABLE GUESTBOOK (
NO INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(50),
PWD VARCHAR(60),
CONTENT VARCHAR(9999),
REG_DATE DATETIME
)
- Dao, Vo 작성 과정 생략
views 폴더
- JSP 파일은 WebContent에 직접 작성하지 않고, WEB-INF 폴더 하위의 views 폴더에 위치합니다.
- JSP 파일이 WEB-INF 폴더 하위에 위치하게 되면, 외부에서 직접 접근을 할 수 없게 됩니다.
- 애플리케이션 내부에서는 WEB-INF 폴더에 접근할 수 있으므로, Servlet이 요청을 처리한 후 응답할 페이지를 WEB-INF 폴더에 접근하여 응답합니다.
Controller - Servlet 작성
- 모든 요청은 Servlet에서 받습니다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
GuestBookDao dao = new GuestBookDao();
String actionName = request.getParameter("a");
System.out.println("action : " + actionName);
if("deleteform".equals(actionName)) {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/deleteform.jsp");
rd.forward(request, response);
}else if("add".equals(actionName)) {
GuestBookVo vo = new GuestBookVo();
vo.setName(request.getParameter("name"));
vo.setPwd(request.getParameter("pwd"));
vo.setContent(request.getParameter("content"));
dao.insert(vo);
response.sendRedirect("/GuestBook_Model2/GuestBook");
}else if("delete".equals(actionName)) {
GuestBookVo vo = new GuestBookVo();
vo.setNo(request.getParameter("no"));
vo.setPwd(request.getParameter("pwd"));
dao.delete(vo);
response.sendRedirect("/GuestBook_Model2/GuestBook");
}else {
List<GuestBookVo> list = dao.getList();
request.setAttribute("list", list);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/index.jsp");
rd.forward(request, response);
}
}
- actionName
String actionName = request.getParameter("a");
- servlet에서는 actionName에 따라 각 요청에 맞는 처리로직을 수행합니다.
- actionName에 따라 if - else if - else문을 실행하고 기본수행이나 잘못된 요청은 else문에서 처리하게 됩니다.
- forward와 redirect
- redirect는 HTTP 응답 코드로 302를 클라이언트에 넘겨줘서, 해당 URL로 다시 요청하도록 합니다. 즉, 모든 자원을 반환한 상태로 새롭게 요청을 합니다.(새로고침)
- forward는 요청 받은 자원을 그대로 유지한 채로 제어권을 넘기는 request의 연장선 입니다.
JSP 작성
- index.jsp
<%@page import="vo.GuestBookVo" %>
<%@page import="dao.GuestBookDao" %>
<%@page import="java.util.List" %>
<%@page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
List<GuestBookVo> list = (List<GuestBookVo>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GuestBook - Model2</title>
</head>
<body>
<form action="/GuestBook_Model2/GuestBook" method="post">
<input type='hidden' name='a' value='add'/>
<table border='1' width='500'>
<tr>
<td>이름</td><td><input type='text' name='name'></td>
<td>비밀번호</td><td><input type='password' name='pwd'></td>
</tr>
<tr>
<td colspan=4><textarea name='content' cols=60 rows=5></textarea></td>
</tr>
<tr>
<td colspan=4 align=right><input type='submit' value='check'></td>
</tr>
</table>
</form>
<br>
<%
if(list != null){
for(GuestBookVo vo : list){
%>
<table width='510' border='1'>
<tr>
<td><%= vo.getNo() %></td>
<td><%= vo.getName() %></td>
<td><%= vo.getRegDate() %></td>
<td><a href="/GuestBook_Model2/GuestBook?a=deleteform&no=<%= vo.getNo() %>">삭제</a></td>
</tr>
<tr>
<td><%= vo.getContent() %></td>
</tr>
</table>
<%
}
}
%>
</body>
</html>
- index.jsp에서는 Dao에 접근할 필요없이 Servlet이 준비해둔 list객체만 가져와서 사용하기만 하는 것이 Model2의 핵심입니다.
- delete.jsp
<%@ page import="vo.GuestBookVo" %>
<%@ page import="dao.GuestBookDao" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% String no = request.getParameter("no"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Guest Book delete form</title>
</head>
<body>
<form action="/GuestBook_Model2/GuestBook" method="post">
<input type='hidden' name='a' value='delete'/>
<input type='hidden' name='no' value='<%= no %>'>
<table border='1' width='200'>
<tr>
<td> NO </td><td><%= no %></td>
<td> PWD </td><td><input type='password' name='pwd'></td>
<td><input type='submit' value='check'></td>
</tr>
</table>
</form>
</body>
</html>