java - mvc - ¿Qué es Servlet Dispatcher en primavera?
spring mvc wikipedia (6)
En esta imagen (que obtuve de here ), la solicitud HTTP envía algo al Servlet de Dispatcher.
Mi pregunta es ¿qué hace Dispatcher Servlet ?
¿Es algo así como sacar la información de la página web y arrojarla al controlador?
El trabajo del DispatcherServlet es tomar un URI entrante y encontrar la combinación correcta de controladores (generalmente métodos en clases de Controlador ) y vistas (generalmente JSP) que se combinan para formar la página o el recurso que se supone que se encuentra en esa ubicación.
puede que tenga
- un archivo
/WEB-INF/jsp/pages/Home.jsp
y un método en una clase
@RequestMapping(value="/pages/Home.html") private ModelMap buildHome() { return somestuff; }
El servlet de Dispatcher es el bit que "sabe" que llama a ese método cuando un navegador solicita la página, y combina sus resultados con el archivo JSP correspondiente para crear un documento html.
Cómo logra esto varía ampliamente con la configuración y la versión de Spring.
Tampoco hay razón para que el resultado final tenga que ser páginas web. Puede hacer lo mismo para localizar puntos finales RMI , gestionar solicitudes SOAP , cualquier cosa que pueda entrar en un servlet.
En Spring MVC todas las solicitudes entrantes pasan por un solo servlet. Este servlet - DispatcherServlet
- es el controlador frontal. El controlador frontal es un patrón de diseño típico en el desarrollo de aplicaciones web. En este caso, un único servlet recibe todas las solicitudes y las transfiere a todos los demás componentes de la aplicación.
La tarea del DispatcherServlet
es enviar una solicitud al controlador Spring MVC específico.
Por lo general, tenemos muchos controladores y DispatcherServlet
refiere a uno de los siguientes mapeadores para determinar el controlador objetivo:
-
BeanNameUrlHandlerMapping
; -
ControllerBeanNameHandlerMapping
; -
ControllerClassNameHandlerMapping
; -
DefaultAnnotationHandlerMapping
; -
SimpleUrlHandlerMapping
.
Si no se realiza ninguna configuración, DispatcherServlet
usa BeanNameUrlHandlerMapping
y DefaultAnnotationHandlerMapping
de forma predeterminada.
Cuando se identifica el controlador objetivo, el DispatcherServlet
envía una solicitud. El controlador realiza algún trabajo de acuerdo con la solicitud (o lo delega a los otros objetos) y vuelve al DispatcherServlet
con el Modelo y el nombre de la Vista.
El nombre de la Vista es solo un nombre lógico. Este nombre lógico se usa para buscar la Vista real (para evitar el acoplamiento con el controlador y la Vista específica). Luego, DispatcherServlet
refiere a ViewResolver
y asigna el nombre lógico de la Vista a la implementación específica de la Vista.
Algunas posibles implementaciones de ViewResolver
son:
-
BeanNameViewResolver
; -
ContentNegotiatingViewResolver
; -
FreeMarkerViewResolver
; -
InternalResourceViewResolver
; -
JasperReportsViewResolver
; -
ResourceBundleViewResolver
; -
TilesViewResolver
; -
UrlBasedViewResolver
; -
VelocityLayoutViewResolver
; -
VelocityViewResolver
; -
XmlViewResolver
; -
XsltViewResolver
.
Cuando DispatcherServlet
determina la vista que mostrará los resultados, se representará como la respuesta.
Finalmente, DispatcherServlet
devuelve el objeto Response
al cliente.
Podemos decir que DispatcherServlet
se encarga de todo en Spring MVC.
En el inicio del contenedor web:
-
DispatcherServlet
se cargará e inicializará al llamar al métodoinit()
-
init()
deDispatcherServlet
intentará identificar el Documento de configuración de Spring con las convenciones de nombres como"servlet_name-servlet.xml"
luego se podrán identificar todos los beans.
Ejemplo:
public class DispatcherServlet extends HttpServlet {
ApplicationContext ctx = null;
public void init(ServletConfig cfg){
// 1. try to get the spring configuration document with default naming conventions
String xml = "servlet_name" + "-servlet.xml";
//if it was found then creates the ApplicationContext object
ctx = new XmlWebApplicationContext(xml);
}
...
}
Por lo tanto, en general, el URI de solicitud de captura de DispatcherServlet
y entrega a HandlerMapping
. HandlerMapping
search mapping bean con método de controlador, donde el controlador devuelve el nombre lógico (vista). Entonces, este nombre lógico se envía a DispatcherServlet
mediante HandlerMapping
. Luego DispatcherServlet
le ViewResolver
a ViewResolver
que proporcione la ubicación completa de la vista al agregar el prefijo y el sufijo, luego DispatcherServlet
da la vista al cliente.
Sé que esta pregunta ya está marcada como resuelta, pero quiero agregar una imagen más reciente que explique este patrón en detalle (fuente: primavera en acción 4):
Explicación
Cuando la solicitud abandona el navegador (1) , contiene información sobre lo que el usuario está pidiendo. Por lo menos, la solicitud llevará la URL solicitada. Pero también puede llevar datos adicionales, como la información presentada en un formulario por el usuario.
La primera parada en los viajes de la solicitud es en Spring''s DispatcherServlet. Al igual que la mayoría de los marcos web basados en Java, Spring MVC canaliza las solicitudes a través de un único servlet de controlador frontal. Un controlador frontal es un patrón de aplicación web común donde un servlet único delega la responsabilidad de una solicitud a otros componentes de una aplicación para realizar el procesamiento real. En el caso de Spring MVC, DispatcherServlet es el controlador frontal. El trabajo del DispatcherServlet es enviar la solicitud a un controlador Spring MVC. Un controlador es un componente de Spring que procesa la solicitud. Pero una aplicación típica puede tener varios controladores, y DispatcherServlet necesita ayuda para decidir a qué controlador enviar la solicitud. Por lo tanto, DispatcherServlet consulta una o más asignaciones de manejador (2) para determinar dónde estará la próxima parada de la solicitud. El mapeo de manejador presta particular atención a la URL llevada por la solicitud al tomar su decisión. Una vez que se ha elegido un controlador apropiado, DispatcherServlet envía la solicitud de manera feliz al controlador elegido (3) . En el controlador, la solicitud deja su carga (la información presentada por el usuario) y espera pacientemente mientras el controlador procesa esa información. (En realidad, un controlador bien diseñado realiza poco o nada de procesamiento y en su lugar delega la responsabilidad de la lógica de negocios en uno o más objetos de servicio.) La lógica realizada por un controlador a menudo da como resultado cierta información que debe llevarse a el usuario y se muestra en el navegador. Esta información se conoce como el modelo. Pero enviar de vuelta la información bruta al usuario no es suficiente; debe formatearse en un formato fácil de usar, generalmente HTML. Para eso, la información debe ser dada a una vista, típicamente una página JavaServer (JSP). Una de las últimas cosas que hace un controlador es empaquetar los datos del modelo e identificar el nombre de una vista que debe representar el resultado. A continuación, envía la solicitud, junto con el modelo y el nombre de vista, de vuelta al DispatcherServlet (4) . Para que el controlador no se acople a una vista particular, el nombre de la vista transferido a DispatcherServlet no identifica directamente un JSP específico. Ni siquiera sugiere necesariamente que la vista sea una JSP. En cambio, solo lleva un nombre lógico que se usará para buscar la vista real que producirá el resultado. El DispatcherServlet consulta una resolución de vista (5) para asignar el nombre de vista lógica a una implementación de vista específica, que puede ser o no una JSP. Ahora que DispatcherServlet sabe qué vista representará el resultado, el trabajo de la solicitud casi ha terminado. Su última parada es en la implementación de la vista (6) , generalmente un JSP, donde entrega los datos del modelo. El trabajo de la solicitud finalmente está hecho. La vista usará los datos del modelo para representar la salida que será llevada al cliente por el objeto de respuesta (no tan laborioso) (7) .
DispatcherServlet
es la implementación de Spring MVC del patrón del controlador frontal .
Ver descripción en los documentos de primavera here .
Básicamente, es un servlet el que recibe la solicitud entrante y delega el procesamiento de esa solicitud a uno de varios controladores, cuya asignación es específica en la configuración de DispatcherServlet
.
El marco DispatcherServlet de Spring Web MVC es una implementación de FrontController y es un componente de Java Servlet. es decir, es un frente de servlet para la aplicación Spring Web Mvc.
DispatcherServlet t es las clases FrontController que recibe todas las solicitudes de clientes HTTP entrantes para la aplicación Spring mvc web.
DispatcherServlet es responsable de inicializar el mvc framework de Spring web para nuestra aplicación, y es un servlet implementado como un subtipo de HttpServlet como cualquier otro Servlet.
DispatcherServlet también requiere configurarse en nuestra aplicación web como cualquier otro Servlet, es decir, descriptor de despliegue de aplicación web (web.xml)
Podemos configurar los parámetros de inicialización para alterar el comportamiento del DispatcherServlet con respecto a la localización de los archivos de configuración XML Beans de primavera y la inicialización del contexto de la aplicación.