1. Información general
En este artículo cubriremos tres enfoques diferentes para configurar un DispatcherServlet disponible en versiones recientes de Spring Framework:
- Comenzaremos con una configuración XML y un archivo web.xml
- Luego, migraremos la declaración de Servlet del archivo web.xml a la configuración de Java, pero dejaremos cualquier otra configuración en XML.
- Finalmente, en el tercer y último paso de la refactorización, tendremos un proyecto 100% configurado en Java
2. El DispatcherServlet
Uno de los conceptos centrales de Spring MVC es DispatcherServlet . La documentación de Spring lo define como:
Un despachador central para controladores / controladores de solicitudes HTTP, por ejemplo, para controladores de interfaz de usuario web o exportadores de servicios remotos basados en HTTP. Despachos a manipuladores registrados para procesar una solicitud web, lo que proporciona un mapeo conveniente y funciones de manejo de excepciones.
Básicamente, DispatcherServlet es el punto de entrada de cada aplicación Spring MVC . Su propósito es interceptar solicitudes HTTP y enviarlas al componente correcto que sabrá cómo manejarlas.
3. Configuración con w eb.xml
Si trabaja con proyectos Spring heredados , es muy común encontrar la configuración XML y hasta Spring 3.1 la única forma de configurar DispatcherServlet era con el archivo WEB-INF / web.xml . En este caso, se requieren dos pasos.
Veamos una configuración de ejemplo: el primer paso es la declaración del servlet:
dispatcher org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/spring/dispatcher-config.xml 1
Con este bloque de XML estamos declarando un servlet que:
- Se llama " despachador "
- Es una instancia de org.springframework.web.servlet.DispatcherServlet
- Se inicializará con un parámetro llamado contextConfigLocation que contiene la ruta al XML de configuración
load-on-startup es un valor entero que especifica el orden para que se carguen varios servlets. Entonces, si necesita declarar más de un servlet, puede definir en qué orden se inicializarán. Los servlets marcados con números enteros más bajos se cargan antes que los servlets marcados con números enteros más altos.
Ahora nuestro servlet está configurado. El segundo paso es declarar un mapeo de servlets :
dispatcher /
Con el mapeo del servlet, lo vinculamos por su nombre a un patrón de URL que especifica qué solicitudes HTTP manejará.
4. Configuración híbrida
Con la adopción de la versión 3.0 de las API de Servlet , el archivo web.xml se ha vuelto opcional y ahora podemos usar Java para configurar DispatcherServlet .
Podemos registrar un servlet implementando un WebApplicationInitializer . Este es el equivalente a la configuración XML anterior:
public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { XmlWebApplicationContext context = new XmlWebApplicationContext(); context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml"); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }
En este ejemplo somos:
- Implementación de la interfaz WebApplicationInitializer
- Anulación del OnStartup método que crear una nueva XmlWebApplicationContext configurado con el mismo archivo pasado como contextConfigLocation al servlet en el XML de ejemplo
- Luego estamos creando una instancia de DispatcherServlet con el nuevo contexto que acabamos de crear.
- Y finalmente estamos registrando el servlet con un patrón de URL de mapeo
Entonces usamos Java para declarar el servlet y vincularlo a una asignación de URL, pero mantuvimos la configuración en un archivo XML separado : dispatcher-config.xml .
5. Configuración 100% Java
Con este enfoque, nuestro servlet se declara en Java , pero aún necesitamos un archivo XML para configurarlo. Con WebApplicationInitializer puede lograr una configuración 100% Java .
Veamos cómo podemos refactorizar el ejemplo anterior.
Lo primero que tendremos que hacer es crear el contexto de la aplicación para el servlet.
Esta vez usaremos un contexto basado en anotaciones para que podamos usar Java y anotaciones para la configuración y eliminar la necesidad de archivos XML como dispatcher-config.xml :
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
Este tipo de contexto se puede configurar registrando una clase de configuración:
context.register(AppConfig.class);
O configurar un paquete completo que se escaneará en busca de clases de configuración:
context.setConfigLocation("com.example.app.config");
Ahora que se creó el contexto de nuestra aplicación, podemos agregar un oyente al ServletContext que cargará el contexto:
container.addListener(new ContextLoaderListener(context));
El siguiente paso es crear y registrar nuestro servlet de despachador:
ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/");
Ahora nuestro WebApplicationInitializer debería verse así:
public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.example.app.config"); container.addListener(new ContextLoaderListener(context)); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }
Java and annotation configuration offers many advantages. Usually it leads to shorter and more concise configuration and annotations provide more context to declarations, as it's co-located with the code that they configure.
But this is not always a preferable or even possible way. For example some developers may prefer keeping their code and configuration separated, or you may need to work with third party code that you can't modify.
6. Conclusion
In this article we covered different ways to configure a DispatcherServlet in Spring 3.2+ and it's up to you to decide which one to use based on your preferences. Spring will accommodate to your decision whatever you choose.
You can find the source code from this article on Github here and here.