En este artículo comentaremos sobre algunas de las nuevas características introducidas por Java Server Faces 2.3 JSR 372 que fue liberado oficialmente en abril de 2017 y que es parte integral de JavaEE 8.

Java Server Faces ha sido una parte fundamental de JEE desde 2002, cuando introdujo el concepto de crear aplicaciones web empleando componentes, en lugar de construir todo desde cero. Esta visión nos permitía concentrarnos en la lógica de negocio y no tanto en Javascript o CSS, los cuales se abstraían.

Durante estos últimos 15 años, JSF se ha mantenido vigente al evolucionar con la introducción de nuevas tecnologías como facelets, flows, ajax, entre muchos otros. La versión 2.3 incluye varias mejoras que nos facilitan el trabajo como programadores. De seguido comentaré respecto a las que me han parecido más relevantes.

Cabe indicar que estos ejemplos funcionan solamente en un servidor de aplicaciones que cumpla con la especificación de JEE 8; por ejemplo: GlassFish 5.

CDI

A mi parecer, la adición más provechosa en JSF 2.3 es que finalmente esta alineada con CDI. Esto por cuando ahora podemos injectar gran cantidad de artefactos de Faces en nuestras clases y expresiones de EL. Previamente había sido tradicional tener que usar varios métodos estáticos y encadenamiento para poder tener accesos a artefactos como FacesContext, RequestMap, o FlowMap. Por ejemplo:

  FacesContext facesContext = FacesContext.getCurrentInstance()
  ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();

Mientras que ahora, simplemente hacemos algo como:

  @Inject
  FacesContext facesContext;

O si necesitamos tener acceso al contexto desde EL; hacemos:

  #{facesContext}

Algo importante es que todas las anotaciones Managed Bean están deprecated, dado que ahora se usa CDI. La idea con esto es evitar que los desarrolladores indroduzcan errores al mezclar anotaciones de CDI y de Managed Bean. De acuerdo a varios post, si se mezclan se puedan dar errores bastante extraños.

La nueva anotación @ManagedProperty se introdujo en 2.3 (del paquete javax.faces.annotation ); pero no debe confundirse con la anotación de Managed Beans previa.

import javax.faces.annotation.ManagedProperty;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@RequestScoped
public class Bean {
  @Inject
  @ManagedProperty (“#{bean.propiedad})
  private String stringProperty;

WebSockets

En un artículo previo, ilustramos como hacer uso de WebSockets. Pues bien, en JSF 2.3 es aún más sencillo, pues existe ahora un nuevo tag denominado «f:websocket». Este tag puede ser colocado en un ‘view’ para permitir comunicación desde el servidor hacia todas las instancias del socket que esten en el mismo canal. Cuando se recibe el mensaje, un event handler de Javascript se invoca.

<h:body>
    <f:websocket channel=“canal1” onmessage=“function(message)
{alert(message)}” />
</h:body>

También se tiene a mano el nuevo javax.faces.push.PushContext, el cual se puede injectar y permitir hacer push desde el servidor hacia un canal.

@Named
@RequestScoped
public class MiBean {

    @Inject @Push
    private PushContext canal1;

    public void send(){
        canal1.send("Hola!");
    }
}
</h:body>

Noten que por omisión el nombre del canal corresponde al nombre de la variable en donde se realiza la injección. En este ejemplo es canal1.

Qué les parece tomar el código del ejemplo de WebSockets y pasarlo a JSF 2.3?

Validaciones

Anteriormente, en JSF 2.0, podiamos tener validación de bean, pero limitada a una propiedad. Ahora es posible validar un bean a nivel de clase por medio del tag «f:validateWholeBean». A este respecto, hice algunas pruebas y me parece interesante, pero requiere de algo de programación extra y la definición de un Constraint Validator. Posteriormente crearemos un artículo exclusivamente sobre el tema. El caso de uso que usé fue verificar que la contraseña y su verificación coincidieran.

Conversiones

Por supuesto, 2.3 ya tiene soporte nativo para el nuevo API de Date-Time (ya no tenemos que hacer trucos para hacer que funcione) por medio del existente «f:convertDateTime». En este momento podemos hacer algo como:

<h:outputText value="#{clientesView.clienteActual.fechaIngreso}">
  <f:convertDateTime type="localDate" pattern="dd-MM-yyyy"/>
</h:outputText>

Los nuevos tipos que se soportan son: LocalDate, LocalTime, LocalDateTime, OffsetTime, OffsetDateTime, and ZonedDateTime.

Conclusión

Finalmente JSF 2.3 se ha alineado con CDI por completo e incluye múltiples elementos nuevos que nos hacen más simple nuestro trabajo y brindan mayor flexibilidad a los desarrolladores. El uso de las nuevas anotaciones y componentes nos permiten escribir un código más limpio y claro. Le recomiendo a los lectores revisar el resto de nuevas funciones que brinda 2.3 para que así puedan saber que tienen disponible en sus desarrollos y particularmente que les ofrecen otras librerias como Primefaces, la cual es mi favorita.

Referencias

Autor

Gerardo Arroyo Arce

Chief Technology Officer.

  • Ingeniero en Software. ITCR.
  • Master en Computación en Informática. UCR.
  • Oracle Certified Expert, JEE 6 Web Services Developer.
  • Oracle Certified Professional, Java SE 7 Programmer.
  • Oracle WebLogic Server 12c Certified Implementation Specialist.

Flecha Roja Technologies, 2017.