algaworks ebook java ee 7 com jsf primefaces e cdi 20131224 (1)

Upload: wilker-alves

Post on 19-Oct-2015

93 views

Category:

Documents


2 download

TRANSCRIPT

  • www.princexml.comPrince - Non-commercial LicenseThis document was created with Prince, a great way of getting web content onto paper.

  • Java EE 7 com JSF, PrimeFaces e CDIpor Thiago Faria

    Edio de 24/12/2013

    2013 AlgaWorks Softwares, Treinamentos e Servios Ltda. Todos os direitosreservados.

    Nenhuma parte deste livro pode ser reproduzida ou transmitida em qualquer forma,seja por meio eletrnico ou mecnico, sem permisso por escrito da AlgaWorks,exceto para resumos breves em revises e anlises.

    AlgaWorks Softwares, Treinamentos e Servios [email protected]+55 (11) 3509-3100

    www.algaworks.com 2

  • Sobre o autorThiago Faria de Andrade@ThiagoFAndrade

    Fundador, instrutor e consultor da AlgaWorks.Graduado em Sistemas de Informao e certificadocomo programador Java pela Sun. Iniciou seu interessepor programao em 1995, quando desenvolveu umsoftware para entretenimento e se tornou um dos mais

    populares no Brasil e outros pases de lngua portuguesa. J foi scio e trabalhou emoutras empresas de software como programador, gerente e diretor de tecnologia, masnunca deixou de programar.

    www.algaworks.com 4

  • Sumrio1 10Introduo ao desenvolvimento web

    1.1 10O que Java EE?1.2 11O protocolo HTTP1.3 13Desenvolvimento web com Java1.4 14Containers1.5 15Instalando o Apache Tomcat1.6 17Integrando o Eclipse com o Apache Tomcat1.7 20Apache Maven1.8 20Primeiro projeto web com Apache Maven

    2 30Persistncia de dados com JPA2.1 30O que persistncia?2.2 30Mapeamento Objeto Relacional (ORM)2.3 32Porque usar ORM?2.4 32Java Persistence API e Hibernate2.5 33Configurao de JPA e Hibernate com Maven2.6 34Criao do Domain Model2.7 36Implementao do equals() e hashCode()2.8 37Mapeamento bsico2.9 41O arquivo persistence.xml2.10 42Gerando as tabelas do banco de dados2.11 43Prximos passos

    3 44Introduo ao JSF3.1 44O que JavaServer Faces?3.2 45Principais componentes3.3 45Bibliotecas de componentes de terceiros3.4 46Escolhendo uma implementao de JSF

  • 3.5 47Adicionando JSF ao projeto Maven3.6 47Managed bean3.7 49Criando uma pgina XHTML3.8 52Ligando valores e aes com EL3.9 54Escopos de managed beans3.10 57Backing bean3.11 60Ciclo de vida3.12 62O arquivo faces-config.xml3.13 63O arquivo web.xml

    4 65Navegao4.1 65Introduo navegao4.2 65Navegao implcita4.3 66Navegao explcita

    5 68Componentes de interface5.1 68Bibliotecas5.2 69Cabealho e corpo da pgina5.3 69Formulrios5.4 70Propriedades comuns5.5 74Entrada de textos5.6 75Sada de textos5.7 77Imagens5.8 78Menus e caixas de listagem5.9 82Campos de checagem e botes rdio5.10 85Itens de seleo5.11 86Botes e links5.12 87Painis5.13 90Mensagens5.14 91Tabelas de dados

  • 5.15 96Arquivos JavaScript e CSS6 98Pgina de consulta de lanamentos

    6.1 98Criando EntityManager6.2 99Persistindo pessoas e lanamentos6.3 101Managed bean que consulta lanamentos6.4 102Pgina de resultado da consulta6.5 104O padro Repository

    7 106Templates com Facelets7.1 106Qual o problema de repetir?7.2 106Incluindo um cabealho e rodap7.3 109Criando um template7.4 110Usando o template

    8 112Converso e validao8.1 112Introduo8.2 114Conversores padro8.3 120Alternativas para definir conversores8.4 121Customizando mensagens de erro de converso8.5 124Validadores padro8.6 127Customizando mensagens de erros de validao8.7 128Criando conversores personalizados8.8 130Criando validadores personalizados

    9 132Pgina de cadastro de lanamento9.1 132Implementando o repositrio9.2 133Implementando as regras de negcio9.3 134Programando o managed bean de cadastro9.4 135Programando o conversor de Pessoa9.5 136Criando o formulrio de cadastro

    10 139Bean Validation

  • 10.1 139O que Bean Validation?10.2 140Adicionando o artefato no pom.xml10.3 140Adicionando restries no modelo10.4 143Customizando mensagens de validao10.5 146Compondo uma nova restrio

    11 148Manipulando eventos11.1 148Introduo11.2 148Eventos de ao11.3 149Eventos de mudana de valor e propriedade immediate

    12 152CDI - Contexts and Dependency Injection12.1 152Injeo de dependncias12.2 154Configurando CDI no projeto12.3 155Beans CDI, EL Names e @Inject12.4 158Escopos de beans CDI12.5 158Produtor de EntityManager12.6 160Controlando as transaes com interceptadores12.7 162Injeo em conversores JSF

    13 164Ajax13.1 164Introduo13.2 164Renderizao parcial13.3 166A propriedade event13.4 166A propriedade listener13.5 167Renderizaes mltiplas13.6 169Processamento parcial13.7 170Palavras-chave para render e execute13.8 171Pgina de cadastro de lanamento com Ajax

    14 173PrimeFaces14.1 173Introduo

  • 14.2 174Configurando o projeto14.3 174OutputLabel e InputText14.4 175SelectOneMenu14.5 176SelectOneButton14.6 177Calendar14.7 178AutoComplete14.8 179Messages14.9 180CommandButton14.10 181PanelGrid14.11 181DataTable14.12 184Menubar14.13 185AjaxStatus14.14 186Programando a alterao de lanamentos14.15 189Programando a excluso de lanamentos

    15 192Segurana da aplicao15.1 192Escolhendo uma soluo15.2 192Login15.3 196Logout15.4 197Filtro de autorizao

  • Captulo 1

    Introduo ao desenvolvimentoweb

    1.1. O que Java EE?

    A Java EE (Java Platform, Enterprise Edition) uma plataforma padro paradesenvolver aplicaes Java de grande porte e/ou para a internet, que inclui bibliotecase funcionalidades para implementar software Java distribudo, baseado emcomponentes modulares que executam em servidores de aplicaes e que suportamescalabilidade, segurana, integridade e outros requisitos de aplicaes corporativasou de grande porte.

    A plataforma Java EE possui uma srie de especificaes (tecnologias) com objetivosdistintos, por isso considerada uma plataforma guarda-chuva. Entre asespecificaes da Java EE, as mais conhecidas so:

    Servlets: so componentes Java executados no servidor para gerar contedodinmico para a web, como HTML e XML.

    JSP (JavaServer Pages): uma especializao de Servlets que permite queaplicaes web desenvolvidas em Java sejam mais fceis de manter. similars tecnologias como ASP e PHP, porm mais robusta por ter todas asfacilidades da plataforma Java.

    JSF (JavaServer Faces): um framework web baseado em Java que tem comoobjetivo simplificar o desenvolvimento de interfaces (telas) de sistemas paraa web, atravs de um modelo de componentes reutilizveis. A proposta queos sistemas sejam desenvolvidos com a mesma facilidade e produtividade

    www.algaworks.com 10

  • que se desenvolve sistemas desktop (at mesmo com ferramentas quesuportam clicar-e-arrastar componentes).

    JPA (Java Persistence API): uma API padro do Java para persistnciade dados, que usa um conceito de mapeamento objeto-relacional. Essatecnologia traz alta produtividade para o desenvolvimento de sistemas quenecessitam de integrao com banco de dados. S para citar, essa APIpossibilita que voc desenvolva aplicaes usando banco de dados semprecisar escrever uma linha sequer de SQL.

    EJB (Enterprise Java Beans): so componentes que executam em servidoresde aplicao e possuem como principais objetivos, fornecer facilidade eprodutividade no desenvolvimento de componentes distribudos,transacionados, seguros e portveis.

    Neste livro, abordaremos sobre JSF e uma breve introduo de JPA.

    1.2. O protocolo HTTP

    O protocolo HTTP utilizado na navegao de pginas da Internet. Quando voc abreuma janela de um browser, acessa uma pgina Web e navega em seus links, voc est,na verdade, utilizando esse protocolo para visualizar, em sua mquina, o contedo queest armazenado e/ou processado em servidores remotos.

    O HTTP um protocolo stateless de comunicao cliente-servidor: o cliente enviauma requisio para o servidor, que processa a requisio e devolve uma resposta parao cliente, sendo que, a princpio, nenhuma informao mantida no servidor emrelao s requisies previamente recebidas.

    Assim, quando digitamos o endereo de uma pgina em um browser, estamos gerandouma requisio a um servidor, que ir, por sua vez, devolver para o browser o contedoda pgina HTML requisitada.

    www.algaworks.com 11

  • A requisio enviada por um cliente deve conter, basicamente, um comando (tambmchamado de mtodo), o endereo de um recurso no servidor (tambm chamado depath) e uma informao sobre a verso do protocolo HTTP sendo utilizado.

    Supondo, por exemplo, que queremos buscar o contedo do endereohttp://www.uol.com.br/index.html. Utilizemos o mtodo GET, o path /index.html e averso 1.1 do protocolo HTTP. Temos a seguinte requisio enviada:

    GET /index.html HTTP/1.1Host: www.uol.com.br

    Existem diversos mtodos HTTP que podem ser especificados em requisies, sendoos mais comuns o mtodo GET, normalmente utilizado para obter o contedo de umarquivo no servidor, e o mtodo POST, utilizado para enviar dados de formulriosHTML ao servidor.

    Uma requisio pode conter parmetros adicionais, chamados headers. Algunsheaders comuns so, por exemplo, Host, User-Agent e Accept.

    Uma vez processada a requisio, o servidor, por sua vez, manda uma resposta parao cliente, sendo que essa resposta tambm tem um formato pr-determinado: aprimeira linha contm informaes sobre a verso do protocolo, um cdigo de statusda resposta e uma mensagem associada a esse status. Em seguida, so enviados osheaders da resposta, e finalmente, enviado o contedo da resposta. Veja um exemplosimples de resposta HTTP:

    HTTP/1.1 200 OKDate: Thu, 26 Sep 2013 15:17:12 GMTServer: Apache/2.2.15 (CentOS)Content-Type: text/html; charset=utf-8

    www.algaworks.com 12

  • No exemplo anterior, o cdigo de status 200 indica que houve sucesso no atendimentoda requisio enviada pelo cliente, e os headers indicam a data e hora do servidor, oservidor usado, tipo do contedo e, por fim, temos o cdigo-fonte da pgina HTML.

    Outros cdigos de status bastante comuns so o 404, que indica que o recurso no foilocalizado no servidor e o cdigo 500, que indica que houve erro no processamento darequisio enviada.

    1.3. Desenvolvimento web com Java

    Com o avano da tecnologia sobre redes de computadores e com o crescimentoda internet, as pginas web esto se tornando cada vez mais atraentes e cheias derecursos que aumentam a interatividade com o usurio.

    Quando falamos em aplicaes web, estamos nos referindo a sistemas ou sites ondegrande parte da programao fica hospedada em servidores na internet, e o usurio(cliente) normalmente no precisa ter nada instalado em sua mquina para utiliz-las,alm de um navegador (browser).

    O acesso s pginas desses sistemas feita utilizando o modelo chamado de request-response, ou seja, o cliente solicita que alguma ao seja realizada (request) e oservidor a realiza e responde para o cliente (response).

    Na plataforma Java, esse modelo foi implementado atravs da API de Servlets. UmServlet estende a funcionalidade de um servidor web para servir pginas dinmicasaos navegadores, utilizando o protocolo HTTP.

    No mundo Java, os servidores web so chamados de Servlet Container, poisimplementam a especificao de Servlet. O servidor converte a requisio em umobjeto do tipo HttpServletRequest. Este objeto ento passado aos componentesweb, que podem executar qualquer cdigo Java para que possa ser gerado umcontedo dinmico. Em seguida, o componente web devolve um objetoHttpServletResponse, que representa a resposta ao cliente. Este objeto utilizadopara que o contedo gerado seja enviado ao navegador do usurio.

    Desde o lanamento de Servlets, outras tecnologias Java e frameworks foram surgindocom o objetivo de melhorar a produtividade e recursos no desenvolvimento de

    www.algaworks.com 13

  • aplicaes web. Atualmente JavaServer Faces a tecnologia do momento, requisitadana maioria das oportunidades de emprego para desenvolvedores Java. JSF, assim comoos outros frameworks web, foram baseados em Servlets.

    1.4. Containers

    Containers so interfaces entre componentes e funcionalidades de baixo nvelespecficas de uma plataforma. Para uma aplicao web desenvolvida em Java ouum componente corporativo ser executado, eles precisam ser implantados em umcontainer.

    Os containers tambm so chamados de servidores de objetos, ou servidores deaplicao, pois oferecem servios de infra-estrutura para execuo de componentes.

    O EJB Container suporta Enterprise JavaBeans (EJB), que so componentescorporativos distribudos. Os Servlets, JSP, pginas JSF e arquivos estticos (HTML,CSS, imagens e etc) necessitam de um Web Container para ser executado.

    Existem diversas organizaes que desenvolvem containers Java EE, por exemplo:Oracle, IBM, Red Hat, Apache, etc. Apesar de tantas ofertas gratuitas, algumasempresas ainda vendem licenas de seus prprios servidores, pois oferecem suportediferenciado ao cliente e normalmente implementam funcionalidades que osservidores gratuitos talvez no possuam.

    Para testar nossos exemplos, usaremos o Apache Tomcat, pois leve, gratuito e muitopopular.

    Como estes servidores so baseados nas especificaes da tecnologia Java EE,teoricamente, voc pode implantar os exemplos que desenvolveremos neste livro emqualquer container compatvel com a Java EE.

    O download do Apache Tomcat pode ser feito em http://tomcat.apache.org.

    www.algaworks.com 14

  • 1.5. Instalando o Apache Tomcat

    O processo de instalao do Apache Tomcat simples, basta descompactar o arquivobaixado no local desejado. Neste livro, usaremos o Tomcat 7.0.

    Uma vez finalizado, tem-se um container pronto para produo. De qualquer forma,o site disponibiliza toda a documentao necessria para resolver problemasencontrados e esclarecer dvidas com relao ao processo de instalao e configuraodo servidor.

    Para entender um pouco sobre o funcionamento do Tomcat, examine os diretrioscriados durante o processo de instalao. Os principais so:

    bin: Executveis, incluindo os aplicativos para iniciar e para encerrar aexecuo do servidor.

    conf: Arquivos de configurao do Tomcat. O arquivo server.xml, emparticular, define uma srie de parmetros para a execuo do servidor, comopor exemplo, a porta onde o servidor ir receber requisies (essa porta

    www.algaworks.com 15

  • , por default, 8080), devendo ser examinado com cuidado e modificadoconforme as necessidades.

    logs: Arquivos de log do servidor. O Tomcat tambm pode gerar arquivos delog com tudo o que as aplicaes desenvolvidas enviam para a sada padrodo sistema.

    work: Diretrio temporrio do Tomcat. Esse diretrio utilizado, porexemplo, para realizar a recompilao automtica de pginas JSP.

    webapps: Nesse diretrio so implantadas as diversas aplicaes webdesenvolvidas.

    Para verificar se a instalao foi bem sucedida, no Windows, acesse o diretrio bine execute o arquivo startup.bat para iniciar o servidor. Voc j deve ter a JDK (JavaDevelopment Kit) instalado em seu computador para executar este passo.

    No Linux ou Mac, acesse o diretrio bin do Tomcat e digite:

    $ chmod +x *.sh$ ./startup.sh; tail -f ../logs/catalina.out

    www.algaworks.com 16

  • Abra um browser e acesse o endereo http://localhost:8080. Se a tela abaixo aparecerpara voc, parabns, o Tomcat est instalado e funcionando em seu computador.

    Para interromper a execuo do Tomcat, execute o arquivo shutdown.bat (Windows)ou shutdown.sh (Linux ou Mac).

    1.6. Integrando o Eclipse com o Apache Tomcat

    Podemos iniciar o Tomcat dentro do Eclipse para ganharmos mais produtividade,mas para isso, precisamos do plugin WTP (Web Tools Platform). O Eclipse IDE forJava EE Developers j vem com esse plugin, que alm de possibilitar a integrao decontainers ao Eclipse, vem com diversos editores que auxiliam o desenvolvimento webe novas perspectivas.

    Vamos integrar o Apache Tomcat ao Eclipse, para podermos iniciar e parar o Tomcat,alm de implantar as aplicaes a partir do ambiente de desenvolvimento.

    Acesse a view Servers e clique no nico link que aparece para adicionar um novoservidor.

    www.algaworks.com 17

  • Na tela que abrir, encontre e selecione Tomcat 7.0 Server. Depois, clique em Next.

    Clique no boto Browse..., selecione o diretrio raiz onde o Tomcat foidescompactado e clique em Finish.

    www.algaworks.com 18

  • Voc ver o Tomcat adicionado na view Servers.

    D um duplo clique no servidor do Tomcat adicionado na view. Marque a opo UseTomcat installation em Server Locations e salve a alterao. Fazemos isso para queo WTP use as mesmas configuraes da instalao do Tomcat.

    www.algaworks.com 19

  • Para iniciar o Tomcat dentro do Eclipse, primeiramente, confirme que o servidor noest rodando fora do Eclipse. Depois, selecione a linha que representa o servidor

    adicionado e clique no cone .

    Se tudo der certo, voc ver na view Servers que o Tomcat est iniciado (Started).

    Abra um browser e acesse o endereo http://localhost:8080.

    1.7. Apache Maven

    Maven uma ferramenta da Apache Software Foundation para gerenciamento dedependncias e automao de build, principalmente em projetos Java.

    Um projeto que usa Maven possui um arquivo XML (pom.xml) que descreve o projeto,suas dependncias, detalhes do build, diretrios, plugins requeridos, etc. Este arquivo conhecido como POM (Project Object Model).

    Usaremos Maven neste livro para criar os exemplos. As verses mais recentes doEclipse j possui um plugin para criar projetos com Maven.

    1.8. Primeiro projeto web com Apache Maven

    Para criar um novo projeto com Maven, acesse o menu File, New, Maven Project.

    www.algaworks.com 20

  • Marque a opo Create a simple project e clique em Next >.

    www.algaworks.com 21

  • Preencha o campo Group Id com um nome nico que identifica sua organizao(domnio ao contrrio) e Artifact Id um identificador nico do projeto dentro daorganizao. Selecione war na seleo Packaging. Depois, clique em Finish.

    Um projeto web ser criado dentro do workspace do Eclipse, com um arquivo pom.xmlbsico:

    4.0.0com.algaworksFinanceiro0.0.1-SNAPSHOTwar

    www.algaworks.com 22

  • Vamos configurar uma propriedade do projeto para que o processo e build use acodificao UTF-8 para copiar arquivos e, tambm, configurar o plugin de compilaopara dizer que nosso projeto deve usar Java 7.

    4.0.0com.algaworksFinanceiro0.0.1-SNAPSHOTwar

    UTF-8

    maven-compiler-plugin3.0

    1.71.7

    Precisamos atualizar o projeto no Eclipse baseado nessas alteraes. Para isso,clicamos com o boto direito no projeto e acessamos o menu Maven, UpdateProject....

    Apenas verifique se o projeto est selecionado e clique em OK.

    www.algaworks.com 23

  • Precisamos verificar os Project Facets instalados no projeto pelo Eclipse. Acesse aspropriedades do projeto e encontre o menu lateral Project Facets. Selecione a verso3.0 no facet Dynamic Web Module, depois, clique em OK.

    www.algaworks.com 24

  • Excluiremos o arquivo web.xml do diretrio src/main/webapp/WEB-INF, pois noprecisaremos dele agora.

    Vamos criar uma servlet muito simples, que apenas exibe "Oi Mundo" para o usurio.Clique com o boto direito no projeto criado, acesse a opo New e clique em Servlet.Na tela que abrir, informe o nome do pacote e da classe da servlet. Depois, clique emFinish.

    www.algaworks.com 25

  • A classe OiMundoServlet ser criada no pacote com.algaworks.servlet com vrioserros.

    www.algaworks.com 26

  • A API de Servlets no foi encontrada, pois no foi declarada como uma dependnciado projeto. Precisamos adicionar essa dependncia no pom.xml, incluindo o trecho decdigo abaixo:

    javax.servletjavax.servlet-api3.0.1provided

    O Maven ir baixar a dependncia e instalar no repositrio local da mquina.

    Programamos a servlet OiMundoServlet, deixando o cdigo como abaixo:

    package com.algaworks.servlet;// imports...

    public class OiMundoServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,

    HttpServletResponse response) throws ServletException,IOException {

    PrintWriter out = response.getWriter();out.print("");out.print("Oi Mundo");out.print("");

    }

    }

    Agora, precisamos adicionar o projeto ao Tomcat, para que ele faa a implantaosempre que houver alguma modificao. Na view Servers, clique com o boto direitono servidor do Tomcat e acesse a opo Add and Remove...

    www.algaworks.com 27

  • Marque o projeto na listagem da esquerda e transfira para a listagem da direita,clicando no boto Add >. Depois, clique em Finish.

    Inicie o Tomcat, se ele no estiver sendo executado, depois, acessehttp://localhost:8080/Financeiro/oi-mundo.

    A servlet responder a requisio e apresentar a mensagem "Oi Mundo" nonavegador.

    www.algaworks.com 28

  • www.algaworks.com 29

  • Captulo 2

    Persistncia de dados com JPA

    2.1. O que persistncia?

    A maioria dos sistemas desenvolvidos em uma empresa precisa de dados persistentes,portanto persistncia um conceito fundamental no desenvolvimento de aplicaes.Se um sistema de informao no preservasse os dados quando ele fosse encerrado, osistema no seria prtico e usual.

    Quando falamos de persistncia de dados com Java, normalmente falamos do uso desistemas gerenciadores de banco de dados relacionais e SQL, porm existem diversasoutras alternativas para persistir dados, como em arquivos XML, arquivos texto e etc.

    2.2. Mapeamento Objeto Relacional (ORM)

    Mapeamento objeto relacional (object-relational mapping, ORM, O/RM ou O/Rmapping) uma tcnica de programao para converso de dados entre banco dedados relacionais e linguagens de programao orientada a objetos.

    Em banco de dados, entidades so representadas por tabelas, que possuem colunasque armazenam propriedades de diversos tipos. Uma tabela pode se associar comoutras e criar relacionamentos diversos.

    Em uma linguagem orientada a objetos, como Java, entidades so classes, e objetosdessas classes representam elementos que existem no mundo real. Por exemplo, umsistema de faturamento possui a classe NotaFiscal, que no mundo real existe e todomundo j viu alguma pelo menos uma vez, alm de possuir uma classe que podese chamar Imposto, que infelizmente todo mundo sente no bolso. Essas classes so

    www.algaworks.com 30

  • chamadas de classes de domnio do sistema, pois fazem parte do negcio que estsendo desenvolvido.

    Em banco de dados, podemos ter as tabelas nota_fiscal e tambm imposto, mas aestrutura de banco de dados relacional est longe de ser orientado a objetos, e porisso a ORM foi inventada para suprir a necessidade que os desenvolvedores tm devisualizar tudo como objetos para programarem com mais facilidade.

    Podemos comparar o modelo relacional com o modelo orientado a objetos conformea tabela abaixo:

    Modelo relacional Modelo OO

    Tabela Classe

    Linha Objeto

    Coluna Atributo

    - Mtodo

    Chave estrangeira Associao

    Essa comparao feita em todo o tempo que se est desenvolvendo usando algummecanismo de ORM. O mapeamento feito usando metadados que descrevem arelao entre objetos e banco de dados.

    Uma soluo ORM consiste de uma API para executar operaes CRUD simples emobjetos de classes persistentes, uma linguagem ou API para especificar queries que sereferem a classes e propriedades de classes, facilidades para especificar metadados demapeamento e tcnicas para interagir com objetos transacionais para identificaremautomaticamente alteraes realizadas, carregamento de associaes por demanda eoutras funes de otimizao.

    Em um ambiente ORM, as aplicaes interagem com APIs e o modelo de classesde domnio e os cdigos SQL/JDBC so abstrados. Os comandos SQL soautomaticamente gerados a partir dos metadados que relacionam objetos a banco dedados.

    www.algaworks.com 31

  • 2.3. Porque usar ORM?

    Uma implementao ORM mais complexa que outro framework qualquer paradesenvolvimento web, porm os benefcios de desenvolver utilizando esta tecnologiaso grandes.

    Cdigos de acesso a banco de dados com queries SQL so chatos de se desenvolver.JPA elimina muito do trabalho e deixa voc se concentrar na lgica de negcio. JPAtrar uma produtividade imensa para voc.

    A manutenabilidade de sistemas desenvolvidos com ORM excelente, pois omecanismo faz com que menos linhas de cdigo sejam necessrias. Alm de facilitar oentendimento, menos linhas de cdigo deixam o sistema mais fcil de ser alterado.

    Existem outras razes que fazem com que um sistema desenvolvido utilizando JPAseja melhor de ser mantido. Em sistemas com a camada de persistncia desenvolvidausando JDBC e SQL, existe um trabalho na implementao para representar tabelascomo objetos de domnio, e alteraes no banco de dados ou no modelo de domniogeram um esforo de readequao que pode custar caro.

    ORM abstrai sua aplicao do banco de dados e do dialeto SQL. Com JPA, voc podedesenvolver um sistema usando um banco de dados e coloc-lo em produo usandodiversos outros banco de dados, sem precisar alterar cdigos-fontes para adequarsintaxe de queries que s funcionam em SGBDs de determinados fornecedores.

    2.4. Java Persistence API e Hibernate

    A Java Persistence API (JPA) um framework para persistncia em Java, que ofereceuma API de mapeamento objeto-relacional e solues para integrar persistncia comsistemas corporativos escalveis.

    Com JPA, os objetos so POJO (Plain Old Java Objects), ou seja, no necessrio nadade especial para tornar os objetos persistentes. Basta adicionar algumas anotaes nasclasses que representam as entidades do sistema e comear a persistir ou consultarobjetos.

    JPA uma especificao, e no um produto. Para trabalhar com JPA, precisamos deuma implementao.

    www.algaworks.com 32

  • O projeto do Hibernate ORM possui alguns mdulos, sendo que o HibernateEntityManager a implementao da JPA que encapsula o Hibernate Core.

    O Hibernate Core a base para o funcionamento da persistncia, com APIs nativase metadados de mapeamentos em arquivos XML. Possui uma linguagem de consultaschamada HQL (parecido com SQL), um conjunto de interfaces para consultas usandocritrios (Criteria API), etc.

    Neste livro, estudaremos apenas o bsico de JPA e Hibernate, para implementarmosexemplos mais interessantes com JSF, com acesso ao banco de dados.

    2.5. Configurao de JPA e Hibernate com Maven

    Como estamos usando Maven, no precisamos acessar o site do Hibernate para baixaros arquivos necessrios e incluir manualmente no projeto. Podemos incluir todasas dependncias no arquivo pom.xml, que o Maven baixar os arquivos necessriosautomaticamente.

    org.hibernatehibernate-core4.2.6.Finalcompile

    org.hibernatehibernate-entitymanager4.2.6.Finalcompile

    mysqlmysql-connector-java5.1.26compile

    ...

    www.algaworks.com 33

  • Adicionamos o ncleo do Hibernate, a implementao de JPA e o driver JDBC doMySQL em nosso projeto.

    2.6. Criao do Domain Model

    Em nosso projeto de exemplo, implementaremos um sistema financeiro simples.Antes de qualquer coisa, precisamos criar nosso modelo de domnio para o negcioem questo.

    Nosso sistema possuir as classes Lancamento e Pessoa, que representaro asentidades de mesmo nome, alm de uma enumerao TipoLancamento..

    package com.algaworks.financeiro.model;public class Pessoa {

    private Long id;private String nome;public Long getId() {

    return id;}

    public void setId(Long id) {this.id = id;

    }

    public String getNome() {return nome;

    }

    public void setNome(String nome) {this.nome = nome;

    }

    }

    package com.algaworks.financeiro.model;public enum TipoLancamento {

    RECEITA, DESPESA

    }

    package com.algaworks.financeiro.model;// imports...

    www.algaworks.com 34

  • public class Lancamento {private Long id;private Pessoa pessoa;private String descricao;private BigDecimal valor;private TipoLancamento tipo;private Date dataVencimento;private Date dataPagamento;public Long getId() {

    return id;}

    public void setId(Long id) {this.id = id;

    }

    public Pessoa getPessoa() {return pessoa;

    }

    public void setPessoa(Pessoa pessoa) {this.pessoa = pessoa;

    }

    public String getDescricao() {return descricao;

    }

    public void setDescricao(String descricao) {this.descricao = descricao;

    }

    public BigDecimal getValor() {return valor;

    }

    public void setValor(BigDecimal valor) {this.valor = valor;

    }

    public TipoLancamento getTipo() {return tipo;

    }

    public void setTipo(TipoLancamento tipo) {this.tipo = tipo;

    }

    public Date getDataVencimento() {return dataVencimento;

    }

    www.algaworks.com 35

  • public void setDataVencimento(Date dataVencimento) {this.dataVencimento = dataVencimento;

    }

    public Date getDataPagamento() {return dataPagamento;

    }

    public void setDataPagamento(Date dataPagamento) {this.dataPagamento = dataPagamento;

    }

    }

    Os atributos identificadores (chamados de id) so referentes s chaves primrias nobanco de dados. Por exemplo, se existirem duas instncias de Pessoa com o mesmoidentificador, eles representam a mesma linha no banco de dados.

    As classes de entidades devem seguir o estilo de JavaBeans, com mtodos getters esetters. obrigatrio que essas classes possuam um construtor sem argumentos.

    2.7. Implementao do equals() e hashCode()

    Para que os objetos de entidades sejam diferenciados uns de outros, precisamosimplementar os mtodos equals() e hashCode().

    No banco de dados, as chaves primrias diferenciam registros distintos. Quandomapeamos uma entidade de uma tabela, devemos criar os mtodos equals() ehashCode(), levando em considerao a forma em que os registros so diferenciadosno banco de dados.

    O Eclipse possui um gerador desses mtodos que usa uma propriedade (ou vrias,informadas por voc) para criar o cdigo-fonte. Veja como deve ficar a implementaodos mtodos para a entidade Pessoa.

    @Overridepublic int hashCode() {

    final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;

    }

    @Overridepublic boolean equals(Object obj) {

    if (this == obj)

    www.algaworks.com 36

  • return true;if (obj == null)

    return false;if (getClass() != obj.getClass())

    return false;Pessoa other = (Pessoa) obj;if (id == null) {

    if (other.id != null)return false;

    } else if (!id.equals(other.id))return false;

    return true;}

    Precisamos gerar esses mtodos tambm para a entidade Lancamento, e o Hibernateconseguir comparar objetos para descobrir se so os mesmos.

    2.8. Mapeamento bsico

    Para que o mapeamento objeto/relacional funcione, precisamos informar implementao do JPA mais informaes sobre como a classes Lancamento e Pessoadevem se tornar persistentes, ou seja, como instncias dessas classes podem sergravadas e consultadas no banco de dados. Para isso, devemos anotar os getters ou osatributos, alm das prprias classes.

    @Entity@Table(name = "pessoa")public class Pessoa {

    private Long id;private String nome;@Id@GeneratedValuepublic Long getId() {

    return id;}

    public void setId(Long id) {this.id = id;

    }

    @Column(length = 60, nullable = false)public String getNome() {

    return nome;}

    public void setNome(String nome) {this.nome = nome;

    www.algaworks.com 37

  • }// hashCode e equals

    }

    As anotaes foram importadas do pacote javax.persistence. Dentro desse pacoteesto todas as anotaes padronizadas pela JPA.

    A anotao @Entity diz que a classe uma entidade, que representa uma tabela dobanco de dados, e @Table define detalhes da tabela no banco de dados, como porexemplo o nome da tabela.

    @Entity@Table(name = "pessoa")public class Pessoa {

    As anotaes nos mtodos getters configuram a relao dos atributos da classe comas colunas do banco de dados. As anotaes @Id e @GeneratedValue so usadas paradeclarar o identificador do banco de dados, e esse identificador deve ter um valorgerado no momento de insero (auto-incremento).

    @Id@GeneratedValuepublic Long getId() {

    return id;}

    Definimos que a propriedade nome tem tamanho que comporta at 60 caracteres e noaceita valores nulos, ou seja, queremos criar uma restrio not null no banco de dados.Como no informamos o nome da coluna no banco de dados, ela receber o mesmonome da propriedade.

    @Column(length = 60, nullable = false)public String getNome() {

    return nome;}

    Vamos mapear a classe Lancamento, que um pouco mais trabalhosa e usa novasanotaes JPA.

    @Entity@Table(name = "lancamento")public class Lancamento {

    private Long id;private Pessoa pessoa;private String descricao;

    www.algaworks.com 38

  • private BigDecimal valor;private TipoLancamento tipo;private Date dataVencimento;private Date dataPagamento;@Id@GeneratedValuepublic Long getId() {

    return id;}

    public void setId(Long id) {this.id = id;

    }

    @ManyToOne(optional = false)@JoinColumn(name = "pessoa_id")public Pessoa getPessoa() {

    return pessoa;}

    public void setPessoa(Pessoa pessoa) {this.pessoa = pessoa;

    }

    @Column(length = 80, nullable = false)public String getDescricao() {

    return descricao;}

    public void setDescricao(String descricao) {this.descricao = descricao;

    }

    @Column(precision = 10, scale = 2, nullable = false)public BigDecimal getValor() {

    return valor;}

    public void setValor(BigDecimal valor) {this.valor = valor;

    }

    @Enumerated(EnumType.STRING)@Column(nullable = false)public TipoLancamento getTipo() {

    return tipo;}

    public void setTipo(TipoLancamento tipo) {this.tipo = tipo;

    }

    @Temporal(TemporalType.DATE)

    www.algaworks.com 39

  • @Column(name = "data_vencimento", nullable = false)public Date getDataVencimento() {

    return dataVencimento;}

    public void setDataVencimento(Date dataVencimento) {this.dataVencimento = dataVencimento;

    }

    @Temporal(TemporalType.DATE)@Column(name = "data_pagamento", nullable = true)public Date getDataPagamento() {

    return dataPagamento;}

    public void setDataPagamento(Date dataPagamento) {this.dataPagamento = dataPagamento;

    }

    // hashCode e equals

    }

    A primeira novidade o mapeamento muitos-para-um em getPessoas. A anotao@ManyToOne indica a multiplicidade do relacionamento entre lanamentos e pessoas,e a anotao @JoinColumn indica que essa relao conseguida atravs da colunaespecificada na propriedade name. Para facilitar o entendimento, esse mapeamento foinecessrio para dizermos ao provedor JPA que existe uma chave estrangeira na colunapessoa_id da tabela lancamento, que referencia a tabela pessoa.

    @ManyToOne(optional = false)@JoinColumn(name = "pessoa_id")public Pessoa getPessoa() {

    return pessoa;}

    Atribumos a preciso de 10 com escala de 2 casas na coluna de nmero decimal.

    @Column(precision = 10, scale = 2, nullable = false)public BigDecimal getValor() {

    return valor;}

    O tipo do lanamento uma enumerao, por isso, mapeamos com a anotao@Enumerated, indicando que queremos armazenar a string da constante na coluna databela, e no o ndice da constante.

    @Enumerated(EnumType.STRING)@Column(nullable = false)public TipoLancamento getTipo() {

    www.algaworks.com 40

  • return tipo;}

    As propriedades de datas foram mapeadas usando a anotao @Temporal, indicandoque queremos armazenar apenas a data (sem informaes da hora).

    @Temporal(TemporalType.DATE)@Column(name = "data_vencimento", nullable = false)public Date getDataVencimento() {

    return dataVencimento;}

    2.9. O arquivo persistence.xml

    O persistence.xml um arquivo de configurao padro da JPA. Ele deve ser criadono diretrio META-INF da aplicao ou do mdulo que contm os beans de entidade.No Eclipse, opcionalmente, voc pode adicionar o Project Facet JPA no seu projeto,que a estrutura bsica desse arquivo criada automaticamente, alm de ter outrasfacilidades.

    O arquivo persistence.xml define unidades de persistncia, conhecidas comopersistence units.

    org.hibernate.ejb.HibernatePersistence

    www.algaworks.com 41

  • O nome da unidade de persistncia foi definido como FinanceiroPU. Precisaremosdesse nome daqui a pouco, quando formos colocar tudo para funcionar.

    O provider diz qual a implementao que ser usada como provedor depersistncia.

    Existem vrias opes de configurao que podem ser informadas neste arquivo XML.Vejamos as principais propriedades que usamos em nosso arquivo de configurao:

    javax.persistence.jdbc.url: descrio da URL de conexo com o bancode dados.

    javax.persistence.jdbc.driver: nome completo da classe do driver JDBC.

    javax.persistence.jdbc.user: nome do usurio do banco de dados.

    javax.persistence.jdbc.password: senha do usurio do banco de dados.

    hibernate.dialect: dialeto a ser usado na construo de comandos SQL.

    hibernate.show_sql: informa se os comandos SQL devem ser exibidos naconsole (importante para debug, mas deve ser desabilitado em ambiente deproduo).

    hibernate.format_sql: indica se os comandos SQL exibidos na consoledevem ser formatados (facilita a compreenso, mas pode gerar textos longosna sada).

    hibernate.hbm2ddl.auto: cria ou atualiza automaticamente a estrutura dastabelas no banco de dados.

    2.10. Gerando as tabelas do banco de dados

    Como ainda no temos as tabelas representadas pelas classes Pessoa e Lancamento nobanco de dados, precisamos cris-la.

    O Hibernate pode fazer isso pra gente, graas propriedade hibernate.hbm2ddl.autocom valor update, que inclumos no arquivo persistence.xml.

    Precisamos apenas criar um EntityManagerFactory, que todas as tabelas mapeadaspelas entidades sero criadas ou atualizadas.

    www.algaworks.com 42

  • import javax.persistence.Persistence;public class CriaTabelas {

    public static void main(String[] args) {Persistence.createEntityManagerFactory("FinanceiroPU");

    }

    }

    O parmetro do mtodo createEntityManagerFactory deve ser o mesmo nome queinformamos no atributo name da tag persistence-unit, no arquivo persistence.xml.

    Ao executar o cdigo, as tabelas so criadas.

    ...Set 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.SchemaUpdate executeINFO: HHH000228: Running hbm2ddl schema updateSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.SchemaUpdate executeINFO: HHH000102: Fetching database metadataSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.SchemaUpdate executeINFO: HHH000396: Updating schemaSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: lancamentoSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: pessoaSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: lancamentoSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: pessoaSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: lancamentoSet 30, 2013 1:50:52 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata...INFO: HHH000262: Table not found: pessoaSet 30, 2013 1:50:53 PM org.hibernate.tool.hbm2ddl.SchemaUpdate executeINFO: HHH000232: Schema update complete

    2.11. Prximos passos

    J temos nossas entidades Pessoa e Lancamento mapeadas e as tabelas criadas nobanco de dados. Precisaremos persistir objetos, consultar, excluir e atualizar, masdeixaremos para apresentar como funciona esses detalhes apenas quando fornecessrio, pois este no um livro de JPA, ok?

    www.algaworks.com 43

  • Captulo 3

    Introduo ao JSF

    3.1. O que JavaServer Faces?

    JavaServer Faces, tambm conhecido como JSF, uma tecnologia paradesenvolvimento web que utiliza um modelo de interfaces grficas baseado emeventos. Esta tecnologia foi definida pelo JCP (Java Community Process), o que a tornaum padro de desenvolvimento e facilita o trabalho dos fornecedores de ferramentas,ao criarem produtos que valorizem a produtividade no desenvolvimento de interfacesvisuais.

    JSF baseado no padro de projeto MVC (Model View Controller), o que torna odesenvolvimento de sistemas menos complicado. O padro MVC separa o sistema emtrs responsabilidades (modelo, visualizao e controle), onde o modelo responsvelpor representar os objetos de negcio, manter o estado da aplicao e fornecer aocontrolador o acesso aos dados. A visualizao responsvel pela interface do usurio.Ela que define a forma como os dados so apresentados e encaminha as aes dousurio para o controlador. O controlador responsvel por ligar o modelo e avisualizao, interpretando as solicitaes do usurio, traduzindo para uma operaono modelo (onde so realizadas efetivamente as mudanas no sistema) e retornandoa visualizao adequada solicitao.

    Em JSF, o controle feito atravs de uma servlet chamada Faces Servlet,opcionalmente, por arquivos XML de configurao e por vrios manipuladores deaes e observadores de eventos. A Faces Servlet recebe as requisies dos usurios naweb, redireciona para o modelo e envia uma resposta.

    O modelo representado por objetos de negcio, que executa uma lgica de negcioao receber dados oriundos da camada de visualizao.

    www.algaworks.com 44

  • A visualizao composta por uma hierarquia de componentes (component tree), oque torna possvel unir componentes para construir interfaces mais ricas e complexas.

    3.2. Principais componentes

    O verdadeiro poder de JavaServer Faces est em seu modelo de componentes deinterface do usurio, que gera alta produtividade aos desenvolvedores, permitindoa construo de interfaces para web usando um conjunto de componentes pr-construdos, ao invs de criar interfaces inteiramente do zero.

    Existem vrios componentes JSF, desde os mais simples, como um Output Label, queapresenta simplesmente um texto, ou um Data Table, que representa dados tabularesde uma coleo que pode vir do banco de dados.

    A API de JSF suporta a extenso e criao de novos componentes, que podem fornecerfuncionalidades adicionais. Os principais componentes que a implementao dereferncia do JSF fornece so: formulrio, campos de entrada de texto e senhas,rtulos, links, botes, mensagens, painis, tabela de dados, etc.

    3.3. Bibliotecas de componentes de terceiros

    Atualmente, existem diversas organizaes que trabalham na criao de componentespersonalizados, como exemplo, podemos citar a Oracle (ADF Faces Rich Client),IceSoft (IceFaces), Red Hat (RichFaces), Prime Technology (PrimeFaces) e etc.

    As bibliotecas de componentes terceiras incluem muitos componentes interessantes,como tabelas de dados avanadas, menus suspensos, botes, barras de progresso,dilogos, componentes para captura de datas e cores, etc.

    www.algaworks.com 45

  • Usaremos PrimeFaces no projeto deste livro, mas antes, usaremos apenas oscomponentes bsicos do JSF.

    3.4. Escolhendo uma implementao de JSF

    A JSF foi criada atravs do Java Community Process (JCP), que uma entidade formadapelas mais importantes empresas de tecnologia do mundo e especialistas em diversosassuntos.

    O JCP composto por vrios grupos de trabalho, que so chamados de JSR (JavaSpecification Request). Uma JSR um projeto de uma nova tecnologia. O artefatoproduzido atravs das JSRs so documentaes, interfaces e algumas classes queespecificam como deve funcionar um novo produto.

    A JSF foi criada e controlada pelo JCP atravs de JSRs. Quando uma JSR finalizada,empresas fornecedoras de tecnologia tm a chance de entender a especificao eimplementar um produto final compatvel com o proposto pela especificao.

    No caso da JSF, a implementao mais conhecida atualmente a Mojarra, que podeser obtida em https://javaserverfaces.java.net/.

    www.algaworks.com 46

  • 3.5. Adicionando JSF ao projeto Maven

    Como estamos usando o Maven, no precisaremos baixar a implememtao de JSFmanualmente. Podemos apenas adicionar a dependncia no POM do projeto.

    org.glassfishjavax.faces2.2.2compile

    Usaremos o JSF 2.2, lanado dentro da Java EE 7.

    Adicionaremos o Project Facet JavaServer Faces com a verso 2.2 para o Eclipse nosauxiliar melhor durante o desenvolvimento.

    3.6. Managed bean

    Antigamente, alguns programadores desenvolviam todo o comportamento de umapgina no prprio arquivo de layout, na verdade, infelizmente, ainda existemprogramadores que fazem isso.

    www.algaworks.com 47

  • Em JSF, no conseguimos fazer isso. O arquivo que inclui os componentes da pginadeve ficar separado da classe que gerencia o comportamento dela, chamada demanaged bean.

    Os managed beans nada mais so que Java Beans, que servem como canais entre ainterface grfica (a pgina) e o back-end da aplicao (regras de negcio, acesso aobanco de dados, etc). Os beans gerenciados do JSF podem receber dados digitadospelos usurios atravs de alguma pgina, processar mtodos atravs de aes dosusurios e fornecer dados para apresentao na pgina.

    Para um bean ser reconhecido como um managed bean JSF, precisamos registr-lo.A maneira mais fcil de fazer isso atravs da anotao @ManagedBean, do pacotejavax.faces.bean. Por padro, todas as classes do projeto sero escaneadas paraencontrar beans anotados.

    Nosso primeiro exemplo ser o managed bean OlaBean. Os atributos nome esobrenome sero informados pelo usurios, por isso, possuem os getters e setterscorrespondentes. O atributo nomeCompleto ser montado pelo mtodo dizerOla eapresentado na pgina, portanto, no precisamos do setter para esse atributo. Omtodo dizerOla ser chamado a partir de um boto da pgina.

    @ManagedBeanpublic class OlaBean {

    private String nome;private String sobrenome;private String nomeCompleto;public void dizerOla() {

    this.nomeCompleto = this.nome.toUpperCase()+ " " + this.sobrenome;

    }

    public String getNome() {return nome;

    }

    public void setNome(String nome) {this.nome = nome;

    }

    public String getSobrenome() {return sobrenome;

    }

    public void setSobrenome(String sobrenome) {this.sobrenome = sobrenome;

    }

    www.algaworks.com 48

  • public String getNomeCompleto() {return nomeCompleto;

    }

    }

    3.7. Criando uma pgina XHTML

    Vamos criar uma pgina simples em JSF, que por enquanto, no far ligao com omanaged bean que programamos.

    Criaremos um arquivo chamado Ola.xhtml, clicando com o boto direito no projetoe acessando New, HTML File. Na tela New HTML File, digite o nome do arquivo eclique em Finish. O arquivo ser criado no diretrio src/main/webapp do projeto.

    Deixaremos o cdigo-fonte do arquivo Ola.xhtml como a seguir:

    www.algaworks.com 49

  • Ol JSF

    OlNome:

    Sobrenome:

    A declarao DOCTYPE foi usada para dizer aos browsers dos usurios a verso doHTML que estamos usando, para que eles possam exibir os elementos de formaadequada. Em nosso exemplo, declaramos que o HTML 5.

    Importamos a biblioteca de componentes HTML atravs do namespacehttp://xmlns.jcp.org/jsf/html. A letra h o prefixo usado para acessar os componentesdessa biblioteca.

    As tags e so importantes para o funcionamento da pgina JSF,para definir o cabealho e corpo da pgina.

    Ol JSF

    ...

    No corpo da pgina, usamos um componente de formulrio, representado pela tag, dois componentes de entrada de texto, representados pela tag e um boto, com .

    www.algaworks.com 50

  • OlNome:

    Sobrenome:

    Considerando que esse exemplo esteja no projeto "Financeiro", podemos acessar apgina que criamos pela URL http://localhost:8080/Financeiro/faces/Ola.xhtml.

    Acesse o cdigo-fonte da pgina pelo navegador. No caso do Google Chrome, cliquecom o boto direito na pgina e depois em View Page Source.

    Ol JSF

    OlNome:

    Sobrenome:

  • value="7050636473587579887:292279611572368337" autocomplete="off" />

    A implementao do JSF gerou o cdigo-fonte HTML a partir dos componentes queadicionados pgina XHTML.

    3.8. Ligando valores e aes com EL

    Depois que o managed bean registrado, ele pode ser acessado pelos componentesdas pginas do projeto. A maioria dos componentes JSF possui propriedades que nospermitem especificar um valor ou uma ligao de valor que est associado a um bean.

    Por exemplo, podemos especificar um valor esttico no componente InputText:

    Expression Language (EL) torna possvel o acesso rpido a managed beans. O avaliadorde expresses responsvel por tratar expresses EL que esto entre os caracteres #{}. No exemplo abaixo, ligamos o valor do componente InputText propriedade nomedo managed bean OlaBean, atravs do getter e setter.

    Quando o componente for renderizado, o mtodo getNome ser invocado. J o mtodosetNome ser chamado quando o usurio digitar algo no componente de entrada detexto e submeter o formulrio.

    O nome olaBean (com inicial em minsculo) definido por padro, de acordo com onome da classe do managed bean, quando no especificamos um outro nome.

    @ManagedBeanpublic class OlaBean {}

    Poderamos definir um nome diferente atribuindo name da anotao @ManagedBean.

    @ManagedBean(name = "ola")public class OlaBean {}

    Agora, associaremos os valores e/ou aes dos componentes s propriedades emtodos de OlaBean.

    www.algaworks.com 52

  • Ol JSF

    Ol #{ola.nomeCompleto}Nome:

    Sobrenome:

    Quando o boto "Dizer ol" for acionado, o framework chamar o mtodo dizerOlado managed bean, que passar o nome para maisculo, concatenar com o sobrenomee atribuir varivel nomeCompleto, que acessada pela pgina atravs do getter, paradizer "Ol NOME sobrenome".

    www.algaworks.com 53

  • 3.9. Escopos de managed beans

    Quando referenciamos um managed bean via EL, o framework do JSF instanciar umobjeto da classe do managed bean, ou recuperar uma instncia existente. Todas asinstncias possuem um tempo de vida, que definido dependendo do escopo usadono managed bean.

    Os escopos de managed beans JSF podem ser definidos atravs de anotaes do pacotejavax.faces.bean. Os principais so:

    @NoneScoped: o bean ser instanciado a cada vez que for referenciado.

    @RequestScoped (padro): tem vida curta, comeando quando referenciado em uma nica requisio HTTP e terminando quando aresposta enviada de volta ao cliente.

    @ViewScoped: a instncia permanece ativa at que o usurio navegue parauma prxima pgina.

    @SessionScoped: mantm a instncia durante diversas requisies e atmesmo navegaes entre pginas, at que a sesso do usurio seja invalidadaou o tempo limite atingido. Cada usurio possui sua sesso de navegao,portanto, os objetos no so compartilhados entre os usurios.

    @ApplicationScoped: mantm a instncia durante todo o tempo deexecuo da aplicao. um escopo que compartilha os objetos para todosos usurios do sistema.

    Para exemplificar o funcionamento de alguns escopos, criaremos uma pgina comuma lista de nomes, com um campo e um boto para adicionar novos nomes.

    www.algaworks.com 54

  • O managed bean abaixo registrado no escopo de requisio, pois anotamos com@RequestScoped.

    @ManagedBean@RequestScopedpublic class NomesBean {

    private String nome;private List nomes = new ArrayList();public void adicionar() {

    this.nomes.add(nome);}

    public String getNome() {return nome;

    }

    public void setNome(String nome) {this.nome = nome;

    }

    public List getNomes() {return nomes;

    }

    }

    www.algaworks.com 55

  • Criamos uma pgina chamada Nomes.xhtml. A nica novidade neste arquivo aimportao do namespace http://xmlns.jcp.org/jsf/facelets e o uso da tag. O componente Repeat funciona como um repetidor, onde cadaelemento da lista passada para a propriedade values atribudo a uma varivel com onome definido em var, renderizando o contedo da tag a cada iterao.

    Lista de nomes

    Nome:

    #{nome}

    Quando executamos esse exemplo, conseguimos inserir o primeiro nomenormalmente, mas ao tentar inserir o segundo nome, o nome anterior que estavana lista desaparece. Isso ocorre porque o escopo que usamos foi de requisio, ouseja, quando inserimos o segundo nome, a primeira requisio j no existe mais, e omanaged bean instanciado novamente pelo framework.

    Para mudar o escopo de NomesBean para view, basta anotarmos a classe com@ViewScoped.

    @ManagedBean@ViewScopedpublic class NomesBean {

    ...

    }

    www.algaworks.com 56

  • Agora conseguimos inserir diversos nomes na lista em sequncia, mas serecarregarmos a pgina ou navegarmos para uma outra pgina e voltar, a lista estarvazia, pois os dados permanecem enquanto o usurio estiver na mesma pgina.

    A anotao @SessionScoped define o escopo de sesso.

    @ManagedBean@SessionScopedpublic class NomesBean {

    ...

    }

    Se usarmos este escopo, podemos adicionar diversos nomes, navegar em outraspginas e voltar para a listagem de nomes, que eles ainda estaro l. O managed beanser perdido apenas quando o tempo limite da sesso for alcanado ou se o usuriosolicitar a invalidao da sesso (geralmente, atravs de logout do sistema).

    O escopo de aplicao compartilha a instncia do managed bean com todos osusurios.

    @ManagedBean@ApplicationScopedpublic class NomesBean {

    ...

    }

    Se adicionarmos alguns nomes e acessarmos a pgina de outro navegador ou atmesmo de outro computador, os mesmos nomes aparecero, mostrando querealmente este escopo compartilha os dados.

    3.10. Backing bean

    Quando voc digita o endereo da aplicao no browser e acessa uma pgina dosistema, o framework JSF l e processa o arquivo XHTML. Esse arquivo contm tags decomponentes, como formulrios, campos de entrada de textos, botes e etc.

    JSF fornece um conjunto de classes que representam os componentes. Essas classesso instanciadas de acordo com as tags adicionadas na pgina XHTML e constroemuma hierarquia de componentes, que representam os elementos da pgina e seusrelacionamentos.

    www.algaworks.com 57

  • Por exemplo, a classe HtmlForm representa o componente de formulrio,HtmlInputText representa o componente de entrada de texto e HtmlCommandButton oboto.

    Durante o processamento da pgina, um cdigo HTML gerado (renderizado) eenviado para o navegador do usurio. Cada componente JSF possui um renderizadorque responsvel por gerar cdigo HTML, refletindo o estado de seu componente.

    Em algumas ocasies, seu bean pode precisar ter acesso s instncias doscomponentes da pgina. Este acesso d possibilidade de inspecionar e at modificarpropriedades do componente que est sendo renderizado para o usurio. Por exemplo,um componente de entrada de texto , representado como objeto Javado tipo HtmlInputText, pode ter a propriedade disabled modificada em tempo deexecuo pelo cdigo Java, atravs do acesso direto a este objeto.

    Para fazer esta ligao entre os componentes da pgina e propriedades de beans,precisamos criar um backing bean. Um bean deste tipo igual ao managed bean,a nica diferena que ele, alm de fazer ligaes de valores, pode fazer tambmligaes de componentes.

    Para um bean ser caracterizado como um backing bean, no cdigo-fonte da pgina feita uma amarrao (binding) em uma tag de um componente JSF para umapropriedade de um managed bean.

    No backing bean NomesBean, criamos os atributos que recebero instncias doscomponentes:

    @ManagedBean@ViewScopedpublic class NomesBean {

    private String nome;private List nomes = new ArrayList();private HtmlInputText inputNome;private HtmlCommandButton botaoAdicionar;public void adicionar() {

    this.nomes.add(nome);// desativa campo e boto quando mais que 3 nomes// forem adicionadosif (this.nomes.size() > 3) {

    this.inputNome.setDisabled(true);this.botaoAdicionar.setDisabled(true);this.botaoAdicionar.setValue(

    www.algaworks.com 58

  • "Muitos nomes adicionados...");}

    }

    // getters e setters

    }

    Para conectar os componentes do formulrio com as propriedades criadas, usamos oo atributo binding das tags dos componentes.

    Nome:

    Podemos acessar a pgina normalmente e adicionar at 4 nomes. A partir da, o campoe boto so desabilitados e o texto do boto tambm modificado.

    Apesar de poderoso, este recurso deve ser usado com bastante cuidado. O usoexcessivo pode deixar o cdigo-fonte grande e difcil de entender. Na maioria dasvezes, conseguimos fazer o que precisamos usando apenas expresses de ligao devalor.

    www.algaworks.com 59

  • 3.11. Ciclo de vida

    Voc pode desenvolver uma aplicao completa em JSF sem conhecer todos osdetalhes deste framework, porm quanto mais voc souber sobre ele, melhor e maisprodutivo voc se tornar. Por isso, estudaremos agora um assunto que nem todos osdesenvolvedores JSF conhecem: o ciclo de vida.

    Ao executar uma pgina construda usando componentes JSF, ela passar por um ciclode vida de processamento bem definido, constitudo por 6 fases:

    1. Restaurar viso

    2. Aplicar valores de requisio

    3. Processar validaes

    4. Atualizar os valores do modelo

    5. Invocar a aplicao

    6. Renderizar a resposta

    www.algaworks.com 60

  • Restaurar viso

    A fase de restaurao da viso recupera a hierarquia de componentes para a pginasolicitada, se ela foi exibida anteriormente, ou constri uma nova hierarquia decomponentes, se for a primeira exibio.

    Se a pgina j tiver sido exibida, todos os componentes so recuperados em seuestado anterior. Isso d condies dos dados de um formulrio submetido ao servidorserem recuperados, caso ocorra algum problema de validao ou restrio de regrade negcio. Por exemplo, se um formulrio solicita campos obrigatrios que noso totalmente preenchidos, porm enviados pelo usurio, o mesmo formulrio deveaparecer novamente com os campos que no estavam vazios j preenchidos, pormcom mensagens de erro indicando os campos requeridos.

    Aplicar valores de requisio

    Nesta fase, cada componente da hierarquia de componentes criada na fase anteriortem a chance de atualizar seu prprio estado com informaes que vieram darequisio.

    Processar validaes

    Os valores submetidos so convertidos em tipos especficos e anexados aoscomponentes. Quando voc programa uma pgina em JSF, voc pode incluirvalidadores que atuam nos valores recebidos pelos usurios. Neste momento, osvalidadores entram em ao e, se surgirem erros de converso ou de validao, a fasede renderizao de resposta invocada imediatamente, pulando todas as outras fasese exibindo a pgina atual novamente, para que o usurio possa corrigir os erros esubmeter os dados mais uma vez.

    Atualizar os valores do modelo

    Durante esta fase, os valores anexados (conhecidos como valores locais) aoscomponentes so atualizados nos objetos do modelo de dados e os valores locais solimpos.

    www.algaworks.com 61

  • Invocar a aplicao

    Na quinta fase, os eventos que originaram o envio do formulrio ao servidor soexecutados. Por exemplo, ao clicar em um boto para submeter um cadastro, aprogramao da ao deste boto deve ser executada. Em alguns casos, o mtodoexecutado pode retornar um identificador dizendo qual a prxima pgina a serexibida, ou simplesmente no retornar nada para exibir a mesma pgina.

    Renderizar a resposta

    Por ltimo, a fase de renderizao da resposta gera a sada com todos os componentesnos seus estados atuais e envia para o cliente. O ciclo recomea sempre que o usuriointerage com a aplicao e uma requisio enviada ao servidor.

    3.12. O arquivo faces-config.xml

    Projetos que usam JavaServer Faces podem ter um arquivo de configurao, chamadofaces-config.xml. Este arquivo opcional, mas se precisar dele, crie no diretrio src/main/webapp/WEB-INF do projeto, com o contedo mnimo abaixo:

    Dentre diversas coisas que podemos configurar nesse arquivo, uma delas o registrode managed beans, como alternativa s anotaes. Por exemplo, veja comoregistraramos o managed bean NomesBean neste arquivo.

    nomesBean

    com.algaworks.financeiro.controller.NomesBean

    view

    Nas verses anteriores ao JSF 2, no existiam as anotaes para registrar managedbeans, e por isso, o arquivo faces-config.xml era obrigatrio. Felizmente, precisaremos

    www.algaworks.com 62

  • desse arquivo apenas para definir outras configuraes da aplicao, que veremos maisadiante.

    3.13. O arquivo web.xml

    As aplicaes web em Java podem ter um arquivo especial, chamado web.xml, que deveficar na pasta src/main/webapp/WEB-INF do projeto. Este arquivo tambm chamadode Deployment Descriptor, pois ele descreve algumas configuraes e detalhes deimplantao dos recursos da aplicao.

    O arquivo web.xml no obrigatrio, mas podemos cri-lo clicando com o botodireito em Deployment Descriptor (dentro do projeto) e depois em GenerateDeployment Descriptor Stub.

    O arquivo ser criado com um contedo semelhante ao cdigo abaixo:

    Financeiro

    www.algaworks.com 63

  • index.htmlindex.htmindex.jspdefault.htmldefault.htmdefault.jsp

    O arquivo gerado descreve o nome da aplicao, atravs de display-name, e algunsarquivos de boas vindas, atravs de welcome-file-list, que so usados caso o usurioacesse o sistema apenas pelo context path, sem informar o nome de um recurso.

    O deployment descriptor de uma aplicao pode descrever tambm servlets, filtros,mapeamentos e outras configuraes.

    Para o framework do JavaServer Faces funcionar, ele registra automaticamente umaservlet chamada Faces Servlet. Esta servlet mapeada para o padro de URL /faces/*,por isso, quando acessamos uma pgina, escrevemos /faces/NomeDaPagina.xhtml.

    Podemos sobrescrever o registro da Faces Servlet e seu mapeamento.

    Faces Servletjavax.faces.webapp.FacesServlet

    Faces Servlet*.xhtml

    Com este novo mapeamento da Faces Servlet, podemos acessar a pgina de listagemde nomes atravs da URL http://localhost:8080/Financeiro/Nomes.xhtml.

    Vamos aproveitar que estamos editando o arquivo web.xml para incluir a configuraoabaixo:

    javax.faces.PROJECT_STAGEDevelopment

    O parmetro de contexto adicionado acima diz que estamos em ambiente dedesenvolvimento. Quando cometermos algum erro, a pgina pode exibir informaestcnicas adicionais, para nos ajudar a resolver o problema.

    www.algaworks.com 64

  • Captulo 4

    Navegao

    4.1. Introduo navegao

    Em JSF, navegao um conjunto de regras que define a prxima pgina a ser exibidaquando uma ao executada pelo usurio. Por exemplo, quando um usurio clica emum boto para se inscrever em um site, qual a prxima pgina ele dever visualizar?Se os dados estiverem incompletos, provavelmente dever visualizar a mesma pgina,com as mensagens de erro apropriadas, porm se tudo estiver correto e a inscrio forefetuada com sucesso, ele poder ver uma pgina de boas vindas ao servio.

    A navegao pode ser implcita ou explcita. Estudaremos como configurar os doistipos.

    4.2. Navegao implcita

    Quando inclumos um com um valor na propriedade action,o mecanismo de tratamento de navegao tentar encontrar uma pgina adequadaautomaticamente. No exemplo abaixo, o mecanismo de navegao encontrar eencaminhar a requisio para a pgina Ola.xhtml.

    O valor passado para a propriedade action chamado de outcome, ou resultado daao.

    www.algaworks.com 65

  • Navegao dinmica

    Quando um action tem uma expresso de ligao de mtodo, o retorno do mtododeve ser o outcome da navegao.

    Quando o mtodo adicionar retornar null, o usurio permanecer na mesma pgina.Quando o retorno for "Ola", a requisio ser encaminhada para a pgina Ola.xhtml.

    public String adicionar() {this.nomes.add(nome);if (this.nomes.size() > 3) {

    return "Ola";}

    return null;}

    Redirecionamento

    Por padro, uma requisio encaminhada para a pgina do outcome, ou seja, arequisio nica e o framework apenas despacha a requisio para uma nova pgina.

    Se for necessrio que seja feito o redirecionamento, podemos passar o parmetrofaces-redirect=true para o outcome.

    public String adicionar() {this.nomes.add(nome);if (this.nomes.size() > 3) {

    return "Ola?faces-redirect=true";}

    return null;}

    4.3. Navegao explcita

    As regras de navegao explcitas so declaradas no arquivo faces-config.xml. Paradeclarar uma regra explcita, precisamos informar o caminho da pgina de origem, umoutcome com um nome qualquer e o caminho da pgina de destino.

    www.algaworks.com 66

  • /Nomes.xhtml

    oi/Ola.xhtml

    A regra que acabamos de declarar define que a ao de nome "oi" a partir da origem/Nomes.xhtml deve encaminhar para a pgina /Ola.xhtml. Para usar esta regra,podemos simplesmente adicionar um boto na pgina Nomes.xhtml com apropriedade action referenciando o outcome.

    Wildcard

    Podemos usar wildcard no elemento from-view-id para selecionar diversos arquivosde origem, como por exemplo * ou /admin/*.

    *

    oi/Ola.xhtml

    Redirecionamento

    Por padro, a requisio ser encaminhada para a pgina de destino. Se precisarmosfazer o redirecionamento, basta incluir o elemento .

    *

    oi/Ola.xhtml

    www.algaworks.com 67

  • Captulo 5

    Componentes de interface

    5.1. Bibliotecas

    Para desenvolver um sistema completo em JavaServer Faces, voc deve conhecer pelomenos os principais componentes bsicos. Quando falamos em componentes bsicos,queremos dizer os componentes padres da especificao da tecnologia.

    As bibliotecas de tags so:

    Core: existe para dar suporte s outras bibliotecas, e no possuicomponentes visuais. Aprenderemos esta biblioteca no decorrer do livro,sempre que for necessrio

    HTML: possui componentes que geram contedo visual, como formulrios,campos de entrada, rtulos de sada de textos, botes, links, selees,painis, tabela de dados, mensagens e etc.

    Facelets: a biblioteca para criao de templates de pginas.

    Composite: usada para criar componentes customizados.

    Neste captulo, focaremos nos componentes visuais, da biblioteca HTML.

    Para usar as bibliotecas, temos que import-las atravs dos namespacescorrespondentes.

  • xmlns:ui="http://xmlns.jcp.org/jsf/facelets"xmlns:composite="http://xmlns.jcp.org/jsf/composite">

    Importamos as bibliotecas de tags e nomeamos com os prefixos f, h, ui e composite.Os prefixos podem ser modificados, mas os que usamos so os convencionais.

    5.2. Cabealho e corpo da pgina

    Os componentes e renderizam as tags HTML e ,respectivamente.

    A importncia destes componentes no apenas a renderizao das tags em HTML,pois seria muito simples escrever as tags HTML diretamente no cdigo da pgina.Na etapa de renderizao da resposta, o JSF pode incluir recursos necessriosdinamicamente, como por exemplo referncia a arquivos JavaScript e CSS.

    5.3. Formulrios

    JavaServer Faces possui um componente para renderizar formulrios HTML, chamado.

    Form

    www.algaworks.com 69

  • A tag gerou um elemento da HTML. Apesar da tag da HTMLpossuir as propriedades method e action, o componente do JSF no possui, poissempre considerado o mtodo post e a ao igual ao endereo da mesma pgina,como voc pode ver no cdigo gerado.

    Form

    5.4. Propriedades comuns

    As tags dos componentes possuem propriedades que dizem como eles devemfuncionar. As propriedades podem ser bsicas, quando so compartilhadas pelamaioria das tags, HTML, tambm conhecido como pass-through HTML, quandorepresentam os mesmos atributos dos elementos HTML, e eventos DHTML, quandodo suporte a scripts de eventos, como ao clicar, ao passar o mouse por cima, etc.

    A propriedade id

    A propriedade id est presente em quase todos os componentes. Ela nos permiteidentificar os componentes da pgina para referncia posterior, atravs de classes Javaou outros componentes JSF, alm de poder acessar os elementos da HTML atravs descripts.

    Para exemplificar, criaremos uma pgina com um campo de entrada de texto e umboto. Apenas para simplificar, o boto no ser criado usando um componente JSF.Ao clicar no boto, um cdigo JavaScript ir alterar o contedo do campo de entrada.

    www.algaworks.com 70

  • Propriedades comuns

    function alterarValorCampo() {var campo = document.getElementById('meuForm:meuCampo');campo.value = 'Valor alterado';

    }

    Veja que criamos uma funo JavaScript chamada alterarValorCampo(). Esta funo chamada no evento onclick do boto "Alterar valor", e deve alterar o valor do campopara "Valor alterado". O campo que inclumos renderizado em HTML da seguinteforma:

    Veja que o id do elemento input foi configurado para meuForm:meuCampo. O id doformulrio usado para definir o id do elemento HTML do campo de entrada. Com esteidentificador, usamos a seguinte programao JavaScript para acess-lo:

    var campo = document.getElementById('meuForm:meuCampo');

    A propriedade binding

    A propriedade binding pode ser especificada com uma expresso ligao quereferencia uma propriedade do bean do tipo do componente. J usamos este atributoquando falamos sobre backing beans.

    www.algaworks.com 71

  • A propriedade rendered

    A propriedade rendered tambm est presente na maioria das tags. Ela controla arenderizao do componente. Se o valor ou o resultado da expresso for false, ocomponente no ser renderizado.

    As propriedades style e styleClass

    possvel utilizar estilos CSS (Cascade Style Sheet) em componentes de modo inlineou usando classes CSS.

    Estilos

    .campo {background-color: #ccc;color: white

    }

    Falaremos sobre importao de arquivos CSS mais adiante. Nesse exemplo, definimosuma classe CSS no prprio arquivo da pgina.

    .campo {

    background-color: #ccc;color: white

    }

    www.algaworks.com 72

  • A classe CSS "campo" configura a cor de fundo para cinza e a cor da fonte para branco.

    O campo que adicionamos referencia a classe CSS atravs da propriedade styleClass,e alm disso, adiciona novos estilos inline na propriedade style, configurando umacor e estilo de borda.

    Ao executar a pgina, podemos ver que as caractersticas do campo forammodificadas.

    A maioria dos componentes da biblioteca HTML possuem as propriedades style estyleClass.

    As propriedades da HTML

    As propriedades da HTML, tambm conhecidos como pass-through HTML,representam exatamente os atributos de elementos da prpria HTML. No vamoslistar todos eles aqui, mas apenas usar alguns como exemplo.

    Propriedades HTML

    Veja como este componente renderizado:

    www.algaworks.com 73

  • As propriedades maxlength, size e title simplesmente foram repassadas para ocdigo de sada, por isso so chamadas de pass-through HTML.

    As propriedades de eventos DHTML

    As propriedades que suportam scripts, que so executados em algum evento dousurio, so chamadas de propriedades de eventos DHTML. Quase todas as tags dabiblioteca HTML possuem essas propriedades.

    No campo de entrada do exemplo abaixo, usamos algumas propriedades para incluircdigos JavaScript que tratam eventos do usurio.

    Propriedades DHTML

    Os cdigos JavaScript sero renderizados na sada para o navegador. Quando o usurioclicar sobre o campo, seu valor ser alterado para vazio, ao alterar o valor do campo,ele ser modificado para letras maisculas, ao passar o cursor do mouse por cima docampo, a cor de fundo ser alterada e ao retirar o cursor do mouse de cima do campo,a cor de fundo ficar branca.

    5.5. Entrada de textos

    Existem trs tipos de componentes que renderizam campos de entrada de texto:, e .

    www.algaworks.com 74

  • O componente

    O componente renderiza um campo de entrada de texto simples,representado pelo elemento input do tipo "text" da HTML. J usamos estecomponente anteriormente. No exemplo a seguir, o campo de entrada est ligado propriedade nome do managed bean meuBean.

    O componente

    O componente renderiza um campo de entrada de senha,representado pelo elemento input do tipo "password" da HTML. O texto digitado apresentado de forma secreta.

    O componente

    O componente renderiza um campo de entrada de textosmaiores, que podem ter vrias colunas e linhas, e representado pelo elementotextarea na HTML. Os atributos cols e rows definem o tamanho de colunas e linhasda rea do texto, respectivamente. O cdigo abaixo cria uma rea de texto com 3 linhase 40 colunas:

    5.6. Sada de textos

    Existem trs tipos de componentes que renderizam sadas de textos: , e .

    O componente

    O componente renderiza textos simples na pgina.

    www.algaworks.com 75

  • O exemplo acima renderiza o trecho HTML a seguir (considerando que o beansegurancaBean exista).

    Bem-vindo Thiago

    Veja que o texto "Bem-vindo" no est envolvido por nenhum elemento da HTML.Quando usamos algum atributo que deve ser refletido no cdigo HTML, como o id oustyle, o texto gerado dentro da tag , como aconteceu com "Thiago".

    O componente

    O componente renderiza textos parametrizados na pgina. Ostextos parametrizados so compostos por espaos reservados (placeholders), que sosubstitudos por valores no momento da renderizao.

    Os valores parametrizados so definidos com nmeros entre chaves, iniciando a partirdo nmero zero. As definies dos valores so feitas atravs da tag dabiblioteca core.

    OutputFormat

    www.algaworks.com 76

  • O componente

    O componente renderiza o elemento da HTML. Os componentesdeste tipo so vinculados com outros atravs do atributo for. O uso deste componente justificado para rotular campos de seus formulrios.

    O cdigo acima renderiza a seguinte sada em HTML:

    Nome:

    5.7. Imagens

    O componente renderiza o elemento da HTML, que exibeuma imagem na pgina. O endereo da imagem deve ser informado no atributo valueou url, pois um atalho para o outro. Este componente permite voc usar o caminhorelativo ao contexto, ou seja, voc no precisa informar o caminho do contexto daaplicao, pois colocado automaticamente.

    O cdigo acima renderiza a seguinte sada em HTML:

    O arquivo logo.png deve ser colocado em src/main/webapp/imagens.

    Biblioteca de recursos

    A partir do JSF 2, todos os recursos web, como imagens, CSS e JavaScript, podem sercolocados no diretrio src/main/webapp/resources.

    Um subdiretrio dentro de resources considerado como uma biblioteca de recursosdo projeto, e voc pode referenciar qualquer um dos recursos pelos atributos librarye name de alguns componentes.

    www.algaworks.com 77

  • Estamos referenciando o recurso logo.png da biblioteca algaworks. O caminho doarquivo no projeto src/main/webapp/resources/algaworks/logo.png.

    Veja a sada em HTML

    5.8. Menus e caixas de listagem

    Existem 4 componentes que renderizam elementos de menus e caixas de listagem:, , e.

    O componente

    O componente renderiza um menu de seleo nica,representado pelo elemento da HTML, com o atributo size igual a 1 e sem o atributomultiple, que permitiria selees mltiplas.

    Precisamos passar uma relao de itens que aparecero na lista, usando a tag.

    O cdigo acima renderiza a seguinte sada em HTML:

    Time de futebol favorito:

    CorinthiansFlamengoPalmeiras

    www.algaworks.com 78

  • SantosSo PauloVascoOutro

    O valor especificado no atributo itemValue da tag do itemselecionado passado para a propriedade do managed bean usada na ligao do valordo componente, por isso, precisamos criar um atributo com seu getter e setter no beanCadastroTorcedorBean.

    private String timeFavorito;public String getTimeFavorito() {

    return timeFavorito;}

    public void setTimeFavorito(String timeFavorito) {this.timeFavorito = timeFavorito;

    }

    O resultado no browser o seguinte:

    Os valores especificados na tag so usados tambm como rtulos dositens do menu. Algumas vezes temos a necessidade de ter os valores diferentes dosrtulos, e por isso a tag possui a propriedade itemLabel.

    Veja o cdigo HTML gerado:

    www.algaworks.com 79

  • Time de futebol favorito:

    TimoMengoPalmeirasSantosSo PauloVascoOutro

    O resultado ser:

    O componente

    O componente renderiza um menu de seleo mltipla,representado pelo elemento da HTML, com o atributo size igual a 1 e multiple iguala multiple.

    O cdigo acima renderiza a seguinte sada em HTML:

    Times de futebol favoritos:

    CorinthiansFlamengoPalmeirasSantos

    www.algaworks.com 80

  • So PauloVascoOutro

    Como este componente possibilita a seleo de mais de um item da seleo, omanaged bean deve possuir uma propriedade do tipo de array para comportar oselementos selecionados. No caso deste exemplo, precisamos criar uma propriedade dotipo String[] com o nome timesFavoritos.

    private String[] timesFavoritos;public String[] getTimesFavoritos() {

    return timesFavoritos;}

    public void setTimesFavoritos(String[] timesFavoritos) {this.timesFavoritos = timesFavoritos;

    }

    O componente

    Este componente renderiza um elemento HTML de qualquer tamanho (especificado)e sem o atributo multiple, ou seja, possvel selecionar apenas um item da seleo.

    O componente

    Este componente renderiza um elemento HTML de qualquer tamanho (especificado)e com o atributo multiple, ou seja, possvel selecionar vrios itens da seleo.

    www.algaworks.com 81

  • O usurio pode selecionar nenhum, um ou vrios itens da seleo.

    5.9. Campos de checagem e botes rdio

    Existem 3 componentes que renderizam elementos de campos de checagem e botesrdio: , e.

    O componente

    Este componente renderiza um elemento HTML do tipo radio, usadoquando voc deseja exibir uma lista de opes que podem ser selecionadasunicamente.

    possvel alterar o layout no qual os itens so apresentados, especificando apropriedade layout. Os valores possveis para este atributo so pageDirection elineDirection (padro).

    www.algaworks.com 82

  • O layout pageDirection exibe os itens na vertical.

    O componente

    O componente renderiza o elemento da HTML do tipo checkbox. Use este componente para definir atributos booleanos.

    No managed bean, precisamos criar uma propriedade booleana para receber a opodo usurio. Se o campo for selecionado, a propriedade receber o valor true, casocontrrio, receber o valor false.

    private boolean termoAceito;public boolean isTermoAceito() {

    return termoAceito;}

    public void setTermoAceito(boolean termoAceito) {this.termoAceito = termoAceito;

    }

    O componente

    Este componente renderiza uma lista de campos de checagem. O usurio podeselecionar nenhum, um ou vrios itens.

    www.algaworks.com 83

  • Como definimos os valores dos itens da seleo como numricos e o usurio podeselecionar mltiplos elementos da lista, criamos um atributo no managed bean dotipo Integer[].

    private Integer[] assuntosInteresse;public Integer[] getAssuntosInteresse() {

    return assuntosInteresse;}

    public void setAssuntosInteresse(Integer[] assuntosInteresse) {this.assuntosInteresse = assuntosInteresse;

    }

    possvel alterar o layout para apresentao dos itens. Os valores possveis paraeste atributo so pageDirection e lineDirection (padro). Veja um exemplo com olayout pageDirection.

    O layout pageDirection exibe os itens na vertical.

    www.algaworks.com 84

  • 5.10. Itens de seleo

    Existem situaes que precisamos que uma lista de itens seja obtida dinamicamente,para disponibilizar ao usurio a seleo em qualquer um dos componentes que vimosnas ltima sees. Esta lista pode vir de um banco de dados, de um arquivo oude qualquer outra origem. Quando existe essa necessidade, precisamos da tag (no plural).

    Neste exemplo, criaremos uma lista de opes com nomes de cidades. Primeiramente,vamos criar nosso managed bean.

    @ManagedBean@ViewScopedpublic class MinhaCidadeBean {

    private String cidadeNatal;private List todasCidades;public MinhaCidadeBean() {

    this.todasCidades = new ArrayList();this.todasCidades.add("Uberlndia-MG");this.todasCidades.add("Uberaba-MG");this.todasCidades.add("Belo Horizonte-MG");this.todasCidades.add("So Paulo-SP");this.todasCidades.add("Campinas-SP");this.todasCidades.add("So Jos dos Campos-SP");this.todasCidades.add("Rio de Janeiro-RJ");this.todasCidades.add("Goinia-GO");this.todasCidades.add("Fortaleza-CE");this.todasCidades.add("Porto Velho-RO");

    }

    public String getCidadeNatal() {return cidadeNatal;

    }

    public void setCidadeNatal(String cidadeNatal) {this.cidadeNatal = cidadeNatal;

    }

    public List getTodasCidades() {return todasCidades;

    }

    }

    Na pgina JSF, inclumos o componente com uma lista deseleo.

    www.algaworks.com 85

  • 5.11. Botes e links

    Aprenderemos a incluir botes e links com os componentes , e .

    O componente

    J usamos este componente em exemplos anteriores. Este componente gera umelemento da HTML do tipo submit, image ou reset. O atributo type pode serespecificado com submit (padro) ou reset. Para botes representados por imagens,basta informar o caminho no atributo image, que o tipo do elemento alteradoautomaticamente para image.

    Nos botes de comando, a propriedade action pode ser especificada com expressesde ligao de mtodos ou outcome de navegao.

    O componente

    O componente gera uma ncora em HTML (link) que funcionacomo um boto de submisso de formulrio. Veja alguns exemplos de uso.

    www.algaworks.com 86

  • Para os links reagirem como um boto e submeter o formulrio usando o mtodoPOST, o framework gera vrios cdigos em JavaScript. Veja a sada em HTML:

    Cadastrar

    Voltar

    O componente

    Os componentes e submetem requisies aoservidor. Em determinadas situaes, voc pode precisar simplesmente de um linkcomum da HTML. Para este caso, existe o componente .

    Este componente facilita a construo de URLs com parmetros (querystring). Osparmetros so especificados usando a tag .

    Ao clicar no link gerado pelo cdigo acima, somos redirecionados para o endereohttp://www.algaworks.com/?codigo=931&grupo=Java.

    5.12. Painis

    JavaServer Faces possui componentes de painis que ajudam a organizar os outroscomponentes da pgina.

    www.algaworks.com 87

  • O componente

    O componente renderiza uma tabela da HTML. Ele funciona comouma grade organizadora de itens no layout da pgina, e pode acomodar qualqueroutro componente.

    O atributo columns especifica o nmero de colunas que queremos por linha. Orenderizador do organiza os componentes em colunas, da esquerdapara a direita, e de cima para baixo.

    Cada componente que estiver dentro do painel ser acomodado em uma clula databela. Quando precisamos pular uma clula, podemos incluir um componente semvalor algum ou que no gera informaes visuais, como foi o caso de .

    possvel alterar a espessura da borda, o espaamento entre clulas, cores e vriasoutras coisas, da mesma forma que voc tambm pode fazer com as tabelas HTML.

    Voc pode tambm especificar o cabealho e rodap do painel usando a tag. Esta tag define um fragmento de cdigo que faz algum sentido parao componente. Por exemplo, para definir o cabealho, o nome do facet deve ser"header", e para rodap, "footer".

    www.algaworks.com 88

  • O componente

    Este componente um container que agrupa seus filhos. Ele deve ser usado,especialmente, em situaes onde desejado a incluso de vrios componentes emum lugar que apenas um permitido, por exemplo, como uma nica clula do.

    Vamos ver como faramos para incluir um boto ao lado de um campo de entrada detexto usando para organizar os componentes.

    Veja o resultado:

    www.algaworks.com 89

  • 5.13. Mensagens

    As aplicaes precisam tratar entradas do usurio, process-las e exibir mensagens desucesso, erros, advertncias e etc. Estudaremos em outro captulo sobre validao econverso de dados, mas j podemos trabalhar com mensagens de feedback para osusurios, pois os managed beans possuem o poder de adicionar mensagens a uma fila,que em algum momento pode ser exibida na pgina.

    Criaremos um managed bean que instancia uma mensagem e adiciona ao contexto doframework.

    @ManagedBeanpublic class CadastroBean {

    private String nome;public void cadastrar() {

    FacesContext context = FacesContext.getCurrentInstance();

    FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado.",

    "Cliente " + this.nome + " cadastrado com sucesso.");context.addMessage(null, mensagem);

    }

    public String getNome() {return nome;

    }

    public void setNome(String nome) {this.nome = nome;

    }

    }

    Instanciamos um objeto da classe FacesMessage, passando como parmetro aseveridade da mensagem, uma mensagem resumida e uma mensagem detalhada. Essaclasse fornece outros construtores tambm.

    www.algaworks.com 90

  • O mtodo FacesContext.addMessage recebe o id do componente que a mensagemser associada e uma instncia de FacesMessage. Veja que no associamos amensagem com nenhum componente, pois passamos null no primeiro parmetro.

    Para exibir todas as mensagens na pgina, usamos o componente ,podendo especificar se queremos exibir a mensagem de detalhe e/ou de resumo, almde aceitar tambm propriedades de estilos CSS.

    Veja o resultado:

    5.14. Tabelas de dados

    O componente gera uma tabela HTML, que deve ser associada a umalista de elementos de um managed bean, atravs de uma expresso de ligao de valor.O managed bean pode obter dados dinamicamente, atravs de um banco de dados,arquivo, etc.

    Nosso exemplo ser de uma tabela de dados de livros favoritos. Precisamos criar umaclasse que representar um livro, chamada Livro.

    public class Livro {private String titulo;private String autor;public Livro() {}

    public Livro(String titulo, String autor) {

    www.algaworks.com 91

  • super();this.titulo = titulo;this.autor = autor;

    }

    public String getTitulo() {return titulo;

    }

    public void setTitulo(String titulo) {this.titulo = titulo;

    }

    public String getAutor() {return autor;

    }

    public void setAutor(String autor) {this.autor = autor;

    }

    }

    Nosso managed bean LivrosBean possuir uma lista de livros, que ser preenchida nainstanciao de objetos da classe.

    @ManagedBean@ViewScopedpublic class LivrosBean {

    private List livros;public LivrosBean() {

    this.livros = new ArrayList();this.livros.add(new Livro("Java e Orientao a Objetos",

    "Thiago Faria"));this.livros.add(new Livro("JPA 2 e Hibernate", "Thiago Faria"));this.livros.add(new Livro("JavaServer Faces", "Thiago Faria"));this.livros.add(new Livro("Test Driven Development", "Kent Beck"));this.livros.add(new Livro("Start Small, Stay Small",

    "Rob Walling"));this.livros.add(new Livro("Trabalhe 4 Horas Por Semana",

    "Timothy Ferris"));this.livros.add(new Livro("Getting Real", "Jason Fried"));this.livros.add(new Livro("Rework", "Jason Fried"));

    }

    public List getLivros() {return livros;

    }

    public void setLivros(List livros) {this.livros = livros;

    }

    www.algaworks.com 92

  • }Criaremos agora uma pgina Livros.xhtml, que listar os livros favoritos atravs docomponente .

    Livros favoritos

    Relao de livros favoritos

    Ttulo

    Autor

    Quando este componente processado, cada item da lista, referenciada atravs doatributo value, fica disponvel dentro do corpo da tag. O nome de cada item da lista definido pelo atributo var, possibilitando o acesso dentro das colunas.

    Definimos o facet header da tabela de dados, que corresponde ao cabealho daprpria tabela.

    Relao de livros favoritos

    www.algaworks.com 93

  • Inserimos duas colunas com . Dentro de cada coluna, podemos incluirqualquer quantidade de componentes. No caso deste exemplo, inserimos apenas um, alm do facet header, que corresponde ao cabealho da coluna.

    Ttulo

    Autor

    Formulrio para incluso de livros

    Deixaremos a pgina de livros favoritos um pouco mais dinmica, possibilitando queo prprio usurio adicione novos livros. Vamos alterar o managed bean LivrosBeanpara o cdigo abaixo:

    @ManagedBean@ViewScopedpublic class LivrosBean {

    private List livros;private Livro novoLivro;public LivrosBean() {

    this.livros = new ArrayList();this.novoLivro = new Livro();

    }

    www.algaworks.com 94

  • public void adicionar() {this.livros.add(this.novoLivro);this.novoLivro = new Livro();

    }

    public List getLivros() {return livros;

    }

    public void setLivros(List livros) {this.livros = livros;

    }

    public Livro getNovoLivro() {return novoLivro;

    }

    }

    No arquivo Livros.xhtml, incluiremos um painel com os campos e