프론트 컨트롤러가 다양한 방식의 컨트롤러를 처리할수 있게 변경
중간에 핸들러 어댑터가 추가 됐다. 핸들러 어댑터란 다양한 컨트롤러를 호출할수 있게 해주는 어댑터 역할을 한다 어댑터가 추가됐으니 컨트롤러는 더 넓은 의미인 핸들러라고 부른다.
public interface MyHandlerAdapter {
boolean supports(Object handler);
ModelView handle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws ServletException, IOException;
}
어댑터가 해당 컨트롤러를 지원하는지? 지원한다면 handle을 호출하고 결과로 Model과View를 반환
ControllerV3 controller = (ControllerV3) handler;
Map<String, String> paramMap = createParamMap(request);
ModelView mv = controller.process(paramMap);
return mv;
handler를 v3로 변환시켜줌
@WebServlet(name = "frontControllerServletV5", urlPatterns = "/front-controller/v5/*")
public class FrontControllerServletV5 extends HttpServlet{
private final Map<String,Object> handlerMappingMap = new HashMap<>();
private final List<MyHandlerAdapter> handlerAdapters = new ArrayList<>();
public FrontControllerServletV5() {
initHandlerMappingMAp();
initHandlerAdapters();
}
private void initHandlerAdapters() {
handlerAdapters.add(new ControllerV3HandlerAdapter());
handlerAdapters.add(new ControllerV4HandlerAdapter());
}
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());
handlerMappingMap.put("/front-controller/v5/v4/members/new-form", new MemberFormControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members/save", new MemberSaveControllerV4());
handlerMappingMap.put("/front-controller/v5/v4/members", new MemberListControllerV4());
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object handler = getHandler(request);
if(handler ==null){
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
MyHandlerAdapter adapter = getHandlerAdapter(handler);
ModelView mv =adapter.handle(request,response,handler);
String viewName= mv.getViewName();
MyView view = viewResolver(viewName);
view.render(mv.getModel(), request,response);
}
private MyHandlerAdapter getHandlerAdapter(Object handler) {
for (MyHandlerAdapter adapter : handlerAdapters) {
if(adapter.supports(handler)){
return adapter;
}
}
throw new IllegalArgumentException("handler adpater를 찾을수 없습니다" + handler);
}
private Object getHandler(HttpServletRequest request) {
String requestURI = request.getRequestURI();
Object controller = handlerMappingMap.get(requestURI);
return controller;
}
private MyView viewResolver(String viewName) {
MyView view = new MyView("/WEB-INF/views/" + viewName + ".jsp");
return view;
}
생성자자가 핸들러 매핑과 어댑터를 등록 그리고 adapter.supports(handler)를 통해서 찾는다. 그리고 어댑터가 handler를 호출하고 그 결과를 어댑터에 맞추어 반환한다.