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 DispatcherServlet el único servlet en Spring MVC?

    , en lo que respecta a la arquitectura de Spring MVC como framework web, el DispatcherServlet es el único servlet que Spring MVC proporciona y que debes registrar.


    📌 ¿Qué hace el DispatcherServlet?

    El DispatcherServlet actúa como el front controller del patrón MVC:

    1. Recibe todas las solicitudes HTTP entrantes.
    2. 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).
    3. 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.