# JavaServer Faces

JavaServer Faces (JSF) es una tecnología y framework para aplicaciones Java basadas en web que simplifica el desarrollo de interfaces de usuario en aplicaciones Java EE. JSF usa JavaServer Pages (JSP) como la tecnología que permite hacer el despliegue de las páginas, pero también se puede acomodar a otras tecnologías como XUL (acrónimo de XML-based User-interface Language, lenguaje basado en XML para la interfaz de usuario)
JSF incluye:
* Un conjunto de API para representar componentes de una interfaz de usuario y administrar su estado, manejar eventos, validar entrada, definir un esquema de navegación de las páginas y dar soporte para internacionalización y accesibilidad.
* Un conjunto por defecto de componentes para la interfaz de usuario.
* Dos bibliotecas de etiquetas personalizadas para JavaServer Pages que permiten expresar una interfaz JavaServer Faces dentro de una página JSP.
* Un modelo de eventos en el lado del servidor.
* Administración de estados.
* Beans administrados.
La especificación de JSF fue desarrollada por la Java Community Process como JSR 127, que definía JSF 1.0 y 1.1, JSR 252 que define JSF 1.2 y JSR 314 para JSF 2.0

## Objetivos

Estos objetivos de diseño representan el foco de desarrollo de JSF:
* Definir un conjunto simple de clases base de Java para componentes de la interfaz de usuario, estado de los componentes y eventos de entrada. Estas clases tratarán los aspectos del ciclo de vida de la interfaz de usuario, controlando el estado de un componente durante el ciclo de vida de su página.
* Proporcionar un conjunto de componentes para la interfaz de usuario, incluyendo los elementos estándares de HTML para representar un formulario. Estos componentes se obtendrán de un conjunto básico de clases base que se pueden utilizar para definir componentes nuevos.
* Proporcionar un modelo de JavaBeans para enviar eventos desde los controles de la interfaz de usuario del lado del cliente a la aplicación del servidor.
* Definir API para la validación de entrada, incluyendo soporte para la validación en el lado del cliente.
* Especificar un modelo para la internacionalización y localización de la interfaz de usuario.
* Automatizar la generación de salidas apropiadas para el objetivo del cliente, teniendo en cuenta todos los datos de configuración disponibles del cliente, como versión del navegador.

## Versiones

* JSF 1.0 (11-03-2004) - Lanzamiento inicial de las especificaciones de JSF.
* JSF 1.1 (27-05-2004) - Lanzamiento que solucionaba errores. Sin cambios en las especificaciones ni en el renderkit de HTML.
* JSF 1.2 (11-05-2006) - Lanzamiento con mejoras y corrección de errores.
* JSF 2.0 (12-08-2009) - Lanzamiento con mejoras de funcionalidad, rendimiento y facilidad de uso.
* JSF 2.1 (22-10-2010) - Lanzamiento de mantenimiento, con mínimos cambios.
* JSF 2.2 (16-04-2013) - Lanzamiento que introduce soporte a HTML 5, Faces Flow, Stateless views y Resource library contracts.
* JSF 2.3 (28-03-2017) - Lanzamiento que introduce mayor soporte de CDI, Websockets, expresiones de búsqueda de componentes, soporte básico de URLs sin extensiones y validación de Beans a nivel de clase.

## Implementaciones

Las principales implementaciones de JSF son:
* JSF Reference Implementation de Sun Microsystems.
* MyFaces proyecto de Apache Software Foundation.

## Extensiones

Algunas extensiones de JSF son:
* RichFaces Agrega componentes visuales y soporte para AJAX.
* ICEfaces Contiene diversos componentes para interfaces de usuarios más enriquecidas, tales como editores de texto enriquecidos, reproductores de multimedia, entre otros.
* jQuery4jsf Contiene diversos componentes sobre la base de uno de los más populares framework javascript jQuery.
* PrimeFaces Es una librería muy liviana, todas las decisiones hechas son basadas en mantener a PrimeFaces lo más liviano posible. PrimeFaces es una librería muy simple que no necesita dependencias y configuraciones.
* OpenFaces Librería open source que contiene diferentes componentes JSF, un Framework Ajax y un Framework de validación por parte del cliente.