#22 mvc: handler adapter
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user