You are on page 1of 16

1/16

Anotaes e Navegao no JSF 2.0


Simplifique a navegao e a configurao XML com o JSF 2.0
Aprenda a utilizar anotaes e navegaes implcita e condicional em suas aplicaes JSF 2.0 MARCEL TOKARSKI A Internet vem evoluindo a cada ano. E com o advento da Web 2.0, o dinamismo e a interatividade dos sites com os usurios ganharam uma importncia fundamental. Hoje, cada vez mais pessoas tm acesso rede mundial de computadores, seja de suas residncias ou de seus escritrios, atravs de um computador ou de dispositivos mveis. Por conta disso, h uma demanda crescente por desenvolvimento para web, como a criao ou remodelagem de sites, redes sociais, sistemas para Intranet de uma empresa, etc. Neste contexto, o primeiro contato que o usurio tem com a aplicao atravs de sua interface, uma de suas partes mais importantes. A tecnologia JavaServer Faces (JSF), em sua essncia, um framework Java destinado criao de componentes de interface grfica para aplicaes web. Ele simplifica o desenvolvimento da Interface com o Usurio, que geralmente uma das partes mais trabalhosas no desenvolvimento web. Neste artigo veremos, com exemplos prticos, algumas dessas novidades: o uso de anotaes nos beans gerenciveis (managed beans) e a navegao implcita e condicional. Porm, antes de entrarmos nos detalhes do JSF 2.0, vamos configurar um ambiente de desenvolvimento e criar um projeto web que ser utilizado em todo o artigo.

Configurando o ambiente de desenvolvimento


Para a montagem do ambiente, utilizaremos o JDK 6 Update 21, o NetBeans IDE 6.9.1 para Java e o servidor de aplicaes GlassFish verso 3.0.1. A melhor maneira de apresentar as novidades do JSF 2.0, destacadas nesse artigo, atravs de uma aplicao exemplo. Para isso, crie um novo projeto web no NetBeans com o nome de ExemploJSF2. Mantenha as configuraes padres durante a criao, e no se esquea de selecionar o framework JavaServer Faces antes de finaliz-la. Pronto! Agora temos um projeto web utilizando JSF 2.0. Notem que o NetBeans criou automaticamente quatro arquivos, como pode ser observado na Figura 1: WEB-INF/web.xml: arquivo descritor para aplicaes web Java EE. Entre outras coisas, nesse arquivo definida a pgina inicial da aplicao (neste caso, index.xhtml); WEB-INF/sun-web.xml: arquivo descritor de deployment para o servidor de aplicaes GlassFish. Nesse arquivo definido o contexto da aplicao (no caso /ExemploJSF2); index.xhtml: pgina inicial JSF (padro Facelets); MANIFEST.MF: arquivo de manifesto padro.

2/16

Figura 1. Projeto ExemploJSF2 criado no NetBeans.

No iremos alterar esses arquivos, exceto o index.xhtml, no qual criaremos um formulrio de cadastro de clientes. A Figura 2 mostra as pginas e os fluxos de navegao que construiremos no nosso projeto.

Figura 2. Pginas e fluxo de navegao do projeto ExemploJSF2.

Como podemos observar, trata-se de um projeto simples. Na pgina index.xhtml, existe uma lista de clientes cadastrados e uma opo para cadastro de novo cliente. A pgina cadastro.xhtml possui um formulrio contendo as informaes necessrias para a criao do cliente. E a pgina confirmacao.xhtml mostra as informaes includas no formulrio, para que o usurio verifique se os dados esto corretos e confirme a incluso do novo cliente. Aps a confirmao, a pgina index.html mostrada novamente, com a lista de clientes atualizada. Alm disso, o usurio tambm tem a opo de cadastrar um novo cliente sem a necessidade de confirmar os dados dele.

Navegao implcita e condicional


O modelo de navegao do JSF contempla as regras que definem como e quando a navegao entre pginas deve ocorrer em uma aplicao. Uma novidade apresentada no JSF 2.0 a chamada navegao implcita, na qual no h a necessidade de configurao XML. O JSF 2.0 tambm apresenta uma novidade para a navegao baseada em regras (aquela definida atravs de configurao XML): a navegao condicional. Nela, possvel definir restries no arquivo de configurao do JSF, o faces-config.xml. Veremos exemplos desses dois tipos. Para comear, vamos criar a primeira pgina. No projeto ExemploJSF2, abra o arquivo index.xhtml e altere seu cdigo padro, conforme a Listagem 1.
Listagem 1. Arquivo index.xhtml contendo a lista de clientes.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head>

3/16
<title>Exemplo simples de aplicao JSF 2.0</title> </h:head> <h:body> <h:form> <h3>Lista de Clientes</h3> <h:dataTable border="1" var="clienteLista" value="#{clienteBean.listaCliente}"> <h:column> <f:facet name="header">Nome</f:facet> #{clienteLista.nome} </h:column> <h:column> <f:facet name="header">Data de Nascimento</f:facet> <h:outputText value="#{clienteLista.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </h:column> <h:column> <f:facet name="header">Sexo</f:facet> #{clienteLista.sexo} </h:column> <h:column> <f:facet name="header">Cidade</f:facet> #{clienteLista.localidadeCliente.cidade} </h:column> <h:column> <f:facet name="header">Estado</f:facet> #{clienteLista.localidadeCliente.estado} </h:column> </h:dataTable> <br/> <h:commandButton value="Cadastrar" action="cadastro" /> </h:form> </h:body> </html>

Na Listagem 1 voc pode notar a presena de algumas tags novas, introduzidas no JSF 2.0: <h:head> e <h:body>. Elas so componentes JSF que renderizam as tags HTML <head> e <body>, respectivamente. Crie tambm as pginas cadastro.xhtml e confirmacao.xhtml, conforme as Listagens 2 e 3.
Listagem 2. Arquivo cadastro.xhtml contendo o formulrio de criao de cliente.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Exemplo simples de aplicao JSF 2.0</title> </h:head> <h:body> <h:form> <h3>Cadastro de cliente</h3> <table> <tr> <td>Nome:</td> <td> <h:inputText id="nome" value="#{clienteBean.cliente.nome}" required="true" /> <h:message for="nome" /> </td> </tr> <tr> <td>Data de Nascimento:</td> <td> <h:inputText id="dataNasc" value="#{clienteBean.cliente.dataNascimento}" required="true"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:inputText> (dd/mm/yyyy) <h:message for="dataNasc" /> </td> </tr> <tr> <td>Sexo:</td> <td> <h:selectOneMenu value="#{clienteBean.cliente.sexo}">

4/16
<f:selectItems value="#{clienteBean.listaSexo}" var="sexo" itemLabel="#{sexo}" itemValue="#{sexo}"/> </h:selectOneMenu> </td> </tr> <tr> <td>Cidade:</td> <td> <h:inputText id="cidade" value="#{clienteBean.cliente.localidadeCliente.cidade}" required="true" /> <h:message for="cidade" /> </td> </tr> <tr> <td>Estado:</td> <td> <h:inputText id="estado" value="#{clienteBean.cliente.localidadeCliente.estado}" required="true" /> <h:message for="estado" /> </td> </tr> </table> <h:messages /> <br/> <h:commandButton value="Criar" action="confirmacao" /> <h:commandButton value="Cancelar" immediate="true" action="#{clienteBean.cancelar}" /> </h:form> </h:body> </html>

Listagem 3. Arquivo confirmacao.xhtml com pedido de confirmao de criao de cliente.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Exemplo simples de aplicao JSF 2.0</title> </h:head> <h:body> <h:form> <h3>Cadastro de cliente - Confirmao</h3> <table> <tr> <td>Nome:</td> <td> <h:outputText value="#{clienteBean.cliente.nome}"/> </td> </tr> <tr> <td>Data de Nascimento:</td> <td> <h:outputText value="#{clienteBean.cliente.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy" /> </h:outputText> </td> </tr> <tr> <td>Sexo:</td> <td> <h:outputText value="#{clienteBean.cliente.sexo}"/> </td> </tr> <tr> <td>Cidade:</td> <td> <h:outputText value="#{clienteBean.cliente.localidadeCliente.cidade}"/> </td> </tr> <tr> <td>Estado:</td> <td> <h:outputText value="#{clienteBean.cliente.localidadeCliente.estado}"/> </td> </tr>

5/16
<tr> <td>Novo cadastro?</td> <td> <h:selectBooleanCheckbox value="#{clienteBean.novoCadastro}"/> </td> </tr> </table> <br/> <h:commandButton value="Confirmar Criao" action="#{clienteBean.criarCliente}" /> <h:commandButton value="Editar" action="cadastro"/> </h:form> </h:body> </html>

Outra novidade do JSF 2 que agora podemos utilizar o componente f:selectItems, como visto na Listagem 2, sem a necessidade de criar uma lista ou um array de SelectItem no bean gerencivel, implementao obrigatria nas verses anteriores. Finalmente, crie as classes Cliente, LocalidadeCliente e ClienteBean, utilizadas pelas pginas JSF. A classe Cliente ser responsvel por conter as informaes pessoais relacionadas ao cliente, e LocalidadeCliente pelas informaes de localidade dele. J a classe ClienteBean ser nosso bean gerencivel. As Listagens 4, 5 e 6 mostram os cdigos destas classes.
Listagem 4. Cdigo da classe Cliente.
package br.com.javamagazine; import java.io.Serializable; import java.util.Date; public class Cliente implements Serializable { private String nome; private Date dataNascimento; private String sexo; private LocalidadeCliente localidadeCliente; // mtodos getters e setters das propriedades }

Listagem 5. Cdigo da classe LocalidadeCliente.


package br.com.javamagazine; import java.io.Serializable; public class LocalidadeCliente implements Serializable { private String cidade; private String estado; // mtodos getters e setters das propriedades }

Listagem 6. Cdigo da classe ClienteBean.


package br.com.javamagazine; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class ClienteBean implements Serializable { private List<Cliente> listaCliente; private List<String> listaSexo; private Cliente cliente; private boolean novoCadastro; public ClienteBean() { listaCliente = new ArrayList<Cliente>(); listaSexo = new ArrayList<String>(); listaSexo.add("Masculino"); listaSexo.add("Feminino"); cliente = new Cliente(); cliente.setLocalidadeCliente(new LocalidadeCliente());

6/16
} public String criarCliente() { listaCliente.add(cliente); cliente = new Cliente(); cliente.setLocalidadeCliente(new LocalidadeCliente()); return "index"; } public String cancelar() { cliente = new Cliente(); cliente.setLocalidadeCliente(new LocalidadeCliente()); return "index"; } // mtodos getters e setters das propriedades }

Precisamos agora registrar a classe ClienteBean como um bean gerencivel pelo JSF. Para isso, vamos criar o arquivo de configurao faces-config.xml dentro da pasta WEB-INF. O contedo desse arquivo est descrito na Listagem 7.
Listagem 7. O arquivo de configurao do JSF faces-config.xml.
<?xml version="1.0" encoding="UTF-8"?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> <managed-bean> <managed-bean-name>clienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.ClienteBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>

Como podemos notar, no h nenhuma novidade no contedo do faces-config.xml, exceto pela ausncia da navegao entre as pginas, j que utilizamos a navegao implcita. Antes de falar sobre ela, vamos rodar a aplicao. Ao executar o projeto que estamos desenvolvendo, a primeira pgina apresentada no navegador a index.xhtml. Ela mostra a relao de clientes cadastrados no sistema. Como no incio no h nenhum dado cadastrado, a lista de clientes estar vazia. Para criar um novo cliente, clique no boto Cadastrar. A Figura 3 exibe a tela inicial.

Figura 3. Pgina inicial da aplicao.

7/16

Na pgina de cadastro, preencha o formulrio, como mostrado na Figura 4. Se clicarmos no boto Cancelar, a operao cancelada e a primeira pgina mostrada novamente. Clique no boto Criar para prosseguir.

Figura 4. Pgina de cadastro de cliente.

A pgina mostrada a seguir uma pgina de confirmao dos dados preenchidos, conforme a Figura 5. O checkbox Novo cadastro? no tem nenhuma funo nesse momento. Ele ser utilizado quando falarmos sobre navegao condicional. Clicando no boto Confirmar Criao, somos direcionados pgina inicial, com o novo cliente cadastrado (Figura 6). Caso voc tenha digitado alguma informao errada, na pgina de confirmao basta clicar no boto Editar. Assim a pgina de cadastro exibida novamente, e voc pode alterar as informaes necessrias.

Figura 5. Pgina de confirmao de cadastro.

8/16

Figura 6. Pgina inicial com o novo cliente cadastrado.

A Listagem 7 no mostra as regras de navegao entre as pginas porque a navegao foi definida nas pginas e no bean gerencivel. Na Listagem 1, podemos notar que a tag <h:commandButton> utiliza a action cadastro para navegar para a pgina cadastro.xhtml. Essa a chamada navegao implcita. Caso a aplicao no possua o arquivo faces-config.xml (arquivo no necessrio quando utiliza-se anotaes para o registro dos beans gerenciveis), ou nenhuma regra de navegao descrita nele, o valor do atributo action inspecionado. Caso exista uma pgina que possua como nome base (nome da pgina sem a extenso) o valor desse atributo, a pgina em questo carregada. Na pgina cadastro.xhtml, a navegao para a pgina de confirmao (confirmacao.xhtml) definida de maneira similar. Porm, para a navegao para a pgina inicial, a action da tag <h:commandButton> uma chamada ao mtodo cancelar() da classe ClienteBean. Esse mtodo define de forma programtica a navegao para a prxima pgina, que no caso a pgina index.xhtml (valor de retorno index), como pode ser visto na Listagem 6. Adicionar navegao em uma aplicao JSF 2.0 ficou bastante simples com o uso da navegao implcita. Como vimos, basta adicionar o nome da pgina de destino (sem a necessidade de colocar a extenso .xhtml) diretamente no cdigo na pgina de origem, ou como resultado de um mtodo do bean gerencivel. E o mais interessante: voc no precisa colocar nenhuma regra de navegao no faces-config.xml.
Navegao condicional

Diferentemente da implcita, a navegao condicional definida juntamente com as regras de navegao da aplicao, no arquivo faces-config.xml. Conforme as verses anteriores do JSF, as regras de navegao do JSF 2.0 no faces-config.xml so definidas atravs das tags <navigation-rule> e <navigation-case>, sendo que dentro de um elemento <navigation-rule>, os itens <navigation-case> so processados na ordem em que aparecem. A primeira condio satisfeita far com que a prxima pgina a ser mostrada no fluxo de navegao seja aquela definida na tag <to-view-id>. Para que um <navigation-case> seja satisfeito, basta que o resultado de um mtodo do bean gerencivel, ou da pgina de origem, seja igual ao valor da tag <from-outcome>. A navegao condicional possibilita definir uma verificao a mais dentro de um <navigation-case>, com o uso da nova tag <if>. No nosso projeto de exemplo, a partir da pgina confirmacao.xhtml pode-se chegar tanto na pgina cadastro.xhtml (quando voc clica no boto Editar), como em index.xhtml (ao confirmar um novo cadastro de cliente). A fim de melhorar a usabilidade da aplicao, vamos deixar o usurio decidir se, aps a confirmao de um novo cadastro, ele deseja voltar tela inicial ou cadastrar um novo cliente, utilizando a navegao condicional. Para isso, no arquivo faces-config.xml, defina as regras de navegao a partir da pgina confirmacao.xhtml conforme a Listagem 8.

9/16

Listagem 8. O arquivo de configurao faces-config.xml com regras de navegao a partir de confirmacao.xhtml.


<?xml version="1.0" encoding="UTF-8"?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"> <managed-bean> <managed-bean-name>clienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.ClienteBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <navigation-rule> <from-view-id>/confirmacao.xhtml</from-view-id> <navigation-case> <from-outcome>index</from-outcome> <if>#{clienteBean.novoCadastro}</if> <to-view-id>/cadastro.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>index</from-outcome> <to-view-id>/index.xhtml</to-view-id> </navigation-case> </navigation-rule> </faces-config>

Ao executar a aplicao novamente, podemos notar que para que um novo cadastro seja realizado logo aps a confirmao de outro, basta selecionar o checkbox Novo cadastro? (observe a Figura 5). Na Listagem 8, no primeiro elemento <navigation-case>, a presena da tag <if> indica a navegao condicional. Essa tag verifica o valor do atributo novoCadastro no clienteBean. Se o valor do atributo for true, ou seja, o usurio selecionou o checkbox, ento a prxima pgina a ser mostrada ser cadastro.xhtml. Se essa regra falhar, o prximo elemento <navigation-case> avaliado. Como no existe nenhuma verificao adicional no segundo <navigation-case>, a prxima pgina mostrada ser index.xhtml. Note que o contedo da tag <if> uma Linguagem de Expresso (em ingls, Expression Language ou EL). Pode ser estranho o uso de EL no faces-config.xhtml, mas tanto na tag <if> quanto na tag <to-view-id> possvel utilizar este recurso. Voc tambm pode incluir quantas tags <if> achar necessrio dentro de um <navigation-case>. Nesse caso, a pgina definida em <to-view-id> somente ser mostrada se todas as tags <if> forem satisfeitas. No foram definidas outras tags, alm da tag <if>, para a navegao condicional.

Anotaes em beans gerenciveis


Ao registrarmos no JSF uma classe criada em nosso projeto web, ela se torna um Managed Bean (ou bean gerencivel). Quando isso acontece, esta classe fica gerencivel pelo framework, ou seja, a partir de qualquer pgina JSF possvel acessar seus mtodos pblicos. Da o nome Managed Bean. No JSF, ele corresponde ao Modelo, da arquitetura Model-View-Controller (MVC), para os componentes de UI. Na verso 1.2 do JSF, para que uma classe se tornasse um bean gerencivel, era necessrio registr-la atravs do faces-config.xml. Isso trazia um inconveniente, pois medida que crescia o nmero de beans gerenciveis, o arquivo de configurao tambm crescia na mesma proporo. E com um nmero grande desses beans, se tornava complicado gerenciar todas as alteraes em trs lugares distintos, porm relacionados: o faces-config.xml, a pgina JSF e o prprio bean gerencivel. O JSF segue o padro arquitetural Model-View-Controller (MVC), no qual o Modelo (Model) contm a lgica de negcios ou cdigo que no seja de UI, a Viso (View) contm todo o cdigo necessrio para apresentar a UI ao usurio, e o Controlador (Controller) o agente que trata as requisies do usurio e o redireciona para

10/16

a Viso apropriada. No JSF, o Modelo representado pelos beans gerenciveis, a Viso pelas pginas JSF e o Controlador pelo Faces Servlet. No JSF 2.0 voc no precisa mais registrar um bean no arquivo de configurao, como fizemos nas Listagens 7 e 8. Voc pode agora utilizar anotaes para isso. Dessa forma, o bean e o seu registro ficam no mesmo lugar, na mesma classe Java. Isso facilita bastante o controle dos beans gerenciveis, como tambm deixa mais limpo o faces-config.xml. Porm, em alguns casos, voc ser obrigado a registrar os beans no arquivo de configurao, por falta de alternativa via anotaes. Veremos um exemplo desta situao mais adiante. Para cada anotao no JSF 2.0 h uma sintaxe XML correspondente a ser utilizada no faces-config.xml. recomendvel utilizar anotaes ao invs do XML, pois com o uso de anotaes o cdigo torna-se mais coeso e a sua manuteno mais fcil. Para exemplificar, vamos comear com uma configurao bsica de um bean gerencivel. Nas Listagens 7 e 8 vimos como a classe ClienteBean registrada no JSF 1.2, no arquivo de configurao faces-config.xml. A Listagem 9 mostra o registro da mesma classe no JSF 2.0, mas com o uso de anotaes.
Listagem 9. Registro do bean gerencivel clienteBean no JSF 2.0 utilizando anotaes.
package br.com.javamagazine; import import import import import java.io.Serializable; java.util.ArrayList; java.util.List; javax.faces.bean.ManagedBean; javax.faces.bean.SessionScoped;

@ManagedBean @SessionScoped public class ClienteBean implements Serializable { private List<Cliente> listaCliente; private List<String> listaSexo; private Cliente cliente; private boolean novoCadastro; ... }

Neste exemplo, a classe br.com.javamagazine.ClienteBean registrada como um bean gerencivel (anotao @ManagedBean) de nome clienteBean e com escopo session (anotao @SessionScoped). Nas Listagens 7 e 8, o nome definido pela tag managed-bean-name. Na Listagem 9 o nome do bean no configurado em nenhum lugar. Na verdade, ao utilizar anotaes, o nome do bean definido pelo atributo name da anotao @ManagedBean. Quando esse atributo omitido, o bean ter o mesmo nome da classe (ClienteBean), mas com a primeira letra em minsculo. O escopo padro do JSF 2.0 o request (anotao @RequestScoped). Os beans gerenciveis do tipo request podem ter a anotao de escopo omitida. Porm, para uma melhor legibilidade do cdigo, recomendvel no omitir a anotao de escopo e nem o atributo name de @ManagedBean. Caso voc queira executar a aplicao novamente para validar as alteraes realizadas na Listagem 9, edite o arquivo faces-config.xml removendo a tag <managed-bean> e seu contedo.
Escopos

No JSF 2.0 existem as seguintes anotaes para definio de escopo de beans gerenciveis: 1. @NoneScoped: os beans gerenciveis de escopo none no so instanciados e nem salvos em nenhum escopo. Eles so instanciados, sob demanda, por outros beans gerenciveis. Um bean gerencivel de escopo none somente pode instanciar outros beans gerenciveis de escopo none;

11/16

2. @RequestScoped: os beans gerenciveis de escopo request so instanciados e permanecem disponveis durante uma mesma requisio HTTP. Eles podem instanciar outros beans gerenciveis de escopo: none, request, view, session e application; 3. @ViewScoped: os beans gerenciveis de escopo view permanecem disponveis enquanto o usurio permanecer em uma mesma pgina de uma aplicao. Eles podem instanciar beans de escopo: none, view, session e application; 4. @SessionScoped: os beans gerenciveis de escopo session so salvos na sesso HTTP de um usurio. Podem instanciar beans de escopo: none, session e application; 5. @ApplicationScoped: os beans gerenciveis de escopo application permanecem disponveis equanto a aplicao estiver no ar, e podem ser acessados por todos os usurios da aplicao. Podem instanciar outros beans de escopo: none e application. 6. @CustomScoped: os beans gerenciveis de escopo custom so beans que possuem um tempo de vida personalizado. Por exemplo, voc pode definir um escopo de conversao, como existe no JBoss Seam, no qual um bean permanece disponvel para um conjunto de pginas. Como podemos notar, um bean gerencivel somente pode instanciar outro bean gerencivel de escopo none ou de escopo maior ou igual ao seu. A anotao @ManagedBean possui, alm do atributo name, o atributo eager, de tipo boolean, que somente considerado quando o escopo do bean gerencivel for application. Caso o valor desse atributo seja true e o escopo application, o bean gerencivel ser criado e colocado nesse escopo quando a aplicao iniciar, e no quando ele for referenciado pela primeira vez (quando eager=false). Ou seja, o bean gerencivel estar disponvel antes que o container da aplicao comece a responder s requisies dos usurios. Para a fase de testes de uma aplicao, o uso do atributo eager pode ser bastante til, pois o bean gerencivel pode realizar algumas tarefas antes de ser referenciado, como popular uma base de dados, por exemplo. Exemplo de cdigo:
@ManagedBean(name=clienteBean, eager=true) @ApplicationScoped public class ClienteBean

Se o atributo eager for utilizado e o escopo do bean no for application, ento o bean gerencivel ser criado quando for referenciado pela primeira vez. Esse o comportamento padro. O atributo eager, assim como o atributo name, opcional, e seu valor default false.
Inicializando propriedades do bean gerencivel

Podemos ter a necessidade de definir valores iniciais para as propriedades do bean quando o mesmo criado. Deste modo, quando um bean for instanciado pelo ciclo de vida do JSF, suas propriedades sero inicializadas com valores pr-definidos, para serem utilizadas em um formulrio, ou mesmo para usufruir dos benefcios da injeo de dependncia, que torna o cdigo mais desacoplado. A Listagem 10 mostra um exemplo de uso da anotao @ManagedProperty, que torna tudo isso possvel. A Listagem 11 mostra o mesmo exemplo, porm no arquivo de configurao.
Listagem 10. Inicializando a propriedade novoCadastro atravs de anotao.
package br.com.javamagazine; import import import import java.io.Serializable; java.util.ArrayList; java.util.List; javax.faces.bean.*;

@ManagedBean(name=clienteBean) @SessionScoped public class ClienteBean implements Serializable { @ManagedProperty(value=true)

12/16
private boolean novoCadastro; ... }

Listagem 11. Inicializando a propriedade novoCadastro atravs do faces-config.xml.


... <managed-bean> <managed-bean-name>clienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.ClienteBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>novoCadastro</property-name> <value>true</value> </managed-property> </managed-bean> ...

Nesse exemplo, quando o clienteBean for instanciado, a propriedade novoCadastro ser inicializada com o valor true. A anotao @ManagedProperty tambm possui um atributo opcional name. Esse atributo deve ter como valor o nome da propriedade que se deseja inicializar, por exemplo:
@ManagedProperty(name=novoCadastro, value=true) private boolean novoCadastro;

Ao executar a aplicao novamente, considerando as alteraes na Listagem 10, poderemos notar que o checkbox Novo cadastro? aparecer previamente selecionado na pgina de confirmao de cadastro.
Utilizando injeo de dependncia

O uso de injeo de dependncia nos beans gerenciveis simplifica o cdigo e diminui o acoplamento entre os objetos, de modo que a classe se preocupe apenas com as regras de negcio da pgina em questo, j que as dependncias estaro disponveis quando necessrias. A injeo de outros objetos no bean esttica, ou seja, somente ocorre durante a sua criao. Para exemplificar, vamos registrar a classe LocalidadeCliente como um bean gerencivel, conforme a Listagem 12. A Listagem 13 mostra o clienteBean referenciando este novo bean.
Listagem 12. Registro do bean gerencivel localidadeCliente no JSF 2.0 utilizando anotaes.
package br.com.javamagazine; import java.io.Serializable; import javax.faces.bean.ManagedBean; import javax.faces.bean.NoneScoped; @ManagedBean(name="localidadeClienteBean") @NoneScoped public class LocalidadeCliente implements Serializable { private String cidade; private String estado; // mtodos getters e setters das propriedades }

Listagem 13. Exemplo de uso de injeo de dependncia.


package br.com.javamagazine; import import import import import java.io.Serializable; java.util.ArrayList; java.util.List; javax.faces.bean.*; javax.faces.context.FacesContext;

@ManagedBean(name=clienteBean)

13/16
@SessionScoped public class ClienteBean implements Serializable { ... @ManagedProperty(value="#{localidadeClienteBean}") private LocalidadeCliente localidade; public ClienteBean() { listaCliente = new ArrayList<Cliente>(); listaSexo = new ArrayList<String>(); listaSexo.add("Masculino"); listaSexo.add("Feminino"); cliente = new Cliente(); } public String criarCliente() { LocalidadeCliente localidadeCliente = new LocalidadeCliente(); localidadeCliente.setCidade(localidade.getCidade()); localidadeCliente.setEstado(localidade.getEstado()); cliente.setLocalidadeCliente(localidadeCliente); listaCliente.add(cliente); cliente = new Cliente(); return "index"; } public String cancelar() { cliente = new Cliente(); return "index"; } // mtodos getters e setters das propriedades }

A injeo de dependncia no bean gerencivel feita atravs de EL no valor da anotao @ManagedProperty. Na Listagem 13, note que o valor da EL #{localidadeClienteBean} o nome de registro do bean LocalidadeCliente, como pode ser visto na Listagem 12. Com a injeo de dependncia, o clienteBean no precisa se preocupar em criar uma nova instncia de LocalidadeCliente e gerenci-la; basta utiliz-la quando necessrio. Por isso, no construtor e nos mtodos criarCliente() e cancelar() do ClienteBean, foi retirada a criao dessa nova instncia. No arquivo de configurao, o cdigo correspondente s Listagens 12 e 13 est descrito na Listagem 14. Na primeira tag <managed-bean>, a classe br.com.javamagazine.LocalidadeCliente registrada com o nome localidadeClienteBean e escopo none. Na segunda tag, a injeo do bean localidadeClienteBean feita na propriedade localidade, como mostrado na tag <managed-property>.
Listagem 14. Exemplo de uso de injeo de dependncia atravs do faces-config.xml.
... <managed-bean> <managed-bean-name>localidadeClienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.LocalidadeCliente</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>clienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.ClienteBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>localidade</property-name> <property-class>br.com.javamagazine.LocalidadeCliente</property-class> <value>#{localidadeClienteBean}</value> </managed-property> </managed-bean> ...

Com as alteraes realizadas nas Listagens 12 e 13, para acessar as propriedades cidade e estado de localidadeClienteBean nas pginas cadastro.xhtml e confirmacao.xhtml, basta utilizar as ELs #{clienteBean.localidade.cidade} e #{clienteBean.localidade.estado}, respectivamente.
Inicializando propriedades do tipo List ou Map do bean gerencivel

Nem sempre a propriedade que desejamos inicializar aps a criao de um bean gerencivel um simples objeto. Deste modo, o que fazer quando precisamos inicializar um conjunto de valores para

14/16

um combobox? Ou quando em um formulrio o usurio pode escolher uma ou mais opes disponveis atravs de checkbox? Tambm possvel inicializar propriedades do tipo array, java.util.List ou java.util.Map na criao de um bean gerencivel, mas no atravs de anotaes. Propriedades desses tipos s podem ser inicializadas atravs do arquivo de configurao facesconfig.xml. Para exemplificar a inicializao de propriedades do tipo List e Map, vamos alterar o nosso cdigo de modo que o usurio no precise mais digitar o estado ao preencher o formulrio, mas sim selecion-lo atravs de uma lista. E tambm, vamos criar uma propriedade nova, que indica em qual regio (norte, sul, leste ou oeste) de uma determinada cidade o usurio reside. A Listagem 15 mostra essas novas propriedades criadas na classe LocalidadeCliente e a Listagem 16 mostra como inicializ-las. No caso da lista, foi utilizada a tag <list-entries>, na qual cada elemento definido pela tag <value>. Como a propriedade listaEstados uma lista de String, cada valor de <value> do tipo String. Para inicializar um map, utilizada a tag <map-entries>, que pode conter um ou mais <map-entry>. Por sua vez, cada <map-entry> possui uma tag <key> (chave do map) e <value> (valor correspondente).
Listagem 15. Exemplo de uso das propriedades de tipo java.util.List e java.util.Map.
package br.com.javamagazine; import java.io.Serializable; import java.util.List; import java.util.Map; public class LocalidadeCliente implements Serializable { private String cidade; private List<String> listaEstados; private Map<String, String> mapRegioes; // mtodos getters e setters das propriedades }

Listagem 16. Exemplo de uso de inicializao de propriedades do tipo List e Map no faces-config.xml.
... <managed-bean> <managed-bean-name>localidadeClienteBean</managed-bean-name> <managed-bean-class>br.com.javamagazine.LocalidadeCliente</managed-bean-class> <managed-bean-scope>none</managed-bean-scope> <managed-property> <property-name>listaEstados</property-name> <property-class>java.util.List</property-class> <list-entries> <value>Acre</value> <value>Alagoas</value> ... <value>So Paulo</value> <value>Tocantins</value> </list-entries> </managed-property> <managed-property> <property-name>mapRegioes</property-name> <property-class>java.util.Map</property-class> <map-entries> <map-entry> <key>Norte</key> <value>Regio Norte</value> </map-entry> <map-entry> <key>Sul</key> <value>Regio Sul</value> </map-entry> <map-entry> <key>Leste</key> <value>Regio Leste</value> </map-entry> <map-entry> <key>Oeste</key> <value>Regio Oeste</value>

15/16
</map-entry> </map-entries> </managed-property> </managed-bean> ...

Como podemos notar, o bean no possui mais anotaes. O registro dele foi feito totalmente no arquivo de configurao. Quando um bean registrado atravs do arquivo de configurao, qualquer anotao contida nele ser desprezada pelo framework. As anotaes descritas nesse artigo so referentes s anotaes do JSF 2.0 para beans gerenciveis. No entanto, eles tambm podem utilizar anotaes do Java EE, como @PostConstruct, @PreDestroy, @Resource, @EJB, entre outras. O uso dessas anotaes est fora do escopo deste artigo. Outras anotaes do JSF 2.0, como @FacesConverter e @FacesValidator tambm esto fora do escopo deste artigo, pois no so para utilizao em beans gerenciveis.

Concluses
O JavaServer Faces uma das tecnologias mais usadas para o desenvolvimento de aplicaes web em Java, e sua verso 2.0 apresentou novidades e melhorias que o tornaram ainda mais robusto e de fcil utilizao. Neste artigo estudamos trs destas novidades: as navegaes implcita e condicional e as anotaes nos beans gerenciveis. Vimos quais so as tags correspondentes s anotaes no arquivo de configurao faces-config.xml, e como ficou mais simples de se desenvolver uma aplicao com JSF em comparao com suas verses anteriores.
De que se trata o artigo:

Neste artigo veremos algumas das novidades do JSF 2.0, como o uso de anotaes nos beans gerenciveis (Managed Beans) e as novas formas de navegao: implcita e condicional.
Para que serve:

O artigo mostra como ficou mais fcil o desenvolvimento de aplicaes JSF na verso 2.0, com a simplificao do modelo de navegao e sem a necessidade de configurao XML para registrar os beans gerenciveis, graas s anotaes.
Em que situao o tema til:

Para quem deseja conhecer um pouco sobre a tecnologia JSF 2.0 e comear a desenvolver aplicaes, o artigo mostra exemplos e diferenas da nova verso do JSF em relao s verses anteriores.
Anotaes e Navegao no JSF 2.0:

A tecnologia JSF uma das mais utilizadas para o desenvolvimento de aplicaes web em Java. A verso 2.0 trouxe vrias novidades que a tornaram ainda melhor. No entanto, como elas so muitas, o artigo se prope a falar de trs muito importantes: o uso de anotaes em beans gerenciveis e as navegaes implcita e condicional. Com o uso de anotaes, o registro dos beans gerenciveis no precisa mais ser feito atravs de configurao XML, o que facilita bastante a manuteno e o controle dos mesmos. E com as navegaes implcita e condicional, o modelo de navegao do JSF fica mais poderoso e intuitivo, pois agora voc tem a possibilidade de definir as regras de navegao nas prprias pginas, assim como estipular condies para se navegar de uma tela para outra.

Links
http://mkblog.exadel.com/2009/08/learning-jsf2-managed-beans/ Detalha o uso de anotaes nos managed beans no JSF 2.0. http://www.oracle.com/technetwork/java/javase/downloads/index.html Pgina para download do JDK 6 Update 21.

16/16
http://netbeans.org/downloads/ Pgina para download do NetBeans IDE 6.9.1 para Java.

Livros
JavaServer Faces 2.0: The Complete Reference, Ed Burns, C. Schalk, N. Griffin, McGraw-Hill, 2009 Livro de referncia sobre JSF 2.0 Marcel Tokarski (marcel.tokarski@venturus.org.br) graduado em Engenharia de Computao (Puccamp) e possui MBA em eBusiness (FGV). Atua h mais de 8 anos com desenvolvimento de sistemas web e h 3 anos trabalha com JavaServer Faces. Atualmente est no Venturus Centro de Inovao Tecnolgica como arquiteto de sistemas web, desenvolvendo projetos para a conta Sony Ericsson.

You might also like