https://creamilk88.tistory.com/97 에서 이어지는 포스팅이다.
위 코드는 기존 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과 같다 (맨 위 링크로 확인하세요!)