目录
一、SpringMVC的核心处理流程
二、DispatcherServlet
1、init()方法
2、doDispatch()方法
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerExecutionChain handler = getHandler(request);
if (handler == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (!applyPreHandle(request, response, executionChain.getInterceptors())) {
return;
}
HandlerAdapter handlerAdapter = getHandlerAdapter(handler.getHandler());
handlerAdapter.handle(request, response, handler.getHandler());
applyPostHandle(request, response, executionChain.getInterceptors(), executionChain.getHandler());
triggerAfterCompletion(request, response, null);
protected boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors) throws Exception {
if (interceptors != null) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(request, response, handler)) {
triggerAfterCompletion(request, response, null, new Exception("Interceptor[" + interceptor + "] preHandle return false"));
return false;
}
}
}
return true;
}
protected void applyPostHandle(HttpServletRequest request, HttpServletResponse response, HandlerInterceptor[] interceptors, Object handler) throws Exception {
if (interceptors != null) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(request, response, handler, null);
}
}
}
}
3、AbstractAnnotationConfigDispatcherServletInitializer类
public abstract class AbstractAnnotationConfigDispatcherServletInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
Class<?>[] rootConfigClasses = getRootConfigClasses();
if (rootConfigClasses != null && rootConfigClasses.length > 0) {
rootContext.register(rootConfigClasses);
}
AnnotationConfigWebApplicationContext servletContext = new AnnotationConfigWebApplicationContext();
Class<?>[] servletConfigClasses = getServletConfigClasses();
if (servletConfigClasses != null && servletConfigClasses.length > 0) {
servletContext.register(servletConfigClasses);
}
DispatcherServlet dispatcherServlet = new DispatcherServlet(servletContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
dispatcher.addMapping(getServletMappings());
customizeRegistration(dispatcher);
}
protected abstract Class<?>[] getRootConfigClasses();
protected abstract Class<?>[] getServletConfigClasses();
protected abstract String[] getServletMappings();
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
}
}
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { ServletConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}