DispatcherServlet actúa como controlador frontal para aplicaciones web basadas en Spring. Entonces, ¿qué es Front Controller? Así que es bastante simple. Cualquier solicitud llegará a nuestro sitio web, el controlador frontal se parará al frente y aceptará todas las requests y una vez que el controlador frontal acepte esa solicitud, este es el trabajo del controlador frontal que tomará una decisión que quién es el controlador correcto para manejar esa solicitud.
Por ejemplo: supongamos que tenemos un sitio web llamado student.com y el cliente está solicitando guardar los datos del estudiante presionando la siguiente URL student.com/save, y primero llega al controlador frontal y una vez que el controlador frontal acepta esa solicitud se va a asignar a Controller_1 ya que este controlador maneja la solicitud para la operación /save. Luego va a devolver la respuesta al Cliente. (Con referencia a la imagen de abajo)
Entonces, ¿ahora podría estar pensando en cómo crear un controlador frontal en una aplicación Spring MVC? Pero la buena noticia es que Spring Framework Developer ya creó el controlador frontal y el nombre de ese controlador en particular es DispatcherServelt. Puede usar ese controlador frontal en su proyecto Spring MVC. Realmente no es necesario que cree un controlador frontal, pero puede reutilizar ese controlador frontal creado por Spring Framework Developer y lo llamaron DispatcherServelt. Podemos decir
DispatcherServlet maneja un HttpRequest entrante, delega la solicitud y procesa esa solicitud de acuerdo con las interfaces de HandlerAdapter configuradas que se han implementado dentro de la aplicación Spring junto con las anotaciones que lo acompañan que especifican los controladores, los puntos finales del controlador y los objetos de respuesta.
Aquí vamos a ver cómo podemos configurar Dispatcher Servlet de las siguientes tres formas diferentes:
- Configurar Dispatcher Servlet en archivo web.xml
- Configurar el servlet de despachador mediante WebApplicationInitializer
- Configurar el Servlet de Dispatcher usando AbstractAnnotationConfigDispatcherServletInitializer
Forma 1: configurar el servlet de despachador en el archivo web.xml
En Spring, el archivo /WEB-INF/web.xml es el descriptor de implementación de aplicaciones web de la aplicación. Este archivo es un documento XML que define todo lo que un servidor necesita saber sobre su aplicación, excepto la ruta de contexto, que asigna el implementador y el administrador de la aplicación cuando se implementa la aplicación, los servlets y otros componentes como filtros o detectores, parámetros de inicialización, Restricciones de seguridad administradas por contenedores, recursos, páginas de bienvenida, etc. Consulte la imagen a continuación para saber dónde se encuentra el archivo web.xml cuando podemos crear un proyecto web dinámico en Spring Tool Suite.
Dentro de este archivo, tenemos que configurar nuestro controlador frontal dentro de una etiqueta <servlet>…</servlet> algo como esto.
<servlet> <!-- Provide a Servlet Name --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a fully qualified path to the DispatcherServelt class --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet>
Ahora digámosle a este servlet, hey servlet, tienes que manejar todas las requests que llegan a nuestro sitio web llamado gfg.com (para este ejemplo). Entonces, la forma en que le diremos al servlet anterior es que podemos escribir algo como esto
<servlet-mapping> <!-- Provide a Servlet Name that you want to map --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a url pattern --> <url-pattern>/gfg.com/*</url-pattern> </servlet-mapping>
Entonces, esto significa que el servlet «frontcontroller-dispatcher» manejará todas las requests a partir de gfg.com/anything, que puede ser gfg.com/save o gfg.com/get, cualquier cosa. Pero debe comenzar con gfg.com. Así que hemos terminado con la configuración de un Dispatcher Servlet. Y el Dispatcher Servlet se inicializará una vez que implementemos la aplicación web dinámica creada dentro del servidor tomcat. Entonces, antes de implementarlo, agreguemos la siguiente línea dentro del archivo web.xml
<load-on-startup>1</load-on-startup>
Y el código anterior se asegura de que cada vez que su servidor se inicie, DispatcherServlet se inicializará. Y si no está escribiendo esta línea de código, cada vez que llegue la primera solicitud a su servidor a partir de /student.com, en ese momento solo se inicializará DispatcherServlet y no lo queremos. Queremos que DispatcherServlet se inicialice durante el tiempo de inicio del servidor. Por eso hemos escrito esta línea de código.
Archivo: web.xml
XML
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> <display-name>myfirst-mvc-project</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.jsp</welcome-file> <welcome-file>default.htm</welcome-file> </welcome-file-list> <servlet> <!-- Provide a Servlet Name --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a fully qualified path to the DispatcherServelt class --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- Provide a Servlet Name that you want to map --> <servlet-name>frontcontroller-dispatcher</servlet-name> <!-- Provide a url pattern --> <url-pattern>/student.com/*</url-pattern> </servlet-mapping> </web-app>
Sugerencia: se debe saber cómo configurar el servlet de despachador en el archivo web.xml antes de continuar.
Forma 2: configurar el servlet de despachador usando WebApplicationInitializer
En Spring, WebApplicationInitializer es una interfaz y es una implementación de Servlet 3.0+ para configurar ServletContext mediante programación en comparación con la forma tradicional de hacerlo mediante el archivo web.xml . Esta interfaz se utiliza para iniciar aplicaciones web de Spring. WebApplicationInitializer registra un Spring DispatcherServlet y crea un contexto de aplicación web Spring. Tradicionalmente, las aplicaciones web de Java basadas en servlets usaban el archivo web.xml para configurar una aplicación web de Java. Desde Servlet 3.0, las aplicaciones web se pueden crear mediante programación a través de escuchas de contexto de Servlet.
Para configurar Dispatcher Servlet usando WebApplicationInitializer primero cree una carpeta src/main/java y dentro de esta carpeta cree una clase (aquí hemos llamado CalculatorApplicationInitializer ) y póngala dentro de algún paquete (aquí com.geeksforgeeks.calculator.config paquete) e implemente el Interfaz WebApplicationInitializer para la cual uno puede consultar los siguientes medios de la siguiente manera:
Ahora en esta clase, tenemos que realizar las siguientes 2 operaciones principales que se enumeran a continuación de la siguiente manera:
- Crear un objeto de servlet de despachador
- Registrar el servlet del despachador con el contexto del servlet
Y podemos hacerlo escribiendo estas líneas de código
Operación 1: crear un objeto de servlet de despachador
XmlWebApplicationContext webApplicationContext = new XmlWebApplicationContext(); // Create a dispatcher servlet object DispatcherServlet dispatcherServlet = new DispatcherServlet(webApplicationContext);
Operación 2: registrar el servlet de despachador con contexto de servlet
ServletRegistration.Dynamic myCustomDispatcherServlet = servletContext.addServlet("myDispatcherServlet", dispatcherServlet);
Esta es la clase en la que hemos seguido el enfoque basado en código con WebApplicationInitializer.
Archivo: CalculatorApplicationInitializer.java
Java
// Java Program to Illustrate // CalculatorApplicationInitializer Class package com.geeksforgeeks.calculator.config; // Importing required classes import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.XmlWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; // Class public class CalculatorApplicationInitializer implements WebApplicationInitializer { // Method public void onStartup(ServletContext servletContext) throws ServletException { XmlWebApplicationContext webApplicationContext = new XmlWebApplicationContext(); // Putting the spring configuration XML file webApplicationContext.setConfigLocation( "classpath:application-config.xml"); // Creating a dispatcher servlet object DispatcherServlet dispatcherServlet = new DispatcherServlet(webApplicationContext); // Registering Dispatcher Servlet // with Servlet Context ServletRegistration .Dynamic myCustomDispatcherServlet = servletContext.addServlet( "myDispatcherServlet", dispatcherServlet); // Setting load on startup myCustomDispatcherServlet.setLoadOnStartup(1); // Adding mapping URL myCustomDispatcherServlet.addMapping("/gfg.com/*"); } }
Sugerencia: uno debe conocer bien WebApplicationInitializer en Spring antes de continuar para una mejor comprensión.
Forma 3: configurar el servlet de despachador usando AbstractAnnotationConfigDispatcherServletInitializer
En este enfoque, podemos configurar Dispatcher Servlet en solo dos líneas de código. Cree una carpeta src/main/java y dentro de esta carpeta cree una clase (aquí hemos llamado CalculatorAppInitializer ) y colóquela dentro de algún paquete (aquí el paquete com.geeksforgeeks.calculator.config ) y extienda la clase AbstractAnnotationConfigDispatcherServletInitializer a la que se puede referir la siguiente imagen de la siguiente manera:
Y cada vez que extiende esta clase, tiene algunos métodos preabstractos que necesitamos para proporcionar la implementación. Así que ahora el archivo CalculatorAppInitializer.java se parece a esto.
Archivo: CalculatorAppInitializer.java
Java
// Java Program to Demonstrate CalculatorAppInitializer Class package com.geeksforgeeks.calculator.config; // Importing required classes import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; // Class public class CalculatorAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { // Method @Override protected Class<?>[] getRootConfigClasses() { return null; } // Method @Override protected Class<?>[] getServletConfigClasses() { return aClass; } // Method @Override protected String[] getServletMappings() { return arr; } }
Ahora, dentro de esta clase, solo tenemos que escribir dos líneas de código para configurar el servlet de despachador.
Primera línea de código: Tenemos que escribir el código dentro del método getServletMappings() para configurar el mapeo para el servlet del despachador, es algo como esto.
// Add mapping url @Override protected String[] getServletMappings() { String arr[] = { "/gfg.com/*" }; return arr; }
2da Línea de Código: Tenemos que escribir el código dentro del método getServletConfigClasses() para registrar la clase de configuración de primavera es algo como esto. Y ha terminado con la configuración de Dispatcher Servlet.
// Register the Spring Config File @Override protected Class<?>[] getServletConfigClasses() { Class aClass[] = { CalculatorAppConfig.class }; return aClass; }
Aquí la clase CalculatorAppConfig es nuestro archivo de configuración de primavera. Entonces, vaya a la carpeta src/main/java y dentro de esta carpeta cree una clase llamada CalculatorAppConfig y colóquela dentro del paquete com.geeksforgeeks.calculator.config . A continuación se muestra el código para el archivo CalculatorAppConfig.java . Hemos utilizado la anotación @Configuration y @ComponentScan en esta clase.
Archivo: CalculatorAppConfig .java
package com.geeksforgeeks.calculator.config; // Importing required classes import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; // Class @Configuration @ComponentScan(basePackages = "com.geeksforgeeks.calculator.controllers") public class CalculatorAppConfig {}
A continuación se muestra el código completo del archivo CalculatorAppInitializer.java .
Archivo: CalculatorAppInitializer.java
Sugerencia: consulte cómo configurar Dispatcher Servlet en solo dos líneas de código en Spring.
De ahora en adelante, de esta manera, puede configurar Dispatcher Servlet en Spring.
Publicación traducida automáticamente
Artículo escrito por AmiyaRanjanRout y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA