Spring/Spring MVC
DispatcherServlet, doDispatch
doriver
2024. 10. 3. 18:23
public class DispatcherServlet extends FrameworkServlet { ~ }
public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware { ~ }
public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware { ~ }
public interface ApplicationContextAware extends Aware { ~ }
HttpServlet - HttpServletBean - FrameworkServlet - DispatcherServlet
요청 받으면 service메소드가 실행됨
HttpServletBean에선 service메소드 @Override 안돼있고, FrameworkServlet에서 돼있음
FrameworkServlet에서
service, doGet, doPost, doPut, doDelete, doOptions, doTrace 메서드에서 processRequest가 실행됨
메서드 processRequest에서 doService메서드가 실행됨
protected abstract void doService(HttpServletRequest request, HttpServletResponse response)
throws Exception;
DispatcherServlet에서
doService가 @Override돼있음, 여기서 doDispatch 사용됨
메서드 doDispatch가 1031 ~ 1111 line에 있음
@SuppressWarnings("deprecation")
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
~
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
~ ~
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
~ ~
} catch (Exception ex) {
dispatchException = ex;
} catch (Throwable err) {
// making them available for @ExceptionHandler methods and other scenarios.
dispatchException = new NestedServletException("Handler dispatch failed", err);
}
processDispatchResult( ~ , mv, dispatchException);
} catch (Exception ex) {
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
} catch (Throwable err) {
triggerAfterCompletion(processedRequest, response, mappedHandler,
new NestedServletException("Handler processing failed", err));
} finally {
if () {
} else {
}
}
}
요청 받으면 service메소드가 실행됨 > processRequest실행 > doService실행 > doDispatch실행