# JavaServer Faces

JavaServer Faces (JSF) é uma especificação Java para a construção de interfaces de usuário baseadas em componentes para aplicações web. Possui um modelo de programação dirigido a eventos, abstraindo os detalhes da manipulação dos eventos e organização dos componentes, permitindo que o programador se concentre na lógica da aplicação.
Foi formalizada como um padrão através do Java Community Process e faz parte da Java Platform, Enterprise Edition.
JSF 2 utiliza Facelets como seu sistema de template padrão. Outras tecnologias da camada de visão, como XUL também podem ser empregadas. Em contraste, JSF 1.x utiliza JavaServer Pages (JSP) como seu sistema de template padrão.

## Características

JavaServer Faces é baseada em um modelo de desenho de IU (interface de usuário) baseada em componentes, usando arquivos XML chamados de modelos de visão ou Facelets views. Os pedidos são processados pelo FacesServlet, que carrega o modelo de visão adequado, constrói uma árvore de componentes, processa os eventos e apresenta a resposta, normalmente na linguagem HTML, para o cliente. O estado de componentes de interface do usuário e outros objetos de interesse de escopo, é salvo no final de cada pedido em um processo chamado stateSaving (nota: transiente true) e restaurado na próxima criação desta visão. Objetos e estados podem ser salvos ou no cliente ou no servidor.
* Permite que o desenvolvedor crie UIs através de um conjunto de componentes UIs pré-definidos;
* Fornece um conjunto de tags JSP para acessar os componentes;
* Reutiliza componentes da página;
* Associa os eventos do lado cliente com os manipuladores dos eventos do lado do servidor (os componentes de entrada possuem um valor local representando o estado no lado servidor);
* Fornece separação de funções que envolvem a construção de aplicações Web.
* Utiliza Ajax em alguns de seus componentes tornando alguns processos mais rápidos e eficientes.

### Ciclo de vida

Ciclo de vida do JSF é o nome dado à sequência de processamento realizada na implementação JSF para a geração das visões. O JSF, diferente de outros frameworks, possui um processamento de requisição dividido em seis fases:
* Restauração da visão - o objetivo principal desta fase é construir a árvores de componentes. Ela utiliza o template e cria a árvore inicial através da análise da requisição. Após isto, ela salva o estado da árvore no objeto FacesContext. Nas requisições subsequentes, ela cria a árvore do estado e procede a execução do resto do ciclo de vida.
* Aplicação dos valores de requisição - o JSF pega cada componente da árvore começando com a raiz e a cria ou recupera do objeto FacesContext. Cada componente na árvore gerencia seus próprios valores e toma-os dos parâmetros, cookies e cabeçalhos da requisição HTTP.
* Validações de processo - o JSF realiza a conversão e validação sobre todos os componentes começando com o raiz. O valor submetido de cada componente é convertido em um objeto e validado chamando-se o validador registrado. O JSF salva o valor submetido. Se ocorrer um erro durante a conversão ou validação, o ciclo de vida escapa diretamente para a fase de "apresentação da resposta".
* Atualização de valores de modelo - durante esta fase, o valor do componente é passado para o modelo através da atualização das propriedades dos backing beans.
* Invocação da aplicação - a manipulação de evento para cada ação e ouvidor de ação é executada começando com o(s) ouvidor(es) de ação e então a chamada do método de ação.
* Apresentação da resposta

### Recursos visuais

O framework JSF permite a inserção, via IDE, de:
* Folhas de estilo (CSS);
* Comandos em JavaScript;
* Metodologia Ajax;

### JSF inclui

* Suporte a internacionalização e acessibilidade;
* Um conjunto padrão de componentes de interface de usuário que possibilitam validação padronizada;
* Duas bibliotecas de etiqueta ("tag libraries") especiais do JavaServer Pages (JSP) para expressar a interface do JavaServer Faces dentro de uma página JSP;
* Um modelo de eventos do lado servidor ("server-side event model");
* Gerência de estados;
* Managed Beans;
* Linguagem de Expressão Unificada ("Unified Expression Language") para JSP 2.0 e JSF 1.2.

### Ferramentas de desenvolvimento

* Eclipse
* Java Studio Creator
* JBuilder
* JDeveloper
* MyEclipse
* NetBeans
* Rational Application Developer for WebSphere Software
* Red Hat Developer Studio
* IntelliJ IDEA

## Histórico

O JavaServer Faces ganhou expressão na versão 1.1 quando implementado pela comunidade utilizando a especificação 127 do Java Community Process, evidenciando maturidade e segurança.
Hoje ele está na versão 2.0 da especificação 252 do JCP. A fundação Apache vem realizando esforços na implementação da especificação através do projeto MyFaces. O reconhecimento do trabalho é visto por diversas empresas, tanto é que a Oracle doou os fontes do ADF Faces, conjunto de mais de 100 componentes JSF, para o projeto MyFaces que o denominará de Trinidad.
O JSF é atualmente considerado pela comunidade Java como a última palavra em termos de desenvolvimento de aplicações Web utilizando Java, resultado da experiência e maturidade adquiridas com o JSP/Servlet (Model1), Model2 (MVC) e Struts.

### Versões da JSF

| Versão | Data | Características |
| 1.0 | 11 de março de 2004 | Especificação inicial liberada. |
| 1.1 | 27 de maio de 2004 | Versão de correção de bugs. Não há mudanças de especificação. |
| 1.2 | 11 de maio de 2006 | Muitas melhorias nos sistemas centrais e API. Coincide com Java EE 5. Adoção inicial em Java EE. |
| 2.0 | 28 de junho de 2009 | Maior versão para facilidade de uso, funcionalidade melhorada e desempenho. Coincide com Java EE 6. |
| 2.1 | 22 de outubro de 2010 | Versão de correção da versão 2.0. Apenas uma quantidade muito menor de mudanças de especificação. |
| 2.2 | 21 de maio de 2013 | Introduziu novos conceitos como visões sem estado, o fluxo de página e a capacidade de criar contratos de recursos portáteis. |
| 2.3 | 28 de março de 2017 | Introduziu expressões de busca, URLS sem extensão, validação de beans para classes completas, comunicação via push usando WebSocket, e maior integração com CDI. |

## Críticas

Em sua publicação "Technology Radar" de janeiro de 2014, a ThoughtWorks escreveu:
Num artigo publicado em novembro de 2014 no DZone, intitulado "Por Que Você Deveria Evitar JSF", Jens Schauder escreveu:
O The Server Side, site da comunidade Java Enterprise, não recomenda o uso do JSF e cita cinco problemas principais:
* tarefas simples se tornam complicadas;
* falta de flexibilidade;
* difícil aprendizado;
* incompatibilidade com outras tecnologias que são padrão no Java; e
* primitivo suporte ao AJAX.