Ciclo de Vida JavaServer Faces

Introdução

JavaServer Faces é um framework de visualização para aplicações Web que vem ganhando espaço entre os desenvolvedores JavaEE, neste link http://groups.google.com/group/javasf/web/empresas-instiuies-que-usam-jsf-no-brasil?pli=1 existe uma lista das empresas e instituições que utilizam JSF. A comunidade a cerca deste assunto também vem crescendo, por exemplo, no grupo javasf http://groups.google.com/group/javasf?pli=1, que é uma lista de discussão pode ser econtrado material e ajuda.

Neste post será exibido primeiramente uma visão geral e depois um detalhamento sobre o funcionamento de todas as fases da versão 1.2 deste framework. É fato que para trabalhar com JavaServer Faces (JSF) não é necessário entender ou conhecer o funcionamento de seu ciclo de vida, no entanto entende-lo aumenta a produtividade e facilita na detecção de problemas durante o desenvolvimento.

Visão Geral

JSF (Java Server Faces) fornece um ciclo de vida bem definido para manusear as requisições das páginas e a submissão dos formulários. Conhecer o ciclo de vida ajuda a compreender o processo de aplicação de valores, conversões, validações, manipulação de eventos (event handling), exceptions e a renderização das páginas.

A Figura 1 mostra as fases em sua provável ordem de execução, digo provável ordem pois o ciclo de vida pode “cortar caminho” de acordo com os acontecimentos, como por exemplo: erros de validação, pressionamento de um botão cancelar, ou por “settar” o atributo immediate de um componente como ‘true‘.

ciclo-de-vida-jsf

Abaixo uma pequena descrição de cada etapa, para entender como um todo:

1. Restore View (Recuperar View)

  • O JSF mantém uma cópia da página (view) do cliente no servidor. Durante esta fase cria-se uma nova página (view) caso ela ainda não exista no servidor, ou restaura a página (view) do servidor.

2. Apply Request Values (Aplicar Valores da Requisição)

  • Atualiza os valores da página (view) do servidor com os novos valores dos componentes da página do cliente, como por exemplo: valores de campos de formulários, cookies.

3. Process Validations (Validações de Processo)

  • Realiza a conversão e ou a validação dos novos valores dos componentes, por exemplo, na página do cliente quando ele digita o valor 5 para um <input type=”text” />, este valor é atribuído como String (texto) ao componente, antes deste valor ser atribuído para a sua classe Java correspondente é necessário convertê-lo para Integer (número). A validação do campo é efetuada aqui também, por exemplo, a validação de CPF ou se determinado valor está entre 1 e 10.

4. Update Model Values (Atualização dos Valores do Modelo)

  • Aqui os valores dos componentes (por exemplo, campos de um formulário) enviados pelo cliente são atribuídos aos atributos das classes Java correspondente.

5. Invoke Application (Invocar a Aplicação)

  • Invoca os métodos (action) dos botões e links que estão configurados nos formulários da página do cliente. Repare que nesta fase todos os valores já estão convertidos e validados, logo é possível manipular todos os dados inseridos pelo usuário.

6. Render Response (Renderiza a resposta)

  • Nesta fase todos componentes renderizam (montam) a página (view) que será exibida para o cliente.

Detalhamento das Fases

Restore View

No servidor existe o que chamamos de árvore de componentes, esta árvore é a representação da página exibida para o usuário em forma de componentes e organizada hierarquicamente. Nesta fase uma nova view (representação da página) é criada ou restaurada caso a mesma já exista no servidor.

O JSF armazena todas as views e o estado de seus componentes dentro de um objeto chamado de FacesContext. Quando o controlador JSF (FacesSevlet) recebe uma requisição, ele examina o id da view para verificar se existe uma cópia da mesma no servidor. O objeto FacesContext contém toda a informação de estado que o JSF precisa para gerenciar o estado da GUI de componente para a requisição e sessão corrente. O FacesContext armazena a view na propriedade viewRoot, que por sua vez possui todos os componentes JSF da view corrente, e seus estados.

Esta fase do ciclo de vida apresenta tres instâncias (estados) da view: new view, initial view e postback, onde cada uma é manuseada diferentemente. No caso da new view, é montado a representação da página (view) ligando os componentes aos seus event handlers (ações que serão invocadas durante uma requisição do cliente) e validators (validações das inserções de dados do usuário). A view é armazenada no objeto FacesContext e prossegue com a execução do ciclo de vida.

Já no caso de uma initial view (primeiro carregamento da página), o JSF cria uma view (representação da página) sem valores atribuídos a seus componentes. Esta view será povoada de acordo com os eventos gerados pelo usuário. Neste caso, o ciclo de vida vai direto para a última fase: Render Response que simplesmente exibe/carrega a página para o usuário.

No caso de um postback (o usuário retorna para uma página previamente acessada, por exemplo, clica no botão voltar do navegador), a view corresponde com uma página já existente no servidor, logo ela precisa apenas ser restaurada, o JSF utiliza as informações disponíves de estado da view para efetuar tal operação, após isto o ciclo de vida é direcionado para a próxima fase: Apply Request Values.

Apply Request Values

O propósito desta fase é que cada componente tenha o seu estado corrente recuperado. Durante esta fase é realizado o trabalho de processar os pares nome e valor das requisições que chegam. Então os valores da página do usuário são atribuídos aos componentes da view (representação da página do usuário) no servidor, isto é efetuado chamando o método decode() de cada componente seguindo a hierarquia da view.

O valor dos componentes geralmente são recuperados através de parâmetros de request, embora também é possível recuperar através de cookies ou headers. Se ocorrer algum erro durante a atribuição de valores uma mensagem de erro é gerada e enfileirada no objeto FacesContext para ser exibida ao usuário.

Nos componentes exibidos ao usuário, existe a possibilidade do atributo immediate ter o valor true. Isto significa que determinado componente terá seu processamento de forma diferente, caso este componente seja um <input type=”text” />, a terceira fase (Process Validation) é efetuada aqui e se nenhum erro ocorrer o ciclo de vida vai direto para a última fase (Render Response). Repare que todos os outros componentes da página que não estiverem com o atributo immediate=’true’ não serão processados, pois não passa pela terceira, quarta e quinta fase.

Isto é útilizado, por exemplo, em formulários onde o usuário seleciona o Estado do país e o sistema carrega uma lista de cidades, onde torna-se desnecessário processar um formulário inteiro por causa de dois componentes.

Se o componente for um botão, então a quinta fase (Invoke Application) é executada aqui, a terceira e quarta fase não serão executadas indo diretamente para a sexta fase (Render Response). Este atributo é utilizado em botões que cancelam operações, por exemplo, o botão cancelar de um formulário de cadastro, fazendo com que o usuário volte para uma listagem, sendo assim o formulário de cadastro não precisa passar pelos processos de validação, conversão, ter seus valores atribuídos as classes Javas para depois descartar todos esses dados e redirecionar o usuário para a listagem.

Process Validation

A conversão e validação ocorre quando o método processValidators() de cada componente da hierarquia da view é invocado. Este método primeiro irá iniciar qualquer conversão de dados necessária, depois irá comparar os dados informados pelo usuário de acordo com as regras definidas na aplicação.

Se existir algum erro, o componente é marcado como inválido e uma mensagem de erro é gerada e enfileirada no objeto FacesContext para ser exibida posteriormente ao usuário final, neste caso o processamento avança diretamente para a fase Render Response (última fase).

Esta fase é simples, mas não menos importante, aqui podemos escrever métodos que convertem os Objetos em textos amigáveis para o usuário final e vice-versa, imagina uma lista de Telefones que você quer exibir apenas o número em um <select></select>

É possível escrever métodos de validações personalizados que serão executados nesta fase, por exemplo, métodos que validam CPF, CNPJ, ou seja, qualquer algoritimo específico.

Update Model Values

Nesta fase as propriedades dos managed beans, entidades, enfim classes Javas, são atualizadas com os novos valores vindos dos UI components (input text, por exemplo) das páginas. A atualização iniciada chamando o método updateModel() de cada componente UIInput na hierarquia da view.

O valor digitado em um campo pelo usuário neste ponto já foi convertido e validado, então eles são atribuídos aos campos das classes Java correspondente. Feito isso o ciclo é direcionado para a penúltima fase Invoke Application.

Invoke Application

Durante esta fase qualquer “action handler” e “event listener” limitados aos componentes UI são invocados, ou seja, a ação dos botões e links correspondem a um método em uma classe Java, é neste momento que este método é invocado, a classe Java que contém este método é comumente chamada de Managed Bean ou Baking Bean.

Esta também é a fase onde talvez a navegação de página ocorra, isso significa que aqui o usuário poderá ser redirecionado para outra página ou permanecer na página corrente. Agora a requisição do usuário será direcionada para a última fase do ciclo de vida.

Render Response

Na última fase do ciclo de vida do JSF, será exibido todos os componentes com seu estado corrente atualizado. O JSF realiza isso chamando o método encode() (lembre-se que na segunda fase é executado o decode()) de cada componente seguindo a hierarquia da view. Esta etapa também salva o estado da view no objeto FacesContext para a próxima requisição ou para operações no lado do servidor.

Conclusão

Uma página JSF é representada por uma árvore de componentes UI. Após a requisição de uma página ou envio de um formulário o ciclo de vida do JSF inicia. Durante o ciclo de vida, é construído a view, levando em consideração os valores preenchidos pelo usuário ou os valores previamente armazenado no servidor. Quando um cliente enviar um formulário, é realizado várias tarefas como conversão e validação dos dados e processar qualquer evento registrado.

Referências:

http://johnderinger.wordpress.com/2008/01/05/jsf-life­cycle/

http://groups.google.com/group/javasf?pli=1

http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html

8 comentários sobre “Ciclo de Vida JavaServer Faces

  1. João, parabéns pelo post, muito bom.

    Por favor, me tira uma dúvida que ta levando o pouco cabelo que ainda tenho.

    Suponha a situação que eu tenha uma tela que detalha um Tratamento e um Tratamento tem uma lista de Consultas. Se eu quiser usar, por exemplo, um p:dataTable para mostrar a lista de consultas, como devo proceder? To fazendo assim atualmente: <p:dataTAble value=#{tratamentoBean.tratamento.consultas}. Mas quando tento fazer alguma coisa com uma das linhas de Consulta, como colocar um <h:commandLink action=#{consultaBean.algumaAcao} e dentro da um não funciona.

    Desde já agradeço.

    1. Oi Jonathan, tudo bem?

      Me manda um e-mail com o código xhtml, o bean e o erro que está dando, desta maneira fica mais fácil identificar o problema.

      Abraços.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s