From 72127d8ccc646ca1517ce9802ed36d8c9fc40c40 Mon Sep 17 00:00:00 2001 From: haerong22 Date: Sat, 3 Apr 2021 21:03:51 +0900 Subject: [PATCH] =?UTF-8?q?spring=20mvc=20:=20mvc=20=ED=94=84=EB=A0=88?= =?UTF-8?q?=EC=9E=84=EC=9B=8C=ED=81=AC=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20-?= =?UTF-8?q?=20=EC=9C=A0=EC=97=B0=ED=95=9C=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v5/FrontControllerServletV5.java | 79 +++++++++++++++++++ .../frontcontroller/v5/MyHandlerAdapter.java | 15 ++++ .../adapter/ControllerV3HandlerAdapter.java | 33 ++++++++ 3 files changed, 127 insertions(+) create mode 100644 spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/FrontControllerServletV5.java create mode 100644 spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/MyHandlerAdapter.java create mode 100644 spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/adapter/ControllerV3HandlerAdapter.java diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/FrontControllerServletV5.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/FrontControllerServletV5.java new file mode 100644 index 00000000..87935a4a --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/FrontControllerServletV5.java @@ -0,0 +1,79 @@ +package com.example.servlet.web.frontcontroller.v5; + +import com.example.servlet.web.frontcontroller.ModelView; +import com.example.servlet.web.frontcontroller.MyView; +import com.example.servlet.web.frontcontroller.v3.ControllerV3; +import com.example.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3; +import com.example.servlet.web.frontcontroller.v3.controller.MemberListControllerV3; +import com.example.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3; +import com.example.servlet.web.frontcontroller.v5.adapter.ControllerV3HandlerAdapter; + +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 java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*") +public class FrontControllerServletV5 extends HttpServlet { + + private final Map handlerMappingMap = new HashMap<>(); + private final List handlerAdapters = new ArrayList<>(); + + public FrontControllerServletV5() { + initHandlerMappingMap(); + initHandlerAdapters(); + } + + private void initHandlerMappingMap() { + handlerMappingMap.put("/front-controller/v5/v3/members/new-form", new MemberFormControllerV3()); + handlerMappingMap.put("/front-controller/v5/v3/members/save", new MemberSaveControllerV3()); + handlerMappingMap.put("/front-controller/v5/v3/members", new MemberListControllerV3()); + } + + private void initHandlerAdapters() { + handlerAdapters.add(new ControllerV3HandlerAdapter()); + } + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Object handler = getHandler(request); // handler 가져오기 + + if (handler == null) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + MyHandlerAdapter adapter = getHandlerAdapter(handler); // handler adapter 가져오기 + + ModelView mv = adapter.handle(request, response, handler); + + String viewName = mv.getViewName(); // 논리 이름 new-form + MyView view = viewResolver(viewName); // 물리 뷰 경로 + + view.render(mv.getModel(), request, response); + } + + private Object getHandler(HttpServletRequest request) { + String requestURI = request.getRequestURI(); // 요청 URI + return handlerMappingMap.get(requestURI); + } + + private MyHandlerAdapter getHandlerAdapter(Object handler) { + for (MyHandlerAdapter adapter : handlerAdapters) { + if (adapter.supports(handler)) { + return adapter; + } + } + throw new IllegalArgumentException("handler adapter 를 찾을 수 없습니다. handler=" + handler); + } + + private MyView viewResolver(String viewName) { + return new MyView("/WEB-INF/views/" + viewName + ".jsp"); + } +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/MyHandlerAdapter.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/MyHandlerAdapter.java new file mode 100644 index 00000000..7bad87e2 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/MyHandlerAdapter.java @@ -0,0 +1,15 @@ +package com.example.servlet.web.frontcontroller.v5; + +import com.example.servlet.web.frontcontroller.ModelView; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public interface MyHandlerAdapter { + + boolean supports(Object handler); + + ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException; +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/adapter/ControllerV3HandlerAdapter.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/adapter/ControllerV3HandlerAdapter.java new file mode 100644 index 00000000..ecbcbd56 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v5/adapter/ControllerV3HandlerAdapter.java @@ -0,0 +1,33 @@ +package com.example.servlet.web.frontcontroller.v5.adapter; + +import com.example.servlet.web.frontcontroller.ModelView; +import com.example.servlet.web.frontcontroller.v3.ControllerV3; +import com.example.servlet.web.frontcontroller.v5.MyHandlerAdapter; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class ControllerV3HandlerAdapter implements MyHandlerAdapter { + @Override + public boolean supports(Object handler) { + return (handler instanceof ControllerV3); + } + + @Override + public ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException { + ControllerV3 controller = (ControllerV3) handler; + Map paramMap = createParamMap(request); + return controller.process(paramMap); + } + + private Map createParamMap(HttpServletRequest request) { + Map paramMap = new HashMap<>(); + request.getParameterNames().asIterator() + .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); + return paramMap; + } +}