diff --git a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java index 0c4515d689..56410ab1ac 100644 --- a/app/src/main/java/com/techcourse/DispatcherServletInitializer.java +++ b/app/src/main/java/com/techcourse/DispatcherServletInitializer.java @@ -1,10 +1,17 @@ package com.techcourse; +import com.techcourse.exception.NotFoundExceptionHandler; import jakarta.servlet.ServletContext; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import web.org.springframework.web.WebApplicationInitializer; import webmvc.org.springframework.web.servlet.DispatcherServlet; +import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.AnnotationHandlerAdapter; +import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapterFinder; +import webmvc.org.springframework.web.servlet.mvc.tobe.exception.ExceptionResolver; +import webmvc.org.springframework.web.servlet.mvc.tobe.handler.AnnotationHandlerMapping; +import webmvc.org.springframework.web.servlet.mvc.tobe.handler.HandlerMapping; /** * Base class for {@link WebApplicationInitializer} @@ -18,7 +25,7 @@ public class DispatcherServletInitializer implements WebApplicationInitializer { @Override public void onStartup(final ServletContext servletContext) { - final var dispatcherServlet = new DispatcherServlet(); + final var dispatcherServlet = initDispatcherServlet(); final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet); if (registration == null) { @@ -31,4 +38,12 @@ public void onStartup(final ServletContext servletContext) { log.info("Start AppWebApplication Initializer"); } + + public DispatcherServlet initDispatcherServlet() { + HandlerMapping handlerMapping = new AnnotationHandlerMapping(); + handlerMapping.initialize(); + HandlerAdapterFinder handlerAdapterFinder = new HandlerAdapterFinder(List.of(new AnnotationHandlerAdapter())); + ExceptionResolver exceptionResolver = new ExceptionResolver(List.of(new NotFoundExceptionHandler())); + return new DispatcherServlet(handlerMapping, handlerAdapterFinder, exceptionResolver); + } } diff --git a/app/src/main/java/com/techcourse/TomcatStarter.java b/app/src/main/java/com/techcourse/TomcatStarter.java index 4f26f228e3..0e2efea57e 100644 --- a/app/src/main/java/com/techcourse/TomcatStarter.java +++ b/app/src/main/java/com/techcourse/TomcatStarter.java @@ -1,5 +1,7 @@ package com.techcourse; +import com.techcourse.exception.UncheckedServletException; +import java.io.File; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.connector.Connector; @@ -7,8 +9,6 @@ import org.apache.catalina.startup.Tomcat; import org.apache.tomcat.util.scan.StandardJarScanner; -import java.io.File; - public class TomcatStarter { public static final String WEBAPP_DIR_LOCATION = "app/src/main/webapp/"; diff --git a/app/src/main/java/com/techcourse/exception/NotFoundExceptionHandler.java b/app/src/main/java/com/techcourse/exception/NotFoundExceptionHandler.java new file mode 100644 index 0000000000..a5fcd1a813 --- /dev/null +++ b/app/src/main/java/com/techcourse/exception/NotFoundExceptionHandler.java @@ -0,0 +1,19 @@ +package com.techcourse.exception; + +import webmvc.org.springframework.web.servlet.ModelAndView; +import webmvc.org.springframework.web.servlet.mvc.tobe.exception.HandlerNotFoundException; +import webmvc.org.springframework.web.servlet.mvc.tobe.handler.ExceptionHandler; +import webmvc.org.springframework.web.servlet.view.JspView; + +public class NotFoundExceptionHandler implements ExceptionHandler { + + @Override + public boolean support(Throwable ex) { + return ex instanceof HandlerNotFoundException; + } + + @Override + public ModelAndView handle() { + return new ModelAndView(new JspView("/404.jsp")); + } +} diff --git a/app/src/main/java/com/techcourse/UncheckedServletException.java b/app/src/main/java/com/techcourse/exception/UncheckedServletException.java similarity index 81% rename from app/src/main/java/com/techcourse/UncheckedServletException.java rename to app/src/main/java/com/techcourse/exception/UncheckedServletException.java index 26acea7605..64466b42de 100644 --- a/app/src/main/java/com/techcourse/UncheckedServletException.java +++ b/app/src/main/java/com/techcourse/exception/UncheckedServletException.java @@ -1,4 +1,4 @@ -package com.techcourse; +package com.techcourse.exception; public class UncheckedServletException extends RuntimeException { diff --git a/mvc/src/main/java/webmvc/org/springframework/web/servlet/DispatcherServlet.java b/mvc/src/main/java/webmvc/org/springframework/web/servlet/DispatcherServlet.java index c0aa4e48fa..b0dbf4e123 100644 --- a/mvc/src/main/java/webmvc/org/springframework/web/servlet/DispatcherServlet.java +++ b/mvc/src/main/java/webmvc/org/springframework/web/servlet/DispatcherServlet.java @@ -4,14 +4,11 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.AnnotationHandlerAdapter; import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapter; import webmvc.org.springframework.web.servlet.mvc.tobe.adapter.HandlerAdapterFinder; import webmvc.org.springframework.web.servlet.mvc.tobe.exception.ExceptionResolver; -import webmvc.org.springframework.web.servlet.mvc.tobe.handler.AnnotationHandlerMapping; import webmvc.org.springframework.web.servlet.mvc.tobe.handler.HandlerMapping; public class DispatcherServlet extends HttpServlet { @@ -19,29 +16,15 @@ public class DispatcherServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class); - private HandlerMapping handlerMapping; - private HandlerAdapterFinder handlerAdapterFinder; - private ExceptionResolver exceptionResolver; + private final HandlerMapping handlerMapping; + private final HandlerAdapterFinder handlerAdapterFinder; + private final ExceptionResolver exceptionResolver; - public DispatcherServlet() { - } - - @Override - public void init() { - handlerMapping = initHandlerMappings(); - handlerAdapterFinder = initHandlerAdapterFinder(); - exceptionResolver = new ExceptionResolver(); - } - - private HandlerMapping initHandlerMappings() { - HandlerMapping handlerMapping = new AnnotationHandlerMapping("com"); - handlerMapping.initialize(); - return handlerMapping; - } - - private HandlerAdapterFinder initHandlerAdapterFinder() { - return new HandlerAdapterFinder( - List.of(new AnnotationHandlerAdapter())); + public DispatcherServlet(HandlerMapping handlerMapping, HandlerAdapterFinder handlerAdapterFinder, + ExceptionResolver exceptionResolver) { + this.handlerMapping = handlerMapping; + this.handlerAdapterFinder = handlerAdapterFinder; + this.exceptionResolver = exceptionResolver; } @Override diff --git a/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/adapter/HandlerAdapterFinder.java b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/adapter/HandlerAdapterFinder.java index 744cf45d90..e76931a4b6 100644 --- a/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/adapter/HandlerAdapterFinder.java +++ b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/adapter/HandlerAdapterFinder.java @@ -1,7 +1,7 @@ package webmvc.org.springframework.web.servlet.mvc.tobe.adapter; -import com.sun.jdi.InternalException; import java.util.List; +import webmvc.org.springframework.web.servlet.mvc.tobe.exception.HandlerNotFoundException; public class HandlerAdapterFinder { @@ -15,6 +15,6 @@ public HandlerAdapter find(Object handler) { return handlerAdapters.stream() .filter(it -> it.supports(handler)) .findFirst() - .orElseThrow(InternalException::new); + .orElseThrow(HandlerNotFoundException::new); } } diff --git a/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/exception/ExceptionResolver.java b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/exception/ExceptionResolver.java index 74f2884acd..ffedce55e5 100644 --- a/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/exception/ExceptionResolver.java +++ b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/exception/ExceptionResolver.java @@ -1,21 +1,24 @@ package webmvc.org.springframework.web.servlet.mvc.tobe.exception; +import com.sun.jdi.InternalException; +import java.util.List; import webmvc.org.springframework.web.servlet.ModelAndView; -import webmvc.org.springframework.web.servlet.view.JspView; +import webmvc.org.springframework.web.servlet.mvc.tobe.handler.ExceptionHandler; public class ExceptionResolver { - public ModelAndView handle(Throwable ex) { - ModelAndView mv = null; - if (ex instanceof HandlerNotFoundException) { - mv = new ModelAndView(new JspView("/404.jsp")); - } + private final List handlers; - if (mv == null) { - return new ModelAndView(new JspView("/500.jsp")); - } + public ExceptionResolver(List handlers) { + this.handlers = handlers; + } - return mv; + public ModelAndView handle(Throwable ex) { + ExceptionHandler handler = handlers.stream() + .filter(it -> it.support(ex)) + .findFirst() + .orElseThrow(() -> new InternalException()); + return handler.handle(); } } diff --git a/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/handler/ExceptionHandler.java b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/handler/ExceptionHandler.java new file mode 100644 index 0000000000..aa1db08047 --- /dev/null +++ b/mvc/src/main/java/webmvc/org/springframework/web/servlet/mvc/tobe/handler/ExceptionHandler.java @@ -0,0 +1,10 @@ +package webmvc.org.springframework.web.servlet.mvc.tobe.handler; + +import webmvc.org.springframework.web.servlet.ModelAndView; + +public interface ExceptionHandler { + + boolean support(Throwable ex); + + ModelAndView handle(); +}