to Web Com Jsf2 e Jpa2

Embed Size (px)

Citation preview

TREINAMENTOS

Desenvolvimento Web com JSF2 e JPA2

Desenvolvimento Web com JSF 2 e JPA 2

15 de maro de 2011

www.k19.com.br

ii

Sumrio1 Banco de dados 1.1 Bases de dados (Databases) . 1.2 Tabelas . . . . . . . . . . . . 1.3 Operaes Bsicas . . . . . . 1.4 Chaves Primria e Estrangeira 1.5 Consultas Avanadas . . . . . 1.6 Exerccios . . . . . . . . . . . 1 2 4 7 11 11 12 27 27 28 28 28 29 29 31 33 33 34 35 36 37 37 37 37 38 38 39 40 41 43 43 43 44 44

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

2

JDBC 2.1 Driver . . . . . . . . . . . . . . . . . . . . . 2.2 JDBC . . . . . . . . . . . . . . . . . . . . . 2.3 Instalando o Driver JDBC do MySQL Server 2.4 Criando uma conexo . . . . . . . . . . . . . 2.5 Inserindo registros . . . . . . . . . . . . . . 2.6 Exerccios . . . . . . . . . . . . . . . . . . . 2.7 SQL Injection . . . . . . . . . . . . . . . . . 2.8 Exerccios . . . . . . . . . . . . . . . . . . . 2.9 Listando registros . . . . . . . . . . . . . . . 2.10 Exerccios . . . . . . . . . . . . . . . . . . . 2.11 Fbrica de conexes (Factory) . . . . . . . . 2.12 Exerccios . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

3

JPA 2 e Hibernate 3.1 Mltiplas sintaxes da linguagem SQL . . . . . . . . . . . 3.2 Orientao a Objetos VS Modelo Entidade Relacionamento 3.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . 3.4 O que JPA e Hibernate . . . . . . . . . . . . . . . . . . 3.5 Congurao . . . . . . . . . . . . . . . . . . . . . . . . 3.6 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . 3.7 Gerando o banco . . . . . . . . . . . . . . . . . . . . . . 3.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9 Manipulando entidades . . . . . . . . . . . . . . . . . . . 3.9.1 Persistindo . . . . . . . . . . . . . . . . . . . . . 3.9.2 Buscando . . . . . . . . . . . . . . . . . . . . . . 3.9.3 Removendo . . . . . . . . . . . . . . . . . . . . . 3.9.4 Atualizando . . . . . . . . . . . . . . . . . . . . . iii

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

SUMRIO 3.9.5 Listando . 3.9.6 Transaes 3.10 Exerccios . . . . . 3.11 Repository . . . . . 3.12 Exerccios . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO . . . . . . . . . . . . . . . . . . . . 44 44 45 46 47 49 49 49 50 50 50 51 51 51 52 52 53 53 53 55 55 55 56 56 56 57 58 63 63 65 66 67 68 68 68 71 71 72 73 74 iv

Web Container 4.1 Necessidades de uma aplicao web . 4.2 Web Container . . . . . . . . . . . . 4.3 Especicao Java EE . . . . . . . . 4.4 Exerccios . . . . . . . . . . . . . . . 4.5 Aplicao Web Java . . . . . . . . . . 4.6 Exerccios . . . . . . . . . . . . . . . 4.7 Processando requisies . . . . . . . 4.8 Servlet . . . . . . . . . . . . . . . . . 4.8.1 Inserindo contedo na resposta 4.9 Exerccios . . . . . . . . . . . . . . . 4.10 JSP . . . . . . . . . . . . . . . . . . 4.11 Exerccios . . . . . . . . . . . . . . . 4.12 Frameworks . . . . . . . . . . . . . . Viso Geral do JSF 2 5.1 Aplicao de exemplo . . . . . . 5.2 Managed Beans . . . . . . . . . 5.2.1 GeradorDeApostasBean 5.3 Facelets e Componentes Visuais 5.3.1 Tela de entrada . . . . . 5.3.2 Tela de Sada . . . . . . 5.4 Exerccios . . . . . . . . . . . . Componentes Visuais 6.1 Formulrios . . . 6.2 Panel Grid . . . . 6.3 Panel Group . . . 6.4 Tabelas . . . . . 6.5 Namespaces . . . 6.6 Esqueleto HTML 6.7 Exerccios . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

. . . . . . . . . . . . .

5

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

6

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

7

Facelets 7.1 Templating . . . . . 7.2 Exerccios . . . . . . 7.3 Particionando as telas 7.4 Exerccios . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

www.k19.com.br

SUMRIO 8 Navegao 8.1 Navegao Esttica Implcita . 8.2 Navegao Esttica Explcita . 8.3 Exerccios . . . . . . . . . . . 8.4 Navegao Dinmica Implcita 8.5 Navegao Dinmica Explcita 8.6 Exerccios . . . . . . . . . . .

SUMRIO 77 77 78 78 80 81 81 85 85 86 86 86 87 87 87 87 88 88 89 90 90 91 92 95 95 95 96 97 97 98 98 99 101 101 101 101 102 102 102 102 103

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

9

Managed Beans 9.1 Criando Managed Beans . . . . . . . . . . . . . . . . 9.2 Disponibilizando dados para as telas . . . . . . . . . . 9.3 Recebendo dados das telas . . . . . . . . . . . . . . . 9.4 Denindo o tratamento das aes . . . . . . . . . . . . 9.5 Expression Language . . . . . . . . . . . . . . . . . . 9.5.1 Nome dos Managed Beans . . . . . . . . . . . 9.5.2 Acessando as propriedades dos Managed Beans 9.6 Binding . . . . . . . . . . . . . . . . . . . . . . . . . 9.7 Escopo . . . . . . . . . . . . . . . . . . . . . . . . . . 9.7.1 Request . . . . . . . . . . . . . . . . . . . . . 9.7.2 Session . . . . . . . . . . . . . . . . . . . . . 9.7.3 Application . . . . . . . . . . . . . . . . . . . 9.7.4 View . . . . . . . . . . . . . . . . . . . . . . 9.8 Interdependncia e Injeo . . . . . . . . . . . . . . . 9.9 Exerccios . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . .

10 Converso e Validao 10.1 Converso . . . . . . . . . . . . . . . . 10.1.1 Converso Padro Implcita . . 10.1.2 Converso Padro Explcita . . 10.2 Mensagens de Erro . . . . . . . . . . . 10.2.1 h:message . . . . . . . . . . . . 10.2.2 h:messages . . . . . . . . . . . 10.2.3 Alterando as Mensagens de Erro 10.3 Exerccios . . . . . . . . . . . . . . . . 10.4 Validao . . . . . . . . . . . . . . . . 10.4.1 Validao Padro . . . . . . . . 10.4.2 Campo Obrigatrio (Required) . 10.4.3 f:validateLongRange . . . . . . 10.4.4 f:validateDoubleRange . . . . . 10.4.5 f:validateLength . . . . . . . . 10.4.6 f:validateRegex . . . . . . . . . 10.4.7 Bean Validation . . . . . . . . . 10.5 Exerccios . . . . . . . . . . . . . . . . v

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . .

K19 Treinamentos

SUMRIO 11 Eventos 11.1 Eventos de Aplicao (Application Events) 11.1.1 ActionEvent . . . . . . . . . . . . 11.1.2 ValueChangeEvent . . . . . . . . . 11.2 Eventos de Ciclo de Vida (Lifecycle Events) 11.3 Exerccios . . . . . . . . . . . . . . . . . . 12 Ajax 12.1 Fazendo requisies AJAX . . . . . . . . 12.2 Recarregando alguns pedaos das telas . 12.3 Processando alguns pedaos das telas . 12.4 Palavras especiais . . . . . . . . . . . . . 12.5 Exerccios . . . . . . . . . . . . . . . . .

SUMRIO 107 107 107 108 109 109 113 113 114 115 115 116 119 119 119 120 120 121 121 122 122 123 123 124 125 126 127 127 129 130 132 132 133 133 133 134 135 135 139 139 140 140 143 143 vi

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

13 Projeto 13.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . 13.2 Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.3 Persistncia - Mapeamento . . . . . . . . . . . . . 13.4 Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.5 Persistncia - Congurao . . . . . . . . . . . . . 13.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.7 Persistncia - Open Session in View . . . . . . . . 13.7.1 Gerenciando as fbricas de Entity Managers 13.7.2 Filtros . . . . . . . . . . . . . . . . . . . . 13.7.3 Gerenciando os Entity Managers . . . . . . 13.8 Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.9 Persistncia - Repositrios . . . . . . . . . . . . . 13.10Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.11Apresentao - Template . . . . . . . . . . . . . . 13.12Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.13Cadastrando e Listando Selees . . . . . . . . . . 13.14Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.15Mensagens de Erro . . . . . . . . . . . . . . . . . 13.16Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.17Removendo Selees . . . . . . . . . . . . . . . . 13.18Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.19Otimizando o nmero de consultas . . . . . . . . . 13.20Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.21Cadastrando, Listando e Removendo Jogadores . . 13.22Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.23Removendo Selees com Jogadores . . . . . . . . 13.24Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.25Controle de Acesso . . . . . . . . . . . . . . . . . 13.26Exerccios . . . . . . . . . . . . . . . . . . . . . . 13.27Ordem dos ltros . . . . . . . . . . . . . . . . . . 13.28Exerccios . . . . . . . . . . . . . . . . . . . . . . www.k19.com.br

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO 13.29Controle de Erro 13.30Exerccios . . . . 13.31Enviando email . 13.32Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

SUMRIO . . . . . . . . . . . . . . . . 144 144 146 147

vii

K19 Treinamentos

SUMRIO

SUMRIO

www.k19.com.br

viii

Captulo 1 Banco de dadosO nosso objetivo desenvolver aplicaes em Java. Essas aplicaes necessitam armazenar as informaes relacionadas ao seu domnio em algum lugar. Por exemplo, uma aplicao de gerenciamento de uma livraria deve armazenar os dados dos livros que ela comercializa. Uma forma de suprir essa necessidade seria armazenar essas informaes em arquivos. Contudo, alguns fatores importantes nos levam a descartar tal opo. A seguir, apresentamos as principais preocupaes a serem consideradas ao trabalhar com dados: Segurana: As informaes potencialmente condenciais devem ser controladas de forma que apenas usurios e sistemas autorizados tenham acesso a elas. Integridade: Eventuais falhas de software ou hardware no devem corromper os dados. Acesso: As funes de consulta e manipulao dos dados devem ser implementadas. Concorrncia: Usualmente, diversos sistemas e usurios acessaro as informaes de forma concorrente. Apesar disso, os dados no podem ser perdidos ou corrompidos. Considerando todos esses aspectos, conclumos que seria necessria a utilizao de um sistema complexo para manusear as informaes das nossas aplicaes. Felizmente, tal tipo de sistema j existe e conhecido como Sistema Gerenciador de Banco de Dados (SGBD).

Sistemas gerenciadores de banco de dadosNo mercado, h diversas opes de sistemas gerenciadores de banco de dados. A seguir, apresentamos os mais populares: 1

Banco de dados Oracle SQL Server MySQL Server PostgreSQL

MySQL ServerNeste treinamento, utilizaremos o MySQL Server, que mantido pela Oracle e vastamente utilizado no mercado. O MySQL Server pode ser obtido a partir do site: http://www.mysql.com.

MySQL Query BrowserPara interagir com o MySQL Server, utilizaremos um cliente com interface grca chamado de MySQL Query Browser.

1.1

Bases de dados (Databases)

Um sistema gerenciador de banco de dados capaz de gerenciar informaes de diversos sistemas ao mesmo tempo. Por exemplo, as informaes dos clientes de um banco, alm dos produtos de uma loja virtual. Caso os dados fossem mantidos sem nenhuma separao lgica, a organizao caria prejudicada. Alm disso, seria mais difcil implementar regras de segurana referentes ao acesso dos dados. Tais regras criam restries quanto ao contedo acessvel por cada usurio. Determinado usurio, por exemplo, poderia ter permisso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da loja virtual, ou vice-versa. Ento, por questes de organizao e segurana, os dados devem ser armazenados separadamente no SGBD. Da surge o conceito de base de dados (database). Uma base de dados um agrupamento lgico das informaes de um determinado domnio, como, por exemplo, os dados da nossa livraria.

Criando uma base de dados no MySQL ServerPara criar uma base de dados no MySQL Server, utilizamos o comando CREATE DATABASE. www.k19.com.br 2

Banco de dados

3

K19 Treinamentos

Banco de dados

Repare que alm da base de dados livraria h outras trs bases. Essas bases foram criadas automaticamente pelo prprio MySQL Server para teste ou para guardar algumas conguraes. Quando uma base de dados no mais necessria, ela pode ser removida atravs do comando DROP DATABASE.

1.2

Tabelas

Um servidor de banco de dados dividido em bases de dados com o intuito de separar as informaes de sistemas diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de uma base a m de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Por exemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome e CPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outra para os dados relacionados aos clientes.

nome Jos Maria

Cliente idade cpf 27 31875638735 32 30045667856

numero 1 2

Conta saldo 1000 2000

limite 500 700 4

www.k19.com.br

Banco de dados Uma tabela formada por registros(linhas) e os registros so formados por campos(colunas). Por exemplo, suponha uma tabela para armazenar as informaes dos clientes de um banco. Cada registro dessa tabela armazena em seus campos os dados de um determinado cliente.

Criando tabelas no MySQL Server

As tabelas no MySQL Server so criadas atravs do comando CREATE TABLE. Na criao de uma tabela necessrio denir quais so os nomes e os tipos das colunas.

5

K19 Treinamentos

Banco de dados

www.k19.com.br

6

Banco de dados

Se uma tabela no for mais desejada ela pode ser removida atravs do comando DROP TABLE.

1.3

Operaes Bsicas

As operaes bsicas para manipular os dados das tabelas so: inserir, ler, alterar e remover. Essas operaes so realizadas atravs da linguagem de consulta denominada SQL. Esta linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE e DELETE. Estes comandos so utilizados para inserir, ler, alterar e remover registros respectivamente. 7 K19 Treinamentos

Banco de dados

www.k19.com.br

8

Banco de dados

9

K19 Treinamentos

Banco de dados

www.k19.com.br

10

Banco de dados

1.4

Chaves Primria e Estrangeira

Suponha que os livros da nossa livraria so separados por editoras. Uma editora possui nome e telefone. Para armazenar esses dados, uma nova tabela deve ser criada. Nesse momento, teramos duas tabelas (Livro e Editora). Eventualmente, ser necessrio descobrir qual a editora de um determinado livro ou quais so os livros de uma determinada editora. Para isso, os registros da tabela Editora devem estar relacionados aos da tabela Livro. Na tabela Livro, poderamos adicionar uma coluna para armazenar o nome da editora a qual ele pertence. Dessa forma, se algum quiser recuperar as informaes da editora de um determinado livro, deve consultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deve consultar a tabela Editora para obter as informaes da editora. Porm, h um problema nessa abordagem, a tabela Editora aceita duas editoras com o mesmo nome. Dessa forma, eventualmente, no conseguiramos descobrir os dados corretos da editora de um determinado livro. Para resolver esse problema, deveramos criar uma restrio na tabela Editora que proba a insero de editoras com o mesmo nome. Para resolver esse problema no MySQL Server, poderamos adicionar a propriedade UNIQUE no campo nome da tabela Editora. Porm ainda teramos mais um problema: na tabela livro poderamos adicionar registros com editoras inexistentes, pois no h nenhum vnculo explcito entre as tabelas. Para solucionar estes problemas, devemos utilizar o conceito de chave primria e chave estrangeira. Toda tabela pode ter uma chave primria, que um conjunto de um ou mais campos que devem ser nicos para cada registro. Normalmente, um campo numrico escolhido para ser a chave primria de uma tabela, pois as consultas podem ser realizadas com melhor desempenho. Ento, poderamos adicionar um campo numrico na tabela Editora e torn-lo chave primria. Vamos chamar esse campo de id. Na tabela Livro, podemos adicionar um campo numrico chamado editora_id que deve ser utilizado para guardar o valor da chave primria da editora correspondente ao livro. Alm disso, o campo editora_id deve estar explicitamente vinculado com o campo id da tabela Editora. Para estabelecer esse vnculo o campo editora_id deve ser uma chave estrangeira associada ao campo id. Uma chave estrangeira um conjunto de uma ou mais colunas de uma tabela que possuem valores iguais aos da chave primria de outra tabela. Com a denio da chave estrangeira, um livro no pode ser inserido com o valor do campo editora_id invlido. Caso tentssemos obteramos uma mensagem de erro.

1.5

Consultas Avanadas

Com o conceito de chave estrangeira, podemos fazer consultas complexas envolvendo os registros de duas ou mais tabelas. Por exemplo, descobrir todos os livros de uma determinada editora.

11

K19 Treinamentos

Banco de dados

1.6

Exerccios

1. Abra o MySQL Query Browser utilizando localhost como Server Hostname, root como Username e root como Password.

2. Caso exista uma base de dados chamada Livraria, remova-a conforme a gura abaixo:

www.k19.com.br

12

Banco de dados 3. Crie uma nova base de dados chamada livraria, conforme mostrado na gura abaixo. Voc vai utilizar esta base nos exerccios seguintes.

4. Selecione a base de dados livraria como padro. 13 K19 Treinamentos

Banco de dados

5. Crie uma tabela chamada Editora conforme as guras abaixo.

Altere o modo de criao da tabela para InnoDB, conforme mostrado na gura. www.k19.com.br 14

Banco de dados

Crie os campos conforme a gura e no esquea de tornar todos os campos obrigatrios, marcando a opo NOT NULL. Alm disso o campo id deve ser uma chave primria e automaticamente incrementada. 15 K19 Treinamentos

Banco de dados

6. Crie uma tabela chamada Livro conforme as guras abaixo:

Altere o modo de criao da tabela para InnoDB, conforme mostrado na gura. www.k19.com.br 16

Banco de dados

Novamente, adicione os campos conforme a gura abaixo, lembrando de marcar a opo NOT NULL. Alm disso o campo id deve ser uma chave primria e automaticamente incrementada. 17 K19 Treinamentos

Banco de dados

Voc precisa tornar o campo editora_id em uma chave estrangeira. Selecione a aba Foreign Keys e clique no boto com o smbolo de mais para adicionar uma chave estrangeira. Depois siga os procedimentos conforme mostrados na gura abaixo. www.k19.com.br 18

Banco de dados

7. Adicione alguns registros na tabela Editora. Veja exemplos na gura abaixo: 19 K19 Treinamentos

Banco de dados

8. Adicione alguns registros na tabela Livro. Veja exemplos na gura abaixo:

www.k19.com.br

20

Banco de dados 9. Consulte os registros da tabela Editora, e em seguida consulte a tabela Livro. Veja exemplos logo abaixo:

21

K19 Treinamentos

Banco de dados 10. Altere alguns dos registros da tabela Livro. Veja o exemplo abaixo:

11. Altere alguns dos registros da tabela Editora. Veja o exemplo abaixo: www.k19.com.br 22

Banco de dados

12. Remova alguns registros da tabela Livro. Veja o exemplo abaixo:

23

K19 Treinamentos

Banco de dados 13. Remova alguns registros da tabela Editora. Preste ateno para no remover uma editora que tenha algum livro relacionado j adicionado no banco. Veja o exemplo abaixo:

14. Faa uma consulta para buscar todos os livros de uma determinada editora. Veja um exemplo na gura abaixo: www.k19.com.br 24

Banco de dados

25

K19 Treinamentos

Banco de dados

www.k19.com.br

26

Captulo 2 JDBCNo captulo anterior, aprendemos que utilizar bancos de dados uma boa soluo para o armazenamento dos dados de uma aplicao. Entretanto, voc deve ter percebido que a interface de utilizao do MySQL (e dos outros bancos de dados em geral) no muito amigvel. A desvantagem deste tipo de interface, que ela exige que o usurio conhea a sintaxe da linguagem SQL para escrever as consultas. Alm disso, quando o volume de dados muito grande, mais difcil visualizar os resultados. Na prtica uma aplicao com interface simples desenvolvida para permitir que os usurios do sistema possam manipular os dados do banco, evitando desse modo que um usurio necessite conhecer SQL. Por isso, precisamos fazer com que essa aplicao consiga se comunicar com o banco de dados utilizado no sistema.

2.1

Driver

Como a aplicao precisa conversar com o banco de dados, ela deve trocar mensagens com o mesmo. O formato das mensagens precisa ser denido previamente. Por questes de economia de espao, cada bit de uma mensagem tem um signicado diferente. Resumidamente, o protocolo de comunicao utilizado binrio. Mensagens denidas com protocolos binrios so facilmente interpretadas por computadores. Por outro lado, so complexas para um ser humano compreender. Dessa forma, mais trabalhoso e mais suscetvel a erro desenvolver uma aplicao que converse com um banco de dados atravs de mensagens binrias. Para resolver esse problema e facilitar o desenvolvimento de aplicaes que devem se comunicar com bancos de dados, as empresas que so proprietrias desses bancos oferecem os drivers de conexo. Os drivers de conexo atuam como tradutores de comandos escritos em uma determinada linguagem de programao para comandos no protocolo do banco de dados. Do ponto de vista do desenvolvedor da aplicao, no necessrio conhecer o complexo protocolo binrio do banco. Em alguns casos, o protocolo binrio de um determinado banco de dados fechado. Consequentemente, a nica maneira de se comunicar com o banco de dados atravs de um driver de conexo. 27

JDBC

2.2

JDBC

Suponha que os proprietrios dos bancos de dados desenvolvessem os drivers de maneira totalmente independente. Consequentemente, cada driver teria sua prpria interface, ou seja, seu prprio conjunto de instrues. Dessa maneira, o desenvolvedor da aplicao precisa conhecer as instrues de cada um dos drivers dos respectivos bancos que ele for utilizar. Para facilitar o trabalho do desenvolvedor da aplicao, foi criado o JDBC (Java Database Connectivity). O JDBC uma API que generaliza a interface com os banco de dados. Assim, quando uma empresa proprietria de um banco de dados pretende desenvolver um driver para ser utilizado com a linguagem Java, ela segue a especicao JDBC com o intuito de incentivar a adoo do driver.

2.3

Instalando o Driver JDBC do MySQL Server

O driver ocial JDBC desenvolvido para funcionar com o MySQL se chama MySQL Connector/J. necessrio fazer o download do driver na seguinte url: http://www.mysql.com/downloads/connector/j/. s descompactar o arquivo e depois incluir o jar com o driver no BUILD PATH da aplicao.

2.4

Criando uma conexo

Com o driver de conexo JDBC adicionado ao projeto, j possvel criar uma conexo com o banco de dados correspondente. Abaixo, esto os passos necessrios para criar uma conexo. Escolher o driver de conexo; Denir a localizao do banco de dados; Informar o nome da base de dados; Ter um usurio e senha cadastrados no banco de dados. As informaes sobre o driver, localizao e nome da base de dados so denidas no que chamamos de url de conexo (ou string de conexo). O usurio e a senha, informamos no momento de criar uma conexo. Para criar esta conexo, utilizamos as classes D RIVER M ANAGER (que instancia a conexo) e C ONNECTION (que armazena a nossa conexo), ambas presentes no pacote JAVA . SQL.1 2 3 4 5 6 7 8 String urlDeConexao = "jdbc:mysql://localhost/livraria"; String usuario = "root"; String senha = ""; try { Connection conn = DriverManager.getConnection(urlDeConexao, usuario, senha); } catch (SQLException e) { e.printStackTrace(); }

www.k19.com.br

28

JDBC

2.5

Inserindo registros

Estabelecida a conexo com o banco de dados, j podemos executar comandos. Como primeiro exemplo, iremos inserir registros em uma tabela. O primeiro passo para executar um comando deni-lo em linguagem SQL.1 2 string textoDoComando = "INSERT INTO Editora (nome, email)" + "VALUES (K19, [email protected]);";

Em seguida, devemos pedir para uma conexo JDBC atravs do mtodo PREPARE S TATE criar o comando que queremos executar. Este mtodo devolve um objeto da interface P REPARED S TATEMENT. O comando no executado na chamada do mtodo PREPARE S TA TEMENT () e sim posteriormente quando o mtodo EXECUTE () for utilizado.MENT ()1 2 3 4 5 // criando comando PreparedStatement comando = conexao.prepareStatement(textoDoComando); // executando o comando comando.execute(); comando.close();

Podemos utilizar a mesma conexo para executar diversos comandos. Quando no desejamos executar mais comandos, devemos fechar a conexo atravs do mtodo CLOSE (). Fechar as conexes que no so mais necessrias importante pois os SGBDs possuem um nmero limitado de conexes abertas.1 close.close();

2.6

Exerccios

1. Crie um projeto java no eclipse chamado JDBC.

2. Crie uma pasta chamada lib no projeto JDBC.

3. Entre na pasta K19-Arquivos/MySQL-Connector-JDBC da rea de Trabalho e copie o arquivo MYSQL - CONNECTOR - JAVA -5.1.13- BIN . JAR para pasta lib do projeto JDBC.

4. Adicione o arquivo MYSQL - CONNECTOR - JAVA -5.1.1. JAR ao build path (veja gura). 29 K19 Treinamentos

JDBC

5. Crie uma nova classe, com o nome InsereEditora, e adicione o seguinte contedo ao arquivo: www.k19.com.br 30

JDBC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import import import import java.sql.Connection; java.sql.DriverManager; java.sql.PreparedStatement; java.util.Scanner;

public class InsereEditora { public static void main(String[] args) { String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; String usuario = "root"; String senha = "root"; Scanner entrada = new Scanner(System.in); try { System.out.println("Abrindo conexao..."); Connection conexao = DriverManager.getConnection(stringDeConexao, usuario, senha); System.out.println("Digite o nome da editora: "); String nome = entrada.nextLine(); System.out.println("Digite o email da editora: "); String email = entrada.nextLine(); String textoDoComando = "INSERT INTO Editora (nome, email) " + "VALUES (" + nome + ", " + email + ")"; PreparedStatement comando = conexao.prepareStatement(textoDoComando); System.out.println("Executando comando..."); comando.execute(); System.out.println("Fechando conexao..."); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } }

Rode e veja se o registro foi inserido com sucesso na base de dados.

6. (Opcional) Analogamente, ao exerccio anterior crie um programa para inserir livros.

2.7

SQL Injection

Apesar de funcional, a implementao da insero de registros feita anteriormente apresenta uma falha grave. Os dados obtidos do usurio atravs do teclado no so tratados antes de serem enviados para o banco de dados. Esses dados podem conter algum carcter especial que altere o comportamento desejado da consulta impedindo que algum registro seja inserido corretamente ou at abrindo uma brecha para que um usurio mal intencionado execute alguma consulta SQL para utilizar de maneira inadequada os dados da nossa aplicao. 31 K19 Treinamentos

JDBC

O problema de SQL Injection pode ser resolvido manualmente. Basta fazer escape dos caracteres especiais, por exemplo: ponto-e-vrgula e apstrofo. No MySQL Server, os caracteres especiais devem ser precedidos pelo carcter \. Ento seria necessrio acrescentar \ em todas as ocorrncias de caracteres especiais nos valores passados pelo usurio. A desvantagem desse processo que, alm de trabalhoso, diferente para cada banco de dados, pois o \ no padronizado e cada banco tem o seu prprio mtodo de escape de caracteres especiais. Para tornar mais prtica a comunicao com o banco de dados, o prprio driver faz o tratamento das sentenas SQL. Esse processo denominado sanitize.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

// lendo a entrada feita pelo usuario System.out.println("Digite o nome da editora: "); String nome = entrada.nextLine(); System.out.println("Digite o email da editora: "); String email = entrada.nextLine(); // texto do comando inclui parmetros String textoDoComando = "INSERT INTO Editora (nome, email) " + "VALUES (?, ?)"; // criao e adio de parmetros ao comando PreparedStatement comando = conexao.prepareStatement(textoDoComando); comando.setString(1, nome); comando.setString(2, email);

Observe que a sentena SQL foi denida com parmetros atravs do carcter ?. Antes de executar o comando, necessrio atribuir valores aos parmetros. Isso feito com o mtodo SET S TRING , que recebe o ndice (posio) do parmetro na consulta e o valor correspondente. De maneira similar, temos os mtodos SET I NT, SET D OUBLE, SET DATE, etc, variando conforme o tipo do campo que foi denido no banco. Os mtodos acima mostrados, realizam a tarefa de sanitizar(limpar) os valores enviados pelo usurio. www.k19.com.br 32

JDBC

2.8

Exerccios

7. Tente causar um erro de SQL Injection na classe feita no exerccio de inserir editoras. (Dica: tente entradas com aspas simples) 8. Altere o cdigo para eliminar o problema do SQL Injection. Voc deve deixar a classe com o cdigo abaixo:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

public class InsereEditora { public static void main(String[] args) { String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; String usuario = "root"; String senha = "root"; Scanner entrada = new Scanner(System.in); try { System.out.println("Abrindo conexao..."); Connection conexao = DriverManager.getConnection(stringDeConexao, usuario, senha); System.out.println("Digite o nome da editora: "); String nome = entrada.nextLine(); System.out.println("Digite o email da editora: "); String email = entrada.nextLine(); String textoDoComando = "INSERT INTO Editora (nome, email) " + "VALUES (?, ?)"; PreparedStatement comando = conexao.prepareStatement(textoDoComando); comando.setString(1, nome); comando.setString(2, email); System.out.println("Executando comando..."); comando.execute(); System.out.println("Fechando conexao..."); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } }

9. Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras.

2.9

Listando registros

O processo para executar um comando de consulta bem parecido com o processo de inserir registros. 33 K19 Treinamentos

JDBC1 2 3 4 5 6 String textoDoComando = "SELECT * FROM Editora;"; PreparedStatement comando = conexao.prepareStatement(textoDoComando); System.out.println("Executando comando..."); ResultSet resultado = comando.executeQuery();

A diferena que para executar um comando de consulta necessrio utilizar o mtodo EXECUTE Q UERY () ao invs do EXECUTE (). Esse mtodo devolve um objeto da interface JAVA . SQL .R ESULT S ET , que responsvel por armazenar os resultados da consulta. Os dados contidos no R ESULT S ET podem ser acessados atravs de mtodos, como o GET STRING , GET I NT , GET D OUBLE, etc, de acordo com o tipo do campo. Esses mtodos recebem como parmetro uma string referente ao nome da coluna correspondente.1 2 3 int id = resultado.getInt("id"), String nome = resultado.getString("nome"), String email = resultado.getString("email");

O cdigo acima mostra como os campos do primeiro registro da consulta so recuperados. Agora, para recuperar os outros registros necessrio avanar o R ESULT S ET atravs do mtodo NEXT .1 2 3 4 5 6 7 8 9 int id1 = resultado.getInt("id"), String nome1 = resultado.getString("nome"), String email1 = resultado.getString("email"); resultado.next(); int id2 = resultado.getInt("id"), String nome2 = resultado.getString("nome"), String email2 = resultado.getString("email");

O prprio mtodo NEXT devolve um valor booleano para indicar se o R ESULT S ET conseguiu avanar para o prximo registro. Quando esse mtodo devolver FALSE signica que no h mais registros para serem consultados.1 2 3 4 5 while(resultado.next()) { int id = resultado.getInt("id"), String nome = resultado.getString("nome"), String email = resultado.getString("email"); }

2.10

Exerccios

10. Insira algumas editoras utilizando a classe I NSERE E DITORA que voc criou nos exerccios acima. 11. Adicione uma nova classe ao projeto chamada ListaEditoras. O objetivo listar as editoras que foram salvas no banco. Adicione o seguinte cdigo esta classe. www.k19.com.br 34

JDBC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import import import import java.sql.Connection; java.sql.DriverManager; java.sql.PreparedStatement; java.sql.ResultSet;

public class ListaEditoras { public static void main(String[] args) { String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; String usuario = "root"; String senha = "root"; try { System.out.println("Abrindo conexao..."); Connection conexao = DriverManager.getConnection(stringDeConexao, usuario, senha); String textoDoComando = "SELECT * FROM Editora;"; PreparedStatement comando = conexao.prepareStatement(textoDoComando); System.out.println("Executando comando..."); ResultSet resultado = comando.executeQuery(); System.out.println("Resultados encontrados: \n"); while (resultado.next()) { System.out.printf("%d : %s - %s\n", resultado.getInt("id"), resultado.getString("nome"), resultado.getString("email")); } System.out.println("\nFechando conexao..."); conexao.close(); } catch (Exception e) { e.printStackTrace(); } } }

2.11

Fbrica de conexes (Factory)

Voc deve ter percebido que em diversos pontos diferentes da nossa aplicao precisamos de uma conexo JDBC. Se a url de conexo for denida em cada um desses pontos teremos um problema de manuteno. Imagine que o driver do banco seja atualizado ou que o ip do SGBD seja alterado. Teramos que alterar o cdigo da nossa aplicao em muitos lugares, mais precisamente, em cada ocorrncia da url de conexo. A probabilidade de algum ponto no ser corrigido grande. Para diminuir o trabalho de manuteno, ns poderamos criar uma classe responsvel pela criao e distribuio de conexes. Nessa e somente nessa classe estaria denida a url de conexo. Dessa forma, qualquer alterao no modo em que nos conectamos base de dados, s acarreta mudanas nesta classe. 35 K19 Treinamentos

JDBC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class FabricaDeConexao { public static Connection criaConexao() { String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; String usuario = "root"; String senha = "root"; Connection conexao = null; try { conexao = DriverManager.getConnection(stringDeConexao, usuario, senha); } catch (SQLException e) { e.printStackTrace(); } return conexao; } }

Agora podemos obter uma nova conexo apenas chamando FABRICA D E C ONEXAO .C RIAC ONEXAO (). O resto do sistema no precisa mais conhecer os detalhes sobre a criao das conexes com o banco de dados, diminuindo o acoplamento da aplicao.

2.12

Exerccios

12. Adicione uma nova classe chamada FABRICA D E C ONEXAO e adicione o seguinte cdigo:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class FabricaDeConexao { public static Connection CriaConexao() { String stringDeConexao = "jdbc:mysql://localhost:3306/livraria"; String usuario = "root"; String senha = "root"; Connection conexao = null; try { conexao = DriverManager.getConnection(stringDeConexao, usuario, senha); } catch (SQLException e) { e.printStackTrace(); } return conexao; } }

13. Altere as classes I NSERE E DITORA e L ISTA E DITORAS para que elas utilizem a fbrica de conexo. Execute-as novamente. 14. (Opcional) Implemente um teste que remove uma editora pelo id. 15. (Opcional) Implemente um teste que altera os dados de uma editora pelo id.

www.k19.com.br

36

Captulo 3 JPA 2 e Hibernate3.1 Mltiplas sintaxes da linguagem SQL

No captulo anterior, voc aprendeu a utilizar a especicao JDBC para fazer uma aplicao Java interagir com um banco de dados. Essa interao realizada atravs de consultas escritas em SQL. Uma desvantagem dessa abordagem, que a sintaxe da linguagem SQL, apesar de parecida, pode variar conforme o banco de dados que est sendo utilizado. Desse modo, os desenvolvedores teriam que aprender as diferenas entres as sintaxes do SQL correspondentes aos banco de dados que ele utilizar. Seria bom se, ao invs de programar direcionado a um determinado banco de dados, pudssemos programar de uma maneira mais genrica, voltado uma interface ou especicao, assim poderamos escrever o cdigo independente de SQL.

3.2

Orientao a Objetos VS Modelo Entidade Relacionamento

Outro problema na comunicao entre uma aplicao Java e um banco de dados o conito de paradigmas. O banco de dados organizado seguindo o modelo entidade relacionamento, enquanto as aplicaes Java, geralmente, utilizam o paradigma orientado a objetos. A transio de dados entre o modelo entidade relacionamento e o modelo orientado a objetos no simples. Para realizar essa transio, necessrio denir um mapeamento entre os conceitos desses dois paradigmas. Por exemplo, classes podem ser mapeadas para tabelas, objetos para registros, atributos para campos e referncia entre objetos para chaves estrangeiras.

3.3

Ferramentas ORM

Para facilitar a comunicao entre aplicaes Java que seguem o modelo orientado a objetos e os banco de dados que seguem o modelo entidade relacionamento, podemos utilizar ferramentas que automatizam a transio de dados entre as aplicaes e os diferente bancos de dados e que so conhecidas como ferramentas de ORM (Object Relational Mapper). Outra consequncia, ao utilizar uma ferramenta de ORM, que no necessrio escrever consultas em SQL, pois a prpria ferramenta gera as consultas de acordo com a sintaxe da 37

JPA 2 e Hibernate linguagem SQL correspondente ao banco que est sendo utilizado. A principal ferramenta ORM para Java utilizada no mercado de TI o Hibernate. Mas, existem outras que possuem o mesmo objetivo.

3.4

O que JPA e Hibernate

Aps o sucesso do Hibernate, a especicao JPA (Java Persistence API) foi criada com o objetivo de padronizar as ferramentas ORM para aplicaes Java e consequentemente diminuir a complexidade do desenvolvimento. Atualmente, essa especicao est na sua segunda verso. Ela especca um conjunto de classes e mtodos que as ferramentas de ORM devem implementar. Veja que a JPA apenas uma especicao, ela no implementa nenhum cdigo. Para isso, utilizamos alguma das diversas implementaes da JPA. Neste curso, utilizaremos o Hibernate como implementao de JPA. As outras implementaes de JPA mais conhecidas so: TopLink, EclipseLink e OpenJPA. Optamos por utilizar o Hibernate por ele ser o mais antigo e mais utilizado atualmente. Caso voc queira utilizar outro framework ORM, poder aplicar os conceitos aqui aprendidos justamente por que eles seguem a mesma especicao. Assim podemos programar voltado especicao e substituir uma implementao pela outra, sem precisar reescrever o cdigo da nossa aplicao. Claro que teramos que alterar alguns arquivos de congurao, mas o cdigo da aplicao permaneceria o mesmo.

3.5

Congurao

Antes de comear a utilizar o Hibernate, necessrio baixar no site ocial o bundle que inclui os jars do hibernate e todas as suas dependncias. Neste curso, utilizaremos a verso 3.5.1. A url do site ocial do Hibernate esta: (http://www.hibernate.org/) Para congurar o Hibernate em uma aplicao, devemos criar um arquivo chamado persistence.xml. O contedo desse arquivo possura informaes sobre o banco de dados, como a url de conexo, usurio e senha. Alm de dados sobre a implementao de JPA que ser utilizada. O arquivo PERSISTENCE . XML deve estar em uma pasta chamada META-INF, que deve estar no classpath da aplicao. Veja abaixo um exemplo de congurao para o PERSIS TENCE . XML : www.k19.com.br 38

JPA 2 e Hibernate1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 org.hibernate.ejb.HibernatePersistence

A propriedade hibernate.dialect permite que a aplicao escolha qual sintaxe de SQL que deve ser utilizada pelo Hibernate.

3.6

Mapeamento

Um dos principais objetivos dos frameworks ORM estabelecer o mapeamento entre os conceitos do modelo orientado a objetos e os conceitos do modelo entidade relacionamento. Este mapeamento pode ser denido atravs de xml ou de maneira mais prtica com anotaes Java. Quando utilizamos anotaes, evitamos a criao de extensos arquivos em xml. A seguir veremos as principais anotaes Java de mapeamento do JPA. Essas anotaes esto no pacote javax.persistence. @Entity a principal anotao do JPA. Ela que deve aparecer antes do nome de uma classe. E deve ser denida em todas as classes que tero objetos persistidos no banco de dados. As classes anotadas com @E NTITY so mapeadas para tabelas. Por conveno, as tabelas possuem os mesmos nomes das classes. Mas, podemos alterar esse comportamento utilizando a anotao @TABLE. Os atributos declarados em uma classe anotada com @E NTITY so mapeados para colunas na tabela correspondente classe. Outra vez, por conveno, as colunas possuem os mesmos nomes dos atributos. E novamente, podemos alterar esse padro utilizando a anotao @C OLUMN. @Id Utilizada para indicar qual atributo de uma classe anotada com @E NTITY ser mapeado para a chave primria da tabela correspondente classe. Geralmente o atributo anotado com @I D do tipo L ONG. @GeneratedValue Geralmente vem acompanhado da anotao @I D. Serve para indicar que o atributo gerado pelo banco, no momento em que um novo registro inserido. 39 K19 Treinamentos

JPA 2 e Hibernate @Table Utilizada para alterar o nome padro da tabela. Ela recebe o parmetro name para indicar qual nome que deve ser utilizado na tabela. Veja o exemplo:1 2 3 4 @Table(name="Publisher") @Entity public class Editora { // ...

@Column Utilizado para alterar o nome da coluna que ser utilizado na tabela. Caso voc esteja utilizando um banco de dados legado, no qual os nomes das colunas j foram denidos, voc pode mudar atravs dessa anotao. Alm disso, podemos estabelecer certas restries, como determinar se o campo pode ou no ser nulo.1 2 3 4 @Entity public class Editora { @Column(name="publisher_name",nullable=false) private String nome;

@Transient Serve para indicar um atributo que no deve ser persistido, ou seja, os atributos anotados com @T RANSIENT no so mapeados para colunas. @Lob Utilizado para atributos que armazenam textos muito grandes, ou arquivos binrios contendo imagens ou sons que sero persistidos no banco de dados. O tipo do atributo deve ser S TRING, B YTE [], BYTE [] ou JAVA . SQL .B LOB. @Temporal Utilizado para atributos do tipo C ALENDAR ou DATE. Por padro, tanto data quanto hora so armazenados no banco de dados. Mas, com a anotao @T EMPORAL, podemos mandar persistir somente a data ou sement a hora.1 2 3 4 5 @Entity public class Livro { @Temporal(TemporalType.DATE) private Calendar publicacao; // ...

3.7

Gerando o banco

Uma das vantagens de utilizar o Hibernate, que ele capaz de gerar as tabelas do banco para a nossa aplicao. Ele faz isso de acordo com as anotaes colocadas nas classes e as informaes presentes no PERSISTENCE . XML. As tabelas so geradas atravs de mtodo da classe P ERSISTENCE, o CREATE E NTITY M A NAGER FACTORY ( STRING ENTITY U NIT ). O parmetro ENTITY U NIT permite escolher, pelo nome, uma unidade de persistncia denida no PERSISTENCE . XML. A poltica de criao das tabelas pode ser alterada congurando a propriedade HIBER NATE . HBM 2 DDL . AUTO no arquivo PERSISTENCE . XML . Podemos, por exemplo, fazer com www.k19.com.br 40

JPA 2 e Hibernate que o Hibernate sempre sobrescreva as tabelas existentes, basta congurar a propriedade BERNATE . HBM 2 DDL . AUTO com o valor CREATE - DROP .1

HI -

Uma outra opo, congurar o Hibernate para simplesmente atualizar as tabelas de acordo com as mudanas nas anotaes sem remov-las. Nesse caso, o valor da propriedade HIBER NATE . HBM 2 DDL . AUTO deve ser UPDATE .1

3.8

Exerccios

1. Crie um projeto no eclipse chamado JPA2-Hibernate e feche o projeto JDBC para no gerar confuso na hora de manipular os arquivos. 2. Crie uma pasta chamada lib dentro do projeto JPA2-Hibernate. 3. Entre na pasta K19-Arquivos/Hibernate da rea de Trabalho e copie os jars do Hibernate para a pasta lib do projeto JPA2-Hibernate. 4. Entre na pasta K19-Arquivos/MySQL-Connector-JDBC da rea de Trabalho e copie o arquivo MYSQL - CONNECTOR - JAVA -5.1.13. BIN . JAR para pasta lib do projeto JPA2Hibernate. 5. Entre na pasta K19-Arquivos/SLF4J da rea de Trabalho e copie os jars para pasta lib do projeto JPA2-Hibernate. 6. Entre na pasta K19-Arquivos/Log4J da rea de Trabalho e copie o arquivo 1.2.16. JAR para pasta lib do projeto JPA2-Hibernate. 7. Adicione os jars da pasta lib ao build path do projeto JPA2-Hibernate. 8. Crie uma pasta chamada META-INF na pasta src no projeto JPA2-Hibernate. 9. Crie o arquivo de conguraes persistence.xml na pasta META-INF. 41 K19 TreinamentosLOG 4 J -

JPA 2 e Hibernate1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 org.hibernate.ejb.HibernatePersistence

10. Crie uma classe para modelar as editoras da nossa livraria e acrescente as anotaes necessrias para fazer o mapeamento. Obs: As anotaes devem ser importadas do pacote JAVAX . PERSISTENCE .1 2 3 4 5 6 7 8 9 10 11 @Entity public class Editora { @Id @GeneratedValue private Long id; private String nome; private String email; // GETTERS AND SETTERS }

11. Apague a tabela Livro e depois a Editora. 12. Congure o Log4J criando um arquivo chamado log4j.properties na pasta src do projeto JPA2-Hibernate.

log4j.rootCategory=INFO, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%r [%t] %-5p %c - %m%n

13. Gere as tabelas atravs da classe P ERSISTENCE. Para isso, crie uma classe com mtodo MAIN . Obs: As classes devem ser importadas do pacote JAVAX . PERSISTENCE . www.k19.com.br 42

JPA 2 e Hibernate1 2 3 4 5 6 7 8 public class GeraTabelas { public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("livraria"); factory.close() } }

Atravs do MySQL Query Browser verique se a tabela E DITORA foi criada corretamente.

3.9

Manipulando entidades

Para manipular as entidades da nossa aplicao, devemos utilizar um E NTITY M ANAGER que obtido atravs de uma E NTITY M ANAGER FACTORY.1 2 3 4 EntityManagerFactory factory = Persistence.createEntityManagerFactory("K19"); EntityManager manager = factory.createEntityManager();

3.9.1

Persistindo

Para armazenar as informaes de um objeto no banco de dados basta utilizar o mtodo PERSIST () do E NTITY M ANAGER .1 2 3 4 5 Editora novaEditora = new Editora(); novaEditora.setNome("K19 - Livros") novaEditora.setEmail("[email protected]"); manager.persist(novaEditora);

3.9.2FIND ()1 2

Buscando

Para obter um objeto que contenha informaes do banco de dados basta utilizar o mtodo ou o GET R EFERENCE () do E NTITY M ANAGER.

Editora editora1 = manager.find(Editora.class, 1L); Editora editora2 = manager.getReference(Editora.class, 2L);

A diferena entre os dois mtodos bsicos de busca FIND () e GET R EFERENCE () que o primeiro recupera os dados desejados imediatamente j o segundo posterga at a primeira chamada de um mtodo GET do objeto. 43 K19 Treinamentos

JPA 2 e Hibernate

3.9.3

RemovendoREMOVE ()

Para remover um registro correspondente a um objeto basta utilizar o mtodo do E NTITY M ANAGER.1 2 Editora editora1 = manager.find(Editora.class, 1L); manager.remove(editora1);

3.9.4

Atualizando

Para alterar os dados de um registro correspondente a um objeto basta utilizar os prprios mtodos setters desse objeto.1 2 Editora editora1 = manager.find(Editora.class, 1L); editora.setNome("K19 - Livros e Publicaes");

3.9.5

Listando

Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, devemos utilizar a linguagem de consulta do JPA, a JPQL que muito parecida com a linguagem SQL. A vantagem do JPQL em relao ao SQL que a sintaxe a mesma para bancos de dados diferentes.1 2 Query query = manager.createQuery("SELECT e FROM Editora e"); List editoras = query.getResultList();

3.9.6

Transaes

As modicaes realizadas nos objetos administrados por um E NTITY M ANAGER so mantidas em memria. Em certos momentos, necessrio sincronizar os dados da memria com os dados do banco de dados. Essa sincronizao deve ser realizada atravs de uma transao JPA criada pelo E NTITY M ANAGER que administra os objetos que desejamos sincronizar. Para abrir uma transao utilizamos o mtodo BEGIN ().1 manager.getTransaction().begin();

FLUSH ()1 2 3 4 5

Com a transao aberta podemos sincronizar os dados com o banco atravs do mtodo ou COMMIT ().

Editora editora1 = manager.find(Editora.class, 1L); editora.setNome("K19 - Livros e Publicaes"); manager.getTransaction().begin(); manager.flush();

www.k19.com.br

44

JPA 2 e Hibernate1 2 3 4 5 Editora editora1 = manager.find(Editora.class, 1L); editora.setNome("K19 - Livros e Publicaes"); manager.getTransaction().begin(); manager.getTransaction().commit();

3.10

Exerccios

14. No arquivo de conguraes PERSISTENCE . XML, altere o valor da propriedade HIBER NATE . HBM 2 DDL . AUTO para UPDATE . Assim as tabelas no sero recriadas a cada execuo e sim apenas atualizadas.

15. Crie um teste para inserir editoras no banco de dados.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

public class InsereEditoraComJPA { public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("livraria"); EntityManager manager = factory.createEntityManager(); Editora novaEditora = new Editora(); Scanner entrada = new Scanner(System.in); System.out.println("Digite o nome da editora: "); novaEditora.setNome(entrada.nextLine()); System.out.println("Digite o email da editora: "); novaEditora.setEmail(entrada.nextLine()); manager.persist(novaEditora); manager.getTransaction().begin(); manager.getTransaction().commit(); factory.close(); } }

16. Crie um teste para listar as editoras inseridas no banco de dados. 45 K19 Treinamentos

JPA 2 e Hibernate1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class ListaEditorasComJPA { public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("livraria"); EntityManager manager = factory.createEntityManager(); Query query = manager.createQuery("SELECT e FROM Editora e"); List editoras = query.getResultList(); for(Editora e : editoras) { System.out.println("EDITORA: " + e.getNome() + " - " + e.getEmail()); } } }

3.11

Repository

A interface E NTITY M ANAGER do JPA oferece recursos sucientes para que os objetos do domnio sejam recuperados ou persistidos no banco de dados. Porm, em aplicaes com alta complexidade e grande quantidade de cdigo, espalhar as chamadas aos mtodos do E NTITY M ANAGER pode gerar diculdades na manuteno e no entendimento do sistema. Para melhorar a organizao das nossas aplicaes, diminuindo o custo de manuteno e aumentando a legibilidade do cdigo, podemos aplicar o padro Repository do DDD(Domain Driven Design). Conceitualmente, um repositrio representa o conjunto de todos os objetos de um determinado tipo. Ele deve oferecer mtodos para recuperar e para adicionar elementos. Os repositrios podem trabalhar com objetos prontos na memria ou reconstru-los com dados obtidos de um banco de dados. O acesso ao banco de dados pode ser realizado atravs de ferramenta ORM como o Hibernate.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class EditoraRepository { private EntityManager manager; public EditoraRepository(EntityManager manager) { this.manager = manager; } public void adiciona(Editora e) { this.manager.persist(e); } public Editora busca(Long id) { return this.manager.find(Editora.class, id); } public List buscaTodas() { Query query = this.manager.createQuery("SELECT e FROM Editora e"); return query.getResultList(); } }

www.k19.com.br

46

JPA 2 e Hibernate1 2 3 4 5 6 7 EntityManagerFactory factory = Persistence.createEntityManagerFactory("K12");

EntityManager manager = factory.createEntityManager(); EditoraRepository editoraRepository = new EditoraRepository(manager); List editoras = editoraRepository.buscaTodas();

3.12

Exerccios

17. Implemente um repositrio de editoras criando uma nova classe no projeto JPA2-Hibernate.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

class EditoraRepository { private EntityManager manager; public EditoraRepository(EntityManager manager) { this.manager = manager; } public void adiciona(Editora e) { this.manager.persist(e); } public Editora busca(Long id) { this.manager.find(Editora.class, id); } public List buscaTodas() { Query query = this.manager.createQuery("SELECT e FROM Editora e"); return query.getResultList(); } }

18. Altere a classe InsereEditoraComJPA para que ela utilize o repositrio de editoras. 47 K19 Treinamentos

JPA 2 e Hibernate1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class InsereEditoraComJPA { public static void main(String[] args) { EntityManagerFactory factory = Persistence.createEntityManagerFactory("livraria"); EntityManager manager = factory.createEntityManager(); EditoraRepository editoraRepository = new EditoraRepository(manager); Editora novaEditora = new Editora(); Scanner entrada = new Scanner(System.in); System.out.println("Digite o nome da editora: "); novaEditora.setNome(entrada.nextLine()); System.out.println("Digite o email da editora: "); novaEditora.setEmail(entrada.nextLine()); editoraRepository.adiciona(novaEditora); manager.getTransaction().begin(); manager.getTransaction().commit(); factory.close(); } }

19. (Opcional) Altere a classe ListaEditorasComJPA para que ela utilize o repositrio de editoras.

www.k19.com.br

48

Captulo 4 Web Container4.1 Necessidades de uma aplicao web

As aplicaes web so acessadas pelos navegadores (browsers). A comunicao entre os navegadores e as aplicaes web realizada atravs de requisies e respostas denidas pelo protocolo HTTP. Portando, ao desenvolver uma aplicao web, devemos estar preparados para receber requisies HTTP e enviar respostas HTTP. Alm disso, na grande maioria dos casos, as aplicaes web devem ser acessadas por diversos usurios simultaneamente. Dessa forma, o desenvolvedor web precisa saber como permitir o acesso simultneo. Outra necessidade das aplicaes web gerar contedo dinmico. Por exemplo, quando um usurio de uma aplicao de email acessa a sua caixa de entrada, ele deseja ver a listagem atualizada dos seus emails. Portanto, fundamental que a listagem dos emails seja gerada no momento da requisio do usurio. O desenvolvedor web precisa utilizar algum mecanismo eciente que permita que o contedo que os usurios requisitam seja gerado dinamicamente. Trabalhar diretamente com as requisies e repostas HTTP e criar um mecanismo eciente para permitir o acesso simultneo e para gerar contedo dinmico no so tarefas simples. Na verdade, extremamente trabalhoso implementar essas caractersticas. Por isso, a plataforma Java oferece uma soluo para diminuir o trabalho no desenvolvimento de aplicaes web.

4.2

Web Container

Uma aplicao web Java deve ser implantada em um Web Container para obter os recursos fundamentais que as aplicaes web necessitam. Um Web Container responsvel pelo envio e recebimento de mensagens HTTP, permite que as aplicaes implantadas nele sejam acessadas simultaneamente por mltiplos usurios de uma maneira eciente e oferece mecanismos para que as aplicaes gerem contedo dinamicamente. Os dois Web Containers mais importantes do mercado so: Tomcat e Jetty. Tambm podemos utilizar um servidor de aplicao Java EE como o JBoss, Glasssh ou WebSphere pois eles possuem um Web Container internamente. 49

Web Container

4.3

Especicao Java EE

Como comum na plataforma Java, para padronizar a interface dos recursos oferecidos pelos Web Containers, especicaes foram denidas. Essas especicaes fazem parte do conjunto de especicaes do Java EE. O Java EE uma especicao que agrupa diversas outras especicaes. Apesar das especicaes, os Web Containers possuem algumas diferenas nas conguraes que devem ser realizadas pelos desenvolvedores. Dessa forma, no h 100% portabilidade entre os Web Containers. Contudo, a maior parte das conguraes e do modelo de programao padronizado. Sendo assim, se voc conhece bem um dos Web Container tambm conhece bastante dos outros.

4.4

Exerccios

1. Na rea de Trabalho, entre na pasta K19-Arquivos e copie glasssh-3.0.1-with-hibernate.zip para o seu Desktop. Descompacte este arquivo na prpria rea de Trabalho. 2. Ainda na rea de Trabalho, entre na pasta glassshv3/glasssh/bin e execute o script startserv para executar o glasssh. 3. Verique se o glasssh est executando atravs de um navegador acessando a url: http://localhost:8080. 4. Pare o glasssh executando o script stopserv que est na mesma pasta do script startserv. 5. No eclipse, abra a view servers e clique com o boto direito no corpo dela. Escolha a opo new e congure o glasssh. 6. Execute o glasssh pela view servers e verique se ele est funcionando acessando atravs de um navegador a url: http://localhost:8080. 7. Pare o glasssh pela view servers.

4.5

Aplicao Web Java

Para que uma aplicao Web Java possa ser implantada em um Web Container, a estrutura de pastas precisa seguir algumas regras. K19-App/ pasta raiz pode ter qualquer nome WEB-INF/ classes/ lib/ web.xml www.k19.com.br 50

Web Container A pasta K19-App raiz da nossa aplicao, o nome dessa pasta pode ser denido pelo desenvolvedor. A pasta WEB-INF deve ser criada dentro da pasta raiz de todas as aplicaes Web Java, o contedo dessa pasta no pode ser acessado diretamente pelos usurios. A pasta classes deve ser criada dentro da pasta WEB-INF, o cdigo compilado das aplicaes Web Java deve ser salvo nessa pasta. A pasta lib deve ser criada dentro da pasta WEB-INF, todos os jars das bibliotecas que sero utilizadas devem ser colocados nessa pasta. O arquivo web.xml contm conguraes do Web Container e deve ser criado na pasta WEB-INF. Os arquivos dentro da pasta raiz da aplicao mas fora da pasta WEB-INF podem ser acessados diretamente pelos usurios atravs de um navegador. As IDEs j criam toda a estrutura de pastas exigidas pelos Web Containers. Ento, na prtica, no temos o trabalho de criar esses diretrios manualmente.

4.6

Exerccios

8. Crie um projeto no eclipse do tipo Dynamic Web Project chamado App-Web-Java selecionando na ltima tela a opo Generate web.xml deployment descriptor. 9. Execute o projeto no glasssh clicando com o boto direito no nome do projeto e escolhendo a opo Run on Server dentro de Run As. 10. Verique o funcionamento da nossa aplicao acessando a url: http://localhost:8080/K19-App/ atravs de um navegador.

4.7

Processando requisies

Aps implantar a nossa aplicao web Java em um Web Container, as requisies e respostas HTTP j esto sendo processadas pelo Web Container que tambm j permite o acesso de mltiplos usurios nossa aplicao. Em seguida devemos denir como o contedo da nossa aplicao deve ser gerado. H duas maneiras fundamentais de gerar contedo dinmico: programando uma Servlet ou um JSP. Na verdade, os JSPs so traduzidos para Servlets automaticamente pelos Web Containers. Ento, escrever um JSP apenas uma maneira diferente de escrever uma Servlet.

4.8

Servlet

Para criar uma Servlet, podemos seguir os seguintes passos bsicos: 1. Criar uma classe 2. Herdar da classe javax.servlet.http.HttpServlet. 3. Reescrever o mtodo service 4. Utilizar a anotao @WebServlet para denir a url que ser utilizada para acessar a Servlet. Essa anotao existe aps a especicao de Servlet 3.0. Antes essa congurao era realizada atravs do arquivo web.xml. 51 K19 Treinamentos

Web Container1 2 3 4 5 6 7 8 9 @WebServlet("/OlaMundo") public class OlaMundo extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // Lgica para processar as regras de negcio e gerar contedo } }

Quando um usurio zer uma requisio para url denida atravs da anotao @W EB S ER VLET, o mtodo service() ser executado. Esse mtodo recebe dois parmetros: o primeiro uma referncia para um objeto da classe HttpServletRequest que guarda todos os dados da requisio HTTP realizada pelo navegador do usurio; o segundo uma referncia para um objeto da classe HttpServletResponse que permite que a resposta HTTP que ser enviada para o navegador do usurio seja construda pela aplicao.

4.8.1

Inserindo contedo na resposta

Para inserir contedo na resposta HTTP que ser enviada para o navegador do usurio, devemos utilizar o mtodo getWriter(). Em geral, o contedo inserido na resposta HTTP texto HTML.1 2 3 4 5 6 7 8 9 10 @WebServlet("/OlaMundo") public class OlaMundo extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println("Ol Mundo"); } }

4.9

Exerccios

11. Crie um pacote chamado servlets no projeto K19-App. 12. Crie uma classe chamada OlaMundo no pacote servlets da seguinte forma:1 2 3 4 5 6 7 8 9 10 @WebServlet("/OlaMundo") public class OlaMundo extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); writer.println("Ol Mundo"); } }

www.k19.com.br

52

Web Container 13. Verique o funcionamento da Servlet acessando atravs de um navegador a url: http://localhost:8080/K19-App/OlaMundo

4.10

JSP

Outra maneira de criar uma Servlet escrever um JSP. Lembrando que os JSPs so traduzidos para Servlets automaticamente pelos Web Containers. Para criar um JSP basta adicionar um arquivo .jsp.1 2 3 4 5 6 7 8 9

Um arquivo JSP pode conter texto HTML e cdigo Java. O cdigo Java pode aparecer em diversos lugares. Por exemplo, dentro de scriptlets ou expressions.

4.11

Exerccios

14. Crie um arquivo JSP chamado olaMundo.jsp na pasta WebContent com o seguinte contedo.1 2 3 4 5 6 7 8 9

15. Verique o funcionamento do JSP acessando atravs de um navegador a url: http://localhost:8080/K19-App/olaMundo.jsp

4.12

Frameworks

Hoje em dia, improvvel que uma empresa decida comear um projeto utilizando diretamente Servlets e JSPs pois a produtividade pequena e a manuteno difcil. Por isso bibliotecas que denem um modelo de programao baseado no padro MVC so utilizadas nos projetos. Essas bibliotecas so os chamados Frameworks web. Eis uma lista dos principais Frameworks web para aplicaes web Java: 53 K19 Treinamentos

Web Container JSF Struts 1.x Struts 2.x Spring MVC Nos prximos captulos mostraremos o funcionamento e explicaremos os conceitos relacionados ao framework JSF.

www.k19.com.br

54

Captulo 5 Viso Geral do JSF 2O JSF 2 oferece muitos recursos para o desenvolvimento de uma aplicao web Java. Cada um desses recursos por si s j so sucientemente grandes e podem ser abordados em separado. Porm, no primeiro contato com JSF 2, interessante ter uma viso geral dos recursos principais e do relacionamento entre eles sem se aprofundar em muito nos detalhes individuais de cada recurso. Portanto, neste captulo, mostraremos de forma sucinta e direta o funcionamento e os conceitos principais do JSF 2. Nos prximos captulos, discutiremos de maneira mais detalhada as diversas partes do JSF 2.

5.1

Aplicao de exemplo

Inspirados na sorte de um dos nossos alunos que ganhou na Loto Mania utilizando um programa que ele fez baseado em algumas dicas que o instrutor Rafael Cosentino deu a ele para gerar nmeros aleatrios em Java, vamos montar uma pequena aplicao em JSF 2 que gera apostas de loteria.

5.2

Managed Beans

Os Managed Beans so objetos utilizados nas aplicaes JSF e possuem trs responsabilidades principais: 1. Receber os dados enviados pelos usurios atravs das telas da aplicao. 2. Executar as lgicas para tratar as requisies dos usurios. 3. Disponibilizar os dados que devem ser apresentados nas telas da aplicao. Para denir o funcionamento de um Managed Bean no JSF 2, devemos seguir os seguintes passos: 1. Criar uma classe com a anotao @ManagedBean. 55

Viso Geral do JSF 2 2. Denir atributos com os correspondentes getters e setters para poder receber dados das telas ou enviar dados para as telas. 3. Denir mtodos para implementar as lgicas de tratamento das possveis requisies dos usurios.

5.2.1

GeradorDeApostasBean

Na aplicao que gera apostas de loteria, devemos criar um Managed Bean para receber alguns parmetros que devem ser denidos pelos usurios para gerar as apostas corretamente.1 2 3 4 5 6 7 8 9 10 @ManagedBean public class GeradorDeApostasBean { private int quantidadeDeNumeros; private int tamanhoDaAposta; private int quantidadeDeApostas; // getters e setters }

Devemos acrescentar no G ERADOR D E A POSTAS B EAN um mtodo para implementar a lgica de gerar as apostas. Este mtodo deve devolver no nal o nome da tela que apresentar as apostas geradas para os usurios.1 2 3 4 public String geraApostas() { // Aqui deve ser implementa a lgica para gerar as apostas return "lista-de-apostas"; }

Por m, devemos adicionar um atributo no G ERADOR D E A POSTAS B EAN para disponibilizar as apostas geradas para a tela que ir apresent-las aos usurios.1 2 3 private List apostas; // getters e setters

5.3

Facelets e Componentes Visuais

As telas das aplicaes JSF 2 podem ser denidas atravs de arquivos xhtml. Esses arquivos so processados pela engine do Facelets que faz parte do JSF 2. Os componentes visuais que formam as telas da aplicao so inseridos atravs de tags xhtml.

5.3.1

Tela de entrada

Na nossa aplicao de gerar apostas, devemos denir uma tela para os usurios passarem os parmetros necessrios para que as apostas sejam geradas. www.k19.com.br 56

Viso Geral do JSF 2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Gerador de Apostas

5.3.2

Tela de Sada

Na tela de sada, devemos apresentar aos usurios uma listagem das apostas que foram criadas pelo G ERADOR D E A POSTAS B EAN. 57 K19 Treinamentos

Viso Geral do JSF 2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Gerador de Apostas

5.4

Exerccios

1. Crie um projeto do tipo Dynamic Web Project chamado K19-Loteria. Siga as imagens abaixo para congurar corretamente o projeto. www.k19.com.br 58

Viso Geral do JSF 2

59

K19 Treinamentos

Viso Geral do JSF 2

www.k19.com.br

60

Viso Geral do JSF 2 2. Na pasta src do projeto K19-Loteria crie um pacote chamado managedbeans.

3. No pacote managedbeans crie uma classe chamada GeradorDeApostasBean com o seguinte contedo.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

@ManagedBean public class GeradorDeApostasBean { private int quantidadeDeNumeros; private int tamanhoDaAposta; private int quantidadeDeApostas; private List apostas; public String geraApostas() { // Prepara uma lista com todos os nmeros ArrayList numeros = new ArrayList(); for (int j = 1; j

Verique o resultado atravs de um navegador. 69 K19 Treinamentos

Componentes Visuais 4. Utilize o componente h:panelGroup para agrupar dois ou mais componentes em uma clula do Panel Grid criado no exerccio anterior. 5. Na pasta src crie um pacote chamado managedbeans. Nesse pacote, adicione uma classe com o seguinte contedo para modelar um simples Managed Bean que gera palavras.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @ManagedBean public class PalavrasBean { private List palavras = new ArrayList(); public PalavraBean() { this.palavras.add("K19 Treinamentos"); this.palavras.add("Rafael Cosentino"); this.palavras.add("Alexandre Macedo"); this.palavras.add("Jonas Hirata"); }

public List getPalavras() { return this.palavras; } public void setPalavras(List palavras) { this.palavras = palavras; } }

6. Crie uma tela aplicando o componente h:dataTable para apresentar as palavras geradas pelo Managed Bean do exerccio anterior.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Palavras apenas palavras

Preencha o formulrio vrias vezes com valores errados e observe os erros. 4. Faa um pacote chamado resources na pasta src e adicione um arquivo de mensagens nesse pacote chamado Messages.properties com o seguinte contedo. www.k19.com.br 100

Converso e Validao1 2 3 4 5 6 javax.faces.converter.NumberConverter.NUMBER=O valor {0} no adequado. javax.faces.converter.NumberConverter.NUMBER_detail={0} no nmero ou inadequado. javax.faces.converter.IntegerConverter.INTEGER=O valor {0} no adequado. javax.faces.converter.IntegerConverter.INTEGER_detail={0} no um nmero inteiro. javax.faces.converter.DateTimeConverter.DATE=A data {0} no est correta. javax.faces.converter.DateTimeConverter.DATE_detail= {0} no parece uma data.

5. Adicione a congurao necessria no faces-cong.xml para utilizar o arquivo de mensagens criado no exerccio anterior.1 2 3 resources.Messages

Observao: a tag deve ser colocada dentro de faces-cong. 6. Preencha o formulrio vrias vezes com valores errados e observe as novas mensagens.

10.4

Validao

Muitas vezes, apenas a converso de dados no suciente para vericar se uma informao preenchida em um formulrio por um usurio est correta. Por exemplo, suponha um campo para os usurios digitarem uma idade. Como visto anteriormente, o valor digitado ser tratado como texto at chegar na aplicao e l poder ser convertido para INT. Essa converso no verica se o nmero obtido negativo. Porm, nesse caso, no seria correto obter nmeros negativos pois a idade de uma pessoa sempre positiva. Dessa forma, depois da converso dos dados, mais uma etapa deve ser realizada para validar as informaes.

10.4.1

Validao Padro

O JSF tambm dene validadores padres para serem aplicados nos dados obtidos dos usurios. A seguir veremos a aplicao desses validadores:

10.4.2

Campo Obrigatrio (Required)

A validao mais comum de todas a de vericar se um determinado campo no deixou de ser preenchido. Podemos aplicar essa validao utilizando o atributo required dos inputs.1 2

10.4.3

f:validateLongRange

O validador f:validateLongRange utilizado para vericar se um valor numrico inteiro pertence a um determinado intervalo de nmeros. 101 K19 Treinamentos

Converso e Validao1 2 3 4

10.4.4

f:validateDoubleRange

O validador f:validateDoubleRange utilizado para vericar se um valor numrico real pertence a um determinado intervalo de nmeros.1 2 3 4

10.4.5

f:validateLength

O validador f:validateLength utilizado para vericar se uma string possui uma quantidade mnima ou mxima de letras.1 2 3 4

10.4.6

f:validateRegex

O validador f:validateRegex utilizado para vericar se um texto respeita uma determinada expresso regular.1 2 3 4

10.4.7

Bean Validation

Uma nova abordagem para denir as validaes foi adicionada no JSF2. A ideia declarar as regras de validao nas classes de modelo ao invs de inser-las nas telas. A grande vantagem das validaes denidas nas classes de modelo que elas podem ser utilizadas em diversas partes da aplicao. Esse novo recurso chamado Bean Validation e foi denido pela especicao JSR 303 que pode ser obtida atravs da url: http://jcp.org/en/jsr/detail?id=303. Para denir as validaes com Bean Validation, basta adicionar anotaes nas classes de modelo. www.k19.com.br 102

Converso e Validao1 2 3 4 5 6 public class Funcionario { @NotNull private String nome; ... }

@NotNull: o valor no pode ser nulo.

@Min: dene um valor mnimo.

@Max: dene um valor mximo.

@Size: dene um valor mnimo e mximo.

@Pattern: aplica uma expresso regular na validao.

Podemos acrescentar mensagens de erro atravs das anotaes.1 2 3 4 5 public class Funcionario { @NotNull(message="O nome no pode ser nulo") private String nome; ... }

10.5

Exerccios

7. No projeto ConversaoValidacao, crie uma tela para cadastrar produtos de uma loja virtual. O arquivo que voc criar deve se chamar cadastra-produto.xhtml. 103 K19 Treinamentos

Converso e Validao1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Cadastro de Produto

8. Crie a classe de modelo para denir os produtos. Adicione essa classe dentro de um pacote chamado model.

1 2 3 4 5 6

public class Produto { private String nome; private double preco; // GETTERS AND SETTERS }

9. Depois, implemente o Managed Bean que dar suporte tela de cadastro de produtos. Faa a classe ProdutoBean dentro do pacote managedbeans.

1 2 3 4 5 6

@ManagedBean public class ProdutoBean { private Produto produto = new Produto(); // GETTERS AND SETTERS }

10. Teste o formulrio preenchendo diversos valores e observe as mensagens de erro. www.k19.com.br 104

Converso e Validao 11. Retire a validao realizada com a tag f:validateDoubleRange. Acrescente uma validao com as anotaes da especicao de Bean Validation na classe P RODUTO.1 2 3 4 5 6 7 8 public class Produto { private String nome; @Min(value = 0) private double preco; // GETTERS AND SETTERS }

12. Teste novamente o formulrio. 13. (Opcional) Altere as mensagens de erros do formulrio de cadastro de produto.

105

K19 Treinamentos

Converso e Validao

www.k19.com.br

106

Captulo 11 EventosNormalmente, as pessoas preferem utilizar aplicaes que ofeream maior grau de interatividade. Consequentemente, as empresas buscam sistemas mais interativos para controlar os seus negcios e serem utilizados pelos seus funcionrios. A interatividade de uma aplicao est diretamente relacionada a sua capacidade de percepo e reao. O nvel mais alto de interatividade aconteceria se uma aplicao pudesse perceber e reagir aos pensamentos dos usurios. O JSF no oferece esse nvel de interao, na verdade, nenhuma tecnologia oferece. Mas, veremos que ele oferece um mecanismo bem sosticado para aumentar a interatividade com os usurios. Esse mecanismo baseado na ideia de eventos. No JSF, h duas categorias fundamentais de eventos: eventos de aplicao e eventos de ciclo de vida. Os eventos de aplicao correspondem s aes dos usurios que so pertinentes s aplicaes. Por exemplo, um usurio pressiona um boto ou altera o valor de preenchido em um campo de um formulrio. Os eventos de ciclo de vida correspondem s transies entre as diversas etapas do processamento de uma requisio ou s transies entre os estados dos componentes do JSF ou da prpria aplicao.

11.1

Eventos de Aplicao (Application Events)

Como dito anteriormente, os eventos de aplicao correspondem s aes dos usurios que interessam para as aplicaes. O JSF suporta dois tipos de eventos de aplicao: ActionEvent e ValueChangeEvent.

11.1.1

ActionEvent

Os ActionEvents so gerados por botes ou links quando esses so pressionados pelos usurios. O tratamento dos ActionEvents pode ser denido por mtodos dentro dos Managed Beans. Esses mtodos so classicados em dois tipos: Action Method ou Action Listener Method. Um Action Method deve ser utilizado quando desejamos efetuar uma navegao (mudar de tela) aps o tratamento do evento. Caso contrrio, devemos utilizar um Action Listener Method. 107

Eventos Action Method Um Action Method deve devolver uma String que ser utilizada como outcome para processar uma navegao. Veja um exemplo de Action Method.1

1 2 3 4

public String salva() { // implementao return "lista-produtos"; }

No h:commandButton denimos qual o Action Method que queremos associar ao boto atravs do atributo action. Action Listener Method Um Action Listener Method precisa ser void e aceita um ActionEvent como argumento. Um ActionEvent contem informaes sobre o evento disparado.1

1 2 3

public void salva(ActionEvent event) { // implementao }

No h:commandButton denimos qual o Action Listener Method que queremos associar ao boto atravs do atributo actionListener.

11.1.2

ValueChangeEvent

Os ValueChangeEvent so gerados quando os usurios modicam o valor preenchido em um campo de um formulrio. O tratamento desse tipo de evento pode ser realizado por mtodos de um Managed Bean. Esses mtodos so chamados de Value Change Listeners. Um Value Change Listener precisa ser void e aceita um ValueChangeEvent como argumento. Um ValueChangeEvent contem informaes sobre o evento disparado.1 2

1 2 3

public void mudaPrecoListener(ValueChangeEvent event) { // implementao }

www.k19.com.br

108

Eventos No h:inputText denimos qual o Value Change Listener queremos associar ao campo atravs do atributo valueChangeListener.

11.2

Eventos de Ciclo de Vida (Lifecycle Events)

Os eventos de ciclo de vida so utilizados quando desejamos executar procedimentos antes ou depois de uma determinada etapa do processamento de uma requisio ou a cada mudana de estado de um componente do JSF e da prpria aplicao. Vamos discutir a respeito dos Phase Events que correspondem s transies entre as etapas do processamento das requisies. Um Phase Event tratado por um Phase Listener. Como o prprio JSF dispara automaticamente os Phase Events, devemos apenas criar um Phase Listener e registr-lo. Para criar um Phase Listener, devemos escrever uma classe que implemente a interface PhaseListener.1 2 3 4 5 6 7 8 9 10 11 12 13 package listeners; public class MeuPhaseListener implements PhaseListener { public void beforePhase(PhaseEvent pe) { // implementao } public void afterPhase(PhaseEvent pe) { // implementao } public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } }

O mtodo getPhaseID() associa o listener a determinadas fases do processamento de uma requisio. Os mtodos beforePhase() e afterPhase() so executados respectivamente antes e depois das fases associadas ao listener. Para registrar o nosso Phase Listener devemos acrescentar algumas conguraes no facescong.xml.1 2 3 listeners.MeuPhaseListener

11.3

Exerccios

1. Crie um projeto do tipo Dynamic Web Project chamado Eventos seguindo os passos vistos no exerccio do captulo 5. 2. Vamos montar um formulrio de estados e cidades. Para isso, crie um pacote chamado model e adicione a seguinte classe para representar os estados. 109 K19 Treinamentos

Eventos1 2 3 4 5 6 7 8 9 10 11 package model; public class Estado { private String nome; private String sigla; private List cidades = new ArrayList(); // GETTERS AND SETTERS }

3. Depois, crie um pacote managedbeans e adicione um Managed Bean para manipular os estados.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

package managedbeans; @ManagedBean @SessionScoped public class LocalidadeBean { private String cidade; private String siglaEstado; private Estado estado = new Estado(); private List estados = new ArrayList(); public LocalidadeBean() { Estado sp = new Estado(); sp.setSigla("SP"); sp.setNome("So Paulo"); sp.getCidades().add("So Paulo"); sp.getCidades().add("Campinas"); Estado rj = new Estado(); rj.setSigla("RJ"); rj.setNome("Rio de Janeiro"); rj.getCidades().add("Rio de Janeiro"); rj.getCidades().add("Niteri"); this.estados.add(sp); this.estados.add(rj); } public void mudaEstado(ValueChangeEvent vce) { this.siglaEstado = vce.getNewValue().toString(); for(Estado e : this.estados){ if(e.getSigla().equals(this.siglaEstado)){ this.estado = e; } } } // GETTERS AND SETTERS }

4. Faa a tela de busca de estados e cidade. Adicione um arquivo chamado busca-localidade.xhtml na pasta WebContent. www.k19.com.br 110

Eventos1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 Busca Localidade Busca Localidade

111

K19 Treinamentos

Eventos

www.k19.com.br

112

Captulo 12 AjaxQuando as aplicaes possuem telas complexas com grande quantidade de contedo, no interessante recarregar uma pgina inteira s para modicar um pequeno pedao da tela pois isso deixar os usurios insatisfeitos. Novamente, com o intuito de melhorar a interatividade entre as aplicaes e os usurios, podemos aplicar o conceito do AJAX (Asynchronous Javascript And XML). Aplicando a ideia do AJAX obtemos duas capacidades muito uteis: a primeira poder fazer requisies sem recarregar as pginas completamente e sim a parte delas que nos interessa; a segunda poder realizar requisies sem pausar a navegao dos usurios. Por exemplo, suponha uma pgina de listagem de fotos que possua paginao. Quando o usurio pressiona o link para a prxima pgina, no necessrio recarregar todo o contedo da tela, podemos recarregar apenas os itens na listagem. Outro exemplo, suponha uma aplicao de Instant Message (gtalk, msn, ...). A listagem de contatos pode ser atualizada frequentemente sem os usurios pedirem e sem que eles tenham que para a navegao para essa atualizao. A verso 2 do JSF, diferentemente das anteriores, oferece suporte nativo a AJAX. Veremos como utilizar esse suporte.

12.1

Fazendo requisies AJAX

As requisies AJAX so realizadas quando determinados eventos denidos pela linguagem Javascript ocorrem. Esses eventos esto fortemente relacionados aos componentes visuais colocados nas telas. Precisamos indicar para o JSF quais componentes e eventos devem disparar requisies para o servidor. Para fazer isso, devemos utilizar a tag f:ajax (principal tag do suporte nativo do JSF para aplicar o conceito do AJAX).1 2 3

No exemplo acima, uma requisio AJAX ser disparada quando o valor do campo for modicado. Isso porque a tag f:ajax assume o evento padro do componente associado a ela. O componente h:inputText utiliza por padro o evento onchange. 113