JSF, Inicio Rápido – Parte 5
Autor: Reinaldo Elias | Publicado: 2011-02-19T18:54:00-02:00

PASSO ANTERIOR (PASSO 4).

Se você chegou até aqui, parabéns! Já leu muita coisa e já escreveu  (ou copiou…) muitas linhas de código, mas o importante não é escrever  com os próprios dedos, mas sim saber o que aquele trecho de código  sgnifica, o que ele faz, como ele se comporta, etç.

Apenas recapitulando um pouco:

Criamos um Bean (testeBean.java) que tem um método testar(), este método faz uma verificação e retorna “falhou” caso não tenha sido digitado nada na tela, ou retorna “sucesso” caso os dois campos tenham sido populados pelo usuário.&nbsp;
Criamos também&nbsp; uma página de menu (menu.jsp) que tem um botão que direciona para “cadastro“.&nbsp;
Criamos uma página de cadastro (inicio.jsp), esta página tem alguns campos que fazem referência à&nbsp; “teste“.&nbsp;
Criamos uma página sucesso.jsp que tem um botão enviando para “inicio” e uma página falha.jsp com um botão direcionando para “cadastro“.

Ao longo deste projeto, criamos diversas páginas, todas apontando para algum “apelido“, para algum lugar imaginário que não existe. Todos estes apelidos são configurados no arquivo de configuração FACES-CONFIG.XML, é sobre este arquivo que iremos falar agora!

Faces-config, o coração do projeto JSF, o arquivo que faz todas as  páginas se conectarem, se conhecerem, pode ser considerado também o  “orkut” de uma aplicação JSF…

Este faces-config é um “arquivinho” xml qualquer, com algumas tags  especiais que fazem o servidor encontrar todos os apelidos que  distribuimos em nossas páginas.

Já criamos o arquivo nos passos anteriores, vamos então enfiar códigos nele!

Abra o arquivo faces-config.xml e insira as seguintes linhas de código:

 &lt;?xml version=”1.0″?&gt;&lt;!DOCTYPE faces-config PUBLIC“-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN”“http://java.sun.com/dtd/web-facesconfig_1_1.dtd”&gt;
&lt;faces-config&gt;
&lt;!– ################### NAVIGATION ###################–&gt;
&lt;navigation-rule&gt;&lt;from-view-id&gt;*&lt;/from-view-id&gt;&lt;navigation-case&gt;&lt;from-outcome&gt;cadastro&lt;/from-outcome&gt;&lt;to-view-id&gt;/pages/inicio.jsf&lt;/to-view-id&gt;&lt;/navigation-case&gt;&lt;navigation-case&gt;&lt;from-outcome&gt;falhou&lt;/from-outcome&gt;&lt;to-view-id&gt;/pages/falha.jsf&lt;/to-view-id&gt;&lt;/navigation-case&gt;&lt;navigation-case&gt;&lt;from-outcome&gt;sucesso&lt;/from-outcome&gt;&lt;to-view-id&gt;/pages/sucesso.jsf&lt;/to-view-id&gt;&lt;/navigation-case&gt;&lt;navigation-case&gt;&lt;from-outcome&gt;inicio&lt;/from-outcome&gt;&lt;to-view-id&gt;/pages/menu.jsf&lt;/to-view-id&gt;&lt;/navigation-case&gt;&lt;/navigation-rule&gt;
&lt;!– ################### MANAGED-BEAN ###################–&gt;&lt;managed-bean&gt;&lt;managed-bean-name&gt;teste&lt;/managed-bean-name&gt;&lt;managed-bean-class&gt;br.com.projetox.view.bean.testeBean&lt;/managed-bean-class&gt;&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;&lt;/managed-bean&gt;
&lt;/faces-config&gt;
Agora o que interessa, a explicação!

As primeiras linhas:&lt;?xml version=”1.0″?&gt;&lt;!DOCTYPE faces-config PUBLIC“-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN”“http://java.sun.com/dtd/web-facesconfig_1_1.dtd”&gt;  indicam que tipo de arquivo é este, são tags padrões  que devem estar no cabeçalho de cada arquivo XML, dependendo da  funcionalidade do arquivo as propriedades destas tags mudam um pouco,  estas indicam que o arquivo é um “faces-config”.

As tags &lt;faces-config&gt;&lt;/faces-config&gt; presentes no inicio e no fim do arquivo indicam o começo e o fim dos comandos de configuração.&nbsp;
Assim como em JavaScript todos os comandos devem ser scritos dentro das tags &lt;script&gt; e &lt;/scritp&gt;, todos os comandos de configuração do faces-config devem ser escritos entre as tags &lt;faces-config&gt;&lt;/faces-config&gt;, se você escrever alguma coisa fora não vai conseguir nem acessar a aplicação...
&lt;navigation-rule&gt; e&lt;/navigation-rule&gt;&nbsp;
Regras de navegação.Dentro destas tags indicaremos todas as nossas regras de navegação,  mas o que seria uma regra de navegação? Seria basicamente informar:  “saindo do jsp X, vai para o jsp Y”. Vamos ver com mais detalhes nas  tags que estão dentro das navigation-rules.
&lt;from-view-id&gt;*&lt;/from-view-id&gt;Aqui estamos informando “saindo da jsp X…”,  neste caso não temos uma regra específica, apenas informamos *, ou  seja, qualquer página. Isso significa que não importa de onde venha a  solicitação sempre terá o o destino, então a nossa “frase” ficaria mais ou menos assim: “Saindo de qualquer lugar, vai para o jsp Y” …&lt;navigation-case&gt;&lt;from-outcome&gt;cadastro&lt;/from-outcome&gt;&lt;to-view-id&gt;/pages/inicio.jsf&lt;/to-view-id&gt;&lt;/navigation-case&gt; 
Estas tags indicam o destino, o “vai para o jsp Y” e aqui definimos os apelidos dos destinos.Todos os mapeamentos de destinos devem estar entre as tags &lt;navigation-case&gt; e &lt;/navigation-case&gt;.

A tag &lt;from-outcome&gt;cadastro&lt;/from-outcome&gt; é muito importante, aqui que configuramos um de nossos “apelidos”, neste caso o apelido “cadastro” que informamos na página menu.jsp,  e também na página falha.jsp. Ou seja, a página menu.jsp, por exemplo,  tem um link que direciona para o apelido “cadastro”, quando este link  for acionado o servidor vai procurar o arquivo faces-config.xml, e  perguntar para ele quem é “cadastro”, o faces-config por sua vez vai  informar para o servidor que “cadastro” é…
&lt;to-view-id&gt;/pages/inicio.jsf&lt;/to-view-id&gt; esta linha que  indica que página o apelido cadastro deve chamar, neste caso estamos  chamando /pages/inicio.jsf, note que estou chamando uma página com a  extensão JSF e não com a extensão JSP, conforme explicação no passo  anterior.

Então, de acordo com esta regra de navegação, sempre que de qualquer  lugar do projeto alguem clicar em algum link “cadastro” a página  inicio.jsp será acionada.

Nota adicional: Se quisermos deixar a arquitetura um pouco mais fechada, por exemplo, não queremos que “cadastro” seja chamado de qualquer lugar do projeto, mas somente da página principal, então na tag &lt;from-view-id&gt; devemos informar o nome da página principal.
As demais informações dentro das tags &lt;navigation-rule&gt; seguem o mesmo padrão do caso “cadastro“, nelas estamos configurando os outros apelidos como falhou e sucesso, que estão sendo utilizados no método testar() do nosso bean, e o apelido inicio que está sendo utilizado na página sucesso.jsp. Todos estes apelidos direcionam para alguma página dentro do nosso projeto.

Agora já configuramos quase todos os apelidos, falta o “teste” que está sendo utilizado na página inicio.jsp.&nbsp;
Neste caso é um pouco diferente, não estamos direcionando para alguma  página, mas sim utilizando variáveis e métodos de uma classe, uma classe  bean, então não podemos configurar uma regra de navegação pois esta não  é uma regra, neste caso possuimos um BEAN, então é isto que devemos  configurar.
&lt;managed-bean&gt; e &lt;/managed-bean&gt;,  estas tags informam o inicio e o fim da configuração de beans do  projeto, todos os beans que vamos utilizar devem ser configurados dentro  destas tags.
&lt;managed-bean-name&gt;teste&lt;/managed-bean-name&gt;, é nesta linha que definimos o apelido do  nosso bean, como ele deverá ser referenciado dentro de nossas páginas,  neste casos estamos dizendo que o apelido do nossa classe testeBean.java será simplesmente teste.
&lt;managed-bean-class&gt;br.com.projetox.view.bean.testeBean&lt;/managed-bean-class&gt;, nesta  linha informamos o caminho completo e o nome da classe, para que o  servidor consiga achar nosso bean quando este for solicitado por alguma  página, neste caso a classe é testeBean (note que não é necessário informar a extensão da classe), e esta classe está dentro das pastas (pacote) br.com.projetox.view.
&lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt; esta linha indica como o servidor vai fazer a comunicação entre a página e o bean, se é por aplicação (application), se é por sessão (session) ou se é por solicitação (request). No nosso caso definimos que a comunicação entre as páginas e o bean será por sessão.

Pronto! Configuramos nossos apelidos e nosso bean! Falta agora configurar nosso projeto!

Somente com o que temos até agora a aplicação não irá funcionar, por  que o servidor ainda não sabe que nosso projeto está utilizando o  framework JSF.&nbsp;
Mas como informar para o servidor que nosso projeto é um projeto JSF?&nbsp;
Atraves do arquivo web.xml!

Neste caso não existe muito o que falar, por enquanto. O arquivo  web.xml é um arquivo padrão de configuração das aplicações web, tanto  faz se é um projeto JSF, ou Struts, ou Raptor ou se não utiliza nenhum  framework, o web.xml deve estar lá, devidamente configurado para que o  servidor entenda que nosso projeto é assim ou assado.

Então abra o arquivo web.xml e insira as seguintes linhas de código:

&lt;?xml version=”1.0″?&gt;&lt;!DOCTYPE web-app PUBLIC“-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”“http://java.sun.com/dtd/web-app_2_3.dtd”&gt;&lt;web-app&gt;
&lt;context-param&gt;&lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;&lt;param-value&gt;server&lt;/param-value&gt;&lt;/context-param&gt;
&lt;context-param&gt;&lt;param-name&gt;javax.faces.CONFIG_FILES&lt;/param-name&gt;&lt;param-value&gt;/WEB-INF/faces-config.xml&lt;/param-value&gt;&lt;/context-param&gt;
&lt;listener&gt;&lt;listener-class&gt;com.sun.faces.config.ConfigureListener&lt;/listener-class&gt;&lt;/listener&gt;
&lt;!– Faces Servlet –&gt;&lt;servlet&gt;&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;&lt;load-on-startup&gt; 1 &lt;/load-on-startup&gt;&lt;/servlet&gt;
&lt;!– Faces Servlet Mapping –&gt;&lt;servlet-mapping&gt;&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;&lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;&lt;/servlet-mapping&gt;
&lt;/web-app&gt;
Estas são tags padrões que devem ser inseridas no arquivo web.xml para que o servidor interprete corretamente nosso projeto JSF.&nbsp;
 Em outro post irem mostrar algumas configurações mais avançadas deste arquivo e do faces-config.

Agora nosso projeto está concluído! Todas as páginas estão criadas e  todos os arquivos devidamente configurados e se comunicando!

Vamos para a parte final deste tutorial…


PRÓXIMO PASSO (FINAL).