martes, 30 de abril de 2013

JSF 2.2 en Java EE 7: Integración con HTML5

Componente JSF o HTML5?

JavaServer Faces es un framework orientado a componentes. Si necesitas algún componente lo puedes obtener de alguna libreria como MyFaces, ICEFaces, RichFaces o el popular PrimeFaces,

Por otro lado las últimas tecnologías de marcado, como HTML5, proveen funcionalidad a los componentes HTML en el browser sin necesidad de agregar código extra. Un ejemplo son los nuevos controles de HTML5 para calendar, date, time, email, url, etc. Tan sólo agregas el tag correspondiente y el browser sabrá interpretarlo.

Hasta ahora, si sale algun nuevo elemento de HTML se tiene que esperar a que exista algún componente de JSF por parte alguna de las librerías arriba mencionadas y así poder usarlo con el resto de mi código (Facelets, clases Java, Managed Beans, etc).

JSF 2.2 abre una puerta enorme a la integración con los tags que constantemente emergen de marcado con lo que le ha llamado HTML Friendly Markup.
Ed Burns, el spec lead de JSF 2.2 lo detalla muy bien en su artículo aquí.

HTML5 Friendly Markup


Con el friendly markup se hace más fácil la división de roles entre los que diseñan la estructura de la página web -comúnmente los diseñadores web hacen esta parte-, y quienes programan lo lógica de la aplicación web.
Los diseñadores web muy probablemente querrán diseñar su página con tecnologías como HTML5, CSS3, Sin embargo, al momento de integrar la vista o páginas web con la lógica del negocio haya mucho trabajo por hacer, y quizá hasta echar para atrás algunos cambios

Cómo aprovechar las ventajas de HTML5 y JSF?

El concepto básico de HTML5 es el de "dejar pasar" atributos en mi vista o página JSF o HTML5.

Por ejemplo, si se quiere utilizar el tag progress de HTML5 y que se modifique mientras se vayan completando los campos requeridos en una forma:


Lo que se hace es aprovechar los tags de HTML5 input y progress para renderear estos campos. Pero aún hace falta la lógica para ligar estos campos con el progress bar. Aquí entra JSF con el tag <f:ajax> y combinar el código HTML5 con JSF para lograrlo:


<label jsf:for="name">Name</label>
<input jsf:id="name" type="text" jsf:value="#{blogBean.name}">
  <f:ajax execute="@this" render="progress"/>
</input><br/>
<label jsf:for="address">Address</label>
<input jsf:id="address" type="text" jsf:value="#{blogBean.address}">
  <f:ajax execute="@this" render="progress"/>
</input><br/>
<label jsf:for="company">Company</label>
<input jsf:id="company" type="text" jsf:value="#{blogBean.company}">
  <f:ajax execute="@this" render="progress"/>
</input><br/>
<label for="progress">Progress</label>
<progress jsf:id="progress" max="3" value="#{blogBean.progress}" />



En el código, blogBean es tan sólo un bean con getters y setters y una función para incrementar en 1 cuando el campo ya no está vacio:


public String getProgress() {
        int progress = 0;
        if(name != null) {
            progress++;
        }
        if(address != null) {
            progress++;
        }
        if(company != null) {
            progress++;
        }
        return progress + "";
    }



Que hace el prefijo jsf: en un tag HTML5? 

Aqui es donde ocurre el "dejar pasar". Se está ocupando un elemento HTML5 (label,input, progress) y en los atributos con jsf: JSF le está diciendo al browser que "deje pasar" ese atributo a JSF.
jsf: es un nuevo namespace que se declara en la página con:
xmlns:jsf="http://xmlns.jcp.org/jsf"

Este prefijo se utiliza para dejar pasar atributos en HTML para JSF. Pero también hay un prefijo para dejar pasar un atributo HTML en un componente JSF: xmlns:p="http://xmlns.jcp.org/jsf/passthrough".

Este ejemplo fue tan sólo una combinación de HTML5 con JSF gracias a los pass-through elements y attributes en JSF 2.2.

Basta echar un ojo a los nuevos elementos que trae HTML5 para imaginarse cómo sacar provecho de la funcionalidad ya embebida en el browser con el poder de JSF.




domingo, 28 de abril de 2013

Expression Language 3.0 en Java EE 7. Segunda Parte

2.- Expresiones Lambda
     Las expresiones lambda de EL 3.0 son más simples que en JDK 8 pero tendrán compatibilidad entre ambas.
Algunos ejemplos:
${((x,y) -> x + y )(5,9)}  , que imprime 14
${(()->100)()}, que imprime 100
${incrementaEnUno = x->x+1; incrementaEnUno(100)} , que imprime 101

Si deseas conocer a detalle los tipos de expresiones, ve a la sección 1.20 de la especificación.

3.- Operaciones a Colecciones
     Los tipos de coleccones soportados son Set, List y Map.
     Para construir un Set:
     ${{"uno", "dos", "tres"}}
     List:
${["uno", "dos", "tres"]}    , con corchetes en vez de llaves.
     Map:
  ${{"uno": 1, "dos": 2, "tres": 3}} , como en JSON.

    Una vez construida la colección se pueden hacer operaciones sobre ella, y con ayuda de expresiones lambda, como por ejemplo:

${["uno","dos","tres","cuatro"].stream().filter(i -> i != "cuatro").toList()}

que regresa ["uno,""dos","tres"]. Nótese que la lista se convierte a stream primero, y después se le aplica la función filter(), y al final el resultado se convierte a lista de nuevo, con la función toList().
El capítulo 2 de la especificación esta dedicado a las colleciones. Hay muchas más operaciones para trabajar con colecciones.

Nota: Los ejemplos de colecciones sólo conseguí correrlos en un JSP, no así en un JSF. En JSF obtuve errores de compilación.

4.- Una API para EL en modo stand-alone
     Puedes correr expresiones EL en un archivo Java sin ser precisamente orientado a web (JSP, JSF). Se importa la la clase javax.el.ELProcessor y se ejecuta de esta manera, por ejemplo:

ELProcessor el = new ELProcessor();
        Object result = el.eval("'Java Rocks' += 100");
        System.out.println(result);

ELProcessor cuenta con muchas más funciones, como, por ejemplo definir un bean y utilizarlo dentro del ambiente EL.
Detalles de este API se encuentran no en la especificación pero si en el javadoc que viene con la especificación.








     

jueves, 25 de abril de 2013

Expression Language 3.0 en Java EE 7

Dentro de las mejoras a Java EE 7 a varios de sus JSRs está Expression Language (EL), que es el JSR 341. Expression Language viene en su edición numero 3 en Java EE 7.
Si quieres conocer más sobre el Expression Language puedes consultar el tutorial de Java Enterprise 6.
Expression language ha resultado muy útil al momento de comunicar la Vista (View en una arquitectura MVC) con la lógica del negocio (Model o Controller según convenga). Con él puedes llamar funciones de tus Managed Beans.

En EL 3.0, EL es ya un lenguaje independiente y se saca del JSR de JSP.
Dentro de lo que le han agregado a EL 3.0 destacan cuatro cambios:

  1. Nuevos Operadores: Concatenación (+=), Asignación(=) y el operador punto y coma (;). Este último para concatenar expresiones.
  2. Expresiones Lambda. Si, Lambda, y estarán en Java EE 7 con el JDK 7.
  3. Soporte (operaciones) a Colecciones
  4. Y un API para evaluar expresiones de EL en ambientes stand-alone, es decir, dentro de clases de Java normales, sin ser un JSP o una página JSF.

Show me Code!

1. Para los nuevos operadores:
  • Concatenación: Es válido en EL concatenar cadenas de la siguiente manera:
${"Java" += " Rocks"}  Para JSP
#{"Java" += " Rocks"}  Para JSF
         Se pueden concatenar otros tipos de datos que no sean String, se intentará convertirlo a String.
  • Asignación: Igual a la asignación en Java. Una de las ventajas es que ya no se tendrá que usar el setValue para asignarle un valor a un bean:
          ${MyBean.value = "100"}               
  • Punto y coma (;): Igual que en Java, con la excepción de que sólo se pueden poner expresiones, no sentencias. Una de las características de este operador es que siempre regresará el resultado de la expresión de más a la derecha, la última de la cadena. En el siguiente ejemplo:
         ${x = 30;50;x}       

          El valor que se regresará de esta expresión es 30.


En el siguiente post vendrán los demás cambios a EL 3.0