public interface ControllerV1 {
void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
인터페이스를 만든다. 기존의 HttpServlet같은, 그렇지만 이건 요청이 들어오면 호출하는게 아니기 때문에.
하지만 구조는 같다. request, response 받고 예외도 똑같이.
List, Save, Form 기존의 것을 그대로 사용했다.
public class MemberFormControllerV1 implements ControllerV1 {
@Override
public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
@WebServlet(name="frontControllerServiceV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {
private Map<String, ControllerV1> controllerMap = new HashMap<>();
public FrontControllerServletV1(){
controllerMap.put("/front-controller/v1/members/new-form",new MemberFormControllerV1());
controllerMap.put("/front-controller/v1/members/save",new MemberSaveControllerV1());
controllerMap.put("/front-controller/v1/members",new MemberListControllerV1());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ControllerV1 controller = controllerMap.get(request.getRequestURI());
if(controller == null){
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
controller.process(request, response);
}
}
얘는 요청이 들어오면 얘가 받는 역할이라, HttpServlet을 상속 받았다.
그리고 /front-controller/v1/* 이렇게 해두면 /front-controller/v1및 그것의 하위로 요청이 들어왔을 때 이것을 실행한다.
Map에 내가 key로 요청의 uri를, 값으로 들어오면 실행할 객체를 넣어놨다.
만약 uri가 들어오면 그것을 키로 Map에서 찾고, 안나오면 NOT_FOUND 상태코드로 보내고 return을 때려버린다.
만약 있으면, 기존의 service역할을 했던 process를 실행한다.
아직 공통로직 부분 개선은 안됐다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
26. 모델 추가 (0) | 2023.08.06 |
---|---|
25. 프론트 컨트롤러 공통로직(뷰 추가) (0) | 2023.08.06 |
23. 프론트 컨트롤러 (0) | 2023.08.06 |
22. MVC 패턴 단점. (0) | 2023.08.06 |
21. MVC 적용 (0) | 2023.08.06 |