MVC Framework

jinkyung·2021년 1월 22일
0

JSP

목록 보기
16/20

controller : 모든 서블릿이 하는 일이 있고, 특정 대상만 하는 일이 있다?
그래서 controller를 두개로 나누었다.

프론트 컨트롤러 -> servlet으로 만들고
뒤의 컨트롤러 -> java로 만든다.


DispatcherServlet
: 어디로 분기시킬지, 어떤 데이터를 뽑아서 준비시킬지 결정한다.

package spms.servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.vo.Member;

/*
1) 의미 : tomcat으로부터 바로 제어 controller로 전송하던 방식 
	-> tomcat은	Front Controller로 전송 
		Front Controller : DispatcherServlet
	* Front Controller는 PageController로 분기 
		back controller : PageController 
		역할을 분할
2) 이유 : 
	2-1) 역할을 보다 상세히 나눠서 규격화(Framework)하려고 한다	
	2-2) 스프링 프레임워크의 제작 방식 
 	2-3) Front Controller만 HttpServlet의 상속을 받고
 		Page Controller는 일반 자바 클래스로 전환(POJO) - 특별한 것 안넣고 자바로 만든다.
 		
3) Front Controller(DispatcherServlet)의 역할
	3-1) tomcat(서블릿 컨테이너 또는 WAS(아파치))과 연결되어 다른 controller에 분기 
			서블릿 컨테이너 : 서블릿을 동작시키는 주체
	3-2) Page Controller에 전송할 VO객체 생성 (향후 자동화)
	3-3) 서블릿/jsp 이동 처리 
	3-4) Page Controller에서 발생하는 예외처리 

4) 장점 
	4-1) 다른 WAS에 이식할 때 Front	Controller만 수정하면 된다 
		(Front Controller만 서블릿에 종속되기 때문에 = HttpServlet을 상속받으므로)
	4-2) 브라우저한테 노출하고 싶지 않은 페이지를 감출 수 있다 
	4-3) Page Controller가 하는 공통 역할을 Front Controller에 담았으므로
		자동화(Framework)하기 편리하다 
*/


@WebServlet("*.do")
@SuppressWarnings("serial")
public class DispatcherServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		
		// pageController에 분기 전송을 위해 '서블릿 경로'를 얻는다
		String servletPath = request.getServletPath();
		
		try {
			String pageControllerPath = null;
			
			if("/member/list.do".equals(servletPath)) {
				pageControllerPath = "/member/list";
			}else if("/member/add.do".equals(servletPath)) {
				pageControllerPath = "/member/add";
				
				
				//아래 조건이 성립하지 않으면 doGet요청 (입력페이지만 전송)
				if(request.getParameter("email")!=null) {
                		//doPost(추가할 새로운 데이터가 존재할 때 )요청일 때 객체 준비 
					request.setAttribute("member", new Member()
							.setEmail(request.getParameter("email"))
							.setPassword(request.getParameter("password"))
							.setName(request.getParameter("name")));
				}
			}else if("/member/update.do".equals(servletPath)) {
				pageControllerPath = "/member/update";
				
				//아래 조건이 성립하지 않으면 doGet요청(상세 정보 보기)
				if(request.getParameter("email")!=null) {
					//doPost(수정 데이터 db에 반영 준비)
					request.setAttribute("member", new Member()
							.setNo(Integer.parseInt(request.getParameter("no")))
							.setEmail(request.getParameter("email"))
							.setName(request.getParameter("name")));
				}
			}else if("/member/delete.do".equals(servletPath)) {
				pageControllerPath = "/member/delete";
			}else if("/member/auth/login.do".equals(servletPath)) {
				pageControllerPath = "/auth/login";
			}else if("/member/logout.do".equals(servletPath)) {
				pageControllerPath = "/auth/logout";
			}
			
			// 페이지 컨트롤러로 위임
			RequestDispatcher rd = request.getRequestDispatcher(pageControllerPath);
			rd.include(request, response);
			
			//include에서 돌아와서 
			// (페이지 컨트롤러가 반환한)jsp페이지로 위임
			String viewUrl = (String)request.getAttribute("viewUrl");
			
			// 경로가 'redirect:'로 시작하면 바로 이동
			if(viewUrl.startsWith("redirect:")) {
				response.sendRedirect(viewUrl.substring(9));
				return;
			}else {
				// 그게 아니라면 viewUrl쪽으로 다시 이동 
				rd = request.getRequestDispatcher(viewUrl);
				rd.include(request, response);
			}
			
		}catch(Exception e) {
			e.printStackTrace();
			
			request.setAttribute("error", e);
			RequestDispatcher rd = 
					request.getRequestDispatcher("/Error.jsp");
			rd.forward(request, response);
		}
	}
}

MemberListServlet

package spms.servlets;

import java.io.IOException;
import java.sql.Connection;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.dao.MemberDao;
import spms.vo.Member;

@SuppressWarnings("serial")
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	
		try {
			// ServletContext에 있는 Connection 객체를 사용하겠다
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
			
			List<Member> members = memberDao.selectList();
			req.setAttribute("members", members);
			
			
			req.setAttribute("viewUrl","/member/MemberList.jsp");
			
		}catch(Exception e) {
		// 예외를 던지면 include로 호출한 dispatcher 서블릿이 받아서 예외처리를 한다. 
			throw new ServletException(e);
            
		}finally {
		}
	}
}

.jsp

: 모두 .do로 변경
.do : 바깥에서 접근(관습)
do가 없으면 내부에서 switching하는 주소


MemberAddServlet

package spms.servlets;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.dao.MemberDao;
import spms.vo.Member;

@SuppressWarnings("serial")
@WebServlet("/member/add")
public class MemberAddServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		req.setAttribute("viewUrl","/member/MemberForm.jsp");
		
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		try {
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
			
			Member member = (Member)req.getAttribute("member");
			memberDao.insert(member);
			
			req.setAttribute("viewUrl", "redirect:list.do");
			
		}catch(Exception e) {
		// 예외를 던지면 include로 호출한 dispatcher 서블릿이 받아서 예외처리를 한다. 
			throw new ServletException(e);
			
		
		}finally {
		}
	}
}

MemberUpdateServlet

package spms.servlets;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.dao.MemberDao;
import spms.vo.Member;

@SuppressWarnings("serial")
@WebServlet("/member/update")
public class MemberUpdateServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		try {
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");

			Member member = memberDao.selectOne(Integer.parseInt(request.getParameter("no")));

			request.setAttribute("member", member);

			request.setAttribute("viewUrl", "/member/MemberUpdateForm.jsp");

		} catch (Exception e) {
			throw new ServletException(e);
		}
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		try {
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");

			Member member = (Member)request.getAttribute("member");
		    memberDao.update(member);

		    request.setAttribute("viewUrl", "redirect:list.do");

		} catch (Exception e) {
			throw new ServletException(e);
		}
	}
}

MemberDeleteServlet

package spms.servlets;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.dao.MemberDao;

@SuppressWarnings("serial")
@WebServlet("/member/delete")
public class MemberDeleteServlet extends HttpServlet {

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");

			memberDao.delete(Integer.parseInt(request.getParameter("no")));

			request.setAttribute("viewUrl", "redirect:list.do");

		} catch (Exception e) {
			throw new ServletException(e);
		}
	}
}

LogInServlet

package spms.servlets;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import spms.dao.MemberDao;
import spms.vo.Member;

@SuppressWarnings("serial")
@WebServlet("/auth/login")
public class LogInServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("viewUrl", "/auth/LogInForm.jsp");
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		try {
		      ServletContext sc = this.getServletContext();
		      MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao"); 
		      
		      Member member = memberDao.exist(
		    		  request.getParameter("email"), 
		    		  request.getParameter("password"));
		      
		      if (member != null) {
		          HttpSession session = request.getSession();
		          session.setAttribute("member", member);
		          request.setAttribute("viewUrl", "redirect:../member/list.do");

		      } else {
		    	  request.setAttribute("viewUrl", "/auth/LogInFail.jsp");
		      }
		}catch(Exception e) {
			throw new ServletException(e);
		}
	}
}

LogOutServlet

package spms.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@SuppressWarnings("serial")
@WebServlet("/auth/logout")
public class LogOutServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 세션저장 객체를 무효화
		HttpSession session = request.getSession();
		session.invalidate();
		
		request.setAttribute("viewUrl", "redirect:login.do");
	}
}


Header.jsp
: EL 사용
member 객체와 email이 존재한다면 로그아웃

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  

<div style="background-color:#00008b; color:white; 
		height:20px; padding:5px;">
SPMS(Simple Project Management System)

<c:if test="${!empty sessionScope.member and 
			  !empty sessionScope.member.email}">
	<span style="float:right;">
		${sessionScope.member.name}
		<a style="color:white;"
			href="<%=request.getContextPath()%>/auth/logout.do">
			로그아웃
		</a>
	</span>
</c:if>
</div>

<%=request.getContextPath()%> = ${pageContext.request.contextPath}

(root경로를 의미한다)

0개의 댓글