Manipulando Eventos em JavaServer Faces – Parte I

 

Saudações Java!!!

 

Neste artigo, irei falar sobre manipulação de eventos em JSF, uma excelente característica do framework. Aplicações web precisam responder a eventos do usuário, tais como selecionar itens de um menu ou clicar um botão ou ainda verificar valores de um determinado campo.

 

O modelo de evento do JSF é igual ao modelo de evento em aplicações standalone(Swing), mas acontece uma pequena diferença ao utilizarmos JSF, as ações do usuário acontecem em um cliente ( por exemplo um navegador).

Todos esses meios que interagem com a interface do usuário, é representada por objetos de evento que sabem que evento ocorreu e qual componente enviou o evento.

 

Para demonstrar a funcionalidade dos eventos em Faces, vou demonstrar um exemplo bastante simples, onde o usuário pode selecionar algumas opções e de acordo com a sua escolha a página atual irá ser reexibida.

 

Irei dividir em três partes este artigo para explicar cada tipo de evento e ainda demonstrar, como a aplicação de teste reage a cada um desses eventos.

 

O JSF oferece suporte a três tipos de eventos:

·         Eventos de mudança de valor;

·         Eventos de Ação;

·         Eventos de fase.

 

Eventos de mudança de valor são iniciados por componentes de entrada, tais como h:inputText, h:selectOneRadio e h:selectManyMenu, quando o valor do componente se modifica e o formulário que o contém é submetido.


Eventos de ação são iniciados por componentes de comando, por exemplo h:commandButton e h:commandLink, quando o botão ou link é ativado.


Eventos de fase normalmente são iniciados pelo ciclo de vida do JSF. Se desejar manipular eventos, você precisa ter um entendimento básico desse ciclo.

Primeiramente, vamos dá uma olhada na Figura 01 onde demonstra em um diagrama, o “Ciclo de Vida dos Eventos”.

 

wmmejsfp1fig01.jpg 

Figura 01

 

O ciclo de vida JSF consiste nas seguintes faces:

1) Restaurar Visão
2) Aplicar Valores de Requisição
3) Processar Validações
4) Atualizar Valores do Modelo
5) Invocar Aplicação
6) Renderizar Resposta

 

Resposta Finalizada - Uma página web que não está em nossa aplicação ou uma página de nossa aplicação que não envolva JSF.

 

Restaurar Visão - A Fase Restaurar Visão recria a árvore de componentes Server-side quando você revisualiza uma página JSF.

 

Aplicar Valores de Requisição - A Fase Aplicar Valores de Requisição copia os parâmetros de requisição para valores submetidos pelos componentes.

 

Processo de Validação - A Fase Processar Validações primeiramente converte esses valores submetidos e valida o valor convertido.

 

Atualizar Valores do Modelo - A Fase Atualizar Valores do Modelo copia valores (convertidos e validados) para o modelo, o que normalmente é escrito em páginas JSF com expressões de referência a valor, tais como:
<h:inputText value=”#{user.nome}”/>

 

Invocar Aplicação - A Fase Invocar Aplicação chama os listeners de ação e as ações, nessa ordem, para os componentes de comando. Você pode registrar um listener de ação e uma ação usando um componente como este:
<h:commandButton action=”#{bean.action}” actionListener=”#{bean.listener}” />


Nesse caso, a implementação JSF invocará o método do bean, seguido pelo método action.

 

Renderizar Resposta - A Fase Renderizar Resposta salva o estado e carrega a visão seguinte. Para aplicações com base em JSP, o handler de navegação do JSF reencaminha-se (forward) ou redireciona-se (redirect) para outra página JSP.

 

A partir da fase Aplicar Valores de Requisição, eventos podem ser criados e colocados em uma fila de eventos durante cada uma das fases do ciclo de vida. Após essas fases, a aplicação JSF envia os eventos da fila para os listeners registrados.

 

Eventos de Mudança de Valor
Os componentes de uma aplicação web, na maioria dos casos, dependem uns dos outros. Você pode escrever um ValueChangeListener sempre que você quiser executar alguma ação baseado no estado alterado do UI. ValueChangeListener está localizado no pacote javax.faces.event.

 

Na aplicação que irei demonstrar, o resultado das exibições irão depender do valor selecionado no menu. Este menu usa o atributo onchange para forçar uma submissão do formulário depois que o valor do menu é modificado:

 

<h:selectOneListbox id="animais" size="1" onchange="submit()"  valueChangeListener="#{evento.animaisChanged}">                                   

  <f:selectItem itemValue="" itemLabel="SELECIONE"/>
 <f:selectItem itemValue="1" itemLabel="DOGS"/>
 <f:selectItem itemValue="2" itemLabel="CATS"/>
</h:selectOneListbox>

 

Quando um usuário seleciona um animal do menu, a função JavaScript submit é invocada para submeter o formulário do menu, o que subseqüentemente invoca o ciclo de vida JSF. Após a Fase Processar Validações, a implementação JSF invoca o método animaisChanged do bean do formulário. Esse método exibe um panelGrid com o animal selecionado e um texto com a opção selecionada:

 

public void animaisChanged(ValueChangeEvent event) throws Exception {
….
}

 

Como todos os listeners de mudança de valor, o listener acima recebe um evento de mudança de valor. O listener usa esse evento para acessar o novo valor do componente.

 

Veja a demonstrando da aplicação na Figura 02.


wmmejsfp1fig02.jpg

Figura 02

 

Você pode fazer download do projeto e testar a aplicação de teste.

 

Conclusão

Eventos em JavaServer Faces é uma característica muito interessante, e entender o ciclo de vida de Faces é essencial!!! Este artigo demonstrou um exemplo prático da utilização de Eventos de Mudança de Valor, nos outros artigos irei escrever sobre Eventos de Ação e Eventos de Fase. Até a próxima!!!

 

Referências
The J2EE
1.4 Tutorial http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html
Core JavaServer Faces http://www.horstmann.com/corejsf/

Leia também