<
https://www.cnblogs.com/Java-Starter/p/10310565.html
Proceso de inicialización
https://blog.csdn.net/dhaiuda/article/details/80026354
Resumir el proceso de inicialización de HttpServletBean, FrameworkServlet y DispatcherServlet
1.HttpServletBean
Inicialice los parámetros en web.xml
2.Servlet de marco
Dar contexto al Servlet actual
3.DispatcherServlet
Inicialice HandlerMapping (Asignación de solicitud), HandlerExceptionResolver (Manejo de excepciones), ViewResolver (Resolución de vista) y otras clases de implementación de funciones
DispatcherServlet maneja la solicitud
Ingrese http: // localhost: 8080 / springmvcdemo / employee en el navegador para activar el método processRequest de DispatcherServlet
Primero mire el método processRequest de la clase primaria FrameworkServlet:
previousLocaleContext Obtenga el LocaleContext relacionado con el hilo actual
Construya un nuevo LocaleContext relacionado con el hilo actual de acuerdo con la solicitud existente
previousAttributes Obtener RequestAttributes vinculados al hilo actual
Construya nuevos ServletRequestAttributes para solicitudes existentes y agregue atributos pre-enlazados
initContextHolders enlaza los RequestAttributes y ServletRequestAttributes recién construidos al hilo actual, se une a ThreadLocal para completar el enlace
El método abstracto doService es anulado por la subclase FrameworkServlet DispatcherServlet
El método resetContextHolders desenlaza RequestAttributes, ServletRequestAttributes y el hilo actual
Regístrese para escuchar el evento ServletRequestHandledEvent y genere un evento cuando llame al contexto
Ahora miramos el método doService de DispatcherServlet
atributosSnapshot se utiliza para guardar los datos en el campo de solicitud, que se puede llamar "instantánea"
Ingrese el método doDispatch
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
//通过当前request获取到 HandlerExecutionChain
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
//确定当前请求的处理程序适配器。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 如果处理程序支持,则处理最后修改的标头
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 实际调用处理程序。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
catch (Throwable err) {
// As of 4.3, we're processing Errors thrown from handler methods as well,
// making them available for @ExceptionHandler methods and other scenarios.
dispatchException = new NestedServletException("Handler dispatch failed", err);
}
processDispatchResult(processedRequest, response, mappedHandler, 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 (asyncManager.isConcurrentHandlingStarted()) {
// Instead of postHandle and afterCompletion
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
}
else {
// Clean up any resources used by a multipart request.
if (multipartRequestParsed) {
cleanupMultipart(processedRequest);
}
}
}
}
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
El primero es: encontrar el controlador apropiado de los dos controladores
BeanNameUrlHandlerMapping @ 833153a, controlador de modo de configuración XML
RequestMappingHandlerMapping @ 3602f818 Controlador anotado
El segundo es: de los tres adaptadores, encuentre el procesador correcto
HttpRequestHandlerAdapter @ 28dc72d7, SimpleControllerHandlerAdapter @ 6b712691, Adaptador y anotación de configuración XML
RequestMappingHandlerAdapter @ 4d763f47 Adaptador anotado
https://blog.csdn.net/abcwanglinyong/article/details/91044492
1. El usuario envía una solicitud, que es interceptada por el controlador front-end DispatcherServlet de SpringMVC.
2. DispatcherServlet llama al mapeador del procesador HandlerMapping después de recibir la solicitud.
3. El mapeador del procesador encuentra el procesador específico, genera una cadena de ejecución del procesador HandlerExecutionChain (incluido el controlador del procesador y la colección del interceptor del procesador), y lo devuelve al DispatcherServlet.
4. DispatcherServlet llama al adaptador de procesador HandlerAdapter.
5. Encuentre el controlador específico a través del HandlerAdapter
6. El controlador encapsula el modelo de datos del modelo en ModelAndView y lo devuelve al HandlerAdapter.
7. El HandlerAdapter devuelve la vista del modelo ModelAndView al DispatcherServlet.
8. DispatcherServlet pasa ModelAndView al analizador de vista ViewReslover.
9. ViewReslover devuelve una vista específica después del análisis.
10. DispatcherServlet representa la vista de acuerdo con la Vista (es decir, llena los datos del modelo en la vista).
11. DispatcherServlet responde la vista al usuario.
Para DispatcherServlet.
8. DispatcherServlet pasa ModelAndView al analizador de vista ViewReslover.
9. ViewReslover devuelve una vista específica después del análisis.
10. DispatcherServlet representa la vista de acuerdo con la Vista (es decir, llena los datos del modelo en la vista).
11. DispatcherServlet responde la vista al usuario.