본문 바로가기
Java Web Programming/4. JSP

[JSP/Model2] 2단계 _ Model2 FrontController + MVC + Singleton Pattern

by 파프리카_ 2020. 8. 28.
728x90
반응형

https://creamilk88.tistory.com/97 에서 이어지는 포스팅이다.

 

[JSP/Model2] Model2 basic / Model2 MVC pattern + Singleton pattern (forward 방식, redirect 방식)

Model2 설계방식 (Architecture)의 주요 디자인 패턴은 MVC Design Pattern이다. Singleton Pattern으로 Model계층의 DAO에 적용시켜 불필요하게 객체를 다수 생성하는 것을 방지하고 클래스 로딩 시, 단 한번의..

creamilk88.tistory.com

 

위 코드는 기존 Model2 Architecture(MVC+Singleton pattern)에

FrontController Pattern을 추가하여 적용해보자. (Controller 부분이 수정되는 것이다)

 

[ FrontController Pattern ]

: 모든 클라이언트의 다양한 요청을 하나의 진입점으로 집중시켜, 일괄적으로 처리하기 위한 디자인 패턴

→ 사용자 요청 정보 수집 및 분석, 예외 처리, 보안(인증 및 인가), 마케팅 적용 적챙 등을 일관성 있게 처리할 수 있다.

(실생활에서의 콜센터 역할을 한다.)

 


> 기존 구조 (web-study17)

                            Controller 영역                          Model 영역

client ---->      FindCarServlet           <---->  

                         RegisterCarServlet

                                  등등..

 

> FrontController Pattern 적용 후 (web-study18)

: 서블릿은 FrontController인 DispatcherServlet 하나만 정의

                            Controller 영역                          Model 영역

client ---->      DispatcherServlet      <---->  

 


web-study18

 

Controller - Servlet

MVC의 Front Controller 역할을 담당

모든 클라이언트의 요청을 여기서 처리한다.

 

DispatcherServlet.java

package controller;

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 model.CarVO;
import model.MockDAO;
/*
 * 모든 클라이언트의 요청을 처리한다.
 */
@WebServlet("/front")
public class DispatcherServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// doGet method
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//handleRequest method 호출
		this.handleRequest(request, response);
	}

	// doPost method
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//POST 방식 한글 처리
		request.setCharacterEncoding("utf-8");
		
		//handleRequest method 호출
		this.handleRequest(request, response);
	}

	/* handleRequest method
	 * get 방식으로 들어오든, post 방식으로 들어오든,
     	* 모든 클라이언트의 요청을 처리
	*/
	protected void handleRequest(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//Model을 만들 때, command를 넘겨준다
		String command = request.getParameter("command");
		
		boolean redirect = false;
		String url = null;
		
		try {
			//1번 예제 
			if(command.equals("selectCar")) {
				
				//jsp에서 받은 값 가져오기
				String id = request.getParameter("carId");
				
				//DAO 객체 가져오기 : 연동
				CarVO carVO = MockDAO.getInstance().selectCarById(id);
				
				if (carVO == null) { //해당 id 차가 없으면
					redirect = true;
					url = "selectcar-fail.jsp";
				} else { //해당 id 차가 있으면
					url = "selectcar-ok.jsp";
					//연동 결과를 View에 공유
					request.setAttribute("vo", carVO);
				}
				
			//2번 예제 
			} else if (command.contentEquals("registerCar")) {
				/* registercar-form.jsp의 form정보를 수정한다.
				 * (action 수정, hidden 추가)
				 * -------------------------------------------
				 * 클라이언트가 보낸 차량 정보를 받아온다.
				 * MockDAO의 registerCar() method를 실행한다.
				 * 적절한 변수 할당을 해서 응답하게 한다
				 */
				
				// registercar-form.jsp에서 정보 받아오기
				String id = request.getParameter("carId");
				String owner = request.getParameter("owner");
				String model = request.getParameter("model");
				String address = request.getParameter("address");

				// Model과 연동
				CarVO carVO = new CarVO(id, owner, model, address);
				// registerCar() 함수를 이용해 등록
				MockDAO.getInstance().registerCar(carVO);
				
				//View로 이동 준비 (redirect 방식)
				redirect = true;
				url = "car-register-result.jsp";
				
				
			}
			
			//View로 이동
			if (redirect) { //redirect가 true면, redirect 방식으로
				response.sendRedirect(url);
			} else { //redirect가 false면, forward 방식으로
				request.getRequestDispatcher(url).forward(request, response);
			}
			
		} catch (Exception e) {
			// error message는 콘솔에 출력
			e.printStackTrace();
			
			//오류 발생 시,
			//redirect 방식으로 error.jsp로 페이지 이동
			response.sendRedirect("error.jsp");
		}
	}//method
}//class

 

 

View

 

action으로 넘어가는 페이지를 DispatcherServlet의 주소값인 front로 해준다.

hidden의 command를 selectCar로 해서 1번 예제를 수행하게 한다.

/select-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Select Car form</title>
</head>
<body>
	<%-- action url : DispatcherServlet 으로 넘어간다 --%>
	<form action="front">
		<input type="hidden" name="command" value="selectCar">
		아이디 <input type="number" name="carId">
		<input type="submit" value="Car 정보 검색">
	</form>
</body>
</html>

 

action으로 넘어가는 페이지를 DispatcherServlet의 주소값인 front로 해준다.

hidden의 command를 registerCar로해서 2번 예제를 수행하게 한다.

/registercar-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>차 등록 정보 Form</title>
</head>
<body>
	<form action="front" method="POST">
		<input type="hidden" name="command" value="registerCar">
		아이디 <input type="number" name="carId"><br>
		차주명 <input type="text" name="owner"><br>
		모델명 <input type="text" name="model"><br>
		주소 <input type="text" name="address"><br>
		<input type="submit" value="등록하기"><br>
	</form>
</body>
</html>

 

/hidden-test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html hidden test</title>
</head>
<body>
	<form action="hidden-result.jsp">
		<input type="hidden" name="command" value="register">
		<input type="submit" value="test">
	</form>
	<hr>
	<form action="hidden-result.jsp" method="POST">
		<input type="hidden" name="command" value="findProductById">
		<input type="submit" value="test2">
	</form>
	<hr>
	<%-- query string 방식으로도 보낼 수 있다 --%>
	<a href="hidden-result.jsp?command=selectCar">link test</a>
</body>
</html>

 

/hidden-result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>hidden 정보 확인</title>
</head>
<body>
	hidden command: <%=request.getParameter("command") %>
</body>
</html>

 

DispatcherServlet의 catch 구문에서 error 발생 시, error.jsp 파일로 넘어가게해준다!

/error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시스템 점검 중</title>
</head>
<body>
	<marquee>
	에러가 발생했습니다. 콘솔을 확인하세요.<br>
	<img src = "error.jpg">
	</marquee>
</body>
</html>

 

 

브라우저 결과값은 web-study17과 같다 (맨 위 링크로 확인하세요!)

728x90
반응형