Professional Documents
Culture Documents
2/16
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.
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.
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>
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 }
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.
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.
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.
8/16
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
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.
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.*;
12/16
private boolean novoCadastro; ... }
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 }
@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.