#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.HandlerKey;
|
||||||
import org.example.mvc.controller.RequestMethod;
|
import org.example.mvc.controller.RequestMethod;
|
||||||
import org.example.mvc.view.JspViewResolver;
|
import org.example.mvc.view.JspViewResolver;
|
||||||
|
import org.example.mvc.view.ModelAndView;
|
||||||
import org.example.mvc.view.View;
|
import org.example.mvc.view.View;
|
||||||
import org.example.mvc.view.ViewResolver;
|
import org.example.mvc.view.ViewResolver;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -27,12 +28,14 @@ public class DispatcherServlet extends HttpServlet {
|
|||||||
|
|
||||||
private RequestMappingHandlerMapping requestMappingHandlerMapping;
|
private RequestMappingHandlerMapping requestMappingHandlerMapping;
|
||||||
private List<ViewResolver> viewResolvers;
|
private List<ViewResolver> viewResolvers;
|
||||||
|
private List<HandlerAdapter> handlerAdapters;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init() throws ServletException {
|
public void init() throws ServletException {
|
||||||
requestMappingHandlerMapping = new RequestMappingHandlerMapping();
|
requestMappingHandlerMapping = new RequestMappingHandlerMapping();
|
||||||
requestMappingHandlerMapping.init();
|
requestMappingHandlerMapping.init();
|
||||||
|
|
||||||
|
handlerAdapters = List.of(new SimpleControllerHandlerAdaptor());
|
||||||
viewResolvers = Collections.singletonList(new JspViewResolver());
|
viewResolvers = Collections.singletonList(new JspViewResolver());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,11 +52,16 @@ public class DispatcherServlet extends HttpServlet {
|
|||||||
return;
|
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) {
|
for (ViewResolver viewResolver : viewResolvers) {
|
||||||
View view = viewResolver.resolveView(viewName);
|
View view = viewResolver.resolveView(modelAndView.getViewName());
|
||||||
view.render(new HashMap<>(), req, resp);
|
view.render(modelAndView.getModel(), req, resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} 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