david geary cay horstmann - … · escopo de aplicação 46 escopo de requisição 47 anotações...
TRANSCRIPT
iv Java Server Faces
Core JavaServer Faces Fundamentos - Segunda EdiçãoDo original Core JavaServer Faces Copyright © 2007 da Editora Alta Books Ltda.
Authorized translation from English language edition, entitled Core JavaServer Faces, by David Geary andCay Horstman, published by Sun Microsystems, Inc. Copyright © 2007 by Sun Microsystems, Inc.PORTUGUESE language edition published by Editora Alta Books, Copyright © 2007 by Editora Alta Books.
Todos os direitos reservados e protegidos pela Lei 5988 de 14/12/73. Nenhuma parte deste livro, semautorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem osmeios empregados: eletrônico, mecânico, fotográfico, gravação ou quaisquer outros. Todo o esforço foifeito para fornecer a mais completa e adequada informação, contudo a editora e o(s) autor(es) não assumemresponsabilidade pelos resultados e usos da informação fornecida. Recomendamos aos leitores testar ainformação, bem como tomar todos os cuidados necessários (como o backup), antes da efetiva utilização.Este livro não contém CD-ROM, disquete ou qualquer outra mídia.
Erratas e atualizações: Sempre nos esforçamos para entregar a você, leitor, um livro livre de erros técnicosou de conteúdo; porém, nem sempre isso é conseguido, seja por motivo de alteração de software,interpretação ou mesmo quando alguns deslizes constam na versão original de alguns livros quetraduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br, a seção Erratas, onde relataremos,com a devida correção, qualquer erro encontrado em nossos livros.
Avisos e Renúncia de Direitos: Este livro é vendido como está, sem garantia de qualquer tipo, sejaexpressa ou implícita.
Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercialsão de responsabilidade de seus proprietários. A Editora informa não estar associada a nenhum produtoe/ou fornecedor apresentado no livro. No decorrer da obra, imagens, nomes de produtos e fabricantespodem ter sido utilizados, e desde já a Editora informa que o uso é apenas ilustrativo e/ou educativo, nãovisando ao lucro, favorecimento ou desmerecimento do produto/fabricante.
Produção Editorial: Editora Alta BooksCoordenação Editorial: Fernanda Silveira
Tradução: Patrícia Azeredo e Fausto MagalhãesRevisão: Mônica Mourão
Revisão Técnica: Eduardo VelascoDiagramação: Marcelo Saraiva
Impresso no Brasil
O código de propriedade intelectual de 1º de Julho de 1992 proíbe expressamente o uso coletivo sem autorização dosdetentores do direito autoral da obra, bem como a cópia ilegal do original. Esta prática generalizada nos estabelecimentosde ensino, provoca uma brutal baixa nas vendas dos livros a ponto de impossibilitar os autores de criarem novas obras.
Rua Viúva Cláudio, 291 – JacaréRio de Janeiro – RJ. CEP: 20970-031
Tel: 21 3278-8069/ Fax: 3277-1253site: www.altabooks.com.br
e-mail: [email protected]
vIntrodução
Sumário
Prefácio xv
Agradecimentos xix
1 PRIMEIROS PASSOS 2
Por que JavaServer Faces? 3
Instalação do Software 4
Um exemplo Simples 6
Ingredientes 8
Estrutura de diretórios 8
Instruções para construção 10
Análise da aplicação de exemplo 10
Beans 11
Páginas JSF 12
Navegação 14
Configuração de servlets 15
O arquivo de boas-vindas 17
Ambientes de desenvolvimento para o JSF 17
Ambientes de desenvolvimento integrado 17
Ferramentas para ambiente visual 18
Automação do processo de construção com Ant 20
Serviços do framework JSF 23
Nos bastidores 25
Renderizando páginas 26
Decodificando requisições 26
O ciclo de vida 28
vi Java Server Faces
2 BEANS GERENCIADOS 30
Definição de um bean 31
Propriedades dos beans 33
Expressões de atribuição de valor 34
Message bundles 35
Mensagens com partes variáveis 36
Configurando as informações de localidadeda aplicação 37
Uma aplicação de exemplo 38
Backing beans 44
Escopos dos beans 45
Escopo de sessão 45
Escopo de aplicação 46
Escopo de requisição 47
Anotações sobre o ciclo de vida 47
Configurando beans 47
Definindo valores de propriedades 48
Inicializando listas e mapas 49
Encadeando definições de beans 50
Convertendo strings 51
A sintaxe das expressões de atribuição de valor 53
Usando colchetes 53
Usando as expressões msp e list 54
Resolvendo o termo inicial 55
Usando expressões compostas 56
Usando expressões de atribuição de método 57
3 NAVEGAÇÃO 58
Navegação estática 59
Navegação dinâmica 60
Questões avançadas de navegação 69
Redirecionando 69
Usando caracteres curinga 69
viiIntrodução
Usando from-action 71
O algoritmo de navegação 71
4 TAGS PADRÃO DO JSF 74
Uma visão geral das tags fundamentais do JSF 75
Uma visão geral das tags HTML do JSF 78
Atributos comuns 80
Formulários 86
Elementos de formulário e JavaScript 87
Campos de texto e áreas de texto 90
Campos ocultos 93
Usando campos de texto e áreas de texto 94
Exibindo textos e imagens 96
Botões e links 98
Usando botões de comando 100
Usando links de comando 103
Tags de seleção 107
Caixas de verificação de botões de rádio 109
Menus e caixas de listagem 111
Itens 113
Mensagens 126
Painéis 131
5 TABELAS DE DADOS 136
A tag Data Table - h:dataTable 137
Uma tabela simples 138
Atributos de h:dataTable 141
Atributos de h:column 142
Cabeçalhos, rodapés e captions 142
Componentes JSF 145
Editando células de tabelas 148
Estilos 150
Estilos por coluna 151
viii Java Server Faces
Estilos por linha 152
Tabelas de bancos de dados 153
Resultado JSTl vs. Conjuntos de resultados 156
Modelos de tabelas 156
Editando modelos de tabelas 157
Ordenando e filtrando 161
Técnicas de rolagem 168
Rolagem com uma scrollbar 168
Rolagem com page widgets 169
6 CONVERSÃO E VALIDAÇÃO 170
Visão geral do processo de conversão e validação 171
Usando conversores padrão 172
Conversão de números e datas 172
Erros de conversão 176
Um exemplo completo de conversor 181
Usando validadores padrão 183
Validando extensões de strings e faixas numéricas 183
Verificando valores obrigatórios 184
Exibindo erros de validação 184
Desviando da validação 186
Um exemplo completo de validação 186
Programando com conversores e validadores customizados 188
Implementando classes de conversores customizadas 188
Implentando classes validadoras customizadas 198
Registrando validadores customizados 200
Validando com métodos Bean 202
Fornecendo atributos aos conversores 202
Validando relações entre múltiplos componentes 203
ixIntrodução
7 MANIPULAÇÃO DE EVENTOS 208
Eventos do ciclo de vida 209
Eventos de alteração de valor 210
Eventos de ação 214
Tags event listener 220
As tags f:actionListener e f:valueChangeListener 221
Componentes imediatos 222
Usando componentes de inputs imediatos 222
Usando componentes de comando imediatos 225
Passando dados da IU para o servidor 225
A tag f:param 226
A tag f: attribute 227
A tag f:setPropertyActionListener 227
Eventos de fase 228
Jutando tudo 235
8 SUBVIEWS E TILES 242
Layouts comuns 243
Um visualizador de livros e uma biblioteca 243
O visualizador de livros 244
Páginas JSf monolíticas 247
Incluindo conteúdo comum 251
Inclusão de conteúdo em aplicações baseadas no JSP 251
Considerações específicas do JSF 252
Inclusão de conteúdo no visualizador de livros 252
Observando o tiles 254
Instalando o tiles 255
Usando o tiles com o visualizador de livros 255
Parametrizando o tiles 257
Estendendo o tiles 257
A biblioteca 260
Tiles aninhados 260
Controladores de tile 260
x Java Server Faces
9 COMPONENTES PERSONALIZADOS, 270CONVERSORES E VALIDADORES
Classes para implementar componentes personalizados 272
Tags e componentes 275
A caixa de ferramentas do desenvolvedor decomponentes personalizados 275
Codificação: gerando código markup 277
Decodificação: processando valores de requisição 280
Usando conversores 282
Implementando tags para componentes personalizados 284
O arquivo TLD 284
A classe tag handler 287
A aplicação spinner 289
Definindo tag handlers no JSF 1.1 292
Revisitando o spinner 295
Usando um renderizador externo 296
Invocando conversores a partir de renderizadoresexternos 300
Implementando suporte a listeners de mudançade valor 300
Implementando suporte a expressões de método 301
A aplicação de exemplo 302
Codificando JavaScript para evitar viagens de ida e voltaao servidor 307
Usando componentes subordinados e Facets 309
Processando elementos subordinados de SelectItem 312
Processando facets 313
Codificando estilos CSS 314
Usando campos ocultos 315
Salvando e restaurando estados 315
Disparando eventos de ação 318
Usando o painel com abas 321
Implementando conversores e validadores personalizados 325
Tags para conversores personalizados 325
xiIntrodução
Tags para validadores personalizados 331
10 SERVIÇOS EXTERNOS 338
Acessando um banco de dados com JDBC 339
Emitindo comando SQL 339
Gerenciando conexões 340
Reparando vazamentos de conexão 341
Usando declarações preparadas 342
Configurando uma fonte de dados 343
Configurando um recurso de banco dedados no GlassFish 343
Configurando um recurso de banco dedados no Tomcat 345
Acessando um recurso gerenciado por container 347
Um exemplo de banco de dados completo 348
Uma introdução ao LDAP 355
Diretórios LDAP 355
Configurando um servidor LDAP 356
Acessando informações de diretórios LDAP 359
Gerenciando informações de configuração 363
Configurando um bean 363
Configurando o contexto externo 365
Configurando um recurso gerenciado porcontainer 366
Criando uma aplicação LDAP 369
Autenticação e autorização gerenciadas por container 377
Usando serviços web 385
11 AJAX 394
Fundamentos do Ajax 395
Bibliotecas de JavaScript 397
A biblioteca Prototype 398
A biblioteca Fade Anything Technique 398
Preenchimento de formulários 398
Validação em tempo real 399
xii Java Server Faces
Propagando o estado da view client-side 401
Direct web remoting 404
Componentes Ajax 406
Componentes híbridos 406
Mantendo o JavaScript separado dosrenderizadores 408
Transmitindo os atributos de tags do JSPpara o código JavaScript 413
Ajax4jsf 413
Implementando o preenchimento de
formulários com o Ajax4jsf 414
Implementando validação em tempo realcom o Ajax4jsf 414
12 CÓDIGO ABERTO 426
Fluxo de aplicações web - Shale 427
Configuração de diálogos 431
Inserindo um diálogo 431
Navegação entre diálogos 432
Escopo do diálogo 432
Sensibilidade do diálogo ao contexto 434
Subdiálogos 436
Tecnologias de view alternativas - Facets 437
Views XHTML 438
Substituindo o código markup porcomponentes JSF: o atributo jsfc 439
Usando tags JSF 441
Criando páginas com modelos 443
Tags personalizadas do Facets 444
Integração com o EJB - Seam 446
Um livro de endereços 446
Configuração 448
Enity beans 451
Stateful session beans 452
xiiiIntrodução
Integração com o JSF DataModel 454
Escopo da conversação 455
13 COMO EU FAÇO PARA... 458
Design de interfaces de usuário web 459
Como eu faço para encontrar maiscomponentes? 459
Como eu faço para implementar suporte auploads? 460
Como eu faço para exibir um map de imagem? 468
Como eu faço para incluir um applet na minhapágina? 469
Como eu faço para produzir dados bináriosem uma página JSF? 470
Como eu faço para exibir um grande conjuntode dados, com uma página de cada vez? 478
Como eu faço para gerar uma janela pop-up? 481
Como eu faço para exibir e ocultarcomponentes através de seleção? 487
Como eu faço para personalizar páginas de erro? 488
Validação 491
Como eu faço para escrever a minha própriatag de validação client-side? 491
Como eu uso o validador do Shale paravalidação client-side? 496
Como eu faço para validar realções entrecomponentes? 498
Programação 498
Como eu faço para usar o JSF com o eclipse? 498
Como eu faço para encontrar um arquivo deconfiguração? 502
Como eu faço para que um componente JSFacesse recursos de um arquivo JAR? 502
Como eu faço para empacotar um conjuntode tags em um arquivo JAR? 505
Como eu faço para obter o ID de formuláriopara gerar document.forms[id] em JavaScript? 506
xiv Java Server Faces
Como eu faço uma função JavaScript aparecersomente uma vez por página? 506
Como eu faço para executar tarefas deinicia.lização ou de limpeza? 507
Como eu faço para armazenar um managedbean por mais tempo que o escopo darequisição, mas por menos tempo que oescopo da sessão? 507
Como eu faço para estender a linguagem deexpressão JSF? 508
Debugging e logging 511
Como eu faço para decifrar um stack trace? 511
Como eu faço para evitar uma “stack tracemaldita”? 513
Como eu faço para executar um “hot deploy”na minha aplicação? 514
Como eu faço para comentar parte de umapágina JSF? 515
Como eu faço para encontrar os logs? 515
Como eu descubro quais parâmetros aminha página recebeu? 517
Como eu faço para ativar o logging docontainer JSf? 518
Como eu faço o debug de uma página travada? 520
Com eu encontro o código-fonte da biblioteca? 521
xvIntrodução
Prefácio
Quando ouvimos falar do JavaServer Faces (JSF), na conferência Java One em 2002, ficamosbastante entusiasmados. Ambos tínhamos tido longa experiência com programação client-side em Java e havíamos sobrevivido para contar a história — David em Graphic Java® e Cayem Core Java®, ambos publicados pela Sun Microsystems Press. Quando experimentamospela primeira vez programar para a web com servlets e páginas JavaServer (JSP), consideramosessa técnica um tanto contra-intuitiva e tediosa. Já o JavaServer Faces prometia colocar umaface amistosa por cima da aplicação web, permitindo aos programadores pensar sobre camposde texto e menus em vez de se preocupar com mudanças de páginas e parâmetros de requisições.Cada um de nós propôs um projeto de livro ao editor, que imediatamente sugeriu queescrevêssemos em conjunto o livro da Sun Microsystems Press sobre essa tecnologia.
Passaram-se mais dois anos até que o Grupo de Especialistas em JSF (do qual David fazparte) publicasse a especificação JSF 1.0 e a sua implementação de referência. A versão 1.1veio logo em seguida para corrigir bugs e, em 2006, a publicação da versão 1.2 acrescentourecursos de limpeza e outras comodidades.
O JSF agora é o framework proeminente em termos de programação em Java server-side,tendo cumprido boa parte de suas promessas. É realmente possível elaborar interfaces deusuário web colocando-se componentes em um formulário e ligando-os a objetos Java, semprecisar misturar código e markup. Um ponto forte do JSF está em o seu modelo decomponentes extensíveis, com um grande número de componentes de terceiros se tornandodisponíveis. O design flexível deste framework permitiu que ele crescesse bem e acomodassenovas tecnologias como o Ajax. O JSF também foi projetado para dar suporte a ferramentas,e a primeira leva de programas criadores de GUIs no estilo arrastar-e-soltar finalmente apareceu.E, por fim, ao contrário de tecnologias concorrentes que fazem você desabar morro abaixoapós dar um simples passo além do básico, o JSF oferece suporte às partes mais complexas— separação entre lógica de apresentação e de negócios, navegação, conexões com serviçosexternos e gerenciamento de configurações.
Nos continuamos entusiasmados com o JSF e esperamos que você compartilhe desse entusiasmoquando aprender como essa tecnologia o torna um desenvolvedor de aplicações para webmais eficaz.
Sobre Este Livro
Este livro é adequado para desenvolvedores web cujo foco principal está na elaboração deinterfaces de usuário, bem como para programadores que implementam componentes
xvi Java Server Faces
reutilizáveis em aplicações web. Isso faz um contraste marcante com a especificação JSFoficial, um documento denso e cheio de palavras difíceis cujo principal público são osimplementadores de framework, bem como os pobres-coitados autores de livros.
A primeira metade do livro, que se estende até o Capítulo 6, se concentra nas tags JSF. Essastags são semelhantes às tags de formulário do HTML. Elas são as unidades básicas para construirinterfaces de usuário em JSF. Não é necessária qualquer programação para se utilizarem as tags.Nós apenas assumimos que o leitor possua habilidades básicas em HTML para a construção depáginas web e conhecimento básico de programação Java para a lógica de negócios.
A primeira parte do livro aborda os seguintes tópicos:
• Configuração de seu ambiente de programação (Capítulo 1)• Conexão de tags JSF à lógica de aplicação (Capítulo 2)• Navegação entre páginas (Capítulo 3)• Uso das tags padrão do JSF (Capítulos 4 e 5)• Conversão e validação do input (Capítulo 6)
A partir do Capítulo 7, começamos com a programação JSF a sério. Você aprenderá como realizartarefas avançadas e como estender a linguagem JSF. Os principais tópicos da segunda parte são:
• Manipulação de eventos (Capítulo 7)• Inclusão de conteúdo em comum entre várias páginas (Capítulo 8)• Implementação de componentes, conversores e validadores customizados (Capítulo 9)• Conexão a bancos de dados e outros serviços externos (Capítulo 10)• Ajax (Capítulo 11)• Tecnologias de código aberto, concentrando-se em Facelets, Seam e Shale (Capítulo 12)
Finalizamos este livro com um capítulo cujo objetivo é responder perguntas comuns, naforma “Como eu faço para..?” (Ver Capítulo 13). Encorajamos você a dar uma olhada nessecapítulo assim que se sentir confortável com o básico do JSF. Nele, é possível encontrarobservações úteis sobre verificação (debugging) e registro (logging) de erros, e também detalhessobre a implementação e códigos funcionais para funções ausentes do JSF, tais como uploadsde arquivos, menus pop-up e um componente paginador para tabelas grandes.
O JSF é construído por cima dos servlets e do JSP mas, do ponto de vista do desenvolvedorJSF, essas tecnologias apenas formam o encanamento mais subterrâneo. Embora não façamal algum se familiarizar com outras
tecnologias web, como servlets, JSP ou Struts, não assumimos que o leitor possua qualquerconhecimento desse tipo.
Software Exigido
Todo o software necessário para este livro está disponível gratuitamente. Você precisa do JavaSoftware Development Kit da Sun Microsystems e um servidor de aplicações que suporte oJSF, como o excelente projeto de código aberto GlassFish. O software roda de forma idêntica
xviiIntrodução
em Linux, Mac OS X, Solaris e Windows. Nós usamos o Java 5 e o GlassFish, tanto no Linuxcomo no Mac OS X, para desenvolver os códigos de exemplo deste livro.
Se você está procurando um ambiente de desenvolvimento que suporte o desenvolvimentocom JSF, recomendamos com entusiasmo o NetBeans IDE, oferecido gratuitamente. Umbom suporte a JSF também pode ser encontrado em produtos comercialmente disponíveisde diversos fabricantes que vendem aprimoramentos para o Eclipse.
Suporte na Web
No site da editora Alta Books (http://www.altabooks.com.br) você vai encontrar (eminglês) o código-fonte de todos os exemplos deste livro.
No site http://corejsf.com você vai encontrar:
• Materiais úteis de referência que consideramos mais eficazes em formato navegável do queem formato impresso.• Uma lista de erros detectados no livro e nos códigos.• Um formulário para envio de correções e sugestões.
xixIntrodução
Agradecimentos
Antes de mais nada, gostaríamos de agradecer a Greg Doench, nosso editor na Prentice Hall, quenos guiou durante este projeto, nunca perdendo a calma apesar dos vários atrasos e complicações.
Apreciamos imensamente o esforço dos nossos revisores para as duas edições, que fizeramum esplêndido trabalho encontrando erros e sugerindo melhorias em vários esboços domanuscrito. São eles:
• Gail Anderson, Anderson Software Group, Inc.• Larry Brown, LMBrown.com, Inc.• Frank Cohen, PushToTest• Brian Goetz, Sun Microsystems, Inc.• Rob Gordon, Crooked Furrow Farm• Marty Hall, autor de Core Java Servlets and JavaServer Pages• Charlie Hunt, Sun Microsystems, Inc.• Jeff Langr, Langr Software Solutions• Bill Lewis, Tufts University• Jeff Markham, Markham Software Company• Angus McIntyre, IBM Corporation• John Muchow, autor de Core J2ME• Dan Shellman, BearingPoint• Sergei Smirnov, principal arquiteto do Exadel JSF Studio• Roman Smolgovsky, Flytecomm• Stephen Stelting, Sun Microsystems, Inc.• Christopher Taylor, Nanshu Densetsu• Michael Yuan, co-autor de JBoss Seam: Simplicity and Power Beyond Java EE
Finalmente, agradecemos às nossas famílias e amigos, que nos apoiaram durante este projetoe que compartilham de nosso alívio ao vê-lo enfim completo.