Utilizando Navegação em JavaServer Faces

 

Hoje em dia em desenvolvimento de aplicações Java é padrão utilizar o Modelo Model-View-Controller. Quando utilizamos framework JavaServer Faces, por padrão estamos adotando este modelo, onde dividimos nossa aplicação em camadas.

 

Neste artigo irei abordar a navegação (Controller) utilizada em faces. Onde a navegação é pré-configurada para atender a navegação do usuário que está utilizando o sistema.

 

Em uma aplicação web simple, a navegação entre páginas é estática. Em uma aplicação utilizando Faces a ação deve coincidir com o outcome (resultado) de uma regra de navegação. Na listagem 01 veja como acontece está configuração:

 

<navigation-rule>

        <from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>login</from-outcome>

<to-view-id>/welcome.jsp</to-view-id>

</navigation-case>

</navigation-rule>

Listagem 01

 

Na listagem 01, uma determinada ação realizada pelo usuário na página índex.jsp, por exemplo, um click em um botão  (<h:commandButton label="Login" action="login" />) com o atributo action e valor login, direciona o usuário para a página welcome.jsp, veja a figura 01:

 

wmujsffig01.jpg
Figura 01

 

Observe que as strings view-id devem começar com /. A extenção deve coincidir com a extensão do arquivo ( .jsp ), não com a extensão da URL. Por exemplo, se usar um from-view-id de /índex.faces ou /índex.jsf, a regra não funcionará.

 

Você pode agrupar várias regras de navegação, por exemplo, você poderia ter botões com ação logout espalhados por todas as páginas da sua aplicação. É possível fazer com que todos esses botões naveguem para a página logout.jsp com apenas a seguinte regra.

 

<navigation-rule>

      <navigation-case>

      <from-outcome>logout</from-outcome>

      <to-view-id>/logout.jsp</to-view-id>

</navigation-case>

</navigation-rule>

 

Note que essa regra se aplica a todas as páginas porque não foi especificado nenhum elemento from-view-id. Você pode unir várias regras de navegação.

 

<navigation-rule>

     <from-view-id>/index.jsp</from-view-id>

<navigation-case>

<from-outcome>login</from-outcome>

<to-view-id>/welcome.jsp</to-view-id>

</navigation-case>

 

<navigation-case>

<from-outcome>signup</from-outcome>

<to-view-id>/newuser.jsp</to-view-id>

</navigation-case>

</navigation-rule>

 

Na maioria das aplicações web, a navegação não é estática, ou seja, com o outcome definido no objeto (ex, botões, links etc...). O fluxo das páginas não depende apenas de qual botão você clicar, mas também das entradas que você fornecer. Submeter uma página de login, por exemplo, pode gerar dois resultados: acesso ou falha. O resultado depende de uma computação, ou seja,  se o nome do usuário e a senha são legítimos.

 

Para implementar a navegação dinâmica, o botão de submissão deve ter uma referência a método, como:

 

<h:commandButton label="Login" action="#{loginController.verifyUser}" />

 

Uma referência a método em um atributo action não tem nenhum parâmetro e tem um tipo de retorno String. Por exemplo, o método verifyUser deveria se parecer mais ou menos com o seguinte:

 

String verifyUser() {

    if(...)

      return “success”;

  else

      return “failure”;

}

 

O método retorna uma string de resultado com o ”success” ou “failure”. O handler de navegação usa a String da referência a método. Um método de ação pode retornar nulo para indicar que a mesma página deve ser re-exibida.

 

Conclusões

Neste artigo, vimos um pouco de como funciona o handler de navegação em Faces, utilizando navegação estática e navegação dinâmica. Nos próximos artigos irei falar mais sobre mais funcionalidades do framework. Bom, é isso! Qualquer dúvida fique a vontade para fazer contato e trocar algumas idéias ;-)

 

Referências

Core JavaServer Faces - http://www.horstmann.com/corejsf/