diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/ControllerV4.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/ControllerV4.java new file mode 100644 index 00000000..ca71bb93 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/ControllerV4.java @@ -0,0 +1,8 @@ +package com.example.servlet.web.frontcontroller.v4; + +import java.util.Map; + +public interface ControllerV4 { + + String process(Map paramMap, Map model); +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/FrontControllerServletV4.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/FrontControllerServletV4.java new file mode 100644 index 00000000..bda8eb61 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/FrontControllerServletV4.java @@ -0,0 +1,63 @@ +package com.example.servlet.web.frontcontroller.v4; + +import com.example.servlet.web.frontcontroller.MyView; +import com.example.servlet.web.frontcontroller.v4.controller.MemberFormControllerV4; +import com.example.servlet.web.frontcontroller.v4.controller.MemberListControllerV4; +import com.example.servlet.web.frontcontroller.v4.controller.MemberSaveControllerV4; + +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.HashMap; +import java.util.Map; + +@WebServlet(name = "frontControllerServletV4", urlPatterns = "/front-controller/v4/*") +public class FrontControllerServletV4 extends HttpServlet { + + private final Map controllerMap = new HashMap<>(); + + // 요청 URI 와 controller 매핑 + public FrontControllerServletV4() { + controllerMap.put("/front-controller/v4/members/new-form", new MemberFormControllerV4()); + controllerMap.put("/front-controller/v4/members/save", new MemberSaveControllerV4()); + controllerMap.put("/front-controller/v4/members", new MemberListControllerV4()); + } + + @Override + protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + String requestURI = request.getRequestURI(); // 요청 URI + + ControllerV4 controller = controllerMap.get(requestURI); + + if (controller == null) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + // paramMap + Map paramMap = createParamMap(request); + Map model = new HashMap<>(); + + String viewName = controller.process(paramMap, model); + + MyView view = viewResolver(viewName); // 물리 이름 + + view.render(model, request, response); + } + + // 논리 이름을 물리 이름으로 변환 + private MyView viewResolver(String viewName) { + return new MyView("/WEB-INF/views/" + viewName + ".jsp"); + } + + // 넘어온 파라미터 값 꺼내기 + private Map createParamMap(HttpServletRequest request) { + Map paramMap = new HashMap<>(); + request.getParameterNames().asIterator() + .forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); + return paramMap; + } +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberFormControllerV4.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberFormControllerV4.java new file mode 100644 index 00000000..a678b186 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberFormControllerV4.java @@ -0,0 +1,12 @@ +package com.example.servlet.web.frontcontroller.v4.controller; + +import com.example.servlet.web.frontcontroller.v4.ControllerV4; + +import java.util.Map; + +public class MemberFormControllerV4 implements ControllerV4 { + @Override + public String process(Map paramMap, Map model) { + return "new-form"; + } +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberListControllerV4.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberListControllerV4.java new file mode 100644 index 00000000..e88c62a8 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberListControllerV4.java @@ -0,0 +1,20 @@ +package com.example.servlet.web.frontcontroller.v4.controller; + +import com.example.servlet.domain.member.Member; +import com.example.servlet.domain.member.MemberRepository; +import com.example.servlet.web.frontcontroller.v4.ControllerV4; + +import java.util.List; +import java.util.Map; + +public class MemberListControllerV4 implements ControllerV4 { + + private final MemberRepository memberRepository = MemberRepository.getInstance(); + + @Override + public String process(Map paramMap, Map model) { + List members = memberRepository.findAll(); + model.put("members", members); + return "members"; + } +} diff --git a/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberSaveControllerV4.java b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberSaveControllerV4.java new file mode 100644 index 00000000..e893e1c2 --- /dev/null +++ b/spring-mvc/servlet/src/main/java/com/example/servlet/web/frontcontroller/v4/controller/MemberSaveControllerV4.java @@ -0,0 +1,24 @@ +package com.example.servlet.web.frontcontroller.v4.controller; + +import com.example.servlet.domain.member.Member; +import com.example.servlet.domain.member.MemberRepository; +import com.example.servlet.web.frontcontroller.v4.ControllerV4; + +import java.util.Map; + +public class MemberSaveControllerV4 implements ControllerV4 { + + private final MemberRepository memberRepository = MemberRepository.getInstance(); + + @Override + public String process(Map paramMap, Map model) { + String username = paramMap.get("username"); + int age = Integer.parseInt(paramMap.get("age")); + + Member member = new Member(username, age); + memberRepository.save(member); + + model.put("member", member); + return "save-result"; + } +}