viernes, 3 de abril de 2009

¿Qué pasa con JSF?

En mi artículo anterior, que trataba sobre las tecnologías disponibles para ayudarnos en el desarrollo de aplicaciones empresariales para la web, se me olvidó citar una. Además es la tecnología que realmente utilizo para desarrollar el 80% de mis proyectos, en los últimos 3 años.

Por algo será el olvido ;-)

Se trata de JSF o Java Server Faces. Realmente JSF es un estándar más que una tecnología. Yo utilizo una de sus implementaciones: MyFaces de Apache. Aunque hay otras...

JSF nos permitirá construir aplicaciones de usuario desde el lado del servidor. Es decir, nuestro código JSF se ejecutará en el servidor de aplicaciones (debe ser un servidor J2EE), haciendo uso de componentes del servidor (beans para acceder a las bases de datos, por ejemplo) y generando automáticamente páginas HTML resultado, que serán las que realmente reciba el usuario en el navegador. En esto, JSF es diferente a Flex, Silverlight, JavaFX, GWT o AJAX (que se ejecutan del lado del cliente comunicándose asíncronamente con el servidor cuando necesitan de él).

En principio, el uso de JSF facilitará el desarrollo de nuestra aplicación, porque de forma natural hará que cumplamos con el patrón de desarrollo MVC.

Si estás desarrollando aplicaciones empresariales con JSP o servlets, te darás cuenta de lo fácil que es crear código "difícil de mantener". La complejidad va en aumento a lo largo del ciclo de vida de la aplicación. JSF viene a evitar esta complejidad.

JSF te proporciona un control más fino de la navegación, componentes de usuario, validadores, conversores, etc. Además puedes intergarlo fácilmente con un sistema de plantillas llamado Facelets y con otros componentes extendidos: Tomahawk, Trinidad, Tobago, ICEfaces, PrimeFaces, etc.

Algunas de estas librerías de componentes te permiten generar, incluso, verdaderos componentes "AJAXizados". Es decir, generarás el HTML, el JavaScript y las llamadas asíncronas AJAX de forma automática.

Respecto al desarrollo... desarrollaremos la vista de nuestra aplicación con un XHTML extendido con los tags JSF/Facelets. El controlador (las reglas de navegación entre las vistas) se programará mediante la configuración de un XML (faces-config.xml) o mediante anotaciones. El modelo (¿cómo accedo a los datos?) podrá ser desarrollado en Java (mejor dicho, en J2EE). Te aconsejaría utilizar el estándar JPA (Hibernate, EclipseLink, OpenJPA, etc.) para resolver el problema de la persistencia de datos.

Como entorno de desarrollo puedes utilizar tanto Netbeans como Eclipse. Los dos entornos disponen de paquetes, lo suficientemente potentes, que te ayudarán en el desarrollo JSF.

Hasta ahora parecen todo virtudes, entonces ¿cuál es el problema? ¿qué ocasionó mi olvido?

A simple vista, con JSF, el desarrollo de aplicaciones empresariales iba a simplificarse, JSF venía a hacernos la vida más sencilla a los desarrolladores, y... realmente esto no es así. La curva de aprendizaje es alta y al final el paquete (la aplicación) resulta complejo.

Además, algo muy importante para mí, pierdes el control sobre lo que el usuario va a recibir en su navegador, ya que todo va a ser generado automáticamente según las reglas que marca la tecnología. No resulta fácil, ni favorable, "forzar" el saltarse estas reglas. Así que, te tienes que adaptar a ellas.

Mi consejo es, si tu jefe (empresa o cliente) no quiere apostar por una tecnología con capacidades para crear verdaderas aplicaciones enriquecidas (léase Flex, Silverlight o GWT) deberás optar por desarrollar con JSF. Piensa, además, en incluir Facelets, Tomahawk y/o ICEfaces.

La apuesta no es muy arriesgada, te lo aseguro, aunque sí un poco "aburrida".

5 comentarios:

Gonzalo dijo...

Deberias probar RichFaces de JBoss para JSF.
http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?c=column&tab=usage

Muy bueno el blog.
Un saludo.

Sergio Montesa dijo...

RichFaces es un conjunto de componentes extendidos para la creación de aplicaciones JSF enriquecidas y AJAXizidas, del mismo modo que lo son ICEfaces y PrimeFaces. Es necesario

El problema, con este tipo de productos, es que es necesario valorar el riesgo que supone incorporar a nuestros proyectos productos que no son realmente una implementación de un estándar, si no una aportación de una compañía.

Sí, sé que llevar al extremo el párrafo anterior haría inviable el acometer determinados proyectos hoy en día.

Todos conocemos productos, de este tipo, que han quedado en el camino o, peor aún, han cambiado de licencias, etc. en función de las necesidades de la empresa "madre".

En su día, Gonzalo, sí estuve a punto de incorporar Seam (también de JBoss) a mis proyectos. Seam es un framework paraguas que integra tecnologías y componentes para facilitar la vida al desarrollador que ha decidido apostar por AJAX/JSF/JPA.

Curiosamente este framework de JBoss integra ICEfaces y Ajax4JSF en lugar de RichFaces.

Gonzalo dijo...

Hace 2 años y medio que comence a programar en Java (antes lo hacía con visual basic)... y hace año y medio que lo hago con Java Enterprice Edition.
Utilizo eclipse y he visto varios plugins que me deberían de ayudar a lidiar con las jsp, sin embargo, todavía siento que programo las pantallas de mis aplicaciones con pico y pala (parezco cavernicola).
Me resulta increible pensar que estoy en el año 2009 y todavía lidiando con este tipo de tecnología (a veces extraño mi viejo visual 6.0). Por eso es que me han llamado mucho la atención todos tus análisis. De hecho, ya me descargué todo para comenzar con Flex y te he agregado a mis favoritos.
Te agradezco los consejos que has brindado en este blog, los voy a seguir. Ademas, espero que sigas con el resto de las partes del proyecto "Desarrollando con Flex, flexmdi, PureMVC, BlazeDS, Spring, JPA, Hibernate,...", me interesaría mucho ver como manejas la comunicación entre Java y Flex a través de BlazeDS.

Bueno... un saludo desde Córdoba, Argentina y felicitaciones de nuevo.

Gonzalo.

Antonio Garcia dijo...

Pero Seam usa tambien Richfaces
http://docs.jboss.com/seam/latest/reference/en-US/html/Book-Preface.html

adastra dijo...

JSF en sus últimas versiones (JSF 2.X) cuenta con un amplio soporte a AJAX, practicamente todos los componentes de la especificación estandar, que requieren interacción con el usuario, tienen atributos que permiten realizar llamadas asicronas de un modo muy similar a como lo hacen componentes de RichFaces o Primefaces utilizando AJAX. Así que hoy en día, no es correcto comparar a "AJAX" con "JSF" como si se tratase de técnologias que estan separadas la una de la otra, "al otro lado de la calle".