Uno de los principales beneficios que ofrece Spring Framework es la capacidad de elegir. En sentido general, Spring no obliga a usar ni comprar ninguna arquitectura, tecnología o metodología en particular (aunque ciertamente tiene algunas recomendaciones sobre una u otra). Esta libertad para elegir la arquitectura, tecnología o metodología que mejor se adapte al desarrollador o a su equipo de desarrollo es quizás más evidente en el dominio web, donde Spring ofrece sus propios frameworks web (Spring MVC y Spring WebFlux) pero al mismo tiempo admite la integración con una serie de marcos web populares de terceros.
Configuración general
Antes de profundizar en las características de integración de cada marco web compatible, veamos primero la configuración general de Spring, que no es específica de ningún marco web en particular. (Esta sección se aplica igualmente a las variantes nativas del marco web Spring).
Uno de los conceptos (a falta de una palabra mejor) soportado por el modelo de aplicación ligera Spring es la
arquitectura en capas. Recuerde que en una arquitectura en capas "clásica", el nivel web es sólo uno de muchos.
Sirve como uno de los puntos de entrada a una aplicación del lado del servidor y delega autoridad a objetos de
servicio (fachadas) que se definen en la capa de servicio para manejar casos de uso empresarial específicos (e
independientes de la tecnología de presentación). En Spring, estos son objetos de servicio, cualquier otro objeto
comercial, objetos de acceso a datos, etc. existen en un "contexto empresarial" separado que no contiene objetos de
nivel web o de presentación (los objetos de presentación, como los controladores Spring MVC, generalmente se
configuran en un "contexto de nivel de presentación" separado). Esta sección detalla cómo puede configurar un
contenedor Spring (WebApplicationContext
) que contenga todos los "business beans" de su aplicación.
Para ser específico, todo lo que necesitas hacer es declarar ContextLoaderListener
en el archivo servlet Java EE estándar
web.xml
de su aplicación web y agregue una
contextConfigLoca
(en el mismo archivo), que tion
especifica qué conjunto de archivos de configuración Spring XML cargar.
Considere la siguiente configuración <listener/>
:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
A continuación, considere la siguiente configuración <context-param/>
:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
Si no especifica el parámetro de contexto contextConfigLocation
, ContextLoaderListener
buscará el archivo /WEB-INF/applicationContext.xml
para carga. Después de cargar los archivos de
contexto, Spring crea un objeto WebApplicationContext
se basa en las definiciones de beans y lo almacena en
el ServletContext
de la aplicación web.
Todos los marcos web de Java se crean sobre la API de Servlet, por lo que puede utilizar el siguiente fragmento de
código para acceder a este "contexto empresarial" ApplicationContext
creado por ContextLoaderListener
.
El siguiente ejemplo muestra cómo obtener WebApplicationContext
:
>WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
Clase WebApplicationContextUtils
es por conveniencia para que no tenga que recordar
el nombre del atributo ServletContext
. Su método getWebApplicationContext()
devuelve
null
si el objeto bajo la clave
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
no existe. Para evitar recibir NullPointerExceptions
en su aplicación, es mejor utilizar el método getRequiredWebApplicationContext()
. Este método genera
una excepción si falta ApplicationContext
.
Una vez que tenga una referencia al WebApplicationContext
, puede recuperar beans por su nombre o tipo.
La mayoría de los desarrolladores obtienen beans por su nombre y luego los envían a una de las interfaces
implementadas.
Afortunadamente, la mayoría de los marcos descritos en esta sección tienen formas más fáciles de encontrar beans. No solo facilitan la obtención de beans de un contenedor Spring, sino que también le permiten usar la inyección de dependencia en sus controladores. Cada sección del marco web describe estrategias de integración específicas con más detalle.
JSF
JavaServer Faces (JSF) es un marco de interfaz de usuario web estándar basado en componentes y controlado por eventos desarrollado como parte del proceso JCP. Es una parte oficial de la especificación genérica Java EE, pero también se puede utilizar por separado, por ejemplo incorporando Mojarra o MyFaces en Tomcat.
Tenga en cuenta que las versiones recientes de JSF se han acoplado estrechamente con el marco CDI en los servidores de aplicaciones, y algunas características nuevas de JSF solo funcionan en dicho entorno. El soporte de JSF en Spring ya no se desarrolla activamente y se utiliza principalmente con fines de migración. al modernizar aplicaciones antiguas basadas en JSF.
El elemento clave de la integración de Spring con JSF es el mecanismo ELResolver
de la especificación
JSF.
5.2.1. Reconocedor de Spring Bean
SpringBeanFacesELResolver
es una implementación compatible con JSF de ELResolver
que se
integra con el lenguaje de expresión unificado estándar (Unified EL) utilizado en JSF y JSP. Delega autoridad
primero al WebApplicationContext del "contexto empresarial" de Spring y luego al solucionador predeterminado de la
implementación JSF subyacente.
Desde una perspectiva de configuración, puede definir SpringBeanFacesELResolver
en el archivo de
especificación JSF faces-context.xml
, como se muestra en el siguiente ejemplo:
<faces-config>
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
...
</application>
</faces-config>
5.2.2. Usando FacesContextUtils
El ELResolver
personalizado funciona muy bien cuando se asignan propiedades a beans en faces-config.xml
,
pero a veces es posible que necesites capturar explícitamente el bean. Clase FacesContextUtils
facilita esta tarea. Es similar a WebApplicationContextUtils
,
excepto que acepta un parámetro FacesContext
en lugar de un ServletContext
.
El siguiente ejemplo muestra cómo utilizar FacesContextUtils
:
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
Apache Struts 2.x
El marco Struts, creado por Craig McClanahan, es un proyecto de código abierto basado en Apache Software Foundation. En ese momento, simplificó enormemente el paradigma de programación JSP/Servlet y se ganó a muchos desarrolladores que utilizaban marcos propietarios. Simplificó el modelo de programación, era de código abierto (es decir, gratuito) y tenía una gran comunidad, lo que permitió que el proyecto creciera y se volviera popular entre los desarrolladores web Java.
Como sucesor del Struts 1.x original, consulte Struts 2.x y lo que se proporciona en Struts un complemento para Spring diseñado para la integración nativa con Spring.
Tapiz Apache 5.x
Tapestry es “un marco basado en componentes para crear aplicaciones web Java dinámicas, robustas y escalables”.
Aunque Spring tiene su propio nivel web potente, crear una aplicación Java empresarial utilizando una combinación de Tapestry para la interfaz de usuario web y un contenedor Spring para las capas inferiores ofrece una serie de beneficios únicos.
Para obtener más información, consulte el módulo de integración de Tapestry para Spring.
Fuentes adicionales
Los siguientes enlaces proporcionan recursos adicionales para los diversos marcos web analizados en este capítulo.