Servlet Config
Servlet Config
En un entorno Servlet, tiene la opción de configurar el contenedor Servlet mediante programación o en combinación con un archivo web.xml. El siguiente ejemplo registra un DispatcherServlet:
import org.springframework.web.WebApplicationInitializer;
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext appContext = new XmlWebApplicationContext();
appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
WebApplicationInitializer es una interfaz proporcionada por Spring MVC que garantiza que su implementación sea detectada y utilizada automáticamente para inicializar cualquier contenedor Servlet 3. Una implementación de clase base abstracta de WebApplicationInitializer denominada AbstractDispatcherServletInitializer facilita aún más el registro de DispatcherServlet al sobrescribir métodos para especificar la asignación del servlet y la ubicación de la configuración de DispatcherServlet.
Esto se recomienda para aplicaciones que utilizan la configuración Spring basada en Java, como muestra el siguiente ejemplo:
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyWebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
Si utiliza una configuración Spring basada en XML, debe extender directamente desde AbstractDispatcherServletInitializer, como se muestra en el siguiente ejemplo:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected WebApplicationContext createServletApplicationContext() {
XmlWebApplicationContext cxt = new XmlWebApplicationContext();
cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
return cxt;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
AbstractDispatcherServletInitializer también proporciona una forma cómoda de añadir instancias de Filter y hacer que se asignen automáticamente al DispatcherServlet, como muestra el siguiente ejemplo:
public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {
// ...
@Override
protected Filter[] getServletFilters() {
return new Filter[] {
new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
}
}
Cada filtro se añade con un nombre por defecto basado en su tipo concreto y se mapea automáticamente al DispatcherServlet.
El método protegido isAsyncSupported de AbstractDispatcherServletInitializer proporciona un único lugar para habilitar la compatibilidad asíncrona en el DispatcherServlet y todos los filtros mapeados a él. Por defecto, este flag está en true.
Por último, si necesita personalizar aún más el propio DispatcherServlet, puede sobreescribir el método createDispatcherServlet.
-
¿Es DispatcherServlet el único servlet que hay en Spring MVC?
✅ ¿Es
DispatcherServletel único servlet en Spring MVC?Sí, en lo que respecta a la arquitectura de Spring MVC como framework web, el
DispatcherServletes el único servlet que Spring MVC proporciona y que debes registrar.
📌 ¿Qué hace el
DispatcherServlet?El
DispatcherServletactúa como el front controller del patrón MVC:- Recibe todas las solicitudes HTTP entrantes.
- Las delega a los componentes adecuados:
HandlerMapping(para encontrar el controlador adecuado).HandlerAdapter(para invocar el método del controlador).ViewResolver(para renderizar la vista).
- Es el “orquestador” de todo el flujo de una petición en Spring MVC.
🔧 ¿Hay más servlets además del
DispatcherServlet?-
En tu aplicación, puede haber otros servlets, pero no son parte de Spring MVC como tal. Por ejemplo, podrías registrar tú mismo otro servlet si lo necesitas (por ejemplo, para servir archivos, monitorear, usar un servlet personalizado, etc.).
@Bean public ServletRegistrationBean<MyCustomServlet> myServlet() { return new ServletRegistrationBean<>(new MyCustomServlet(), "/custom/*"); } -
El servidor de aplicaciones (Tomcat, Jetty, etc.) también puede tener otros servlets internos, pero eso no es parte de Spring MVC.
✅ Conclusión
En Spring MVC, DispatcherServlet es el único servlet necesario y principal para manejar las solicitudes web dentro del framework. No necesitas otros servlets a menos que tú los agregues por necesidades específicas fuera del flujo MVC estándar.