Integración JSF2
Introducción
En el día a día de su trabajo habitual, puede que tenga que utilizar aplicaciones JSF2. JSF2 es el estándar que sustituye a las páginas JSP. Sin embargo, todavía se proporciona con Jakarta EE 9 con la versión JSF 3.0 (https://jakarta.ee/specifications/faces/). La versión 4.0 está en desarrollo para la versión Jakarta EE 10.
En este capítulo solo abordamos JSF2, para permitir que el lector realice el mantenimiento o pueda intervenir en proyectos de migración. No hay más proyectos nuevos que usen Spring junto con las nuevas versiones de JSF (3 y 4).
Únicamente trataremos JSF2 de forma parcial y solo recordaremos los elementos principales para entender cómo integrarlo con Spring. De hecho, JSF2 es un conjunto bastante complejo que requeriría un libro entero para describir todos los detalles de su funcionamiento.
Primero veremos la implementación estándar de Mojorra. En la actualidad observamos cierta tendencia a la migración de aplicaciones JSF2 a Angular. De hecho, las nuevas aplicaciones suelen utilizar un framework Single Page Application como Angular, ReactJS o VueJS. El uso de Angular con Spring se explica en el capítulo Application Spring Angular.
JSF estaba muy bien adaptado cuando queríamos migrar aplicaciones cliente/servidor para las que queríamos mantener exactamente la misma interfaz hombre-máquina....
Mojarra
Mojarra es la implementación estándar. JSF2 reemplaza a las JSP para tener un enfoque de componentes.
La idea principal es exponer directamente los beans JSF «gestionados» en las vistas. Del mismo modo, se simplifica la noción de controlador. El objetivo es ocultar la complejidad, pero esto sigue siendo bastante delicado de implementar.
Mojarra está disponible en la dirección https://github.com/javaserverfaces/mojarra. Hay disponible una versión más moderna en https://github.com/eclipse-ee4j/mojarra
La última versión 2 requiere:
-
Java 1.8
-
Servlet 3.0 (se recomienda 4.0)
-
EL 3.0
-
CDI 1.2 (se recomienda 2.0) o Spring
-
JSTL 1.2
-
JSONP 1.1 (si se utiliza <f:websocket>)
-
BV 1.1 (si se utiliza <f:validateBean> o <f:validateWholeBean>, se recomienda la versión 2.0).
Arquitectura
La configuración se basa en el archivo web.xml y el archivo faces-config.xml.
Las últimas versiones 2 de los frameworks permiten prescindir de estos archivos a través de anotaciones, como veremos en un ejemplo.
De forma simplificada:
-
La consulta llega al controlador.
-
El controlador valida los datos.
-
Si hay errores, se devuelve la página actual con los errores.
-
De lo contrario, busca la vista correspondiente a la respuesta.
-
La vista consulta los beans gestionados presentes en la página; estos beans son datos de negocio o servicios.
-
La capa de negocio o DAO devuelve los datos a la página.
-
A continuación, se representa la página.
Es posible cortocircuitar los pasos durante las llamadas AJAX. Hay que tener en cuenta que hay un contexto en el servidor. Este contexto está relacionado con la página. Contiene la estructura de la página a nivel de los componentes con los datos de negocio (servicios y datos). La página cambia el contexto y, a continuación, lo devuelve. El contexto devuelto puede ser válido o no válido, en términos de validez de los datos modificados. Los datos solo se pueden guardar si el modelo es válido.
Será necesario evitar tener rollbacks provenientes de una interrupción durante la actualización en la base porque corrompe el contexto.
El contexto es de tipo FacesContext y contiene toda la información...
Ciclo de vida
El ciclo de vida describe las etapas realizadas por el controlador. Activando el log o registro de actividad, es posible trazar en qué etapa nos encontramos para un tratamiento determinado.
Ciclo de vida:
Los términos están en inglés porque aparecen así en la configuración y los logs.
1. Consulta
Se trata de una consulta HTTP. La consulta contiene los datos necesarios que JSF necesita para gestionar su ciclo de vida. Incluye elementos sobre el contexto asociado a la consulta.
2. Restore View o Reconstruct Component Tree
Desde la sesión, el servidor devuelve el contexto asociado con la sesión y recompone la estructura de árbol de los componentes de la página.
3. Apply Request Value
De la consulta HTTP se extraen los valores de los datos que se corresponden con los componentes. Utilizamos convertidores para adaptar el formato de los datos que se pasan en la consulta como cadenas de caracteres. Así que tendremos que crear convertidores.
4. Perform Validation
Esta es una fase crucial: vamos a utilizar los validadores guardados en los componentes para validar los datos en la página actual. Con JSF2 es posible validar los datos en las páginas antes de hacer el submit (enviar) del formulario. Los datos del lado servidor todavía se deben validar para evitar problemas.
A menudo, la validación de los datos se puede delegar en una parte al servicio para los asuntos del negocio y, en otra, al ORM de la capa de dominio para la validación directa en los beans del modelo. La validación puede provocar una discrepancia entre el contexto correspondiente a la página y el contexto JSF del servidor, que está en línea con el contexto de ORM. A continuación, es necesario asegurarse de que todos los datos se validan antes de solicitar una actualización.
Los datos se pueden validar parcialmente para los datos presentes en varias vistas. A continuación, validamos solo los datos de la vista que mostramos.
En caso de error, renderizamos inmediatamente la página actual a través de la etapa «Render Response», con los errores en el contexto....
Integración Spring
El bean gestionado por JSF se convierte en un bean Spring.
@Component("messageBackingBean")
@Scope("request")
public class MessageBackingBean {
private Message message = new Message();
private List<Message> messages;
@Autowired
private MessageDao messageDao;
public String getMessage() {
return "Hola";
}
public Message getMessage() {
return message;
}
public void saveMessage() {
messageDao.save(message);
message = new Message();
invalidateMessages();
}
private void invalidateMessages() {
messages = null;
}
public List<Message> getMessages() {
if (messages == null) {
messages = messageDao.list();
}
return...
Puntos clave
-
JSF2 es muy simple de usar.
-
Spring interactúa fácilmente con JSF2.
-
Podemos usar JSF2 para aplicaciones Spring MVC.