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.

  • Página de inicio JSF

  • Página de inicio Struts

  • Página de inicio Tapiz