심심한 개발자의 취미생활

본 글은 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>