#22 mvc: handler adapter

This commit is contained in:
haerong22
2022-10-11 01:42:28 +09:00
parent 1c0ea3230e
commit dd97887635
4 changed files with 69 additions and 3 deletions

View File

@@ -4,6 +4,7 @@ import org.example.mvc.controller.Controller;
import org.example.mvc.controller.HandlerKey;
import org.example.mvc.controller.RequestMethod;
import org.example.mvc.view.JspViewResolver;
import org.example.mvc.view.ModelAndView;
import org.example.mvc.view.View;
import org.example.mvc.view.ViewResolver;
import org.slf4j.Logger;
@@ -27,12 +28,14 @@ public class DispatcherServlet extends HttpServlet {
private RequestMappingHandlerMapping requestMappingHandlerMapping;
private List<ViewResolver> viewResolvers;
private List<HandlerAdapter> handlerAdapters;
@Override
public void init() throws ServletException {
requestMappingHandlerMapping = new RequestMappingHandlerMapping();
requestMappingHandlerMapping.init();
handlerAdapters = List.of(new SimpleControllerHandlerAdaptor());
viewResolvers = Collections.singletonList(new JspViewResolver());
}
@@ -49,11 +52,16 @@ public class DispatcherServlet extends HttpServlet {
return;
}
String viewName = handler.handleRequest(req, resp);
HandlerAdapter handlerAdapter = handlerAdapters.stream()
.filter(ha -> ha.supports(handler))
.findFirst()
.orElseThrow(() -> new ServletException("No adapter for handler [" + handler + "]"));
ModelAndView modelAndView = handlerAdapter.handle(req, resp, handler);
for (ViewResolver viewResolver : viewResolvers) {
View view = viewResolver.resolveView(viewName);
view.render(new HashMap<>(), req, resp);
View view = viewResolver.resolveView(modelAndView.getViewName());
view.render(modelAndView.getModel(), req, resp);
}
} catch (Exception e) {

View File

@@ -0,0 +1,13 @@
package org.example.mvc;
import org.example.mvc.view.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}

View File

@@ -0,0 +1,22 @@
package org.example.mvc;
import org.example.mvc.controller.Controller;
import org.example.mvc.view.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleControllerHandlerAdaptor implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
@Override
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String viewName = ((Controller) handler).handleRequest(request, response);
return new ModelAndView(viewName);
}
}

View File

@@ -0,0 +1,23 @@
package org.example.mvc.view;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class ModelAndView {
private Object view;
private final Map<String, Object> model = new HashMap<>();
public ModelAndView(String viewName) {
view = viewName;
}
public Map<String, ?> getModel() {
return Collections.unmodifiableMap(model);
}
public String getViewName() {
return (this.view instanceof String ? (String) this.view : null);
}
}