20
Introducción a JavaServer Faces Índice 1 Introducción a JSF........................................................................................................ 2 1.1 Un ejemplo sencillo con JSF....................................................................................3 1.2 Resumen de los elementos de JSF........................................................................... 9 2 Funcionamiento básico de JSF................................................................................... 11 3 Evolución de JSF........................................................................................................ 13 3.1 Especificaciones de JSF......................................................................................... 13 3.2 JSF y Ajax.............................................................................................................. 14 3.3 JSF en la actualidad............................................................................................... 15 4 ¿Es conveniente utilizar JSF en mi proyecto?............................................................ 15 5 Implementaciones y componentes JSF....................................................................... 16 Copyright © 2009-2010 Depto. CCIA All rights reserved.

Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Introducción a JavaServer Faces

Índice

1 Introducción a JSF........................................................................................................2

1.1 Un ejemplo sencillo con JSF....................................................................................3

1.2 Resumen de los elementos de JSF........................................................................... 9

2 Funcionamiento básico de JSF................................................................................... 11

3 Evolución de JSF........................................................................................................13

3.1 Especificaciones de JSF.........................................................................................13

3.2 JSF y Ajax..............................................................................................................14

3.3 JSF en la actualidad............................................................................................... 15

4 ¿Es conveniente utilizar JSF en mi proyecto?............................................................15

5 Implementaciones y componentes JSF.......................................................................16

Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 2: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

1. Introducción a JSF

JavaServer Faces es el framework propuesto por la especificación Java EE para definir lasinterfaces de usuario de las aplicaciones web. JSF compite con otros frameworksdiseñados por la comunidad opensource como Struts, Tapestry, Velocity o incluso GoogleWeb Toolkit, construido por Google.

Con JSF podemos definir la interfaz de usuario de una aplicación web de una formabastante limpia, separando claramente la lógica de negocio (lo que hace la aplicación webcon los datos) de la presentación (cómo mostramos y obtenemos los datos al usuario).JSF, por tanto, refuerza la separación por capas de la aplicación web, utilizándose paradefinir principalmente la capa de presentación. La capa de lógica de negocio y depersistencia se define e implementa independientemente de JSF utilizándose el enfoquedeseado (mediante objetos de negocio, JPA, servicios web, etc.). Para garantizar laseparación de las capas, es recomendable que los datos que se pasan a JSF sean TransferObjects o similares.

Entrando un poco más en detalle, JSF proporciona las siguientes característicasdestacables:

• Definición de las interfaces de usuario mediante vistas que agrupan componentesgráficos.

• Conexión de los componentes gráficos con los datos de la aplicación mediante losdenominados backing beans.

• Conversión de datos y validación automática de la entrada del usuario.• Navegación entre vistas.

JSF se ejecuta sobre la tecnología de Servlets y no requiere ningún servicio adicional, porlo que para ejecutar aplicaciones JSF sólo necesitamos un contenedor de servlets tipoTomcat o Jetty.

En el caso de JSF, la vista se define con componentes JSF mediante etiquetas especialesen páginas JSP. El modelo se corresponde con los denominados backing beans, sencillosobjetos JavaBeans que proporcionan a los componentes los datos que deben mostrar (oobtienen de estos componentes esos datos). Por último, el controlador se implementacomo métodos de los backing beans que se activarán cuando el usuario lance loscorrespondientes eventos. La respuesta devuelta por estos métodos se utiliza para decidirqué página o componente mostrar a continuación.

Nota:Cuando en JSF se habla de MVC se hace de un forma distinta a Struts, por ejemplo. La 'M' deJSF, el modelo, no se corresponde con el modelo de la aplicación (los objetos de negocio), sinocon los backing beans. Éstos recuperan los datos introducidos por el usuario y podemos verloscómo la representación en forma de datos Java de los valores introducidos en un formulario.Estos datos deben después pasarse a la capa de negocio de la aplicación. La ventaja de JSF es quenos proporciona esos datos ya validados y convertidos a tipos Java.

Introducción a JavaServer Faces

2Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 3: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

En una aplicación web existe una separación física entre la presentación y los datos. Losdatos se presentan en forma de páginas HTML que se envían al navegador y con las queinteractua el usuario. Pero estas páginas no son estáticas, sino que han sido generadas porJSF en tiempo de ejecución como resultado de una petición HTTP con ciertos parámetros.A la hora de comprender correctamente el funcionamiento de JSF, y poder compararlocon tecnologías alternativas como GWT (Google Web Toolkit), Flex o Ajax, esfundamental entender cuáles son los distintos procesos que intervienen en la definición ygeneración de los distintos elementos del framework.

1.1. Un ejemplo sencillo con JSF

La mejor forma de comprobar estas características de JSF es mediante un ejemploconcreto. Consideremos una versión muy simplificada de una aplicación web dematriculación de estudiantes a cursos. Tenemos una página en la que el estudiante debeescribir su correo electrónico y marcar los cursos de los que desea matricularse. Cuandose pulsa el botón para enviar los datos, la aplicación debe realizar una llamada a unmétodo de negocio en el que se realiza la matrícula del estudiante.

La siguiente figura muestra el aspecto de esta página web.

Veamos cómo podemos implementar este sencillo ejemplo con JSF, separando lasdistintas responsabilidades de la aplicación según el modelo MVC.

1.1.1. Vista

La forma más común de definir la vista en JSF (versión 1.2) es utilizando ficheros JSPcon etiquetas especiales que definen componentes JSF. Al igual que en JSP, estoscomponentes se convierten al final en código HTML (incluyendo JavaScript en lasimplementaciones más avanzadas de JSF) que se pasa al navegador para que lo muestre alusuario. El navegador es el responsable de gestionar la interacción del usuario.

Veamos el código JSF que genera el ejemplo visto anteriormente. El fichero llamadoselec-cursos.jsp define la vista de la página web. A continuación se muestra la partede este fichero donde se define el árbol de componentes JSF.

Introducción a JavaServer Faces

3Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 4: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Fichero selec-cursos.jsp

...<f:view>

<h:form><table>

<tr><td>Dirección e-mail:</td><td><h:inputText value="#{selecCursosBB.email}" /></td>

</tr><tr>

<td>Tecnologías Java de interés</td><td><h:selectManyCheckbox

value="#{selecCursosBB.cursosId}"><f:selectItem itemValue="JSP" itemLabel="Servlets y

JSP" /><f:selectItem itemValue="Struts" itemLabel="Struts"

/><f:selectItem itemValue="JSF" itemLabel="JSF" /><f:selectItem itemValue="JPA" itemLabel="JPA" />

</h:selectManyCheckbox></td></tr>

</table><h:commandButton value="Enviar"

action="#{selecCursosHandler.grabarDatosCursos}"/></h:form>

</f:view>

Los componentes JSF son un sencillo campo de texto (h:inputText) para el correoelectrónico y una caja de selección de opción múltiple (h:selectManyCheckbox) con laque marcar los cursos seleccionados. Cada curso a seleccionar es a su vez un componentede tipo f:selectItem. Para enviar los datos a la aplicación web se utiliza un componentebotón (h:commandButton).

Todos los componentes se encuentran dentro de un h:form que se traducirá a unformulario HTML. Y todo el árbol de componentes define una vista JSF que se marcacon la etiqueta f:view.

Los componentes tienen un conjunto de atributos con los que se especifican suscaracterísticas. Por ejemplo, el componente f:selectItem utiliza el atributo itemLabel

para definir el texto que aparece en la página y el atributo itemValue para indicar el valorque se enviará a la aplicación.

Un aspecto muy importante de JSF es la conexión de las vistas con la aplicación mediantelos denominados backing beans. En nuestro ejemplo, la vista utiliza los backing beansselecCursosBB y selecCursosHandler. El primero se utiliza para guardar los datosintroducidos por el usuario, y el segundo proporciona el método manejador al que sellamará cuando se pulse el botón de la página. Ambos beans representan el modelo JSFde la aplicación web.

La conexión entre la vista y el modelo JSF se realiza mediante el Lenguaje deExpresiones JSF (JSF EL), una versión avanzada del lenguaje de expresiones de JSP. Con

Introducción a JavaServer Faces

4Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 5: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

este lenguaje, podemos definir conexiones (bindings) entre las propiedades de los beans ylos valores de los componentes que se muestran o que introduce el usuario.

En el ejemplo anterior se define un binding entre el componente h:selectManyCheckbox

y la propiedad cursosId del bean selecCursosBB mediante la expresión

<h:selectManyCheckboxvalue="#{selecCursosBB.cursosId}">

De esta forma, los valores de los datos seleccionados por el usuario se guardarán en esapropiedad del bean y podremos utilizarlos en la acción grabarDatosCursos que seejecuta cuando se pulsa el botón.

1.1.2. Modelo

El modelo JSF se define mediante beans idénticos a los que se utilizan en JSP. Un beanes una clase con un conjunto de atributos (denominados propiedades) y métodos getters ysetters que devuelven y actualizan sus valores.

Por ejemplo, en la anterior página selec-cursos.jsp se utiliza el bean selecCursosBB

cuya definición se muestra en el siguiente código.

Clase SelecCursosBackingBean.java

public class SelecCursosBackingBean {private String email;private String[] cursosId;

public String getEmail() {return email;

}

public void setEmail(String email) {this.email = email;

}

public String[] getCursosId() {return cursosId;

}

public void setCursosId(String[] cursosId) {this.cursosId = cursosId;

}}

El bean define dos propiedades:

• email: un String que guardará el correo electrónico introducido por el usuario.Asociado a este atributo se definen los métodos getEmail() y setEmail(String

email).• cursosId: un array de Strings que guardará la selección de cursos realizada por el

usuario. También se definen en el bean los métodos get y set asociados a esta

Introducción a JavaServer Faces

5Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 6: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

propiedad, que devuelven y toman como parámetro un array de cadenas.

Para escoger el nombre de la clase hemos seguido el convenio de utilizar el nombre de lapágina en la que se usa el bean y el sufijo BackingBean. De esta forma remarcamos quelas instancias de esta clase van a ser backing beans que van a contener los datosmostrados y obtenidos en esa página.

En las expresiones JSF EL de la página en la que se usa el bean se puede acceder a suspropiedades utilizando el nombre de la propiedad. Si la expresión es sólo de lectura seutilizará internamente el método get para recuperar el contenido del bean y mostrarlo enla página. Si la expresión es de lectura y escritura, se utilizará además el set paramodificarlo con los datos introducidos por el usuario de la página. Por ejemplo, en elsiguiente fragmento de código se está mapeando la propiedad cursoIds del beanselecCursosBB con el valor del componente h:selectManyCheckbox. De esta forma,los valores de los cursos seleccionados por el usuario se guardarán en la propiedadcursosIds como un array de cadenas utilizando el método setCursosId. Después laaplicación podrá utilizar el método getCursosId para recuperar esos valores.

<h:selectManyCheckboxvalue="#{selecCursosBB.cursoIds}"><f:selectItem itemValue="JSP" itemLabel="Servlets y JSP" /><f:selectItem itemValue="Struts" itemLabel="Struts" /><f:selectItem itemValue="JSF" itemLabel="JSF" /><f:selectItem itemValue="JPA" itemLabel="JPA" />

</h:selectManyCheckbox>

¿Dónde se declaran los beans en una aplicación JSF? Hemos visto hasta ahora cómo seusa un bean en una página JSF y su definición como una clase Java. Nos falta unelemento para completar el puzle. En algún lugar debe decirse que el beanselecCursosBB es un objeto de la clase selecCursosBackingBean. ¿Dónde? Si habéisutilizado algún otro framework como Struts o Spring, ya os podéis imaginar la respuesta.En un fichero de configuración XML. En concreto, el nombre del fichero deconfiguración que se usa en JSF es faces-config.xml. En él se definen, entre otrascosas, los beans usados por la aplicación.

En el siguiente fragmento de código podemos comprobar cómo se define un bean llamadoselecCursosBB de la clase jtech.jsf.presentacion.SelecCursosBackingBean conel ámbito de sesión. El ámbito determina cuándo se crea un bean nuevo y desde dónde sepuede acceder a él. El ámbito de sesión indica que se debe crear un bean nuevo en cadanueva sesión HTTP y que va a ser accesible en todas las vistas JSF que compartan esamisma sesión.

Fichero faces-config.xml

...<managed-bean>

<managed-bean-name>selecCursosBB</managed-bean-name><managed-bean-class>

jtech.jsf.presentacion.SelecCursosBackingBean</managed-bean-class>

Introducción a JavaServer Faces

6Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 7: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

<managed-bean-scope>session</managed-bean-scope></managed-bean>...

1.1.3. Controlador

Llegamos al último pilar del patrón MVC aplicado a JSF. Hemos visto cómo en JSF sedefine la vista de una aplicación y cómo se obtienen y se guardan los datos del modelo.Nos falta el controlador. ¿Cómo se define el código que se debe ejecutar cuándo elusuario realiza alguna acción sobre algún componente?

Debemos diferenciar dos tipos de acciones, las acciones del componente y las acciones dela aplicación. En el primer tipo de acciones es el propio componente el que contiene elcódigo (HTML o JavaScript) que le permite reaccionar a la interacción del usuario. Es elcaso, por ejemplo, de un menú que se despliega o un calendario que se abre. En este casono hay ninguna petición al controlador de la aplicación para obtener datos o modificaralgún elemento, sino que toda la interacción la maneja el propio componente.

Las acciones de la aplicación son las que debemos definir en nuestro código. Se trata decódigo que queremos que se ejecute cuando el usuario pulsa un determinado botón opincha en un determinado enlace. Este código realizará llamadas a la capa de negocio dela aplicación y determinará la siguiente vista a mostrar o modificará la vista actual.

Estas acciones se definen también en algún backing bean de la página con la que estáinteractuando el usuario. Son métodos del bean que se ligan al elemento action delcomponente que vaya a lanzar esa acción.

Por ejemplo, en la página selec-curso se define un botón asociado al métodograbarDatosCursos del bean selecCursosHandler. De esta forma, cuando el usuariopulse el botón se ejecutará este método.

<h:commandButton value="Enviar"action="#{selecCursosHandler.grabarDatosCursos}"/>

¿Cómo se ejecutará el método? Recordemos que la interfaz de usuario y la aplicaciónestán separadas por el protocolo HTTP. La interfaz reside en el navegador (en forma decódigo HTML y, posiblemente, JavaScript) y la aplicación se encuentra en el servidor.Para que el método se ejecute en el servidor es necesario que se realice una petición GETo POST. En este caso la página HTML resultante contendrá un formulario que realizaráuna petición POST a la aplicación. Allí el servlet principal de JSF detectará el método alque debe llamarse y realizará la llamada a grabarDatosCursos. Para el programador deJSF todo esto es transparente, sólo tiene que definir el método en el bean.

El siguiente código muestra la definición del bean selecCursosHandler:

Fichero jtech.jsf.controlador.SelecCursosHandler.java

public class SelecCursosHandler {SelecCursosBackingBean datosCursos;

Introducción a JavaServer Faces

7Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 8: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

public SelecCursosBackingBean getDatosCursos() {return datosCursos;

}

public void setDatosCursos(SelecCursosBackingBean datosCursos) {this.datosCursos = datosCursos;

}

public String grabarDatosCursos() {EstudianteBO estudianteBO = new EstudianteBO();String email = datosCursos.getEmail();String[] cursosId = datosCursos.getCursosId();estudianteBO.grabarAsignaturas(email, cursosId);return "OK";

}}

Vemos en el método grabarDatosCursos() la forma típica de proceder del controlador.Se obtiene el objeto de negocio con el método de negocio al que se quiere llamar y serealiza la llamada, pasándole los parámetros introducidos por el usuario. En nuestro caso,realizamos una llamada a un método grabarAsignaturas que realiza la matrícula delestudiante a esas asignaturas.

El email y los cursos seleccionados son datos introducidos por el usuario y, como hemosvisto, se encuentran en el bean selecCursosBB. Pero este bean es distinto delselecCursosHandler en el que hemos definido la acción a ejecutar. ¿Cómorelacionamos ambos beans? ¿Cómo podemos acceder a los datos introducidos por elusuario? Una solución sería haber definido el método con la acción en el propio bean quecontiene los datos. De esta forma, los datos son atributos del bean accesibles desdecualquiera de sus métodos.

Pero vamos a presentar la solución más general, en la que las acciones están definidas enun backing bean controlador y los datos en otro. Resumamos la situación. Tenemos unbacking bean controlador llamado selecCursosHandler en el que definimos la acción aejecutar cuando el usuario pulsa el botón de la página. Tenemos también un backing beancon los datos introducidos por el usuario llamado selecCursosBB. Y queremos accederdesde el primer bean al segundo. Veamos cómo hacerlo. Si miramos el código de laacción, vemos que se obtienen los datos del usuario a partir del atributo datosCursos, detipo SelecCursosBackingBean (el mismo tipo del bean que contiene los datos). Paraconseguir que esa propiedad esté ligada (binding) al bean con los datos, se utiliza elfichero de configuración faces-config.xml. En el fragmento de código siguiente vemosque al declarar el bean controlador se indica que el valor de su propiedad datosCursos sedebe inicializar con el bean selecCursosBB. De esta forma, cuando el beanselecCursosHandler se crea, JSF llama a su método setDatosCursos y le pasa comoparámetro el objeto selecCursosBB, que ya debe estar creado en la sesión.

En general, es posible inicializar cualquier propiedad de un bean con el resultado de unaexpresión JSF EL.

Introducción a JavaServer Faces

8Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 9: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Fichero faces-config.xml

...<managed-bean>

<managed-bean-name>selecCursosHandler</managed-bean-name><managed-bean-class>jtech.jsf.controlador.SelecCursosHandler</managed-bean-class><managed-bean-scope>session</managed-bean-scope><managed-property>

<property-name>datosCursos</property-name><value>#{selecCursosBB}</value>

</managed-property></managed-bean>...

Además de lanzar la lógica de negocio requerida por la selección del usuario, el beancontrolador debe definir también qué sucede con la interfaz una vez realizada la acción.Para ello, JSF obliga a que todas las acciones devuelvan una cadena. Dependiendo de lacadena resultante de la acción, JSF mostrará una vista. En el fichero de configuraciónfaces-config.xml se definen las reglas que relacionan acciones, cadenas resultantes yvistas destino. En nuestro caso las reglas se definen en el siguiente fragmento de códigode este fichero.

...<navigation-rule>

<from-view-id>/selec-cursos.jsp</from-view-id><navigation-case>

<from-outcome>OK</from-outcome><to-view-id>/cursos-grabados.jsp</to-view-id>

</navigation-case></navigation-rule>...

En la regla de navegación se indica que si el resultado de alguna acción lanzada en lapágina selec-cursos.jsp es OK se debe mostrar la vista definida en la páginacursos-grabados.jsp.

1.2. Resumen de los elementos de JSF

Veamos un resumen rápido de cómo se relacionan los distintos elementos de JSF.

En primer lugar, la vista se define mediante páginas con componentes JSF que utilizanbacking beans para almacenar los datos. Los beans se declaran en el fichero deconfiguración faces-config.xml. La siguiente figura muestra las relaciones entre ambosen nuestro ejemplo. Para acceder a los datos, JSF utiliza un lenguaje de expresiones (JSFEL) similar al de JSP. El lenguaje de expresiones se puede utilizar también en el ficherofaces-config.xml para inicializar los valores de las propiedades de los beans. En estecaso, se utiliza para poder acceder a un bean desde otro.

Introducción a JavaServer Faces

9Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 10: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

En segundo lugar, el modelo se define mediante los beans. Son beans Java normales conpropiedades y métodos getters y setters.

Introducción a JavaServer Faces

10Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 11: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Por último, el controlador se define mediante métodos de los beans ligados a acciones dela vista. La acción a ejecutar se define en el código del método y la vista resultantedepende de la cadena devuelta y del fichero de configuración faces-config.xml.

2. Funcionamiento básico de JSF

Para entender el funcionamiento de JSF es interesante compararlo con JSP. Recordemosque una página JSP contiene código HTML con etiquetas especiales y código Java. Lapágina se procesa en una pasada de arriba a abajo y se convierte en un servlet. Loselementos JSP se procesan en el orden en que aparecen y se transforman en código Javaque se incluye en el servlet. Una vez realizada la conversión, las peticiones de losusuarios a la página provocan la ejecución del servlet.

En JSF el funcionamiento es distinto. Una página JSF también contiene etiquetasespeciales y código HTML, pero su procesamiento es mucho más complicado. Ladiferencia fundamental con JSP es el resultado del procesamiento interno, en el servidor,de la página cuando se realiza la petición. En JSP la página se procesa y se transforma enun servlet. En JSF, sin embargo, el resultado del procesamiento es un árbol decomponentes, objetos Java instanciados el servidor, que son los que posteriormente seencargan de generar el HTML.

Introducción a JavaServer Faces

11Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 12: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Con un poco más de detalle, cuando el usuario realiza una petición a la página JSF serealizan las siguientes acciones en orden:

• (1) Se procesa la página de arriba abajo y se crea un árbol de componentes JSF enforma de objetos instanciados de clases del framework JSF.

• (2) Se obtienen los valores introducidos por el usuario y se actualizan los backingbeans con ellos.

• (3) Se actualizan los componentes con los valores procedentes de las propiedades delos backing beans.

• (4) Se pide a los componentes que se rendericen, generándose el código HTML que seenvía de vuelta al navegador como resultado de la petición.

• (5) El árbol de componentes JSF se guarda en memoria para que posteriorespeticiones a la misma página JSF no tengan que crearlo, sino que utilicen el existente.

¿Cómo se genera el HTML final de la respuesta a la petición? En JSP el servlet genera elHTML mediante sentencias embebidas en su código que escriben en el stream de salida.En JSF, la página HTML se genera como resultado de llamadas a métodos del árbol decomponentes (en JSF se habla de realizar un render del componente). Una ventaja delenfoque de JSF es que el renderizado de la interfaz de usuario resultante es más flexible.De hecho, es posible generar con el mismo JSF distinto código para distintos dispositivos.Por ejemplo, es posible utilizar la misma aplicación JSF para servir páginas anavegadores web y dispositivos móviles.

Un ejemplo concreto de generación de código HTLM es el siguiente. Siguiendo con lamatriculación a cursos Java, la página JSF que se muestra cuando se grabancorrectamente los datos puede ser la siguiente:

Fichero cursos-grabados.jsp

<f:view><p>El usuario <h:outputText value="#{selecCursosBB.email}" /> seha matriculado de los cursos:</p>

<h:dataTable value="#{selecCursosBB.cursosId}" var="curso"><h:column>

<h:outputText value="#{curso}" /></h:column>

</h:dataTable></f:view>

En la página se muestra el correo electrónico del usuario y una tabla con la lista de cursosque ha seleccionado.

Introducción a JavaServer Faces

12Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 13: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Si lanzamos la aplicación e introducimos [email protected] como correo electrónico yseleccionamos los cursos Struts y JSF, el código HTML que genera la anterior vista JSFes el siguiente:

<body>

<p>El usuario [email protected] seha matriculado de los cursos:</p>

<table><tbody><tr><td>Struts</td></tr><tr><td>JSF</td></tr></tbody></table>

</body>

3. Evolución de JSF

3.1. Especificaciones de JSF

JavaServer Faces es el framework oficial de Java Enterprise para el desarrollo deinterfaces de usuario avanzadas en aplicaciones web. La especificación de JSF ha idoevolucionando desde su lanzamiento en 2004 y se ha ido consolidando, introduciendonuevas características y funcionalidades.

La especificación original de JavaServer Faces (1.0) se aprobó en marzo del 2004, con laJava Specification Request JSR 127. En esta especificación se define el funcionamientobásico de JSF, introduciéndose sus características principales: uso de backing beans, ellenguaje JSF EL, componentes básicos y navegación entre vistas.

La especificación JavaServer Faces 1.2 se aprobó en mayo del 2006 y es la vigente en laactualidad. La JSR donde se define es la JSR 252. En esta especificación se introducenalgunas mejoras y correcciones en la especificación 1.1. Una de las principales es laintroducción del lenguaje unificado de expresiones (Unified Expression Language oUnified EL ), que integra el lenguaje JSTL de expresiones de JSP y el lenguaje deexpresiones de JSF en una única especificación.

Esta es la especificación con la que vamos a trabajar en este módulo.

La próxima especificación de JSF (JavServer Faces 2.0) está en actualidad en proceso deaprobación (JSR 314). En esta especificación se rompe definitivamente con JSP comoforma de definir las vistas JSF y se introduce un formato independiente de JSP. De hecho,

Introducción a JavaServer Faces

13Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 14: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

la implementación de referencia de Sun se integra con Facelets, un sistema de definiciónde plantillas para las páginas web que sustituye a JSP y que se ha popularizado con JSF1.2.

Otras características importantes de esta especificación son :

• Soporte para Ajax• Componentes múltiples• Integración con Facelets• Gestión de recursos (hojas de estilo, imágenes, etc.)• Facilidad de desarrollo y despliegue

Por la cantidad de comentarios que está generando, parece ser que esta nueva versión va arepresentar un salto cualitativo importante y va a conseguir popularizar definitivamenteJSF.

La nueva versión se hará oficial pronto, a comienzos de 2009, junto con el resto denuevas especificaciones que definirán Java EE 6.0.

3.2. JSF y Ajax

Con Ajax es posible actualizar los valores de los componentes definidos en una página sintener que recargarla ni generar un nuevo ciclo de proceso de JSF. La ventaja de utilizarcomponentes Ajax es que no tenemos que escribir código Ajax, ni saber cómo programaren algún framework de Ajax. Es el propio componente el que implementa sucomportamiento utilizando Ajax. Nosotros sólo debemos saber cómo enlazar elcomponente con la aplicación mediante los backing beans.

A pesar de que el soporte definitivo de Ajax se define en la especificación 2.0 de JSF, laespecificación actual ya soporta el uso de Ajax en los componentes. De hecho, bastantesconjuntos de componentes existentes en la actualidad utilizan Ajax (ver el apartadoComponentes JSF).

Un ejemplo muy sencillo con el que se puede comprobar el funcionamiento de Ajax es elsiguiente, definido en el conjunto de componentes RichFaces (de Exadel, y ahora deRedHat/JBoss). Se trata de un campo de texto conectado a un componente de salida detexto a través de un backing bean. Lo que se escribe en el campo de texto apareceinmediatamente en la salida a su derecha.

El código fuente es el siguiente.

<h:form id="myform"><h:panelGrid columns="2">

<h:inputText id="myinput" value="#{userBean.name}"><a4j:support event="onkeyup" reRender="outtext" />

</h:inputText>

Introducción a JavaServer Faces

14Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 15: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

<h:outputText id="outtext" value="#{userBean.name}" /></h:panelGrid>

</h:form>

Se puede comprobar que se utiliza la propiedad name del backing bean userBean parapasar al h:outputText el valor tecleado en el h:inputText cuando se produce el eventodel navegador onkeyup.

3.3. JSF en la actualidad

En la actualidad JSF se ha convertido una alternativa ya madura digna de ser tenida encuenta si necesitamos que nuestra aplicación web tenga un interfaz rico.

Algunas de las características más importantes de JSF en la actualidad:

• Framework estándar definido en la especificación Java EE.• Soporte en todos los servidores de aplicaciones y en las herramientas de desarrollo:

Eclipse, GlassFish, etc.• Entornos gráficos para desarrollar rápidamente aplicaciones JSF.• Gran variedad de implementaciones de componentes.• Fácil integración con frameworks en la capa de negocio y de persistencia: Spring,

JPA, etc.• Comunidad muy activa en la actualidad; podemos encontrar fácilmente soporte en

foros, artículos, tutoriales, etc.

Todo esto, sumado a la inminente aprobación de la especificación 2.0 (ya enfuncionamiento en la última versión de GlassFish), hace que JSF sea una tecnología quetenemos que conocer obligatoriamente.

4. ¿Es conveniente utilizar JSF en mi proyecto?

Como cualquier otra tecnología y framework novedoso, hay que tomar ciertasprecauciones antes de dar el paso a utilizar JSF en nuestros proyectos. JSF es unatecnología bastante complicada, con una curva de aprendizaje bastante empinada, ydebemos meditar bien si es apropiado utilizarla o no.

Lo primero que debemos plantearnos es si nuestro proyecto necesita una interfaz deusuario rica. Si estamos desarrollando una aplicación web de gestión de contenidos ypáginas HTML, lo más probable es que JSF nos venga grande. Sería suficiente algunaherramienta para gestionar plantillas como Velocity o Tiles junto con JSP.

Si nuestro proyecto va a necesitar formularios, rejillas de datos, gráficas estadísticasgeneradas dinámicamente, árboles de navegación, pestañas, validación de los datosintroducidos por el usuario, internacionalización y demás características avanzadas,entonces sí que debemos considerar JSF.

Introducción a JavaServer Faces

15Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 16: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Uno de los problemas que nos podemos encontrar en JSF es que necesitemos algúncomponente específico que no exista en el conjunto de componentes que estemosutilizando. Puede ser que queramos definir alguna funcionalidad específica en nuestraweb (un canvas, por ejemplo, en el que el usuario dibuja algunos sencillos trazos) que noesté soportada por ningún conjunto de componentes, o que queramos integrar en ellaalgún servicio Ajax de terceros, como Google Maps. Dado que JSF se basa encomponentes definidos previamente que insertamos en las páginas web de formadeclarativa (utilizando etiquetas XML), tendríamos que construir ese componentenosotros mismos. Hay bastante información sobre cómo hacerlo, pero es un temaavanzado que no vamos a ver en este curso.

Entre las alternativas más sólidas a JSF en la actualidad se encuentran GWT (GoogleWeb Toolkit), Java FX y Flex. Todas ellas se pueden comunicar perfectamente con laaplicación Java en el servidor, si hemos utilizado una correcta arquitectura y hemosseparado nuestra aplicación en capas. Algunas de las características de estas tecnologíasson las siguientes:

• GWT (Google Web Toolkit) es un proyecto open source de Google para desarrollaraplicaciones de internet ricas en Java basadas en Ajax. El enfoque de GWT esradicalmente distinto al de JSF. La interfaz de usuario se desarrolla en Java (en lugarde definirse estáticamente en un fichero XML) como si estuviéramos programando enSwing. La conexión con el servidor se realiza utilizando un API de GWT de llamadasasíncronas a procedimientos remotos. El código que define la interfaz de usuariocliente se compila a código JavaScript compatible con todos los navegadores con lasherramientas suministradas por Google. Es una alternativa a JSF muy interesante.

• Java FX es la última propuesta de Sun para desarrollar aplicaciones RIA (RichInternet Applications) que podemos ejecutar en el navegador o en el escritorio. Sun hainvertido mucho esfuerzo en el desarrollo del framework y ahora en su divulgación ypromoción. Los resultados y las aplicaciones ejemplo que muestran en el sitio webson bastante espectaculares. Es una tecnología que merece la pena conocer si sequiere desarrollar una aplicación totalmente interactiva, que se salga del navegador yque necesite conexión a servicios web externos proporcionados por un servidor. Conla actualización 10 de Java 6 se intenta dar un nuevo empujón a los applets,introduciendo la posibilidad de arrastrar y soltar applets del navegador al escritorio.

• Flex es la propuesta de Adobe basada en Flash para realizar aplicaciones RIA. Esposible integrarlo con código Java en el servidor. Es posible usarlo tanto paradesarrollar aplicaciones completas, como para definir pequeños componentes conefectos interactivos en nuestras páginas web. Una de las ventajas de Flex frente a JavaFX es que Flash está instalado casi en la totalidad de navegadores, lo que hace laaplicación muy portable.

5. Implementaciones y componentes JSF

Una vez que hemos decidido utilizar JSF para nuestro proyecto tenemos que tomar una

Introducción a JavaServer Faces

16Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 17: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

decisión complicada. ¿Qué conjunto de componentes utilizar? Existen multitud deimplementaciones de componentes.

JSF es una especificación y, como tal, existen distintas implementaciones. Sun siempreproporciona una implementación de referencia de las tecnologías Java, que incluye en elservidor de aplicaciones GlassFish. En el caso de JSF, la implementación de referencia eslas dos implementaciones más usadas son:

• Mojarra es la especificación de referencia realizada por Sun. Es una de lasimplementaciones más populares y se incluye en distintos servidores de aplicacionesJava Enterprise, entre los que se encuentran GlassFish y JBoss. Sun la mantieneactivamente y se puede descargar desde esta página.

• MyFaces es la implementación abierta de la Fundación Apache. Está desarrollada porla comunidad Apache y está incluida en el servidor de aplicaciones Geronimo. Sepuede descargar desde esta página.

Las implementaciones de la especificación JSF proporcionan el framework y loscomponentes básicos (etiquetas h: y f:). Para utilizar JSF en una aplicación avanzadanecesitaremos componentes más elaborados.

En la página web www.jsfmatrix.net se encuentra una tabla resumen muy útil en la que secomparan las características de distintos conjuntos de componentes para JSF (más de 20).Los autores de la página escribieron un interesante artículo en The Server Sidecomparando tres conjuntos de componentes específicos. Este artículo dio origen a la tablacomparativa.

Podemos destacar los siguientes:

• RichFaces. Desarrollado por Exadel y comprado por JBoss para su servidor deaplicaciones JBoss. Componentes Ajax muy elaborados y con una detalladadocumentación. Muy recomendable. Licencia open source LGPL.

• Icefaces. Conjunto de componentes muy maduro, usado por gran cantidad deaplicaciones web de importantes empresas. Ha sido escogido por Sun como conjuntode componentes adicional a los básicos, sustituyendo un proyecto interno de Sunrecién cancelado (Proyecto Woodstock). Licencia open source Mozilla PublicLicense, version 1.1.

• MyFaces Tomahawk. Desarrollado por el proyecto MyFaces de Apache. Tambiénmaduro y estable. Licencia open source Apache Software License, version 2.0.

En las siguientes imágenes, se puede observar un ejemplo de la apariencia de algunoscomponentes de RichFaces y de Icefaces. Hay que tener en cuenta que la apariencia finaldel componente en una misma implementación depende también del skin escogido, que, asu vez, se implementa con hojas de estilo CSS.

Richfaces:

Introducción a JavaServer Faces

17Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 18: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Icefaces:

Introducción a JavaServer Faces

18Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 19: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Introducción a JavaServer Faces

19Copyright © 2009-2010 Depto. CCIA All rights reserved.

Page 20: Introducción a JavaServer Faces...1.Introducción a JSF JavaServer Faces es el framework propuesto por la especificaciónJava EE para definir las interfaces de usuario de las aplicaciones

Introducción a JavaServer Faces

20Copyright © 2009-2010 Depto. CCIA All rights reserved.