java source-springmvc

<img

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

img

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

img

img

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

img

atributosSnapshot se utiliza para guardar los datos en el campo de solicitud, que se puede llamar "instantánea"

img

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

img

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.

Publicado 37 artículos originales · elogiado 6 · visitas 4651

Supongo que te gusta

Origin blog.csdn.net/littlewhitevg/article/details/105475071
Recomendado
Clasificación