¿Cuál es la relación entre SpringMVC y Spring?

Autor: Zhuangsheng Wen
enlace: https: //www.zhihu.com/question/39678061/answer/312545961
Fuente: saber casi con
derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.

Proceso básico de Spring Web Framework

Conozca el marco Spring MVC, ahora echemos un vistazo a su proceso

Spring MVC Framework es tan grande como el proceso: cuando se inicia el programa web, ContextLoaderServlet leerá la información del archivo de configuración correspondiente e inicializará el controlador DispatchServlet mediante inyección. Cuando se reciba una solicitud HTTP, DispatchServlet dejará que HandlerMapping vaya Maneja esta solicitud. HandlerMapping selecciona un controlador de acuerdo con la URL de la solicitud (no necesariamente una URL, se puede personalizar, es muy flexible). Luego, DispatchServlet llamará al método handlerRequest del controlador seleccionado y llamará al controlador antes y después de este método interceptor (si está configurado), y luego devuelve una colección de vistas y modelos ModelAndView. El marco resuelve la vista a través de ViewResolver y devuelve un objeto View, y finalmente llama al método de renderizado de View para regresar al cliente

DispatcherServlet

Este es el controlador del marco, que es una clase concreta, que es inicializada por el objeto de contexto en tiempo de ejecución. El controlador en sí no controla el proceso, sino que es simplemente el "controlador" del controlador. Simplemente delega la responsabilidad de procesar la solicitud a El Controller correspondiente.
Controller hereda de la clase base abstracta FrameworkServlet, y su atributo webApplicationContext representa el contexto del programa web, y la implementación predeterminada de este objeto de contexto es leer la información de configuración de un archivo XML (por supuesto, también puede estar en otros formatos de archivo) . WebApplicationContext es en realidad el paquete beans. Este paquete proporciona la estructura básica de todo el marco de Spring. Analizaré el contenido de este paquete en el futuro. Pero ahora solo necesito saber que WebApplicationContext representa el objeto de contexto de una aplicación web.

Ahora veamos cómo funciona DispatchServlet:

DispatchServlet hereda de la clase base abstracta FrameworkServlet, y los métodos doGet () y doPost () en FrameworkServlet llaman a serviceWrapper (), salte a serviceWrapper () para ver, resulta que ha delegado la implementación específica a doService (solicitud) , respuesta); método. Ahora está claro que DispatchServlet realmente implementa la función del método doService ().
En particular, el método initFrameworkServlet () de FrameworkServlet es el método de inicialización del controlador, utilizado para inicializar objetos como HandlerMappings , Esto también se retrasa a la implementación de la subclase. De hecho, es una implementación del patrón Template. No nos llames, llamaremos u. En general, Spring implementa su inversión de control de esta manera: usa el framework para Controle el flujo, no el usuario

Salte a doService () y eche un vistazo, encontrará que es otra función auxiliar doDispatch (solicitud, respuesta) que realmente funciona. No hay forma, continúe leyendo y encuentre estas dos líneas de código

HandlerExecutionChain mappedHandler = null;
mappedHandler = getHandler (ProcessingRequest, falso) ;

Mirando el código fuente de HandlerExecutionChain, resulta que en realidad envuelve el controlador y sus interceptores;

getHandler () es para recuperar el objeto handlerMapping correspondiente de HandlerMappings (esto es una lista, objetos handlerMapping almacenados), cada objeto HandlerMapping representa un controlador y un mapeo de URL (de hecho, en tiempo de ejecución, es un HandlerExecutionChain y un mapeo de URL, y El objeto HandlerExecutionChain es en realidad un contenedor para el controlador y sus interceptores. HandlerMapping puede considerarse como un mapeo entre el controlador y la URL). Este HandlerMapping se inyecta en tiempo de ejecución a través del archivo de configuración. Generalmente, la subclase SimpleUrlHandlerMapping
obtiene el objeto HandlerMapping. , Continúe mirando hacia abajo y encuentre:

if(mappedHandler.getInterceptors()!=null)

    {
    
    
        for (int i = 0; i < mappedHandler.getInterceptors().length; i++) {
    
    
            HandlerInterceptor interceptor = mappedHandler.getInterceptors()[i];
            if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
    
    
                triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
                return;
            }
            interceptorIndex = i;
        }
    }

Aquí está el interceptor que llama al controlador, el principio es esta oración:

interceptor.preHandle(processedRequest, response,mappedHandler.getHandler(), mv);

El método preHandle pasa el parámetro mappedHandler.getHandler () para implementar llamadas recursivas. El método interceptor.postHandle es muy general. Es solo que este método se llama después del método handleRequest

Sigue leyendo:

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

Se encuentra que la operación real de handleRequest del controlador se delega al método handle de HandlerAdapter, y se devuelve un ModelAndView. Creo que el significado de agregar una capa aquí debería ser desacoplar el controlador y DispatchServlet.

Entonces es muy simple, llame al método render (), en este método, ViewResoler analiza el nombre de la vista y luego llama al método render del objeto de vista para mostrar la vista apropiada al usuario

En este punto, el proceso del controlador ha terminado.

HandlerMapping

Al usar HandlerMapping, el controlador puede usar la URL para realizar una asignación estándar con un controlador y realizar el UrlHandlerMapping de la subclase específica de la asignación de URL.

Spring también nos permite personalizar el mapeo, como mapeo por sesión, cookie o estado de usuario. Y todo esto solo necesita implementar la interfaz HandlerMapping. Pero el mapeo de URL ya puede cumplir con la mayoría de los requisitos

Controlador

El controlador es similar a Structs Action. La interfaz del controlador tiene solo un método handleRequest (), que devuelve un objeto ModelAndView. Como decía el objetivo de diseño, cada controlador es un componente de Java, por lo que se puede configurar arbitrariamente en el contexto, las propiedades del componente Se configurará durante la inicialización. Spring proporciona varias implementaciones específicas. Es conveniente para nosotros usar

ViewResolver

El controlador generalmente devuelve un objeto ModelAndView que contiene el nombre de la vista en lugar del objeto de la vista. Esto elimina por completo la relación de acoplamiento entre el controlador y la vista, y también puede proporcionar soporte de internacionalización aquí. En su archivo de configuración puede:

welcomeView.class = org.springframework.web.servlet.view.InternalResourceView
welcomeView.url=/welcome.jsp
也可以
welcomeView.class = org.springframework.web.servlet.view.xslt.XsltView
welcomeView.url=/xslt/default.xslt

Ver

Este también es un componente java. No realiza ningún procesamiento de solicitudes ni lógica de negocios. Solo obtiene los datos pasados ​​por el modelo y muestra los datos. El método render en él funciona de acuerdo con el siguiente proceso:

  1. Establecer los datos del modelo al alcance de la solicitud
  2. Obtener la URL de la vista
  3. Reenviar a la URL correspondiente

Supongo que te gusta

Origin blog.csdn.net/qq1350975694/article/details/108735186
Recomendado
Clasificación