You are on page 1of 238

J AVA

francisco calaa
otvio calaa

Guia para iniciantes


2013 Verso 1.2-beta

LICENA

Esta apostila disponibilizada sob os termos da licena Creative Commons - AttributionNonCommercial-NoDerivs 3.0 Unported.
Isto quer dizer que VOC PODE:
Copiar este material de forma no comercial;
Redistribuir este material de forma no comercial;
Imprimir este material de forma no comercial;
Esta licena tambm quer dizer que voc VOC NO PODE:
Vender este material a terceiros;
Alterar este material;
Qualquer uso indevido deste material, venda ou alterao estaro sugeitos s penas previstas na Lei Federal No 9.610, de 19 de fevereiro 1998.
Mais detalhes sobre esta licena bem como seu contedo original pode ser acessado em:
http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode
Bons estudos. . .

iii

C O L A B O R E C O M E S TA A P O S T I L A

Precisamos de colaboradores para melhorar esta apostila. Se voc deseja entrar para nosso
time, mande um email para apostila-java@googlegroups.com com o ttulo:
DESEJO COLABORAR COM A APOSTILA DE JAVA.
Responderemos a voc com informaes sobre o que ainda necessrio fazer.
Nas prximas verses, voc ver seu nome adicionado na lista de colaboradores e poder
se gabar, mostrando isto ao seus amigos. Colabore !

Colaboradores
Francisco Calaa Xavier
Otvio Calaa Xavier
Edicarlos Pimenta Gonalves
Deuslirio Junior

CONTEDO
1

introduo
1
1.1 Algoritmos
1
1.2 Lgica binria
1
1.3 Nascimento da cincia da computao
2
1.4 Java
2
2 preparao do ambiente de estudos
5
2.1 Padronizao do ambiente de trabalho
5
2.2 Primeiros testes no ambiente de trabalho
6
2.3 Exerccios
7
3 lgica de programao em java
9
3.1 Fluxograma
9
3.2 Para entender os programas criados a partir de agora
3.2.1 Informaes iniciais
10
3.3 Strings
11
3.4 Sada Formatada
12
3.5 Conceito de Varivel
13
3.6 Palavras reservadas e identificadores
14
3.7 Tipos Primitivos
15
3.7.1 Tipos primitivos inteiros
15
3.7.2 Tipos primitivos de ponto flutuante
15
3.7.3 Tipo primitivo char
16
3.7.4 Tipo primitivo boolean
16
3.7.5 Converses de variveis
17
3.8 Operadores
17
3.8.1 Aritmticos
17
3.8.2 Atribuio
18
3.8.3 Incremento/Decremento
19
3.8.4 Relacionais
20
3.8.5 Lgicos
20
3.9 Estruturas de seleo
22
3.9.1 if . . . else
22
3.9.2 Operador condicional ou ternrio
24
3.9.3 switch
25
3.10 Estruturas de Repetio
26
3.10.1 for
26
3.10.2 while
27
3.10.3 do . . . while
28
3.11 Exerccios
28
4 introduo orientao a objetos
31
4.1 O conceitos Classe e Objeto
31
4.2 Elementos de uma classe
32

10

vii

Verso 1.2-beta
4.2.1 Atributos
32
4.2.2 Mtodos
33
4.2.3 Mtodos construtores
34
4.2.4 Padres de nomenclatura
35
4.3 Atributos e mtodos static
36
4.3.1 Import static
37
4.4 Tipos Wrapper
38
4.4.1 Auto-boxing e Auto-unboxing
38
4.5 Regras de escopo
39
4.6 Sobrecarga de mtodos
40
4.7 Exerccios
41
5 arrays
43
5.1 O que so arrays
43
5.2 Declarao e inicializao de arrays
44
5.3 Mtodo main
46
5.4 Lao for aprimorado
48
5.5 Passagem de parmetros no Java
48
5.6 Arrays multidimensionais
51
5.7 Lista de parmetros com comprimento varivel
51
5.8 Exerccios
52
6 um pouco mais de orientao a objetos
53
6.1 Coletor de lixo
53
6.2 A palavra-chave this
54
6.3 Variveis do tipo final
56
6.4 Encapsulamento
56
6.5 Enumeraes
59
6.6 Pacotes
59
6.6.1 Como usar tipos dentro de outros pacotes
61
6.7 Herana
62
6.7.1 Um exemplo de Herana
62
6.7.2 Sobrescrita de mtodos
64
6.7.3 A palavra-chave super
64
6.8 Alguns Modificadores de acesso
64
6.8.1 private
64
6.8.2 pacote
64
6.8.3 protected
65
6.8.4 public
65
6.9 Classe object
65
6.9.1 mtodo equals()
65
6.9.2 mtodo toString()
66
6.10 Polimorfismo
67
6.10.1 Abstrao
67
6.10.2 Exemplo de Polimorfismo
68
6.11 Converso e casting
71
6.11.1 A palavra-chave instanceof
72
6.12 Mtodos e classe do tipo final
72

viii

contedo

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

10

11

contedo

6.13 Interfaces
73
6.13.1 Interfaces em Java
73
6.14 Exerccios
75
tratamento de excees
77
7.1 O que so excees
77
7.2 Como tratar excees
77
7.2.1 O bloco try
77
7.2.2 O bloco catch
78
7.3 Excees checadas e excees no checadas
80
7.4 Como declarar novos tipos de excees
80
7.5 Como lanar excees
81
7.6 Hierarquia das excees
82
7.7 Exerccios
83
fluxo de dados
85
8.1 A classe File
85
8.2 Como escrever em arquivos
85
8.3 Como ler arquivos
86
8.4 Um editor de texto simples
87
8.5 Serializao de objetos
89
8.6 Um trocador de mensagens simples
90
8.7 Exerccios
93
genricos e colees
95
9.1 o que so genricos
95
9.2 Introduo a colees
97
9.3 Listas
97
9.4 Conjuntos
99
9.5 Mapas
99
9.5.1 Properties 101
9.6 Pilhas 103
9.7 Filas 104
9.8 Ordenao de Listas 104
9.9 Exerccios 106
uml: unified modeling language
109
10.1 Diagrama de Classe 109
10.1.1 Classe 109
10.1.2 Associaes de Classe 110
10.2 Diagrama de Caso de Uso 112
10.2.1 Caso de Uso 112
10.2.2 Ator 113
10.2.3 Descrio do Caso de Uso 113
10.3 Demais diagramas
113
threads
115
11.1 Processos e Threads 115
11.1.1 Processos
115
11.1.2 Threads 115
11.2 Criao de Threads 116

http://solutioin.com
Francisco Calaa, Otvio Calaa

ix

Verso 1.2-beta

12

13

14

15

11.3 A classe Executors 117


11.4 Mtodos sleep e yield 118
11.5 Sincronizao
118
11.6 O verificador de primos 121
11.7 Exerccios 123
strings e datas
125
12.1 As classes Date e Calendar
125
12.2 Formatao de Datas 126
12.3 A classe String
127
12.4 A classe StringBuffer 127
12.5 Sada formatada
128
12.5.1 Caracteres de converso 128
12.6 Exerccios 130
jdbc
133
13.1 Conexo com banco de dados 133
13.2 A linguagem SQL 135
13.2.1 SELECT 135
13.2.2 Clusula WHERE 135
13.2.3 O Operador LIKE 135
13.2.4 INSERT 136
13.2.5 UPDATE 136
13.2.6 DELETE 136
13.3 Como executar instrues SQL e obter registros
13.3.1 PreparedStatement 138
13.4 Execuo em Lote
138
13.5 Tabela de Clientes 140
13.6 Exerccios 143
java persistence api com hibernate
145
14.1 Mapeamento objeto relacional 145
14.2 Configuraes iniciais 145
14.3 A criao do primeiro exemplo 146
14.4 O arquivo persistence.xml 148
14.5 O EntityManager 150
14.6 A incluso de clientes com JPA 151
14.6.1 Persistindo entidades 151
14.6.2 Localizando entidades 152
14.6.3 Removendo entidades 152
14.6.4 Mesclando entidades 152
14.7 Relacionamento entre classes 152
14.8 Formas de obteno de ids 155
14.9 JPQL - A linguagem consulta da Jpa 156
14.9.1 Passagem de parmetros 156
14.10Exerccios 157
aplicativos web
159
15.1 XML 159
15.2 HTML
160

contedo

136

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta
15.2.1 A estrutura bsica de um documento HTML
15.2.2 Outras tags HTML
161
15.3 JavaScript 162
15.4 CSS
163
15.5 Aplicativos Web com Java 165
15.5.1 Instalao do Tomcat 165
15.6 Exerccios 166
16 servlets
167
16.1 Estrutura de uma aplicao web Java 167
16.2 Construindo o primeiro Servlet 167
16.3 Como fazer no eclipse
169
16.4 Atendendo requisies com o mtodo get 170
16.5 Atendendo requisies com o mtodo post 176
16.6 Redirect
177
16.7 Forward 179
16.8 Escopo de objetos web 180
16.8.1 Request
180
16.8.2 Session 181
16.8.3 Application 181
16.9 Como distribuir uma aplicao web 181
16.10Exerccios 182
17 java server pages
183
17.1 Elementos do Jsp 183
17.1.1 Scriptlet 183
17.1.2 Expresses
184
17.1.3 Declaraes 185
17.2 Diretivas 185
17.2.1 Diretiva include 185
17.2.2 Diretiva Page
186
17.3 Aes do JSP
188
17.4 Biblioteca de tags JSTL 188
17.4.1 EL - Expresso de Linguagem 189
17.5 MVC - Model View Control 190
17.5.1 O cadastro de clientes 190
17.6 Exerccios 192
18 introduo ao javaserver faces
193
18.1 Fazendo JavaServer Faces funcionar 193
18.2 Managed bean 193
18.3 Tags bsicas 197
18.3.1 Tags JSF para renderizao de HTML 197
18.3.2 Tags Core do JSF 197
18.3.3 Exemplo de uso das Tags 197
18.4 Expresses de Ligao - EL 199
18.4.1 Ligaes com atributos 200
18.4.2 Ligaes com mtodos 200
18.5 Configurar o Primefaces 201

http://solutioin.com
Francisco Calaa, Otvio Calaa

contedo

160

xi

Verso 1.2-beta
18.6 Cadastro de Clientes 202
18.7 Cadastro de Produtos (com JPA) 205
18.8 Conversores
212
18.8.1 Conversores personalizados 212
18.9 Exerccios 215
19 padres de projeto
217
19.1 Padres GoF
217
19.2 Abstract Factory 218
19.2.1 Utilizao 219
19.3 Factory Method 219
19.3.1 Utilizao 219
19.3.2 Command 220
19.3.3 Problema 220
19.3.4 Aplicao 221
19.4 Data Access Object (DAO) 221
19.4.1 Vantagens 221
19.5 MVC 222
19.5.1 Componentes
222
19.5.2 Justificativa 222
a montagem do ambiente de trabalho
223
a.1 Obteno e instalao do JDK
223
a.2 O que a Mquina virtual Java 223
a.3 Obteno e instalao do eclipse 223
b erros comuns enfrentados por iniciantes
b.1 Excees que costumam serem vistas 225
b.1.1 ClassNotFoundException 225
b.1.2 NoSuchMethodError 225
b.1.3 LazyInitializationException 225
b.1.4 NoClassDefFoundError 225
b.1.5 NullPointerException
225
b.1.6 ClassCastException 225
b.2 Erros comuns do HTTP
225

xii

contedo

225

http://solutioin.com
Francisco Calaa, Otvio Calaa

INTRODUO
A computao pode ser definida como a busca de uma soluo para um problema, a partir
de entradas (inputs), e atravs de um algoritmo. com isto que lida a teoria da computao,
subcampo da cincia da computao e da matemtica. Durante milhares de anos, a computao foi executada com caneta e papel, ou com giz e ardsia, ou mentalmente, por vezes
com o auxlio de tabelas, ou utenslios artesanais.
A primeira ferramenta conhecida para a computao foi o baco, inventado na Mesopotmia
em torno de 2400 a.C. Sua verso original consistia em desenhar linhas na areia com rochas.
Os bacos ainda so usadas como instrumento de clculo hoje.

1.1.

Algoritmos

O matemtico indiano Brahmagupta foi o primeiro a descrever o sistema de numerao


hindu-arbico, no sculo VII. Nesta poca, aparecem os primeiros relatos de utilizao
do nmero 0. Por volta de 820, o matemtico persa Al-Khwarizmi escreveu o livro Calculando com Numerais Hindus. Este matemtico foi responsvel pela difuso do sistema de
numerao hindu-arbico no Oriente Mdio, e posteriormente na Europa. No sculo XII
comearam traduzir este livro para o latim: Algoritmi de numero Indorum. Tais livros
apresentaram novos conceitos para definir sequncias de passos para completar tarefas
(definio de algortimos), como aplicaes de aritmtica e lgebra. Por derivao do nome,
atualmente usa-se o termo algortmo.

1.2.

Lgica binria

O matemtico indiano Pingala inventou o sistema de numerao binrio por volta do sculo
III a.C. Este sistema de numerao ainda utilizado atualmente no processamento de todos computadores, o sistema estabelece que sequncias de uns e zeros podem representar
qualquer nmero. Fisicamente estas sequncias so substituidas pelos estados ligado e
desligado.
George Boole, em 1854, publicou a lgebra booleana com um sistema completo que permitia a construo de modelos matemticos para o processamento computacional. Em 1801
apareceu o tear controlado por carto perfurado, inveno de Joseph Marie Jacquard. Neste
tear os buracos indicavam os uns, e reas no furadas indicavam os zeros. O sistema ainda
no pode ser considerado um computador, mas demonstrou que as mquinas poderiam
ser controladas pelo sistema binrio.

Verso 1.2-beta

1.3.

introduo

Nascimento da cincia da computao

Antes da dcada de 1920, computador era um termo associado a pessoas que realizavam
clculos, geralmente fsicos e matemticos. Milhares de computadores, em sua maioria mulheres, eram empregados em projetos no comrcio, governo e pesquisa. Aps a dcada de
1920, a expresso mquina computacional comeou a ser usada para referir-se a qualquer
mquina que realize o trabalho de um profissional computador.
No final da dcada de 1940 o termo mquina computacional perdeu espao para o termo
computador. As mquinas digitais estavam cada vez mais difundidas. Alan Turing, um dos
pioneiros da Cincia da Computao, inventou a Mquina de Turing, que posteriormente
evoluiu para o computador moderno.
Em 1930 os engenheiros eletricistas j podiam construir circuitos eletrnicos para resolver
problemas lgicos e matemticos, mas a maioria o fazia sem qualquer processo, de forma
particular, sem rigor terico, ou qualquer estudo ou padronizao. Isso mudou com a tese
de mestrado de Claude E. Shannon de 1937, A Symbolic Analysis of Relay and Switching
Circuits. Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de George
Boole, e percebeu que tal conceito poderia ser aplicado em conjuntos eletro-mecnicos para
resolver problemas de lgica. Tal idia, que utiliza propriedades de circuitos eletrnicos
para a lgica, o conceito bsico de todos os computadores digitais. Shannon desenvolveu
a teoria da informao no artigo de 1948 A Mathematical Theory of Communication, cujo
contedo serve como fundamento para reas de estudo como compresso de dados e criptografia.

1.4.

Java

A linguagem de programao orientada a objetos Java foi criada em 1991 pelo engenheiro
James Gosling, da Sun, e anunciada em 1995. O projeto da sua criao surgiu num contexto
de um outro projeto, em que certos problemas da linguagem C++, como, por exemplo, a
falta de funcionalidades do garbage collection, levaram a optar pela criao de uma nova
linguagem, ento denominada Oak (palavra inglesa para as rvores da famlia Quercus,
como o carvalho) em "homenagem" rvore que se encontrava plantada do lado de fora
do escritrio de James Gosling.
Em 1994 esta linguagem foi renomeada para Java porque, aps uma pesquisa de marcas,
foi descoberta que j existia uma linguagem de computador denominada Oak. Desta forma,
em 1996 o Java 1.0 foi finalmente apresentado comunidade.
Em 2009, a Oracle adquire a Sun Microsystems e tornou-se a detentora dos direitos e da
marca Java.
As especificaes da linguagem Java so mantidas uniformes atravs de um processo
comunitrio gerido pela Sun Microsystems, o JCP (Java Community Process). Fazem parte
do JCP vrias empresas como a Oracle, Google, IBM, Nokia dentre outras. Para mais informaes sobre o JCP acesse o site http://jcp.org.
As caractersticas principais da linguagem Java so:
orientada a objetos;

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo

independente de plataforma;
integra mecanismos e bibliotecas de funes para programao distribuda;
foi projetada para executar cdigo remotamente sem perda de segurana.

http://solutioin.com
Francisco Calaa, Otvio Calaa

P R E PA R A O D O A M B I E N T E D E
ESTUDOS
Neste captulo voc montrar seu ambiente de estudos Java. A sua principal ferramenta
o JDK (Java Development Kit). Esta sigla significa: Kit de Desenvolvimento Java. O JDK
contm uma vasta quantidade de aplicativos necessrios para resolver problemas do dia a
dia do desenvolvimento Java.
Outra ferramenta importante a IDE (Integrated Development Environment). Esta sigla
significa: Ambiente de desenvolvimento integrado. Trata-se de uma ferramenta que contm vrios recursos, necessrios para a construo eficiente de um software.
Hoje possvel encontrar diversas IDEs para desenvolvimento em Java. Dentre elas
esto o Eclipse1 e o NetBeans2 , que so ides Open Source e que contam com colabrao de
grandes comunidades e empresas ao redor do mundo. Os exemplos deste livro sero feitos
utilizando o Eclipse. Apesar disto, nada impede voc de instalar o netbeans e tambm testar
estes exemplos nele.

2.1.

Padronizao do ambiente de trabalho

muito importante ter um ambiente de trabalho organizado e padronizado para prosseguimento dos estudos. Esta padronizao te ajudar a encontrar dependncias, aplicativos e
exemplos e est ilustrada na Figura 2.1.
Onde em:
Aplicativos: contm os aplicativos utilizados no desenvolvimento de software. Exemplo: JDK, eclipse, etc.
Material: contm bibliotecas, tutoriais, etc
Projetos: contm os seus projetos criados no decorrer da sua aprendizagem.
1 http://www.eclipse.org
2 http://www.netbeans.org

Figura 2.1: Padronizao do ambiente de trabalho utilizada

Verso 1.2-beta

preparao do ambiente de estudos

Se voc quiser, pode baixar um arquivo compactado contendo esta estrutura j montada.
Este arquivo pode ser obtido no site http://solutioin.com/java. Aps ter realizado o download
no seu computador, descompacte o arquivo em algum lugar de sua preferncia e pronto!
Voc j est apto para comear os estudos em Java. Bons estudos!

Dica:
Se voc ficou curioso em como este ambiente foi montado, acesse o
Apncie A que saber como.

2.2.

Primeiros testes no ambiente de trabalho

Primeiro, inicialize o eclipse. Isto pode ser feito executando o programa eclipse (Linux) ou
eclipse.exe (Windows) da pasta eclipse, dentro da pasta Aplicativos da estrutura baixada.
Com o eclipse inicializado, crie um novo projeto Java. Depois crie uma classe. Ser a
primeira classe criada neste curso. O objetivo que voc entenda como funciona um programa bem simples em Java. O cdigo deste exemplo inicial est apresentado na Listagem
2.1. Esta classe, aps executada, gera a sada no console:
Veja como fcil

Listagem 2.1: Exemplo do primeiro Programa


1
2
3
4
5

public class PrimeiroPrograma {


public static void main(String[] args) {
System.out.println("Veja como fcil");
}
}

No momento, no se preocupe com as instrues desta classe. O que voc deve entender
agora que o comando da linha 3 imprime no console o texto que se encontra entre aspas.
Outra forma de apresentar texto para o usurio est ilustrada no cdigo da Listagem
2.2. Observe, que aps executar este cdigo, a mensagem apresentada em uma janela,
conforme ilustrado na Figura 2.2.
Listagem 2.2: Exemplo de apresentao de mensagem
1

import javax.swing.JOptionPane;

2
3
4
5
6
7

public class SegundoPrograma {


public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "Ol , como vai ?");
}
}

Para um terceiro exemplo, ser apresentado um cdigo que faz a leitura de informaes
teclado. Isto ser bastante til nesta primeira fase do curso, onde estamos estudando os
elementos iniciais da programao. A Listagem 2.3 exemplifica uma das formas de se obter
informaes do usurio.

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

preparao do ambiente de estudos

Figura 2.2: Sada apresentada pelo segundo programa

Listagem 2.3: Exemplo de apresentao de mensagem


1

import javax.swing.JOptionPane;

2
3
4
5
6
7
8

public class TerceiroPrograma {


public static void main(String[] args) {
String texto = JOptionPane.showInputDialog("Digite um texto:");
System.out.println("Texto digitado: " + texto);
}
}

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

2.3.

Exerccios

1. Crie uma classe que apresente no console a seguinte mensagem: Meu primeiro
cdigo Java.
2. Crie uma classe que apresente em uma janela a mensagem: Estou ficando bom
nisto.
3. Crie uma classe que solicite ao usurio as seguintes informaes: nome, endereo e
telefone. Aps o usurio ter digitado estas informaes, apresente em uma janela.

http://solutioin.com
Francisco Calaa, Otvio Calaa

L G I C A D E P R O G R A M A O E M J AVA
Todo programa constitudo por uma sequncia lgica de passos que executar tarefas
necessrias para a soluo do problema a que o programa se propem.
Neste captulo, sero apresentados os passos necessrios para construo de um programa simples em Java.

3.1.

Fluxograma

Fluxograma uma representao esquemtica do processo. Ilustra graficamente a transio


de informaes ao longo da execuo deste processo.
til para compreenso de controle de fluxo quando o algoritmo complexo ou extenso.
A Figura 3.1 ilustra um fluxograma. Observe que cada ao representada por um retngulo. O losango representa uma tomada de deciso. As elpses representam o incio e o fim
do processo.

Figura 3.1: Exemplo de fluxograma

Verso 1.2-beta

lgica de programao em java

3.2. Para entender os programas criados a partir de agora


3.2.1 Informaes iniciais
Para que haja um completo entendimento inicial nos programas que faremos neste captulo,
importante apresentar alguns conceitos.

3.2.1.1 Pacote java.lang


No necessrio importar o pacote java.lang, ou seja, todas as classes deste pacote esto
acessveis sem a necessidade de que seja feito qualquer import. Algumas destas classes so:
System, String, Integer, Double, Character, etc.

3.2.1.2 Nomeclatura dos mtodos e das classes


Java utiliza um padro de escrita chamado CamelCase1 .
nomes de classes iniciam com letras maisculas e o restante das letras so minsculas.
Exemplo: PrimeiraClasse, PessoaFisica, etc.
nomes de mtodos iniciam com letras minsculas. Uma nova palavra no nome inicia
com letra maiscula (sem o caracter sublinhado _). Exemplo: realizarAcao(), fazerAlgo(), etc.

3.2.1.3 Mtodo main


Todo aplicativo Java inicia sua execuo pelo mtodo main. A nica forma de escrever esta
assinatura :
public static void main(String [] args)

O significado de cada uma destas palavras ser descrito posteriormente. necessrio que
o leitor apenas utilize esta assinatura como est.

3.2.1.4 Case sensitive


Em Java existe diferena entre letras maisculas e minsculas. Assim, os identificadores
teste, Teste e TesTe so todos diferentes.

1 CamelCase a denominao em ingls para a prtica de escrever palavras compostas ou frases, onde cada
palavra iniciada com Maisculas e unidas sem espaos. um padro largamente utilizado em diversas
linguagens de programao, como Java, Ruby, PHP e Python, principalmente nas definies de Classes e Objetos. Exemplo: iPod, GameCube, OpenOffice.org, CamelCase, dataNascimento, enderecoEntregaMercadoria,
ItemPedido.

10

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

3.2.1.5 Nome da classe o nome do arquivo


Todo cdigo Java deve ser escrito dentro de classes. O nome da classe deve ser o mesmo
nome do arquivo. Isto no uma regra, mas evitar alguns problemas. Posteriormente ser
apresentado mais detalhes sobre este assunto.

3.2.1.6 Outras observaes


Aps cada instruo deve ser colocado um ponto-vrgula (;).
Em Java as funes so chamadas de mtodos. As variveis declaradas fora dos mtodos
so chamadas de atributos ou variveis de classe.

3.2.1.7 Comentrios
Existem trs tipos de comentrios em Java, conforme apresentado na Listagem 3.1.
Listagem 3.1: Exemplo de comentrios
1

//Comentrio de linha

2
3
4
5
6
7
8

/*
* Comentrio
* de
* bloco
*/

9
10
11
12
13
14
15

/**
* Exemplo de comentrio
* de Javadoc.
*
*/

3.3.

Strings

Strings so cadeias de caracteres. Em java so representadas pela classe String e so expressas entre aspas. Strings literais como abcdef tambm so instncias desta classe.
possvel utilizar o operador + para concatenao de Strings:
Primeira String + Segunda String

resulta em:
Primeira String Segunda String

Existem alguns caracteres que necessitam de alguns truques para serem expressos em
Strings. Eles esto descritos na tablela da figura 3.2.
A listagem 3.2 apresenta mais exemplos de sequncias de escape. A sada deste exemplo
:

http://solutioin.com
Francisco Calaa, Otvio Calaa

11

Verso 1.2-beta

lgica de programao em java

Figura 3.2: Caracteres especiais e sua forma de representao em Strings

Como colocar "aspas" na String.


Exemplo
de
tabulao
c:\diretorio\arquivo

Observe que, para imprimir apenas uma barra, utiliza-se duas.


Listagem 3.2: Exemplos de sequncia de escape
1
2

public class ExemploSequenciaEscape {

public static void main(String[] args) {


System.out.println("Como colocar \"aspas\" na String.");
System.out.println("Exemplo\n\tde\n\t\ttabulao");
System.out.println("c:\\ diretorio \\ arquivo");
}

4
5
6
7
8
9
10

3.4.

Sada Formatada

O Java possui o recurso de sada formatada. Com este recurso possvel definir uma String
de formatao e aps isto, passar parmetros para a mesma. Isto evita concatenao excessiva de String e aumenta a legibilidade do cdigo. A utilizao destes caracteres est
descrita na Tabela 12.1. Para cada caractere de converso existe um parmetro que ser
colocado no seu lugar:
("O aluno %s foi %s", "Marcos", "aprovado")

Neste caso palavra Marcos ser colocada no lugar do primeiro %s e a palavra aprovado
ser colocada no lugar do segundo %s resultando no seguinte:
"O aluno Marcos foi aprovado"

A listagem 12.4 apresenta exemplos de sada formatada.

12

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta
Caracter

lgica de programao em java

Aplicado em

%s

String

%d

Inteiro

%f

Ponto flutuante

Tabela 3.1: Caracteres de converso utilizados na sada formatada

Listagem 3.3: Sada formatada


1

import javax.swing.JOptionPane;

2
3
4

public class ExemploSaidaFormatada {

public static void main(String[] args) {


String nome = JOptionPane.showInputDialog("Nome:");
String resultado = JOptionPane.showInputDialog("Resultado:");
System.out.printf("O aluno %s foi %s\n", nome, resultado);
System.out.printf("\nFormatao numrica :%.2f", 12.356);
}

6
7
8
9
10
11
12
13

3.5.

Conceito de Varivel

Para resolver problemas em programas de computador necessrio manipular vrios dados, sejam eles nmeros ou caracteres. Se voc precisa calcular o resultado de uma nica
conta, provavelmente o melhor seria utilizar uma calculadora. A utilidade de se escrever
um programa aparece quando usamos vrias variveis. Estas possuem a capacidade de conter valores. Desta forma, possvel ento calcular o resultado de vrias contas. As variveis
so declaradas com um identificador e seu nome. Exemplo:
String nome;
int idade;
String endereco;

Tambm possvel passar valores para variveis no momento de sua declarao:


String nome = "Jos Maria";
int idade = 5;
String endereco = "Rua 2 nr 3 Centro";

http://solutioin.com
Francisco Calaa, Otvio Calaa

13

Verso 1.2-beta

3.6.

lgica de programao em java

Palavras reservadas e identificadores

Palavras reservadas, so as palavras que no podem ser usadas como identificadores, ou


seja, no podem ser usadas como nome de variveis, nome de classes, etc. Estas palavras
so assim definidas ou porque j tm uso na sintaxe da linguagem ou porque sero usadas
em algums momento, seja para manter compatibilidade com verses anteriores ou mesmo
com outras linguagens. No caso do Java, as palavras reservadas esto descritas na Tabela
3.2.
abstract

continue

for

new

switch

assert

default

goto

package

synchronized

boolean

do

if

private

this

break

double

implements

protected

throw

byte

else

import

public

throws

case

enum

instanceof

return

transient

catch

extends

int

short

try

char

final

interface

static

void

class

finally

long

strictfp

volatile

const

float

native

super

while

Tabela 3.2: As palavras reservadas do Java

De acordo com a Java Language Specification2 , null, true e false so tecnicamente chamados de valores literais, e no keywords. Se voc tentar criar algum identificador com estes
valores, voc tambm ter um erro de compilao.
Utilizamos, em Java, as seguintes regras para criao do identificador:
no pode ser uma palavra reservada (Tabela 3.2);
no pode ser true nem false - literais que representam os tipos lgicos (booleanos);
no pode ser null - literal que represanta o tipo nulo;
no pode conter espaos em brancos ou outros caracteres de formatao;
deve ser a combinao de uma ou mais letras e dgitos (letras mausculas, minsculas,
nmeros, sublinha (_) e cifro ($)).
Os identificadores no podem comear com nmeros. As letras maisculas e minsculas
diferenciam os identificadores, ou seja, x um identificador diferente de X, nome diferente
de Nome, etc.
Exemplos:
X
2 http://docs.oracle.com/javase/specs/

14

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

Y_1
nome
Pessoa
j3
_teste

3.7.

Tipos Primitivos

Tipos primitivos so tipos que no necessitam instanciao, ou seja, sua declarao j cria
a varivel na memria no sendo necessrio construtores.
Existem oito tipos primitivos em Java que so divididos em quatro grupos:
inteiros
ponto flutuante
caractere
booleano.

3.7.1 Tipos primitivos inteiros


Os quatro tipos primitivos inteiros so utilizados para armazenamento de nmeros inteiros,
sem casas decimais. Eles esto descritos na Tabela 3.3.
Tipo

Tamanho

Intervalo

byte

1 byte

128 at +127

short

2 bytes

32.768 at +32, 767

int

4 bytes

2.147.483.648 at 2.147.483.647

long

8 bytes

9.223.372.036.854.775.808 at 9.223.372.036.854.775.807
Tabela 3.3: Tipos primitivos inteiros do Java

Por padro, os tipos primitivos inteiros so do tipo int, ou seja, se apenas for escrito
o nmero 5, este ser do tipo int. Para explicitar o tipo long deve-se acrescentar, aps o
nmero, a letra L (maiscula ou minscula):
long numero = 45L;

3.7.2 Tipos primitivos de ponto flutuante


Existem dois tipos de ponto flutuante, conforme descrito na tabela da figura 3.4. Estes tipos
so utilizados para armazenamento de nmeros com casas decimais. Utiliza-se o smbolo
ponto (.) para separao decimal:

http://solutioin.com
Francisco Calaa, Otvio Calaa

15

Verso 1.2-beta

lgica de programao em java

1234.566
4343.1212

Tipo

Tamanho

Intervalo

float

4 byte

+/ 3.4E 38 at +/ 3.4E + 38

double

8 bytes

+/ 1.7E 308 at +/ 1.7E + 308

Tabela 3.4: Tipos primitivos de ponto flutuante do Java

Por padro, os tipos primitivos com casas decimais so do tipo double, ou seja, se apenas for escrito o nmero 3.5, este ser do tipo double. Para explicitar o tipo float deve-se
acrescentar, aps o nmero, a letra F (maiscula ou minscula):
float numero = 3.5F;

3.7.3 Tipo primitivo char


O tipo primitivo char utilizado para representar caracteres. Ocupa dois bytes para armazenamento e o intervalo vai de 0 at 65535. Note que o tipo char no abrange nmeros
negativos e possui dois bytes de armazenamento pois o Java suporta caracteres Unicode.

Dica:
O Unicode possui o objetivo explcito de transcender as limitaes
de codificaes de carcter tradicionais, como as definidas pelo
padro ISO 8859, que possuem grande uso em vrios pases mas
que permanecem em sua maioria incompatveis umas com as outras.
Vrias codificaes de carcter tradicionais compartilham um problema comum, ao permitirem processamento bilngue (geralmente usando caracteres romanos e a lngua local), mas no processamento
multilngue (processamento de lnguas arbitrrias misturadas umas
com as outras).

3.7.4 Tipo primitivo boolean


O tipo primitivo boolean utilizado para representar dois estados, verdadeiro ou falso.
Exemplo:
boolean ativo = true;
boolean cancelado = false;

16

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

3.7.5 Converses de variveis


possvel realizar automticamente converses entre variveis primitivas do Java seguindo
a figura 3.3. Segundo esta figura no possvel converter automaticamente tipos maiores
como long para tipos menores como byte. Neste caso necessrio realizar a operao cast:
long maior = 56L;
byte menor = (byte)maior;

Observe que para realizar a operao de cast basta colocar o tipo que se deseja converter
entre parntesis na frente da varivel a ser convertida.
O cdigo da listagem 3.4 apresenta um exemplo do que acontece quando feito um cast
de uma varivel maior para uma menor. Existe o risco de truncamento do nmero. A sada
deste exemplo :
Numero:300
Aps truncamento:44

Isto ocorre porque 300 escrito em binrio : 100101100. Contando os primeiros oito bits
da direita para esquerda, temos: 00101100. Este valor em decimal vale 44. O restante do
nmero em binrio fui truncado, ou seja, descartado.
Listagem 3.4: Exemplo de truncamento de nmeros
1

public class ExemploTruncamento {

public static void main(String[] args) {


int numero = 300;
byte menor = (byte) numero;
System.out.printf("\nNumero:%d \nAps truncamento :%d", numero, menor);
}

3
4
5
6
7
8
9

3.8.

Operadores

Quando o computador foi concebido ele era puramente uma mquina de clculos. Apesar de atualmente o computador estar associado a diversas atividades da vida cotidiana, o
mesmo ainda no passa de uma super mquina de fazer clculos. Desta forma, a linguagem
Java possui vrios operadores cujo objetivo realizar este clculos. Nesta seo sero apresentados os operadores que iro nos auxiliar em operaes matemticas e lgicas.

3.8.1 Aritmticos
A aritmtica do Java realizada por meio dos cinco operadores. Eles so divididos em dois
grupos, os de maior prioridade, listados na Tabela 3.5 e os de menor prioridade, listados

http://solutioin.com
Francisco Calaa, Otvio Calaa

17

Verso 1.2-beta

lgica de programao em java

Figura 3.3: Converses automticas de tipos primitivos

na Tabela 3.6. Os operadores de maior prioridade so executados antes dos operadores


de menor prioridade, ou seja, se em uma expresso matemtica existirem os dois tipos
inicialmente realiza-se as operaes de maior prioridade e somente aps so executados os
operadores de menor prioridade. A expresso:
5 + 3 * 5

Resultar em 20. A operao 3 5 ser executada primeiro.


A ordem de execuo do Java d-se da esquerda para a direita, ou seja, o nosso sentido
de leitura. Existindo, na mesma expresso matemtica, dois ou mais operadores de maior
prioridade ser executado o que vier primeiro: 8/2 3 resultar em 12 porque a diviso 8/2
veio primeiro.
possvel alterar a rdem de execuo com parntesis. Aps a execuo de:
x = (5 + 3) * 2

o valor da varivel x ser 16 pois a soma ser feita primeiro devido aos parntesis.

3.8.2 Atribuio
Em Java utilizado o operador = para realizar a atribuio. Sua ordem de execuo da
direita para a esquerda, ou seja, os valores mais direita so atribudos s variveis mais a
esquerda: x = 4 equivale a dizer que o valor 4 ser atribudo varivel x e, aps a execuo
desta instruo a varivel x passar a conter o valor 4.

18

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta
Operador

lgica de programao em java

Operao realizada

Multiplicao

Diviso

Resto da diviso inteira

Tabela 3.5: Operadores com maior prioridade

Operador

Operao realizada

Adio

Subtrao

Tabela 3.6: Operadores com menor prioridade

Em Java, possvel combinar o operador de atribuio (=) com os operadores de aritmtica. Desta forma so criados mais operadores de atribuio. Estes operadores esto
listados na Tabela 3.7.
Uma dica, para entender melhor estes operadores, colocar o operador de aritmtica
antes do operador de atribuio. Sendo assim, se for necessrio realizar as operaes de
soma e atribuio, primeiro escreva o operador de soma e depois o de atribuio: + =,
x += 3;

Aps a execuo desta instruo o valor da varivel x ser acrescido de 3.


Operador

Exemplo

Equivalente a

+=

s += 7

s=s+7

-=

s -= 7

s=s-7

*=

m *= 7

m=s*7

/=

d /= 7

d=s/7

%=

r %= 7

r=s%7

Tabela 3.7: Exemplos de operadores de atribuio

3.8.3 Incremento/Decremento
Os operadores de incremento e decremento so utilizados quando existe a necessidade de
somar ou subtrair em apenas uma unidade os valores contidos em uma varivel utilizando
dois sinais de soma, para incremento e dois sinais de subtrao para decremento: Assim,
x + + incrementar o valor de x e x decrementar o valor de x. Estes operadores se
dividem em dois grupos:

http://solutioin.com
Francisco Calaa, Otvio Calaa

19

Verso 1.2-beta

lgica de programao em java

1. Pr-incremento/Pr-decremento: primeiro incrementado/decrementado e somente


depois o valor utilizado. O operador colocado antes da varivel:
x = 4;
y = ++x + 5;

O resultado de y aps esta execuo 10. Inicialmente o valor de x incrementado


passando a valer 5. S aps o incremento o valor da varivel utilizado na operao
de soma.
2. Ps-incremento/Ps-decremento: primeiro utiliza-se o valor e somente depois a varivel incrementada/decrementada. O operador colocado aps a varivel.
x = 4;
y = x++ + 5;

O resultado de y aps esta execuo 9. Inicialmente o valor de x somado, assim 4


+ 5 vale 9. O valor s incrementado aps as operaes aritmticas.

3.8.4 Relacionais
So utilizados para comparar duas variveis. O resultado da comparao um valor
booleano. A relao de comparadores do Java pode ser vista na Tabela 3.8.
Operador

Operao

==

Igualdade

!=

Diferena

>

Maior que

>=
<
<=

Maior ou igual que


Menor que
Menor ou igual que

Tabela 3.8: Operadores de comparao do Java

3.8.5 Lgicos
Existem quatro operaes lgicas, cujos operadores esto ilustrados na Figura 3.9:
1. E, o resultado de uma operao lgica E s verdadeiro se os dois operandos tambm
forem verdadeiros;

20

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

2. OU, o resultado de uma operao lgica OU s falso se os dois operandos tambm


forem verdadeiros;
3. NAO, o resultado a negao do operando, assim o que verdadeiro se torna falso
e o que falso se torna verdadeiro aps esta operao;
4. OU EXCLUSIVO, o resultado de uma operao lgica OU EXCLUSIVO s verdadeiro se os dois operandos forem diferentes.

Operador

Operao

||

OU curto-circuito

&&

E curto-circuito

OU lgico

&

E lgico

OU exclusivo

No lgico

Tabela 3.9: Tabela de operadores lgicos

A tabela verdade do Operador E pode ser vista na figura 3.11, do Operador OU na figura
3.10 e a tabela do Operador OU EXCLUSIVO na figura 3.12.
Observe na Figura 3.9 que existem dois tipos de operadores para a operao OU: | (OU
simples) e || (OU curto-circuito) e dois tipos de operadores para a operao E: & (simples)
e && (E curto-circuito).
Basicamente o que diferem estes dois tipos de operadores so o seguinte. OU e E curtocircuito (|| e &&) so utilizados apenas para operaes condicionais. Em uma operao
condicional, j sendo possvel a obteno do resultado, analisando apenas o primeiro
operando, no analisado o segundo operando. Neste caso a resposta j retornada, da o
nome curto circuito. Exemplo:
V || ? = V
F && ? = F

Note, no exemplo, que na operao de OU, independente do valor do segundo operando,


a resposta ser sempre verdadeira se o primeiro operando tambm for. Na operao de E, a
resposta ser sempre falsa se o primeiro operando tambm for. Como voc pode perceber,
no necessrio analisar o segundo operando para retornar as respostas nestes casos.
J os operadores OU e E lgico (| e &) so utilizados em operaes lgicas bit a bit. Por
exemplo:
410 = 1002
310 = 0112
410 |310 1002 |0112
Desta forma,
410 |310 = 7, pois
1002 |0112 = 1112

http://solutioin.com
Francisco Calaa, Otvio Calaa

21

Verso 1.2-beta

lgica de programao em java

Entrada 1

Entrada 2

Sada

Tabela 3.10: Tabela verdade da operao OU

Entrada 1

Entrada 2

Sada

Tabela 3.11: Tabela verdade da operao E

3.9.

Estruturas de seleo

Estrutura de seleo (expresso condicional ou ainda construo condicional) uma estrutura de desvio do fluxo de controle que executa diferentes instrues dependendo se a
seleo (ou condio) verdadeira ou falsa, em que a expresso processada e transformada em um valor booleano.

3.9.1 if . . . else
A instruo if . . . else se comporta da seguinte maneira. Quando o teste do if for verdadeiro, executado o cdigo que se encontra logo em seguida do if. No caso do teste ser
falso, executado o cdigo que se encontra logo em seguida do else. O bloco else no
obrigatrio. A figura 3.4 ilustra o fluxo da instruo if . . . else. Na listagem 3.5 pode ser
visto um exemplo de uso.
Sua sintaxe :
Entrada 1

Entrada 2

Sada

Tabela 3.12: Tabela verdade da operao OU EXCLUSIVO

22

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

if(teste){
//executa somente se o teste for verdadeiro
}else{
//executa somente se o teste for falso
}

Figura 3.4: Fluxo de execuo do if

Listagem 3.5: Exemplo de uso do if . . . else


1

import javax.swing.JOptionPane;

2
3
4
5
6
7
8

public class ExemploIf {


public static void main(String[] args) {
//Obteno dos dados do usurio
String notaString = JOptionPane.showInputDialog("Digite a nota:");
//Converso em int
int nota = Integer.parseInt(notaString);

if (nota >= 5) {
JOptionPane.showMessageDialog(null, "Aprovado");
} else {
JOptionPane.showMessageDialog(null, "Reprovado");
}

10
11
12
13
14

15
16

http://solutioin.com
Francisco Calaa, Otvio Calaa

23

Verso 1.2-beta

lgica de programao em java

Dica:
Para converter String em int, utilize o cdigo:
int nota = Integer.parseInt(notaString);

e para converter String em double:


double nota = Double.parseDouble(notaString);

3.9.2 Operador condicional ou ternrio


O operador condicional pode ser utilizado como um if ... else. Este operador conhecido
tambm como operador ternrio porque ele possui trs operandos:
(teste ? "quando teste verdadeiro" : "quando teste falso" ));

Um exemplo de uso deste operador est na Listagem 3.6.


Na listagem 3.7 pode ser visto outro exemplo de aplicao do operador condicional na
listagem 3.7;
Listagem 3.6: Exemplo de uso do operador condicional.
1

import javax.swing.JOptionPane;

2
3
4
5
6
7
8
9
10
11

public class ExemploCondicional {


public static void main(String[] args) {
String notaString = JOptionPane.showInputDialog("Digite a nota:");
int nota = Integer.parseInt(notaString);
String resultado = nota >= 5 ? "aprovado" : "reprovado";
String msg = "O aluno foi " + resultado;
JOptionPane.showMessageDialog(null, msg);
}
}

Listagem 3.7: Outro exemplo de uso do operador condicional.


1

import javax.swing.JOptionPane;

2
3
4
5
6

public class ImprimeMaior {


public static void main(String[] args) {
String primeiroNumero = JOptionPane.showInputDialog("Digite um nmero:");
String segundoNumero = JOptionPane.showInputDialog("Digite um nmero:");

int n1 = Integer.parseInt(primeiroNumero);
int n2 = Integer.parseInt(segundoNumero);

8
9
10

int maior = n1 > n2 ? n1 : n2;

11
12

JOptionPane.showMessageDialog(null, "O maior numero : " + maior);

13

14

24

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

15

lgica de programao em java

3.9.3 switch
Diferente das instrues if e if . . . else, a instruo switch permite um maior nmero de
possibilidades de caminhos de execuo. A palavra chave switch pode ser utilizada somente
com o tipo primitivo int (byte, short, char por converso automtica e seus tipos Wrappers),
o tipo Enum e, a partir da verso 7 do Java, String.
Sua sintaxe :
switch(tipo){
case a:
//instrucao;
case b:
//instrucao;
default:
//instrucao;
}

Na Listagem 3.8 est o cdigo de exemplo da instruo switch.


comum utilizar a instruo switch juntamente com o break para que apenas uma opo
seja executada.
Listagem 3.8: Exemplo de utilizao do switch
1

import javax.swing.JOptionPane;

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

public class ExemploSwitch {


public static void main(String[] args) {
String numeroString =
JOptionPane.showInputDialog("Digite o nmero de um ms (1 a 12):");
int num = new Integer(numeroString);
String msg;
switch (num) {
case 1:
msg = "Janeiro";
break;
case 2:
msg = "Fevereiro";
break;
case 3:
msg = "Maro";
break;
case 4:
msg = "Abril";
break;
case 5:
msg = "Maio";
break;

http://solutioin.com
Francisco Calaa, Otvio Calaa

25

Verso 1.2-beta
case 6:
msg = "Junho";
break;
case 7:
msg = "Julho";
break;
case 8:
msg = "Agosto";
break;
case 9:
msg = "Setembro";
break;
case 10:
msg = "Outubro";
break;
case 11:
msg = "Novembro";
break;
case 12:
msg = "Dezembro";
break;
default:
msg = "Nmero incorreto";
}
JOptionPane.showMessageDialog(null, msg);

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

50
51

lgica de programao em java

3.10.

Estruturas de Repetio

Estrutura de repetio uma estrutura de desvio do fluxo de controle que realiza e repete
diferentes aes, dependendo se uma condio verdadeira ou falsa, em que a expresso
processada e transformada em um valor booleano. Esto associados a uma estrutura
de repetio uma condio (tambm chamada "expresso de controle" ou "condio de
parada") e um bloco de cdigo: verifica-se a condio, e caso seja verdadeira, o bloco
executado. Aps o final da execuo do bloco, a condio verificada novamente, e caso
ela ainda seja verdadeira, o cdigo executado novamente.

3.10.1

for

A instruo for prov um caminho rpido para percorer uma faixa de valores. Com esta
instruo possvel repetir determinadas instrues enquanto a condio for verdadeira. A
sintaxe do for a seguinte:
for (inicializao; condio; incremento) {
instrues(s)
}

26

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

bom lembrar que:


A inicializao executada apenas quando o loop inicia;
Quando a condio for false o loop terminar;
O incremento invocado depois de cada iterao, local adequado para incrementos e
decrementos de variveis;
Veja na listagem 3.9 um exemplo de uso do lao for. Neste exemplo so impressas quinze
linhas no console.
Listagem 3.9: Exemplo de uso do lao for
1
2
3
4
5
6
7

public class ExemploFor {


public static void main(String[] args) {
for (int i = 0; i < 15; i++) {
System.out.printf("\nlinha: %d", i);
}
}
}

3.10.2 while
A instruo while executa um bloco de instrues enquanto uma condio particular for
verdadeira (true). Sua sintaxe :
while (teste) {
statement(s)
}

A expresso while avalia o teste, que deve retornar um tipo booleano. Se a espresso
avaliada for verdadeira (true), o bloco while executa as instrues dentro do bloco. A expresso while continua testando o teste at que este seja falso (false). O cdigo da listagem
3.10 calcula a soma de inteiros enquanto a opo de sada no informada.
Listagem 3.10: Exemplo de utilizao do lao while
1

import javax.swing.JOptionPane;

2
3
4
5

public class ExemploWhile {


public static void main(String[] args) {
int status = 0;

6
7
8

int qtd = 0;
double soma = 0;

9
10
11
12

while (status != 1) {
String numStr1 = JOptionPane.showInputDialog("Digite um inteiro");
int n1 = Integer.parseInt(numStr1);

13

http://solutioin.com
Francisco Calaa, Otvio Calaa

27

Verso 1.2-beta

lgica de programao em java

soma += n1;
qtd++;

14
15
16

String msg = "Digite 1 para sair ou qualquer outro nmero para continuar";
String statusStr = JOptionPane.showInputDialog(msg);

17
18
19

status = Integer.parseInt(statusStr);

20
21

22
23

double media = soma / qtd;


JOptionPane.showMessageDialog(null, "Mdia: " + media);

24
25
26

27
28

3.10.3

do . . . while

A linguagem Java prov a instruo do . . . while que pode ser vista abaixo:
do {
statement(s)
} while (teste);

A principal diferena entre do . . . while e while que while primeiro avalia o teste e somente
aps executa o loop, enquanto do . . . while primeiro executa a instruo e somente aps isto
avaliado o teste. Em resumo, do . . . while garante pelo menos uma execuo das instrues
do bloco.

3.11.

Exerccios

1. Crie um cdigo que executa a seguinte ao: solicita ao usurio uma idade. Se esta for
maior ou igual a 16, imprime: Pode votar. Se no for, imprime: No pode votar.
2. Melhore o cdigo do exerccio anterior para imprimir tambm Voto obrigatrio quando
a idade estiver entre 18 e 70 anos.
3. Crie um cdigo que imprima o seguinte:
************
************
************
************

4. Crie um cdigo que solicita ao usurio um nmero entre 1 e 7. Aps isto, o sistema
imprime: Domingo se o nmero for 1, Segunda se o nmero for 2, Tera se o nmero
for 3, etc. . .

28

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

lgica de programao em java

5. Altere o cdigo da listagem 3.10 para utilizar do. . . while no lugar de while.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

http://solutioin.com
Francisco Calaa, Otvio Calaa

29

I N T R O D U O O R I E N TA O A
OBJETOS
O Objetivo da orientao a objetos facilitar o reuso de software. Hoje ao ir a uma loja
para comprar uma lmpada, a nica coisa que necessrio saber a potncia desta. O
fabricante da lmpada, sem ter medido nada na sua sala, consegue fabricar uma lmpada
que servir para voc. Hoje fcil reutilizar lmpadas por conta que estas seguem alguns
padres que facilitam sua utilizao. No necessrio rever toda a fiao da sua residncia
quando uma lmpada queima, nem substituir nada. Basta tirar a lmpada defeituosa e
colocar outra nova no seu lugar.
Desta forma, a orientao a objetos traz para o mundo do software as facilidades encontradas no mundo real.
Neste captulo voc ver os conceitos inicias da orientao a objetos, tais como classes e
seus elementos.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

4.1.

O conceitos Classe e Objeto

Os conceitos iniciais de Orientao a Objetos so:


Classe, significa grupo ou conjunto. Representa um tipo de dados que pode conter
atributos e mtodos, como por exemplo, Carro. A classe Carro define todo o conjunto
de carros. A este conjunto possvel associar atributos como potncia, nmero de
passageiros, etc. Mas lembre-se, trata-se de apenas um conjunto, este ainda pode
estar vazio.
Objeto, representa um elemento do conjunto Carro, ou seja, o carro construdo. Sabendo
o que um carro (seus atributos) possvel construir quantos objetos do tipo carros
forem necessrios.
Em resumo: Objeto a instncia de uma classe. Mas o que significa instncia ?
Instncia siginifica a concretizao de algo, ou seja, a materizalizao de um objeto.
Assim a frase: Objeto a instncia de uma classe pode ser traduzida como: Objeto
a concretizao de uma classe.

31

Verso 1.2-beta

introduo orientao a objetos

Assim uma classe o arquivo, o cdigo digitado, enquanto o objeto ser construdo pelo
programa, a partir da classe, e executado pelo computador.
Para declarar classes utiliza-se a palavra chave class:
class Carro {
//campos, construtores, e declarao de mtodos
}

Para instanciar, ou criar, objetos a partir de uma classe utiliza-se o operador: new.
Carro seuCarro = new Carro();

Note que uma classe tambm um tipo. Voc acabou de criar um novo tipo de variveis
no Java! O tipo Carro.
Antes de serem instanciadas, as variveis objeto valem null. A palavra chave null
utilizada para expressar a no existencia de uma instncia de um objeto em determinada
varivel, ou seja, representa o nulo. Esta forma, uma varivel no instanciada possui o valor
null.

4.2.

Elementos de uma classe

Uma classe possui atributos e mtodos. Existe tambm um tipo especial de mtodo: o mtodo
construtor. Nesta seo sero apresentados estes elementos.

4.2.1 Atributos
Atributos de uma classe so as propriedades da mesma. No exemplo do Carro, atributos
poderiam ser: cor, dataDeFabricacao, potncia, etc. Observe que atributos so substantivos que
descrevem a Classe e que so exclusivos de cada objeto, ou seja, apesar de todos os Carros
possuirem o atributo cor, cada Carro pode ter uma cor diferente. Na classe da listagem 4.1
existem os atributos cor e velocidade. Aps a execuo da classe da Listagem 4.2, voc ver
a seguinte sada:
Cor: Branco - Velocidade:80.0

Listagem 4.1: Carro com seus atributos


1
2
3
4

public class Carro {


double velocidade;
String cor;
}

Listagem 4.2: Classe que cria um objeto do tipo Carro


1
2
3

public class CarroTeste {


public static void main(String[] args) {
Carro obj = new Carro();

32

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo orientao a objetos

obj.cor = "Branco";
obj.velocidade = 80;

4
5
6

System.out.printf("Cor: %s - Velocidade :%s\n", obj.cor, obj.velocidade);

8
9

4.2.2 Mtodos
Mtodos so como funes. Possuem instrues que so executadas quando o mtodo
invocado. Em Orientao a Objetos os mtodos descrevem aes realizadas pelos objetos.
Em Java os mtodos devem possuir tipo de retorno:
int realizaAlgo(){
//instrues
return 5;
}

Neste caso obrigatrio explicitar o que o mtodo retorna com a palavra chave return.
Se o mtodo no retornar algo, o tipo de retorno utilizado void (note que sempre deve
ser informado o tipo de retorno. Mesmo quando o mtodo no retorna nada!):
void realizaAlgo(){
//instrues
}

Os mtodos tambm podem receber parmetros:


void realizaAlgo(int parametro){
//instrues
}

Havendo a necessidade de mltiplos parmetros em um mtodo utiliza-se vrgula para


separ-los:
void realizaAlgo(int parametro, double outroParametro){
//instrues
}

A Listagem 4.3 inclui mtodos na classe Carro. Estes mtodos so responsveis por alterar a velocidade e parar o carro. A Listagem 4.4 apresenta um exemplo de execuo destes
mtodos. Aps sua execuo, voc ver a seguinte sada:
Mudando a velocidade para 80,000000 Km/h
Velocidade atual: 80,000000 Km/h
Parando veculo. Velocidade 0 Km/h. Cor: Branco
Mudando a velocidade para 60,000000 Km/h
Velocidade atual: 60,000000 Km/h
Parando veculo. Velocidade 0 Km/h. Cor: Vermelho

http://solutioin.com
Francisco Calaa, Otvio Calaa

33

Verso 1.2-beta

introduo orientao a objetos

Listagem 4.3: Carro com atributos e mtodos


1

public class Carro {

double velocidade;
String cor;

3
4
5

void mudarVelocidade(double v) {
velocidade = v;
System.out.printf("\n\nMudando a velocidade para %f Km/h", velocidade)
;
}

6
7
8

9
10

void pararCarro() {
System.out.printf("\nVelocidade atual: %f Km/h", velocidade);
System.out.printf("\nParando veculo. Velocidade 0 Km/h. Cor: %s", cor
);
}

11
12
13

14
15

Listagem 4.4: Classe que cria um objeto do tipo Carro


1
2
3
4
5
6

public class CarroTesteMetodo {


public static void main(String[] args) {
Carro meuCarro = new Carro();
meuCarro.cor = "Branco";
meuCarro.mudarVelocidade(80);
meuCarro.pararCarro();

Carro carroDaEsposa = new Carro();


carroDaEsposa.cor = "Vermelho";
carroDaEsposa.mudarVelocidade(60);
carroDaEsposa.pararCarro();

8
9
10
11

12
13

4.2.3 Mtodos construtores


Mtodos construtores so um tipo especial de mtodos. Eles so invocados quando objetos
so criados. A declarao de um construtor similar a declarao de um mtodo, exceto
o tipo de retorno: Construtores no possuem tipo de retorno. Nem void. Toda classe Java
possui um construtor. Se no for implementado um construtor o compilador criar um
automaticamente. Este construtor criado, chamado de construtor padro por no receber
parmetros.

Dica:
Construtor padro aquele que no recebe parmetros.

34

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo orientao a objetos

possvel passar parmetros para construtores conforme apresentado na listagem 4.5.


uma forma de criar objetos e ao mesmo tempo ajustar os atributos iniciais. O cdigo da
listagem 4.6 possui a seguinte sada:
Fabricando uma Motocicleta.
Cor: Azul, Potncia: 125,000000 cilindradas
Fabricando uma Motocicleta.
Cor: Vermelho, Potncia: 250,000000 cilindradas
Fabricando uma Motocicleta.
Cor: Prata, Potncia: 400,000000 cilindradas

Listagem 4.5: Exemplo de construtor que recebe atributos


1
2
3

public class Motocicleta {


String cor;
double potencia;

public Motocicleta(String c, double p) {


cor = c;
potencia = p;
System.out.printf("\n\nFabricando uma Motocicleta."
+ "\nCor: %s, Potncia: %f cilindradas", cor, potencia);
}

5
6
7
8
9
10
11

Listagem 4.6: Criao de motocicletas


1
2
3
4
5
6
7

public class MotocicletaTeste {


public static void main(String[] args) {
Motocicleta moto1 = new Motocicleta("Azul", 125);
Motocicleta moto2 = new Motocicleta("Vermelho", 250);
Motocicleta moto3 = new Motocicleta("Prata", 400);
}
}

4.2.4 Padres de nomenclatura


Os padres de nomenclatura utilizados pelos programadores Java so:
Os nomes das classes comeam com letras maisculas;
Os nomes dos mtodos e variveis comeam com letras minsculas;
No utilizado o caracter _ para mudana de palavra e sim a colocacao da primeira
letra da palavra em maisculo.
Variveis constantes so escritas em maisculo.

http://solutioin.com
Francisco Calaa, Otvio Calaa

35

Verso 1.2-beta

introduo orientao a objetos

Dica:
Esta padronizao, dentre outras da linguagem Java, esto descritas
no documento chamado: Code Conventions for the Java Programming Language. Este documento pode ser acessado atravs do site:
http://www.oracle.com/technetwork/java/codeconv-138413.html

4.3.

Atributos e mtodos static

At agora todos os atributos e mtodos de uma classe s estavam acessveis atravz de suas
instncias. Se voc observar o campo out da classe System ver que possvel acessa-lo
diretamente da classe, sem qualquer instncia.
Os campos podem ser da classe ou do objeto. At agora todos os campos criados foram
de objetos, pois s so acessveis a partir de objetos. Para que determinados atributos
possam ser compartilhados por todos os objetos de determinada classe, estes atributos
devem possuir o modificador static.
Na listagem 4.7 apresentada uma classe com um atributo static. Observe que este
atributo incrementado a cada nova instncia desta classe. A classe da listagem 4.8 cria
trs objetos do tipo ObjetoTeste e no final acessa a varivel quantidadeInstancias para saber
este nmero. Note que possvel acessar elementos statics sem a necessidade de instanciar
a classe.
Listagem 4.7: Objeto para testes da palavra chave static
1
2

public class ObjetoTeste {

static int quantidadeInstancias;

4
5

public ObjetoTeste() {
quantidadeInstancias ++;
}

6
7
8
9
10

Listagem 4.8: Demonstrao da palavra chave static


1
2

public class ExemploStatic {

public static void main(String[] args) {


ObjetoTeste obj1 = new ObjetoTeste();
ObjetoTeste obj2 = new ObjetoTeste();
ObjetoTeste obj3 = new ObjetoTeste();

4
5
6
7
8

System.out.printf("\nQuantidade de instncias do Objeto" +


"Teste:%d" , ObjetoTeste.quantidadeInstancias);

9
10

11
12

36

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

13

introduo orientao a objetos

4.3.1 Import static


Permite importar mtodos e campos static de determinadas classes. Exemplo:
import static javax.swing.JOptionPane.*;
import static java.lang.Math.*;

Observe no cdigo da listagem 4.9 a utilizao de vrios mtodos do tipo static das
classes JOptionPane e Math. A cada utilizao de um mtodo destas classes como:
JOptionPane.showMessageDialog(...);

Um exemplo equivalente est no cdigo da listagem 4.10. Nesta classe foi utilizado o
import static o que tornou desnecessrio a referncia das classes JOptionPane e Math:
showMessageDialog(...);

Listagem 4.9: Cdigo sem import static


1

import javax.swing.JOptionPane;

2
3
4
5
6
7
8
9

public class ExemploSemImportStatic {


public static void main(String[] args) {
String numeroTexto = JOptionPane.showInputDialog("Digite um nmero:");
int numero = new Integer(numeroTexto);
double raizQuadrada = Math.sqrt(numero);
double cubo = Math.pow(numero, 3);
double seno = Math.sin(numero);

10

JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,

11
12
13
14

"Raiz Quadrada:" + raizQuadrada);


"Cubo:" + cubo);
"Seno:" + seno);

15
16

"Numero:" + numero);

Listagem 4.10: Cdigo com import static


1
2
3

import static javax.swing.JOptionPane.*;


import static java.lang.Math.*;

4
5
6
7
8
9
10
11

public class ExemploImportStatic {


public static void main(String[] args) {
String numeroTexto = showInputDialog("Digite um nmero:");
int numero = new Integer(numeroTexto);
double raizQuadrada = sqrt(numero);
double cubo = pow(numero, 3);
double seno = sin(numero);

http://solutioin.com
Francisco Calaa, Otvio Calaa

37

Verso 1.2-beta

introduo orientao a objetos

12

showMessageDialog(null,
showMessageDialog(null,
showMessageDialog(null,
showMessageDialog(null,

13
14
15
16

"Numero:" + numero);
"Raiz Quadrada:" + raizQuadrada);
"Cubo:" + cubo);
"Seno:" + seno);

17
18
19

4.4.

Tipos Wrapper

As classes wrappers tem o papel de encapsular os tipos primitivos para a possibilidade de


operaes como: converses, mudana de bases decimais, e algumas operao que somente
a objetos permitido, como por exemplo, trabalhar com conjuntos.
Java possui oito tipos wrapper, que adicionam funcionalidades aos tipos primitivos:
1. Byte - byte
2. Short - short
3. Integer - int
4. Long - long
5. Float - float
6. Double - double
7. Character - char
8. Boolean - boolean
Basicamente os tipos wrapper possuem os mesmos nomes dos tipos primitivos, com a
primeira letra maiscula, exceto para os tipos int que Integer e char que Character.
Algumas destas funcionalidades so: a converso de tipo primitivo para objeto, converso para String, converso partir de String, etc.

4.4.1 Auto-boxing e Auto-unboxing


Este conceito permite converter automaticamente tipos primitivos em equivalentes objetos
utilizando a classe Wrapper respectiva. Isto economiza cdigo e facilita o entendimento do
programa.
Auto-boxing, converso automtica de um tipo primitivo para seu respectivo tipo
Wrapper;
Auto-unboxing, converso automtica de um tipo Wrapper para seu respectivo tipo
primitivo;

38

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo orientao a objetos

Veja na listagem 4.11 um exemplo de boxing e unboxing.


Listagem 4.11: Exemplo de auto boxing
1
2
3
4
5
6
7

public class ExemploAutoBoxing {


public static void main(String[] args) {
/*
* Exemplo de auto boxing. Observe o nmero 16, tipo int e primitivo, foi
* automaticamente convertido para o tipo Wrapper Integer.
*/
Integer idade = 16;

/*
* Exemplo de auto unboxing. Observe a utilizao da classe Integer para
* converso da String 56 em tipo int.
*/
int quantidade = new Integer("56");

9
10
11
12
13
14

15
16

4.5.

Regras de escopo

Entenda por escopo rea de atuao. Os escopos do Java so definidos por chaves. As variveis declaradas dentro de um escopo somente podem ser acessadas dentro deste mesmo
escopo.
Observe que os blocos if, while, for, mtodos, etc. definem escopos. Seus cdigos so
escritos entre chaves. Todas as variveis declaradas dentro de um bloco if somente podem
ser acessadas dentro de um bloco if. Cada mtodo define um novo escopo, por isto as
variveis declaradas dentro de um mtodo no podem ser acessadas por outro mtodo, ou
seja, outro escopo.
Observe o cdigo da listagem 4.12. Neste cdigo existe um bloco for no mtodo main.
Dentro do bloco for foi declarada as variveis numero e i. Estas variveis no podem ser
acessadas fora do bloco for.
Listagem 4.12: Exemplo de regras de escopo
1
2
3
4
5
6
7
8

public class ExemploEscopo {


public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int numero = i;
System.out.println("linha " + i);
}
}
}

http://solutioin.com
Francisco Calaa, Otvio Calaa

39

Verso 1.2-beta

4.6.

introduo orientao a objetos

Sobrecarga de mtodos

Java trabalha com o conceito da assinatura de mtodos. A assinatura de um mtodo consiste


no nome do mesmo juntamente com seus atributos de entrada. Assim o mtodo:
void acao(String texto)

possui a assinatura acao(String), pois o mtodo se chama acao e recebe uma String como
parmetro de entrada.
No entra no conceito de assinatura de um mtodo o seu tipo de retorno, ou seja, dois
mtodos:
void acao(String texto)
int acao(String texto)

possuem a mesma assinatura: acao(String) pois o tipo de retorno no considerado na


definio da assinatura.
O cdigo da listagem 4.13 apresenta um exemplo de sobrecarga de mtodos. Neste
cdigo todos os mtodos se chamam metodoQualquer e diferem apenas na quantidade
e tipo de parmetros. Observe que suas assinaturas so diferentes. O mtodo main invoca
cada um destes mtodos passando parmetros diferentes. A JVM consegue descobrir o
mtodo correto a ser executado em funo da quantidade e tipo dos parmetros informados.
Listagem 4.13: Exemplo de sobrecarga de mtodos
1
2
3
4
5
6
7
8
9
10
11
12
13

public class ExemploSobrecarga {


static void metodoQualquer(int i){
System.out.printf("\nEste mtodo recebe um INT: %d", i);
}
static void metodoQualquer(double d){
System.out.printf("\nEste mtodo recebe um DOUBLE: %f", d);
}
static void metodoQualquer(String texto){
System.out.printf("\nEste mtodo recebe um BYTE: %s", texto);
}
static void metodoQualquer(){
System.out.printf("\nEste mtodo no recebe parmetros");
}

14

public static void main(String[] args) {


metodoQualquer(1);
metodoQualquer(1.0);
metodoQualquer("teste");
metodoQualquer();
}

15
16
17
18
19
20
21

40

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo orientao a objetos

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

4.7.

Exerccios

1. Qual a diferena entre classe e objeto?


2. Quais so os elementos de uma classe?
3. O que so mtodos construtores?
4. Para que serve a palavra chave static?
5. O que faz o import static?
6. O que um escopo?
7. O que sobrecarga de mtodos?
8. O que so tipos wrappers ? Quais so eles ?
9. Crie uma classe java com atributos e mtodos ( sua escolha). Crie outra classe que
instancia a primeira, seta seus atributos e invoca seus mtodos.
10. Adicione um construtor na classe do exerccio anterior.

http://solutioin.com
Francisco Calaa, Otvio Calaa

41

A R R AY S
Arrays so estruturas de dados que permitem o armazenamento de objetos o que facilita a manipulao e transporte destes. No mundo real so utilizadas caixas quando
necessrio agrupar ou transportar objetos. No mundo do Java uma das estruturas utilizadas
so Arrays. Para trabalhar adequadamente com Arrays necessrio que voc saiba como
inicializa-los. O prprio mtodo main recebe um array de strings quando feito String []
args.
O Java 5 trouxe uma nova estrutura for, mais adequada para percorrer valores de arrays.
Esta estrutura mais rpida e mais simples de implementar. Trata-se do for aprimorado.

5.1.

O que so arrays

Um array um objeto continer utilizado para armazenar outros objetos. Possui um tamanho
fixo. O tamanho de um array estabelecido quando este criado. Aps sua criao no
mais possvel alterar este tamanho. Em captulos posteriores ser apresentado as colees
que podem ter seus tamanhos alterados.
Cada item em um array chamado de elemento e cada elemento pode ser acessado por
um ndice numrico. Este ndice um inteiro e sempre se inicia com 0, ou seja, um array
com 10 elementos ter os ndices de 0 at 9.
Um bom exemplo para ilustrar um array a caixa de ovos. Pense em uma caixa de ovos
com 9 unidades. A caixa de ovos um array com 9 elementos. Todos do tipo ovo. A figura
5.1 ilustra isto. Note que quando se cria um array este uma caixa de ovos vazia mas com
um espao pr-determinado, no caso 9. Este espao o tamanho do array. Somente aps a
criao do array possvel colocar elementos nele.
Para acessar determinado elemento de um array necessrio utilizar colchetes:
int n = numeros[4];

Este exemplo acessa o quinto elemento do array (a numerao dos ndices de um array
inicia com 0, por isto o indice 4 representa o quinto elemento).
Se ocorrer uma tentativa de acesso a um elemento no existente em um array ocorrer
um erro. Por exemplo, ao tentar acessar o sexto elemento de um array com 3 elementos
ser visto um erro:
int [] numeros = new int[3];
int n = numeros[5];

Ocasionar o erro: java.lang.ArrayIndexOutOfBoundsException


No captulo sobre excees ser apresentado como tratar estes tipos de erros.

43

Verso 1.2-beta

arrays

Figura 5.1: Um array pode ser comparado a um porta ovos, cada elemento do array pode ser comparado a um ovo

5.2.

Declarao e inicializao de arrays

possvel declarar arrays da seguinte forma:


int [] primeiroArray;

Como nas declaraes de variveis de qualquer tipo no Java, a declarao possui duas
partes: o tipo e o nome da varivel. Note que o tipo do array escrito como tipo[], onde
tipo o tipo de dados que ser colocado no array.
Tambm possvel, ao declarar arrays, colocar os colchetes aps a varivel:
int primeiroArray [];

Mas esta forma menos usual no Java.


Um array inicializado utilizando o operador new porque este um objeto:
primeiroArray = new int[10];

Este exemplo cria um array com capacidade de armazenamento de 10 elementos.


Esta operao apenas inicializa o array, mas no os elementos internos a este. Os elementos devem ser inicalizados um a um:
primeiroArray[0] = 2;
primeiroArray[1] = 3;
. . .
primeiroArray[8] = 4;
primeiroArray[9] = 5;

Outra forma de se inicializar um array e, ao mesmo tempo, inicializar os elementos de


um array :
int [] primeiroArray = {1, 2, 3, 4, 5, 6, 7, 8, 9};

Observe neste exemplo que , na mesma linha, declarado um array, inicializado com 10
elementos e, cada elemento, inicializado com um determinado valor.
Uma observao importante, que costuma cair nas provas de certificao, que quando o
array de tipos primitivos todos os elementos deste so inicializados com 0 ou false, se for

44

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

arrays

de tipo boolean. Em array de Objetos, os elementos no so inicializados, todos continuaro


valendo null.
Array possui um atributo chamado length. Este atributo possui a quantidade de elementos do array.
O cdigo da listagem 5.1 apresenta um exemplo de declarao e inicializao de arrays.
Observe neste exemplo que foi declarado dois tipos de arrays: um array de int e um array
de String. Os elementos destes arrays no foram inicializados mas aps a iterao entre
seus elementos possvel notar que os elementos do array de int valem 0 e os elementos
dos array de tipo String valem null.
A sada deste exemplo a seguinte:

Array de tipo int


Posio [0] = 0
Posio [1] = 0
Posio [2] = 0
Posio [3] = 0
Posio [4] = 0
Posio [5] = 0
Posio [6] = 0
Posio [7] = 0
Posio [8] = 0
Posio [9] = 0
Array de tipo String
Posio [0] = null
Posio [1] = null
Posio [2] = null
Posio [3] = null
Posio [4] = null
Posio [5] = null
Posio [6] = null
Posio [7] = null
Posio [8] = null
Posio [9] = null

Listagem 5.1: Exemplo de declarao de arrays


1
2
3
4
5
6

public class DeclaracaoArray {


public static void main(String[] args) {
//Criando um array de tipo int
int [] numeros = new int[10];
//Criando um array de String
String [] textos = new String[10];

7
8
9

System.out.println("\nArray de tipo int");


for (int i = 0; i < numeros.length; i++) {

http://solutioin.com
Francisco Calaa, Otvio Calaa

45

Verso 1.2-beta

arrays

System.out.printf("Posio [%d] = %d\n", i, numeros[i]);

10

11
12

System.out.println("\nArray de tipo String");


for (int i = 0; i < textos.length; i++) {
System.out.printf("Posio [%d] = %s\n", i, textos[i]);
}

13
14
15
16
17

18
19

5.3.

Mtodo main

Agora possvel explicar toda a assinatura do mtodo main:


public static void main(String [] args){
. . .
}

Sempre dever ser assim! Este mtodo deve:


Ser public pois deve ser acessado externamente;
Ser static pois, como o primeiro mtodo a ser acessado em um programa Java, ainda
no possvel existir uma instncia de um objeto, logo, necessrio um mtodo static,
que pode ser acessado fora de qualquer instncia de um objeto;
Deve, sempre, receber um array de String como parmetro. So os parmetros para o
programa.
O cdigo da listagem 5.2 ilustra como obter os parmetros informados pela linha de
comando a um programa Java. Neste exemplo observe a utilizao do atributo length no
lao for.
Para configurar o eclipse basta clicar no boto descrito na figura 5.2. Aps isto crie
um novo Java Application, conforme ilustrado na figura 5.3. Clique na aba Arguments
e coloque os parmetros no campo Program Arguments.
Para executar via linha de comandos basta acrescentar, aps a classe, os parmetros para
a aplicao, conforme ilustrado na figura 5.4.
Listagem 5.2: Obteno dos parmetros informados ao programa
1
2
3
4
5
6
7
8

public class ParametrosPrograma {


public static void main(String[] args) {
System.out.println("Os parmetros digitados foram:");
for (int i = 0; i < args.length; i++) {
System.out.println(args[i]);
}
}
}

46

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

arrays

Figura 5.2: Incio das configuraes de execuo

Figura 5.3: Configurao do eclipse para passagem de parmetros para a aplicao

Figura 5.4: Passagem de parmetros para uma aplicao Java via linha de comando

http://solutioin.com
Francisco Calaa, Otvio Calaa

47

Verso 1.2-beta

5.4.

arrays

Lao for aprimorado

O Java 5 trouxe uma nova funcionalidade para iterao de arrays: o for aprimorado. Esta
nova forma de utilizao do for permite iteraes de colees e arrays de forma compacta
e mais fcil de ser lida. Para demonstrar um exemplo, considere o exemplo da listagem 5.3.
Neste exemplo utilizada a seguinte estrutura for:
for (String meioTransporte : transportes) {
. . .
}

Observe que este for necessita apenas de dois parmetros: A varivel que receber cada
item do array e o array. Este for percorrer todo o array transportes e coloca, cada elemento
deste, na varivel meioTransporte.
Listagem 5.3: Exemplo de uso do for aprimorado
1
2
3

public class ForAprimorado {


public static void main(String[] args) {
String [] transportes = {"Terrestre", "Aqutico", "Areo"};

for (String meioTransporte : transportes) {


System.out.printf("\nTransporte: %s", meioTransporte);
}

5
6
7

8
9

5.5.

Passagem de parmetros no Java

Em Java todos os parmetros so passados por valor. Isto significa que o valor da varivel
passado sempre ser copiado para o valor da varivel que est recebendo o parmetro. Mas
isto provoca dois tipos de comportamentos diferentes:
Quando a varivel passada primitiva (byte, short, int long, float, double, char e
boolean), o valor copiado para a varivel que est recebendo, ou seja, esta pode
sofer alteraes que no sero replicadas no valor da varivel passada.
Quando passado uma varivel Objeto, o valor desta tambm copiado. A diferena
que o valor de uma varivel Objeto apenas a referncia a este Objeto, por isto,
tem-se a impresso que ocorreu uma passagem por referncia, mas ainda por valor,
pois este foi copiado. Lembre-se o valor de uma varivel Objeto a referncia a este
objeto. Se, neste caso, for alterada a varivel passada, esta tambm sofre alteraes na
origem.
Para poder entender melhor isto, veja o cdigo da listagem 5.5. Esta classe utiliza a classe
Pessoa descrita na listagem 6.4.

48

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

arrays

Observe, na classe da listagem 5.5, a existncia de dois mtodos chamados metodoQualquer. O primeiro mtodo recebe um int, que um tipo primitivo, e o segundo mtodo
recebe uma Pessoa, que um objeto.
Quando invocado o metodoQualquer pela primeira vez no mtodo main, foi passado
como parmetro a varivel valor que um tipo primitivo. Note que o valor desta varivel
no mudou, antes e depois da execuo do metodoQualquer continuou tendo 4 como valor.
Quando invocado o metodoQualquer passando um objeto do tipo Pessoa, este teve
sua referncia copiada. Assim quando alterado em metodoQualquer, esta alterao ser
percebida no mtodo main. Observe que, apesar de se ter a impresso que ocorreu uma
passagem por referncia, no foi isto que ocorreu no Java. O que ocorreu foi uma passagem
por valor. Lembre-se que em Java as varveis Objeto armazenam apenas a referncia a um
objeto. Na passagem de parmetros por valor, o valor (no caso a referncia ao objeto do
tipo Pessoa) foi copiado para o mtodo metodoQualquer.
A figura 5.5 ilustra a cpia de uma referncia. Observe que, apesar de serem variveis e
referncia diferentes, o Objeto o mesmo. Assim, uma alterao realizada pela referncia
referencia 01 - varivel 01 tambm ser percebida pela referncia referencia 02 - varivel
02.
Um outro exemplo est no cdigo da listagem 5.6. Lembre-se que array um objeto,
logo ter sua referncia copiada. O mtodo alteraArray recebe um array de int. Este array
(que um objeto) criado no mtodo main e passado como parmetro para o mtodo
passagemArray. Gerando a seguinte sada:
Antes:
1

Depois:
11

12

13

14

15

16

17

18

19

Figura 5.5: Comportamento das referncias do Java

Listagem 5.4: Classe Pessoa utilizada no exemplo de passagem de parmetros


1
2
3

public class Pessoa {


String nome;

http://solutioin.com
Francisco Calaa, Otvio Calaa

49

Verso 1.2-beta
public Pessoa(String n) {
nome = n;
}

4
5
6
7

arrays

Listagem 5.5: Exemplo de passagem de parmetros no Java


1
2
3
4

public class PassagemParametros {


static void metodoQualquer(int a) {
a++;
}

static void metodoQualquer(Pessoa p) {


p.nome = p.nome + "[NOME ALTERADO]";
}

6
7
8
9

public static void main(String[] args) {


System.out.println("Passagem tipo primitivo:");
int valor = 4;
System.out.printf("\nValor antes: %d", valor);
metodoQualquer(4);
System.out.printf("\nValor depois: %d", valor);

10
11
12
13
14
15
16

Pessoa pessoa = new Pessoa("Maria");


System.out.printf("\n\nValor antes: %s", pessoa.nome);
metodoQualquer(pessoa);
System.out.printf("\nValor depois: %s", pessoa.nome);

17
18
19
20

21
22

Listagem 5.6: Passagem de um array como parmetro


1
2
3
4
5
6

public class PassagemArray {


static void alteraArray(int[] array) {
for (int i = 0; i < array.length; i++) {
array[i] += 10;
}
}

public static void main(String[] args) {


int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.out.println("\n\nAntes:");
for (int n : numeros) {
System.out.printf(" %d ", n);
}
alteraArray(numeros);
System.out.println("\n\nDepois:");
for (int n : numeros) {
System.out.printf(" %d ", n);
}
}

8
9
10
11
12
13
14
15
16
17
18
19
20

50

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

5.6.

arrays

Arrays multidimensionais

possvel, mas no aconselhado, utilizar arrays multidimensionais no Java. Basta acrescentar o par abre e fecha colchetes para cada dimenso. Note que os arrays criados at agora
possuem dimenso unitria. Um exemplo de array bi-dimenssional :
int [][] matriz = new int [3][4];

Neste exemplo foi declarado um array bi-dimensional e inicializado com 3 x 4 posies


de armazenamento, podendo ser utilizado para representao de uma matriz com 3 linhas
e 4 colunas.

5.7. Lista de parmetros com comprimento varivel


Mais uma funcionalidade acrescentada no Java 5 foi a Lista de parmetros com comprimento varivel: vararg. A declarao feita utilizando o tipo, reticncias e nome da varivel:
metodoQualquer(double ... varivel){
}

Este exemplo cria o metodoQualquer que pode receber qualquer quantidade de valores
do tipo double:
metodoQualquer(1, 2, 3);
metodoQualquer(3.5, 6.4);
metodoQualquer();

So todas as chamadas vlidas para metodoQualquer.


Um outro exemplo de vararg o mtodo printf. Note que este mtodo pode receber uma
quantidade qualquer de parmetros.
Para utilizao de vararg deve-se seguir as seguintes regras:
1. Um mtodo pode receber no mximo uma lista de parmetros variveis;
2. A lista de parmetros variveis deve ser o ltimo argumento;
3. Entenda que a lista de parametros variveis ser convertida, pelo compilador, em um
array;
4. possvel passar de 0 a muitos parmetros para um vararg;
O cdigo da listagem 5.7 apresenta um exemplo de utilizao de vararg. Esta classe
possui um mtodo chamado calcularMedia(double . . . varivel) que recebe uma quantidade
qualquer de parmetros.

http://solutioin.com
Francisco Calaa, Otvio Calaa

51

Verso 1.2-beta

arrays

Listagem 5.7: Exemplo de utilizao de vararg


1
2
3
4
5
6
7
8

public class ExemploVararg {


public static double calcularMedia(double... notas) {
double soma = 0;
for(double n : notas){
soma += n;
}
return soma / notas.length;
}

public static void main(String[] args) {


double media = calcularMedia(5, 6, 5, 8);
System.out.printf("\nA mdia : %f", media);
}

10
11
12
13
14

Tambm possvel utilizar vararg no mtodo main, apesar de pouco usual:


public static void main(String ... args) {
}

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

5.8.

Exerccios

1. O que so arrays?
2. Quais as formas de se declarar um array?
3. Explique o for aprimorado.
4. Como passar parmetros para o mtodo main?
5. Explique a passagem de parmetros no Java.
6. O que so lista de parmetros com comprimento varivel?
7. Crie uma classe chamada Calculadora. Esta classe dever possuir os mtodos somar
e multiplicar que recebam uma quantidade varivel de parmetros do tipo double.
O mtodo somar retorna a soma de todos eles e o mtodo multiplicar o valor do
produto entre eles.

52

http://solutioin.com
Francisco Calaa, Otvio Calaa

U M P O U C O M A I S D E O R I E N TA O A
OBJETOS
No captulo 4 foi realizada uma introduo orientao a objetos. Neste captulo ser
apresentado mais detalhes deste novo paradigma: Encapsulamento, Herana, Abstrao e
Polimorfismo. Estes elementos promovem o melhor reuso de software o que torna possvel
a concepo de sistemas mais complexos e menos propensos a erros.
Outro assunto abordado neste captulo o coletor de lixo. Algumas tecnologias demandam uma preocupao do desenvolvedor em desalocar recursos. Em Java no necessrio
preocupar-se com isto. Os objetos criados uma vez no mais referenciados so coletados
pelo Garbage Collector (Coletor de lixo).

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

6.1.

Coletor de lixo

chamado de heap space o espao onde ficam armazenados os objetos Java instanciados.
Os objetos so criados pelo operador new e alocados no heap space em tempo de execuo.
A coleta do lixo o processo automtico que remove os objetos que no esto sendo mais
referenciados liberando espao neste heap space.
O coletor de lixo ou gc (garbage collector em ingls) um processo executado paralelamente
aplicao e responsvel pela liberao de memria.
Nas listagens 6.1 e 6.2 apresentado uma demonstrao de funcionamento do coletor de
lixo. Todas as instncias de ObjetoColetado, ao serem instanciadas, escrevem a linha:
++ Construindo o objeto: 0

e toda as vezes que estas instncias so finalizadas pelo gc, executado o mtodo
void finalize(). Desta forma, impressa a linha:
-- Finalizando o objeto: 0

Assim a sada do programa :


++ Construindo o objeto: 0
++ Construindo o objeto: 1

53

Verso 1.2-beta

um pouco mais de orientao a objetos

++ Construindo o objeto: 2
++ Construindo o objeto: 3
-- Finalizando o objeto: 3
-- Finalizando o objeto: 2
. . .
++ Construindo o objeto: 1200
++ Construindo o objeto: 1201

Quando voc executar na sua mquina o comportamento ser ligeiramente diferente. Os


objetos coletados bem como a ordem que isto realizado sero diferentes. Isto ocorre por
no ser possvel prever o momento em que determinado objeto ser coletado.
possvel solicitar mquina virtual a invocao do coletor de lixo. Para isto, deve ser
executado o mtodo System.gc(). Isto no aconselhado uma vez que existe um algoritmo,
bastante otimozado, para realizar esta tarefa.
Listagem 6.1: Objeto a ser coletado na demonstrao do coletor de lixo
1

public class ObjetoColetado {

int numero;

3
4

public ObjetoColetado(int n) {
numero = n;
System.out.printf("\n++ Construindo o objeto: %d", numero);
}

5
6
7
8
9

protected void finalize() throws Throwable {


System.out.printf("\n-- Finalizando o objeto: %d", numero);
}

10
11
12
13
14

Listagem 6.2: Demonstrao do coletor de lixo


1
2

public class ExemploColetorLixo {

public static void main(String[] args) {


for (int i = 0; i < 5000; i++) {
new ObjetoColetado(i);
}
}

4
5
6
7
8
9
10

6.2.

A palavra-chave this

A palavra chave this pode ser utilizada de duas formas:


como mtodo

54

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

como referncia
Quando utilizada como mtodo, este acessa o construtor da prpria classe. Observe que
um dos construtores do cdigo abaixo:
public class Ponto {
public int x = 0;
public int y = 0;
//construtor
public Ponto(int a, int b) {
x = a;
y = b;
}
public Ponto() {
this(0, 0);
}
}

invoca um outro construtor com a chamada this(0, 0) passando os parmetros para outro
construtor.
Quando utilizada como referncia esta referencia o objeto da prpria classe. Com this
possvel acessar os elementos da instncia do objeto a partir da classe. Note que a palavra
chave this no pode ser utilizada dentro de contextos static porque nestes contextos no
so acessados a partir de instncias da classe e sim diretamente. Lembre-se this acessa
membros do objeto criado a partir da classe em que utilizado.
Por exemplo a classe Ponto pode ser escrita assim:
public class Ponto {
public int x = 0;
public int y = 0;
//construtor
public Ponto(int a, int b) {
x = a;
y = b;
}
}

Mas tambm pode ser escrito assim:


public class Ponto {
public int x = 0;
public int y = 0;
//construtor
public Ponto(int x, int y) {

http://solutioin.com
Francisco Calaa, Otvio Calaa

55

Verso 1.2-beta

um pouco mais de orientao a objetos

this.x = x;
this.y = y;
}
}

Cada argumento do segundo exemplo se possui o mesmo nome dos atributos da classe:
x e y. Para diferencia-los utilizado this. A referncia this indica que this.x e this.y so as
variveis x e y da classe e no do construtor. Assim:
this.x = x;

Significa que o valor declarado de x ser atribuido a um elemento da classe chamado x.

6.3.

Variveis do tipo final

Variveis do tipo final so constantes no Java. Isto significa que:


obrigatria a inicializao;
Aps ser inicializada seu valor no pode mais ser alterado;
um padro utilizar letras maisculas nos identificadores de variveis do tipo final:
final int CONSTANTE = 7;

6.4.

Encapsulamento

Encapsulamento significa, na ntegra, colocar dentro de uma cpsula. Imagine o seguinte


cenrio:
Um parque municipal, sem grades, muros, etc. Todos os visitantes podem entrar no
parque por qualquer lugar. O parque muito extenso. Um dia o administrador do parque
deseja entregar um aviso dizendo que no dia seguinte no ser aberto. Como entregar
os avisos? Dificil! O que fazer para facilitar a entrega de informaes aos visistantes do
parque?
Soluo: Criar grades ao redor do parque e colocar uma portaria! Assim qualquer aviso
a ser dado aos visitantes do parque pode ser dado por meio de uma determinada portaria.
Fica muito mais fcil avisar a todos uma vez que obrigatria a passagem dos visitantes
pela portaria.
Encapsulamento justamente isto. Significa fechar todas as entradas a um atributo e
construir uma portaria onde possvel entrar e sair valores para melhorar o controle sobre
os valores deste atributo.
Encapsulamento um dos pilares da Orientao a Objetos e no java feito da seguinte
forma:
Para fechar todos os acessos utiliza-se o modificador de acesso private no atributo.
Este modificador impede que o atributo da classe possa ser acessado de outra classe.

56

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

Para construir a portaria devem ser criados os mtodos acessores: getAtributo()


para ler o resultado e setAtributo para gravar no atributo.
Suponha o seguinte atributo:
String nome;

Para ecapsul-lo necessrio:


Proibir o acesso ao nome a partir de outra classe:
private String nome;

Construir os mtodos acessores get. . . e set. . . :


public String getNome(){
}
public void setNome(String nome){
}

Apesar dos termos get e set estarem em ingls obrigatrio que estes sejam usados desta
forma. Mais adiante este padro ser necessrio para correto funcionamento de determinadas APIs.
No se preocupe com isto. Hoje a maior parte das IDEs fazem este trabalho.
No eclipse basta criar a classe, escrever os atributos nela (com o modificador private),
conforme a figura 6.1. Aps isto clique com o boto direito na tela e selecione a opo
source - Generate getters and setters, conforme a figura 6.2. Clique nos parmetros que
deseja criar os mtodos getters e setters conforme a figura 6.3. A figura 6.4 apresenta os
mtodos criados.

Figura 6.1: Exemplo do encapsulamento no eclipse: Criando o atributo

http://solutioin.com
Francisco Calaa, Otvio Calaa

57

Verso 1.2-beta

um pouco mais de orientao a objetos

Figura 6.2: Exemplo do encapsulamento no eclipse: Invocando o assistente para criao do encapsulamento

Figura 6.3: Exemplo do encapsulamento no eclipse: Escolha dos campos que sero encapsulados

58

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

Figura 6.4: Exemplo do encapsulamento no eclipse: Resultado final

6.5.

Enumeraes

As enumeraes (ou enums) so tipos especiais de Java que permite lista limitada dos
valores. Estes valores podem ser passados s indicaes de controle (switch(), if() ex.)
Em liberaes prvias, a maneira padro representar um tipo enumerated era o teste
padro interno de Enum: teste padro interno de Enum - tem problemas severos!
final static public int INVERNO = 0;
final static public int PRIMAVERA = 1;
final static public int VERAO = 2;
final static public int OUTONO = 3;

Este teste padro tem muitos problemas, como:


Como os tipos so int possvel passar o nmero 10, por exemplo, que no corresponde a nenhuma estao do ano.
provvel que ocorram conflitos entre constantes, por exemplo, pode existir uma
constante MASCULINO = 1 que conflitar com PRIMAVERA, ou seja, neste caso
PRIMAVERA = MASCULINO!.

6.6.

Pacotes

Para facilitar a localizao, melhorar a organizao e os conflitos de nomes entre classes


utilizado pacotes que agrupam tipos relacionados.
Definio: Um pacote um agrupamento de tipos relacionados que facilitam o gerenciamento de algumas classes.

http://solutioin.com
Francisco Calaa, Otvio Calaa

59

Verso 1.2-beta

um pouco mais de orientao a objetos

Os tipos (classes, enumeraes, interfaces) que fazem parte da plataforma java sao membros de vrios pacotes como:
Pacote java.lang, classes fundamentais do java
Pacote java.io, classes para leitura e escrita em dispositivos
possvel colocar as suas classes dentro de pacotes tambm, utilizando a palavra chave
package:
package livro.capitulo08;

No permitida a existncia de mais que uma declarao package. Isto se d pelo fato
de que um tipo (classe, enum ou interface) pode estar em apenas um pacote.
A declarao package deve ser a primeira declarao do arquivo. Antes dos imports,
antes de tudo.
Suponha que voc escreveu um grupo de classes que representa objetos grficos, como
crculos, retngulos, linhas e pontos.
public class Circulo {
. . .
}
public class Retangulo{
. . .
}
public class Ponto{
. . .
}
public class Linha{
. . .
}

Voc deve colocar estas classes em um pacote por vrias rases, incluindo:
Voc ou outros programadores podem facilmente determinar que estes tipos esto
relacionados entre si.
Voc e outros programadores sabem onde encontrar os tipos que fornecem funcionalidades grficas.
Os nomes dos seus tipos no conflitaro com os nomes de tipos com outros pacotes
Voc pode permitir tipos que sero acessados apenas por elementos de dentro do
mesmo pacote ou tipos que sero acessados externamente

60

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

6.6.1 Como usar tipos dentro de outros pacotes


possvel utilizar tipos (classes, enums ou interfaces) dentro de outros pacotes de trs
formas:
Referencie o tipo com o seu nome qualificado. Ex.: java.util.Date
Importe o tipo: import java.util.Date
Importe todos os tipos dentro do pacote: import java.util.*
A listagem 6.3 apresenta esses trs exemplos. Nesta listagem possvel ver a declarao
de:
import java.io.* - que importa todos os tipos do pacote java.io
import java.util.Date - que importa apenas o tipo Date do pacote java.util
java.util.List - que referencia diretamente o tipo dentro do pacote sem a necessidade do import.
Listagem 6.3: Exemplo de uso de pacotes
1
2

import java.io.*;
import java.util.Date;

3
4

public class ExemploPacote {

public static void main(String[] args) {


/*
* A classe Date foi importada atravs da declarao:
* import java.util.Date;
* contida no cabealho da classe
*/
Date hoje = new Date();
System.out.println(hoje);

6
7
8
9
10
11
12
13
14

/*
* Note a referncia direta List, sem a necessidade
* de realizar um import.
*/
java.util.List lista = new java.util.ArrayList();

15
16
17
18
19
20

/*
* Esta classe foi importada do pacote java.io, atravs
* da declarao:
* import java.io.*;
*/
File arquivo = new File("c:\\ arquivo.txt");

21
22
23
24
25
26

27
28

http://solutioin.com
Francisco Calaa, Otvio Calaa

61

Verso 1.2-beta

6.7.

um pouco mais de orientao a objetos

Herana

Na Orientao a Objetos uma classe pode derivar de outras classes atributos e mtodos.
Uma classe que deriva, ou herda de outra classe chamada de subclasse (tambm
classe derivada, classe extendida, ou classe filha). A classe herdada por uma subclasse
chamada de superclasse (tambm classe ancestral, classe pai).
A Herana define uma especializao. Desta forma uma subclasse, pode ser entendida
como uma especializao de determinada classe. Por exemplo, seja a classe Medico. Uma
especializao Pediatra. Desta forma, um Pediatra possui todos os mtodos e atributos
de Medico, afinal um Pediatra ainda Medico. Mas, alm destes, possui tambm atributos
e mtodos especficos de Pediatra.
Exceto a classe Object, que no possui superclasses, todas as classes tem uma, e somente
uma superclasse direta (herana simples). Se uma classe no tiver herdando de outra explicitamente, ento esta herda da classe Object de forma implcita.
Heraa somente aplicado a atributos e mtodos de classes. Construtores no so herdados por herana.

6.7.1 Um exemplo de Herana


O cdigo da listagem 6.4 apresenta a classe Pessoa que ser ancestral das demais classes
em nosso exemplo. Observe a existencia dos atributos nome e telefone nesta classe.
A classe Aluno, apresentada na listagem 9.14, herda de pessoa. Esta herana faz comv
que Aluno tambm possua os atributos e mtodos de Pessoa, como nome e telefone.
A listagem 6.6 apresenta o uso das classes Aluno e Pessoa. Note que o mtodo imprimirDados utilizado para imprimir os dados referentes classe.
Listagem 6.4: Classe Pessoa
1
2

public class PessoaFisica {

private String nome;


private String telefone;

4
5
6
7
8

public PessoaFisica(String nome, String telefone) {


this.nome = nome;
this.telefone = telefone;
}

9
10
11
12
13

public void imprimirDados(){


System.out.printf("\nNome: %s - Telefone :%s", nome, telefone);
}

14
15
16
17

public String getNome() {


return nome;
}

18
19
20

62

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

public void setNome(String nome) {


this.nome = nome;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}

21
22
23
24
25
26
27
28
29
30

um pouco mais de orientao a objetos

Listagem 6.5: Classe Aluno - filha de Pessoa


1
2

public class Aluno extends PessoaFisica{

private double nota;

4
5

public Aluno(String nome, String telefone, double nota) {


super(nome, telefone);
this.nota = nota;
}

6
7
8
9
10

public void imprimirDados() {


super.imprimirDados();
System.out.printf(" Nota: %.2f", nota);
}

11
12
13
14
15

public double getNota() {


return nota;
}

16
17
18
19

public void setNota(double nota) {


this.nota = nota;
}

20
21
22
23

Listagem 6.6: Exemplo da utilizao da herana com as classes Pessoa e Aluno


1
2

public class ExemploHeranca {

public static void main(String[] args) {


PessoaFisica pessoa = new PessoaFisica("Maria", "3231 -2323");
Aluno aluno = new Aluno("Claudia", "3132 -5656", 8.5);

4
5
6
7

pessoa.imprimirDados();
aluno.imprimirDados();

8
9

10
11
12

http://solutioin.com
Francisco Calaa, Otvio Calaa

63

Verso 1.2-beta

um pouco mais de orientao a objetos

6.7.2 Sobrescrita de mtodos


Note que a classe Aluno possui um mtodo com mesmo nome e assinatura de sua ancestral,
Pessoa. A isto da-se o nome de sobrescrita de mtodos. Mais adiante ser apresentado o
Polimorfismo e a Sobrescrita de mtodos possui papel fundamental no Polimorfismo.

6.7.3 A palavra-chave super


A palavra chave super pode ser utilzada de duas formas:
como mtodo
como referncia.
Quando utilizada como mtodo, este acessa o mtodo construtor da classe Pai. Note
no construtor da classe da listagem 9.14 que foi utilizado super(nome, telefone); para
referenciar o construtor da super-classe.
Quando utilizada como referncia, este acessa mtodos ou membros da classe Pai. Note
no mtodo imprimirDados() o uso de super.imprimirDados(); para tambm imprimir os
dados de pessoa.

6.8.

Alguns Modificadores de acesso

Veja agora o uso de quatro modificadores de acesso:

6.8.1 private
A palavra private restringe o acesso do mtodo ou do atributo somente classe que o
definiu, ou seja, um mtodo ou atributo privado s poder ser acesso dentro da classe que
o definiu.! A listagem 6.4 descreve uma classe que possui um atributo com esse modificador.
Veja que no possvel acessar o atributo nome de fora desta classe.

6.8.2 pacote
utilizado quando no existe nenhum modificador de acesso antes da varivel. Restringe
o acesso somente a classes definidas dentro do mesmo pacote, ou seja, quando no informado nenhum modificador de acesso, o elemento pode apenas ser acessado de uma classe
que esta no mesmo pacote.

64

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

6.8.3 protected
Ele um pouco mais liberal que o modificador padro ou pacote, pois ele permite que um
mtodo de uma classe definida em um pacote possa ser acessado por uma classe definida
em outro pacote desde que esta classe seja filha da anterior.

6.8.4 public
Um mtodo pblico pode ser acessado por qualquer classe em qualquer pacote. Utilizado
para estabelecer uma interface entre os componentes do programa.
boa prtica definir todos os membros de uma classe private e ir aumentando a acessibilidade quando for necessrio. Evite criar tudo do tipo public.

6.9.

Classe object

A classe Object uma classe que serve de superclasse para todas as classes existentes em
Java. Isso significa que ao criar uma classe, se no for especificada nenhuma superclasse
aps a palavra extends, ento a classe Object ser assumida automaticamente como superclasse. Portanto toda classe subclasse de Object, e com isso herda alguns mtodos
automaticamente.

6.9.1 mtodo equals()


Um mtodo muito interessante presente na classe Object o equals. Suponha que haja duas
instncias de uma mesma classe e necessrio testar se elas contm a mesma informao.
O operador:
==

retorna apenas o valor true apenas se seus operandos forem precisamente o mesmo objeto.
Porm, o operador equals retorna quando os objetos contm o mesmo estado, atravs da
comparao campo-a-campo.
Por exemplo, eu e voc podemos ter carro do mesmo modelo. Nesse caso:
meuCarro == seuCarro

seria false pois embora nossos carros sejam do mesmo modelo, so carros diferentes. Entretanto,
meuCarro.equals(seuCarro);

poderia ser true se os atributos de ambos os carros fossem idnticos, por exemplo, mesmo
ano, mesma cor, etc.
A listagem 6.7 apresenta um exemplo de comparao de objetos. Note que apesar das
Strings possuirem o mesmo valor: texto, ao compar-las com == no visto o resultado
esperado. Apenas com equals.

http://solutioin.com
Francisco Calaa, Otvio Calaa

65

Verso 1.2-beta

um pouco mais de orientao a objetos

A sada deste exemplo :


s1 = texto
s2 = texto
s1 diferente de s2 com ==
s1 igual a s2 com equals

Listagem 6.7: Exemplo de comparao entre objetos com equals


1

public class ExemploEquals {

public static void main(String[] args) {


String s1 = new String("texto");
String s2 = new String("texto");

3
4
5
6

System.out.printf("s1 = %s\n", s1);


System.out.printf("s2 = %s\n", s2);

7
8
9

if (s1 == s2) {
System.out.println("s1 igual a s2 com ==");
} else {
System.out.println("s1 diferente de s2 com ==");
}

10
11
12
13
14
15

if (s1.equals(s2)) {
System.out.println("s1 igual a s2 com equals");
} else {
System.out.println("s1 diferente de s2 com equals");
}

16
17
18
19
20
21

22
23
24

6.9.2 mtodo toString()


Outro mtodo bastante utilizado da classe Object o mtodo toString. Este mtodo
invocado pela mquina virtual toda vez que se deseja converter determinado objeto em
String.
O cdigo da listagem 6.8 apresenta um exemplo de utilizao do toString. Observe no
mtodo main o cdigo:
System.out.println(exemplo);

Este cdigo imprime o objeto e, ao ser convertido em String para a impresso, a mquina
virtual executar o mtodo toString para descobrir como fazer isto.
Listagem 6.8: Exemplo de utilizao do mtodo toString
1

66

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

public class ExemploToString {

public String toString() {


return "Exemplo da implementao do toString";
}

4
5
6
7

public static void main(String[] args) {


ExemploToString exemplo = new ExemploToString();
System.out.println(exemplo);
}

8
9
10
11
12

6.10.

Polimorfismo

Uma caracterstica importante das classes reside no fato de que as subclasses de uma dada
classe so consideradas do mesmo tipo de seu parente.
Assim no exemplo anterior de Pessoa e Aluno, pode-se dizer que Aluno do tipo Pessoa,
ou seja, Aluno uma Pessoa. Note que a herana define, desta forma, o relacionamento
UM. Nestes casos tambm possvel que exista a sobrescrita de mtodos. Isto permite a
realizao de uma mesma operao sobre diferentes tipos de classes, desde que mantenham
algo em comum. Este efeito se chama Polimorfismo.

6.10.1 Abstrao
Para que voc entenda melhor a abstrao veja um exemplo com o mundo real. Tome
inicialmente algumas verdades:
1. Todo animal locomove;
2. Todo Peixe um animal;
3. Todo Sapo um animal;
4. Todo Tigre um animal;
Pergunta: Como o Animal Locomove? A resposta complicada pois Peixes, Sapos e
Tigres se locomovem de forma diferente. Na verdade a resposta : depende.
Mas, para cumprir a verdade 1, que todo animal se locomove, necessrio definir um
mtodo locomover em animal. Mesmo no sabendo ainda como este o faz: nadando, pulando ou correndo.
neste cenrio que entra o conceito de abstrao: Existe, mas no possvel saber como
, como feito.
Desta forma, o mtodo locomover deve ser abstrato utilzando a palavra chave abstract.
Para isto deve-se cumprir algumas regras:
Todo mtodo abstrato no possui corpo, ou seja, no lugar dos
vrgula: ;.

http://solutioin.com
Francisco Calaa, Otvio Calaa

colocado ponto-

67

Verso 1.2-beta

um pouco mais de orientao a objetos

Quando uma classe possui pelo menos um mtodo abstrato, esta tambm deve ser
declarada como abstrata
As classes abstratas no podem ser instanciadas.
As classes filhas de uma classe abstrata devem, obrigatoriamente ou implementar os
mtodos abstratos da classe pai, ou tambm ser abstrata.

6.10.2

Exemplo de Polimorfismo

Para explicar melhor o Polimorfismo veja o exemplo da folha de pagamento de uma empresa.
O cdigo da listagem 6.9 apresenta a classe Empregado. Observe que esta classe abstrata (pelo modificador abstract na sua declarao). O mtodo calcularSalario tambm
abstrato, pois apesar de todos os empregados possuirem salrio, esta caracterstica s
poder ser descrita se for possvel saber o tipo de empregado: Assalariado, Comissionado
ou Horista.
A classe Empregado herda de Pessoa os atributos nome e telefone, no sendo mais
necessrios sua implementao. Essa classe tambm sobrescreve o mtodo toString que
define um comportamento personalizado quando for necessrio a conversso de objetos
do tipo Empregado em String.
O cdigo da listagem 6.10 apresenta a classe EmpregadoAssalariado. Esta classe herda
de Empregado alguns mtodos, inclusive os de Pessoa. possvel dizer que EmpregadoAssalariado um Empregado e por consequencia, uma Pessoa.
A classe EmpregadoAssalariado no abstrata, logo deve obrigatoriamente implementar
o mtodo calcularSalario. Observe que, para EmpregadoAssalariado, possvel dizer como
se calcula o salrio. Basta retornar o salrio mensal do empregado.
O cdigo da listagem 6.11 apresenta a classe EmpregadoComissionado. Esta classe tambm herda de Empregado alguns mtodos.
Note que o mtodo calcularSalario de EmpregadoComissionado retorna o resultado da
multiplicao das vendas brutas com o valor da comisso do empregado.
O cdigo da listagem 6.12 apresenta a classe EmpregadoHorista. Esta classe tambm
filha de Empregado. O seu mtodo calcularSalario tambm especfico apenas para empregados que trabalham por hora.
At agora foro apresentadas quatro classes em nosso exemplo:
Empregado
EmpregadoAssalariado
EmpregadoComissionado
EmpregadoHorista
Todos estes empregados so do tipo Pessoa. Os empregados assalariados, horistas e
comissionados so do tipo empregados. Isto se deve por causa da herana.
Para finalizar este exemplo ser construda a classe FolhaPagamento, descrita na listagem
6.13. Obseve neste exemplo que todos os empregados so instanciados e colocados em um

68

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

array de tipos Empregado. Quando este array iterado pelo for os dados salariais so
impressos de acordo com o tipo de empregado. Isto o polimorfismo: Apesar de todos os
empregados possuirem o mtodo calcularSalario, este se comporta de forma diferente em
funo do tipo do empregado.
Polimorfismo quer dizer: vrias formas de executar a mesma ao, ou seja, vrias formas
de executar o calcularSalario.
Listagem 6.9: Cdigo da classe Empregado
1
2

public abstract class Empregado extends PessoaFisica {

public Empregado(String nome, String telefone) {


super(nome, telefone);
}

4
5
6
7

public String toString() {


return String.format("Nome:%s Telefone :%s
getTelefone(), calcularSalario());
}

8
9
10
11

Salario :%.2f" , getNome(),

12

public abstract double calcularSalario();

13
14
15

Listagem 6.10: Cdigo da classe EmpregadoAssalariado


1
2

public class EmpregadoAssalariado extends Empregado{

private double salario;

4
5

public EmpregadoAssalariado(String nome, String telefone, double salario) {


super(nome, telefone);
this.salario = salario;
}

6
7
8
9
10

public double calcularSalario() {


return salario;
}

11
12
13
14

public double getSalario() {


return salario;
}

15
16
17
18

public void setSalario(double salario) {


this.salario = salario;
}

19
20
21
22

Listagem 6.11: Cdigo da classe EmpregadoComissionado


1

http://solutioin.com
Francisco Calaa, Otvio Calaa

69

Verso 1.2-beta

um pouco mais de orientao a objetos

public class EmpregadoComissionado extends Empregado{

private double vendasBrutas;


private double comissaoVendas;
public EmpregadoComissionado(String nome, String telefone,
double vendasBrutas, double comissaoVendas) {
super(nome, telefone);
this.vendasBrutas = vendasBrutas;
this.comissaoVendas = comissaoVendas;
}

4
5
6
7
8
9
10
11
12

public double calcularSalario() {


return vendasBrutas * comissaoVendas;
}

13
14
15
16

public double getVendasBrutas() {


return vendasBrutas;
}

17
18
19
20

public void setVendasBrutas(double vendasBrutas) {


this.vendasBrutas = vendasBrutas;
}

21
22
23
24

public double getComissaoVendas() {


return comissaoVendas;
}

25
26
27
28

public void setComissaoVendas(double comissaoVendas) {


this.comissaoVendas = comissaoVendas;
}

29
30
31
32

Listagem 6.12: Cdigo da classe EmpregadoHorista


1
2

public class EmpregadoHorista extends Empregado{

private int qtdHoras;


private double valorHora;
public EmpregadoHorista(String nome, String telefone, int qtdHoras,
double valorHora) {
super(nome, telefone);

4
5
6
7
8
9

this.qtdHoras = qtdHoras;
this.valorHora = valorHora;

10
11

12
13

public double calcularSalario() {


return qtdHoras * valorHora;
}

14
15
16
17

public int getQtdHoras() {


return qtdHoras;

18
19

70

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

20
21

public void setQtdHoras(int qtdHoras) {


this.qtdHoras = qtdHoras;
}

22
23
24
25

public double getValorHora() {


return valorHora;
}

26
27
28
29

public void setValorHora(double valorHora) {


this.valorHora = valorHora;
}

30
31
32
33

Listagem 6.13: Cdigo da classe FolhaPagamento


1
2

public class FolhaPagamento {

public static void main(String[] args) {


Empregado [] empregados = new Empregado[3];
empregados[0] = new EmpregadoAssalariado("Maria", "231 -1234", 1500);
empregados[1] = new EmpregadoComissionado("Antonio", "241 -9876", 5000, 0.25);
empregados[2] = new EmpregadoHorista("Jose", "241 -9876", 40, 50);

4
5
6
7
8
9

for (int i = 0; i < empregados.length; i++) {


System.out.println(empregados[i]);
}

10
11
12
13

14
15
16

6.11.

Converso e casting

Aps ter sido colocados, no exemplo da seo anterior, todos os empregados no Array
empregados como pode ser obtido o valor da comisso do empregado comissionado?
Observe que dentro do lao for isto no mais possvel pois todos os empregados so
tratados como do tipo Empregado.
Para isto existe o casting. A traduo de casting atuar. Com o casting possvel fazer
o Empregado atuar como EmpregadoComissionado e assim buscar o valor da comisso.
Assim como nos filmes no qualquer ator que pode atuar em um determinado papel,
tambm no ser qualquer objeto que poder atuar como EmpregadoComissionado, apenas aqueles que foram instanciados como tal.
O casting feito colocando o tipo desejado dentro de parntesis na frente do objeto:
EmpregadoComissionado empComiss = (EmpregadoComissionado) empregados[i];

http://solutioin.com
Francisco Calaa, Otvio Calaa

71

Verso 1.2-beta

6.11.1

um pouco mais de orientao a objetos

A palavra-chave instanceof

Para testar o objeto instancia de determinada classe e consequentemente pode ser feito
uma operao de casting dele para essa classe utilizado a palavra-chave instanceof.
O cdigo da listagem 6.14 apresenta um exemplo de utilizao do operador instanceof.
Observe o teste do objeto empregados[i]. Este teste retornar true se esse objeto for do tipo
EmpregadoComissionado.
if(empregados[i] instanceof EmpregadoComissionado){
. . .
}

Listagem 6.14: Exemplo de utilizao do operador instanceof


1
2

public class FolhaPagamentoMelhorado {

public static void main(String[] args) {


Empregado [] empregados = new Empregado[3];
empregados[0] = new EmpregadoAssalariado("Maria", "231 -1234", 1500);
empregados[1] = new EmpregadoComissionado("Antonio", "241 -9876", 5000, 0.25);
empregados[2] = new EmpregadoHorista("Jose", "241 -9876", 40, 50);

4
5
6
7
8
9

for (int i = 0; i < empregados.length; i++) {


System.out.println(empregados[i]);
if(empregados[i] instanceof EmpregadoComissionado){
EmpregadoComissionado empComiss = (EmpregadoComissionado) empregados[i];
System.out.printf("\nEmpregado comissionado , comisso: %d",
empComiss.getComissaoVendas());
}
System.out.println();
}

10
11
12
13
14
15
16
17
18
19

20
21
22

6.12.

Mtodos e classe do tipo final

Em uma seo anterior foi apresentado que variveis do tipo final representam constantes.
O modificador final tambm pode ser usando em classes e em mtodos.
Uma classe do tipo final no pode ser herdada, ou seja, no pode ter sub-classes.
Um mtodo do tipo final no pode ser sobrescrito.

72

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

6.13.

um pouco mais de orientao a objetos

Interfaces

Interfaces so equivalentes a classes com todos os mtodos abstratos. A palavra chave


interface utilizada para declara-la.
H um vrios motivos na engenharia de software onde importante que os programadores concordem com um contrato que diz como determinados componentes de software se comunicaro. Cada grupo precisa estar habilitado a escrever cdigo sem o conhecimento de como este trabalha. Geralmente estes contratos so as interfaces.
como dirigir! Vrios tipos de motoristas, em locais diferentes do mundo, capaz de
dirigir qualquer carro sem conhecer como este funciona. Porque para os motoristas basta
conhcecer a interface que faz o carro funcionar. Para o motorista, basta saber que o freio,
acelerador, cmbio, etc, se comportaro conforme ele espera. No necessrio saber se o
carro possui direo eltrica ou hidrulica, como foi implementado os freios ou se o motor
funciona com combustveis renovveis ou no. Basta conhecer a interface de comunicao
que oferecida ao motorista.
Outro exemplo so os eletrodomsticos. Quando voc adquire um eletrodomstico, como
um liquidificador, no necessrio preocupar-se se os plugues deste servir nas tomadas
de nossas casas. Existe a certeza que sim porque o fabricante do eletrodomstico construiu
o plugue de acordo com a interface das tomadas residenciais.

6.13.1 Interfaces em Java


Em Java as interfaces tambm so tipos de dados similar s classes. As interfaces contm
apenas constantes, e assinaturas de mtodos. Os mtodos no possuem corpo. Interfaces
no podem ser instanciadas. So somente implementadas por classes ou herdadas de outras
interfaces.
O cdigo da listagem 6.15 apresenta um exemplo de interface. Note o uso da palavrachave interface e que os mtodos desta no possuem corpo, apenas esto declarados.
Os cdigos das listagens 6.17 e 6.16 apresentam as classes que implementam a interface
Animal. Observe o uso da palavra chave implements.
Na listagem 6.18 apresentado a utilizao das interfaces. Note o uso do mtodo newInstance para instanciao das classes. Nesta classe apresentado um prompt para o usurio
indagando-o qual animal deseja instanciar.
Aps a instanciao do animal executado os mtodos alimentar e locomover deste.
No se preocupe com o uso das palavras-chaves: try e catch. Apenas utilize conforme o
exemplo. Em um captulo posterior ser apresentado mais detalhes sobre estas palavras.
Listagem 6.15: Interface Animal
1
2
3

public interface Animal {

4
5
6

void alimentar();
void locomover();

http://solutioin.com
Francisco Calaa, Otvio Calaa

73

Verso 1.2-beta

um pouco mais de orientao a objetos

Listagem 6.16: Classe Aguia para o exemplo de interfaces


1
2
3

public class Aguia implements Animal{

public void alimentar() {


System.out.println("A guia caa a sua presa em voo e a devora!");
}

5
6
7
8

public void locomover() {


System.out.println("A guia se locomove voando!");
}

9
10
11
12

@Override
public String toString() {
return "Aguia";
}

13
14
15
16
17

Listagem 6.17: Classe Tigre para o exemplo de interfaces


1
2
3

public class Tigre implements Animal{

public void alimentar() {


System.out.println("O tigre caa a sua presa e a devora!");
}

5
6
7
8

public void locomover() {


System.out.println("O tigre se locomove correndo!");
}

9
10
11
12

@Override
public String toString() {
return "Tigre";
}

13
14
15
16
17
18

Listagem 6.18: Exemplo da aplicao de interfaces


1
2
3
4

public class Zoo {

public static void main(String[] args) {


Animal [] animais = new Animal[2];
animais[0] = new Aguia();

6
7
8

74

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

um pouco mais de orientao a objetos

animais[1] = new Tigre();


for (Animal a : animais) {
System.out.println(a);
a.alimentar();
a.locomover();
}

9
10
11
12
13
14
15

16
17
18

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

6.14.

Exerccios

1. O que o coletor de lixo?


2. Explique a referncia this.
3. O que encapsulamento?
4. O que so enumeraes? Crie um Enum para representar o estado civil.
5. O que so pacotes?
6. Qual a relao entre pacotes e diretrios?
7. O que herana?
8. O que sobrescrita de mtodos?
9. Explique a palavra chave super.
10. Qual a diferena entre a palavra-chave super e a palavra-chave this?
11. Explique o modificador de acesso protected.
12. O que a classe Object?
13. Qual a diferena entre utilizar == e equals para comparar objetos?
14. Para que serve o mtodo toString?
15. O que polimorfismo?
16. O que casting?

http://solutioin.com
Francisco Calaa, Otvio Calaa

75

Verso 1.2-beta

um pouco mais de orientao a objetos

17. Explique a utilidade do operador instanceof.


18. O que so interfaces?

76

http://solutioin.com
Francisco Calaa, Otvio Calaa

T R ATA M E N T O D E E X C E E S
Os aplicativos devem estar preparados para resolver situaes inesperadas como quando
um usurio digita um campo texto onde devia ser numrico ou uma data fora do padro.
Nestes casos ocorrem excees forma normal da execuo da rotina. Neste captulo ser
apresentado o mecanismo de excees do Java, as palavras chaves try cath throw e throws.

7.1.

O que so excees

Uma exceo um evento, que ocorre durante a execuo de um programa, e interrompe


o fluxo normal deste.
Quando ocorre uma exceo em um mtodo, este cria um objeto que contem informaoes
sobre o tipo de exceo, ou erro, incuido o seu tipo, o estado do programa, a pilha de
chamada de mtodos. Quando criada uma exceo esta deve ser lanada para que possa
ser capturada em um local especfico.
Depois do mtodo ter laado uma exceo, a execuo do sistema procurar, na pilha de
chamada de mtodos, algum bloco de cdigo que poder manipular essa exceo.
As instrues que sero executadas para manipular determinada exceo deve ser escrito dentro de blocos catch (Em ingls, capturas). Se no for encontrado um bloco catch
apropriado para tratar a exceo, o programa terminar.

7.2.

Como tratar excees

7.2.1 O bloco try


O primeiro passo para tratar excees envolver o cdigo que pode lanar uma com um
bloco try. Em geral, o bloco try escrito da seguinte forma:
try {
cdigo que pode lanar exeo
}
catch(Exception e){
cdigo que ser exeucutado quando uma exceo ocorrer.
}

Observe que todo o cdigo que poder lanar alguma exceo colocado dentro de um
bloco try.

77

Verso 1.2-beta

tratamento de excees

7.2.2 O bloco catch


As excees so associadas a tipos. Mais adiante voc saber sobre estes tipos. Qualquer
erro que pode ocorrer dentro de um bloco try poder ser capturado por um bloco catch.
Neste bloco deve ficar todo o cdigo necessrio ao tratamento de determinada exceo
como, por exemplo, apresentar uma mensagem de erro ao usurio.
O cdigo da listagem 7.1 apresenta um exemplo de cdigo em que pode acontecer os
seguintes erros:
O usurio pode informar um valor no numrico.
O usurio pode informar zero no denominador.
Como exerccio, escreva este cdigo e execute. Tente execut-lo passando informaes
incorretas, como zero no denominador, ou valores no numricos.
Para tratar estes erros adequadamente utilize o bloco try . . . catch.
O cdigo da listagem 7.2 apresenta o cdigo da listagem 7.1 com tratamento de erros.
Observe que os possveis locais para ocorrencia de erros so:
int numerador = new Integer(numeradorString);
int denominador = new Integer(denominadorString);

Quando o usurio informar um valor no numrico e este o programa tentar converte-lo


para int.
outro local:
int quociente = numerador / denominador;
int resto = numerador % denominador;

Quando o usurio informar ZERO como denominador.


Para tratar estes dois possveis erros estes cdigos foram envolvidos com o bloco try e os
blocos catchs responsveis pelo tratamento de cada erro especfico:
catch (NumberFormatException e) {
showMessageDialog(null, "Informe apenas nmeros inteiros.");
} catch (ArithmeticException e) {
showMessageDialog(null, "O denominador no pode ser ZERO.");
}

Observe que possvel colocar quantos blocos catchs quantos forem necessrios e que
as excees possuem tipos, neste caso, NumberFormatException para erros de formatao
numrica e ArithmeticException para erros de aritimtica, como diviso por zero.
Em cada bloco catch foi adicionado o cdigo necessrio para tratar este tipo de erro,
neste caso, apenas a apresentao de uma mensagem ao usurio.

78

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

tratamento de excees

Listagem 7.1: Exemplo de cdigo que poder lanar uma exceo


1

package capitulo7;

2
3

import javax.swing.JOptionPane;

4
5

public class Divisao {

public static void main(String[] args) {


String numeradorString = JOptionPane.showInputDialog("Digite o nmerador:");
String denominadorString = JOptionPane.showInputDialog("Digite o denominador:");

7
8
9
10

int numerador = new Integer(numeradorString);


int denominador = new Integer(denominadorString);

11
12
13

int quociente = numerador / denominador;


int resto = numerador % denominador;

14
15
16

String texto = String.format("Quociente :%d, Resto:%d", quociente,


resto);

17
18
19

JOptionPane.showMessageDialog(null, texto);

20

21
22

Listagem 7.2: Exemplo do tratamento de excees


1

package capitulo7;

2
3

import javax.swing.JOptionPane;

4
5

public class DivisaoMelhorado {

6
7
8
9

public static void main(String[] args) {


String numeradorString = JOptionPane.showInputDialog("Digite o nmerador:");
String denominadorString = JOptionPane.showInputDialog("Digite o denominador:");

10
11
12
13

try {
int numerador = new Integer(numeradorString);
int denominador = new Integer(denominadorString);

14
15
16

int quociente = numerador / denominador;


int resto = numerador % denominador;

17
18
19

String texto = String.format("Quociente :%d, Resto:%d",


quociente, resto);

20
21
22
23
24
25
26

JOptionPane.showMessageDialog(null, texto);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Informe apenas nmeros inteiros.");
} catch (ArithmeticException e) {
JOptionPane.showMessageDialog(null, "O denominador no pode ser ZERO.");
}

http://solutioin.com
Francisco Calaa, Otvio Calaa

79

Verso 1.2-beta
}

27
28

tratamento de excees

7.3.

Excees checadas e excees no checadas

O Java possui dois tipos de excees:


as checadas em tempo de compilao;
as no checadas em tempo de compilao;
As excees checadas em tempo de compilao devem, obrigatoriamente, serem tratadas
na compilao, ou seja, o uso do try . . . catch obrigatrio. Em captulos posteriores sero
apresentados elementos que lanam excees que possuem essa caracterstica - obrigatoriedade no tratamento.
As excees no checadas em tempo de compilao no possuem obrigatoriedade no
seu tratamento. As excees apresentadas no cdigo da listagem 7.2 no possuem esta
obrigatoriedade. Todas as excees no checadas devem herdar de RuntimeException ou
suas subclasses.
Porque os projetistas decidem em forar um mtodo a lanar uma exceo? Qualquer
exceo checada pode ser lanada por um mtodo como parte da lgica do mtodo como
tratamento de erros de usurio, etc.
A prxima questo : Se interessante lanar excees checadas e obrigar o tratamento
no cdigo, porque lanar excees que herdam de RuntimeException, ou seja, exees no
checadas?
A resposta que qualquer exceo no checada representa um erro do sistema, como
diviso por zero, acesso a elementos inexistentes de arrays, etc.
Em Geral, no lance uma RuntimeException ou sua subclasse simplesmente porque voc
no quer obrigar o tratamento de determinado problema.
Uma boa regra para lanamento de excees : Se a aplicao cliente pode resolver o
problema lance uma exceo checada em tempo de compilao. Se a aplicao cliente no
pode resolver, lance uma exceo no checada em tempo de compilao.

7.4.

Como declarar novos tipos de excees

Toda exceo deve, obrigatoriamente, herdar de Exception. O cdigo da listagem 7.3 apresenta um exemplo. Lembre-se que quando a exceo herda de RuntimeException (que
subclasse de Exception) esta torna-se uma exceo no checada. Se a exceo no herdar
de RuntimeException (ou suas subclasses) ela passa a ser uma exceo checada.
Observe que a classe Exception herda de Throwable, ou seja, toda exceo do tipo
throwable.
Listagem 7.3: Exemplo de declarao de uma nova exceo
1

package capitulo7;

80

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

tratamento de excees

public class AutenticacaoException extends Exception{

public AutenticacaoException(String mensagem) {


super(mensagem);
}

5
6
7
8
9

7.5.

Como lanar excees

utilizada a palavra chave throw para lanar uma exceo:


throw new AutenticacaoException("Erro ao realizar a autenticao");

Observe que a expresso throw necessita apenas de um argumento: O objeto do tipo


Throwable.
O cdigo da listagem 7.4 mostra um exemplo. Observe o mtodo autenticar. Ele verifica
duas coisas: Se o login estiver vazio e se a senha e o login informado esto corretos. Note
que para cada tipo de problema lanada a Exceo AutenticacaoException com uma mensagem apropriada. O mtodo main invoca o mtodo autenticar e este captura as excees
do tipo AutenticacaoException mostrando a mensagem para o usurio.
Listagem 7.4: Exemplo de lanamento de uma exceo
1

package capitulo7;

2
3

import javax.swing.JOptionPane;

4
5

public class Autenticador {

6
7

8
9
10
11
12
13

public static void autenticar(String login, String senha) throws


AutenticacaoException{
/*
* Verifica se o usurio digitou um login.
*/
if(login.length() == 0){
throw new AutenticacaoException("Login vazio");
}

14

/*
* Verifica o login e a senha do usurio.
* Esta verificao normalmente feita com dados vindos de um Banco de Dados
* ou LDAP. Colocamos o usuario e a senha no cdigo para facilitar
* o entendimento.
*/
if(!"java".equals(login) || !"123".equals(senha)){
throw new AutenticacaoException("Usurio ou senha invlidos");
}

15
16
17
18
19
20
21
22
23
24

http://solutioin.com
Francisco Calaa, Otvio Calaa

81

Verso 1.2-beta

tratamento de excees

25

public static void main(String[] args) {


String login = JOptionPane.showInputDialog("Digite o Login:");
String senha = JOptionPane.showInputDialog("Digite a Senha:");
try {
autenticar(login, senha);
JOptionPane.showMessageDialog(null, "Autenticado");
} catch (AutenticacaoException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}

26
27
28
29
30
31
32
33
34
35
36
37

7.6.

Hierarquia das excees

A Hierarquia das excees apresentada na figura 7.1. A classe pai de todas as Excees
Throwable. Observe que existem duas derivaes: Exception e Error. Error so erros no
tratveis em cdigo como falta de memria. Exception so excees tratveis. A classe Exception possui uma subclasse especial: RuntimeException. Todas as excees que derivam
de RuntimeException so excees no verificadadas (nao existe obrigtoriedade no seu
tratamento). As outras excees, que no herdam de RuntimeException, mas so subclasses
de Exception so excees verificadas (existe a obrigatoriedade no seu tratamento).

Figura 7.1: Hierarquia da excees

82

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

tratamento de excees

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

7.7.

Exerccios

1. Explique o que so excees.


2. Qual a utilidade do bloco try?
3. Explique o bloco catch.
4. Qual a diferena entre excees checadas e excees no checadas?
5. Como criar novas excees?
6. Qual a palavra chave utilizada para lanar novas exees?

http://solutioin.com
Francisco Calaa, Otvio Calaa

83

FLUXO DE DADOS
No mundo corporativo vital a transferncia de informaes entre computadores. Esta
troca feita atravs de fluxos de informao. Qualquer troca de dados, como rede, arquivos,
dispositivos IO vista como um fluxo de dados em Java.
Este captulo apresentar exemplos de fluxo de dados de arquivos e de rede com a
construo de um editor de texto simples e a construo de um trocador de mensagens
entre computadores.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

8.1.

A classe File

A classe File existe para representar um arquivo. Ela no utilizada para escrever, ler, ou
alterar arquivos. Simplesmente para represent-los. Possui um construtor onde informado
a localizao do arquivo:
File arquivo = new File(c:\\arquivo.txt)

8.2.

Como escrever em arquivos

Para escrever em arquivos ser utilizada a classe Formatter do pacote java.util. Existem
outras formas de escrever em um arquivo utilizando classes como FileWriter, DataOutputStream, etc. Para entender os exemplos preocupe-se apenas com a classe Formatter.
O cdigo da listagem 8.1 apresenta um exemplo de escrita em arquivos. Note o uso da
classe Formatter para realizar a escrita. Nesse exemplo tambm foi utilizado a classe File.
Observe o uso do mtodo close(). Este mtodo fecha o fluxo. Nunca se esquea dele.
Listagem 8.1: Exemplo de escrita em arquivos
1

package capitulo8;

2
3
4
5

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;

85

Verso 1.2-beta

fluxo de dados

6
7
8

public class ExemploEscrita {

public static void main(String[] args) {


File arquivo = new File("c:\\ arquivo.txt");
try {
Formatter fluxo = new Formatter(arquivo);
fluxo.format("Exemplo de escrita do capitulo 10");
fluxo.close();
System.out.println("Arquivo criado ...");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

10
11
12
13
14
15
16
17
18
19
20
21
22

8.3.

Como ler arquivos

Para ler um arquivo texto ser utilizada a classe Scanner do pacote java.util. Como na escrita existem outras formas de ler arquivos. Para entender os exemplos preocupe-se apenas
com a classe Scanner.
O cdigo da listagem 8.2 apresenta um exemplo de leitura de arquivos. Note o uso da
classe Scanner para ler o arquivo. Assim como no exemplo de escrita, a classe File foi
utilizada para representar um arquivo. Aps a leitura do arquivo no se esquea de fechar
o fluxo com o mtodo close().
Listagem 8.2: Exemplo de leitura em arquivos
1

package capitulo8;

2
3
4
5

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

6
7

public class ExemploLeitura {

public static void main(String[] args) {


File arquivo = new File("c:\\ arquivo.txt");
System.out.println("Lendo arquivo :\n");
try {
Scanner fluxo = new Scanner(arquivo);
while(fluxo.hasNext()){
System.out.println(fluxo.nextLine());
}
fluxo.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

9
10
11
12
13
14
15
16
17
18
19
20

86

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

fluxo de dados

21
22
23

8.4.

Um editor de texto simples

Este tpico apresentar um editor de texto que reunir todos os conhecimentos apresentados at agora. O cdigo est na listagem 10.6. O cdigo:
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(botaoAbrir, BorderLayout.NORTH);
c.add(botaoSalvar, BorderLayout.SOUTH);
c.add(new JScrollPane(areaTexto), BorderLayout.CENTER);

cria a tela. Note o uso da classe BorderLayout. Esta classe define um layout que posiciona
componentes com informaes NORTH para o topo, SOUTH para colocar algo abaixo,
CENTER para colocar algo no centro, etc.
A tela do editor de texto apresenta na figura 10.6.
O cdigo:
botaoAbrir.addActionListener(this);
botaoSalvar.addActionListener(this);

adiciona o listener de evento nos botes.


Neste exemplo a classe JFileChooser foi utilizada para criar a tela de escolha de arquivos:
para salvar ou para abrir.

Figura 8.1: Tela do editor de Texto

Listagem 8.3: Editor de texto simples

http://solutioin.com
Francisco Calaa, Otvio Calaa

87

Verso 1.2-beta

1
2
3
4
5
6
7
8
9
10

fluxo de dados

package capitulo8;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
import java.util.StringTokenizer;

11
12
13
14
15
16
17

import
import
import
import
import
import

javax.swing.JButton;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JOptionPane;
javax.swing.JScrollPane;
javax.swing.JTextArea;

18
19
20
21
22

public class EditorTexto extends JFrame implements ActionListener{


JButton botaoAbrir = new JButton("Abrir");
JButton botaoSalvar = new JButton("Salvar");
JTextArea areaTexto = new JTextArea();

23
24
25

public EditorTexto(){
Container c = getContentPane();

26

c.setLayout(new BorderLayout());
c.add(botaoAbrir, BorderLayout.NORTH);
c.add(botaoSalvar, BorderLayout.SOUTH);
c.add(new JScrollPane(areaTexto), BorderLayout.CENTER);

27
28
29
30
31

botaoAbrir.addActionListener(this);
botaoSalvar.addActionListener(this);

32
33
34

setTitle("Editor de Texto");
setSize(800,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

35
36
37
38
39

40
41
42

public void actionPerformed(ActionEvent e) {


JFileChooser jfc = new JFileChooser();

43

try {
if(e.getSource() == botaoAbrir){
jfc.showOpenDialog(this);
File file = jfc.getSelectedFile();
abrirArquivo(file);
}else if(e.getSource() == botaoSalvar){
jfc.showSaveDialog(this);
File file = jfc.getSelectedFile();
salvarArquivo(file);

44
45
46
47
48
49
50
51
52

88

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

fluxo de dados

}
}catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(null, "Arquivo no encontrado!");
}

53
54
55
56

57
58

private void salvarArquivo(File file) throws FileNotFoundException{


Formatter saida = new Formatter(file);
StringTokenizer token = new StringTokenizer(areaTexto.getText(), "\n");
while(token.hasMoreElements()){
saida.format("%s%n", token.nextElement());
}
saida.close();
}

59
60
61
62
63
64
65
66
67

private void abrirArquivo(File file) throws FileNotFoundException{


String texto = "";
Scanner scan = new Scanner(file);
while(scan.hasNext()){
texto += scan.nextLine() + "\n";
}
areaTexto.setText(texto);
scan.close();
}

68
69
70
71
72
73
74
75
76
77

public static void main(String[] args) {


new EditorTexto();
}

78
79
80
81

8.5.

Serializao de objetos

At agora os fluxos apresentados foram apenas de String. possvel tambm trafegar objetos em fluxos de dados. Objetos Java podem ser salvos em arquivos, transmitido pela rede,
etc. Para que os objetos possam ser transmitidos de um lugar para o outro necessrio que
eles implementem a interface Serializable do pacote java.util. Quando a classe implementa
esta interface necessrio criar um atributo:
private static final long serialVersionUID = 1L;

para que no haja problemas com verses de classes. Esta a nica garantia que o objeto
trafegado, apesar de estar com os pacotes, mtodos, etc idnticos possuam a mesma verso
de suas classes nos computadores envolvidos.
O eclipse possui um assistente para criar este atributo.

http://solutioin.com
Francisco Calaa, Otvio Calaa

89

Verso 1.2-beta

8.6.

fluxo de dados

Um trocador de mensagens simples

O prximo exemplo ser de um trocador de mensagens. A mensagem trafegar atravz de


objetos da classe Mensagem apresentada na listagem 8.4.
Observe que esta classe implementa a interface Serializable e possui o atributo:
private static final long serialVersionUID = 1L;

no se preocupe em criar este atributo. Pea para o eclipse criar para voc.
A classe Enviador, apresentada na listagem 8.5 envia as mensagens. O cdigo responsvel
por isto :
Socket socket = new Socket("127.0.0.1", 12345);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(mens);

a classe Socket cria uma comunicao com o ip 127.0.0.1 (que a sua mquina local)
na porta 12345. A classe ObjectOutputStream cria um fluxo de dados de saida e utiliza
o socket criado na linha anterior. O mtodo writeObjetct(mens) escreve o objeto no fluxo
criado na linha anterior.
A classe Receptor, apresentada na listagem 8.6 recebe as mensagens e as imprime no
console. Note que esta classe possui um lao infinito while(true). Este lao far com que o
receptor receba mensagens enquanto estiver rodando.
server = new ServerSocket(12345);
Socket socket = server.accept();
ObjectInput ois = new ObjectInputStream(socket.getInputStream());
Mensagem mens = (Mensagem) ois.readObject();
System.out.println(mens);

a classe ServerSocket cria um socket na mquina e abre a porta 12345 (esta dever estar
disponvel). O mtodo server.accept() aguarda at algum enviar uma mensagem por meio
destar porta (lembre-se do Enviador que enviar mensagens por esta porta). Foi utilizado
o mtodo readObject() para ler o objeto que est sendo trafegado, no caso, Mensagem.
Listagem 8.4: Classe Mensagem
1

package capitulo8;

2
3

import java.io.Serializable;

4
5

public class Mensagem implements Serializable {

private static final long serialVersionUID = 1;

7
8

private String remetente;


private String descricao;

9
10

90

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

fluxo de dados

11

public String getDescricao() {


return descricao;
}

12
13
14
15

public void setDescricao(String descricao) {


this.descricao = descricao;
}

16
17
18
19

public String getRemetente() {


return remetente;
}

20
21
22
23

public void setRemetente(String remetente) {


this.remetente = remetente;
}

24
25
26
27

public String toString() {


return String.format("%-30s-%s", remetente, descricao);
}

28
29
30
31

Listagem 8.5: Classe que envia mensagens


1

package capitulo8;

2
3
4
5
6

import
import
import
import

java.io.IOException;
java.io.ObjectOutputStream;
java.net.Socket;
java.net.UnknownHostException;

7
8

import javax.swing.JOptionPane;

9
10
11
12
13
14
15
16
17

public class Enviador {


public static void main(String[] args) {
String resposta;
do {
resposta = JOptionPane.showInputDialog("Mensagem:");
Mensagem mens = new Mensagem();
mens.setRemetente("Seu Nome");
mens.setDescricao(resposta);

18
19
20
21
22
23
24
25
26
27
28

try {
Socket socket = new Socket("127.0.0.1", 12345);
ObjectOutputStream oos = new ObjectOutputStream(socket
.getOutputStream());
oos.writeObject(mens);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

29

http://solutioin.com
Francisco Calaa, Otvio Calaa

91

Verso 1.2-beta
} while (!resposta.equals("sair"));

30

31
32

fluxo de dados

Listagem 8.6: Receptor de mensagens


1

package capitulo8;

2
3
4
5
6

import
import
import
import

java.io.ObjectInput;
java.io.ObjectInputStream;
java.net.ServerSocket;
java.net.Socket;

7
8

public class Receptor {

public static void main(String[] args) {


ServerSocket server = null;
while (true) {
try {
server = new ServerSocket(12345);
Socket socket = server.accept();

10
11
12
13
14
15
16

ObjectInput ois = new ObjectInputStream(socket.getInputStream());


Mensagem mens = (Mensagem) ois.readObject();
System.out.println(mens);

17
18
19
20

ois.close();
socket.close();
server.close();
} catch (Throwable e) {
e.printStackTrace();
} finally {
try {
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}

21
22
23
24
25
26
27
28
29
30
31
32
33

34

35
36
37

92

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

8.7.

fluxo de dados

Exerccios

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!
1. Qual a utilidade da classe File?
2. Descreva o processo para escrita em arquivos.
3. Descreva o processo para leitura de arquivos.
4. O que serializao de objetos?
5. Na serializao de objetos para que serve o atributo serialVersionUID?

http://solutioin.com
Francisco Calaa, Otvio Calaa

93

GENRICOS E COLEES
Em um captulo anterior foi abordado os Arrays. Um dos problemas dos arrays a impossibilidade de alterar seu tamanho. Neste captulo sero abordadas outras colees como
Listas, Conjuntos e Mapas. Estas colees permitem ter seu tamanho alterado em tempo
de execuo e se comportam de forma diferente se aproximando ao comportamento do
mundo real.

9.1.

o que so genricos

Genricos existem para diminuir os erros de Converso de classes do tipo ClassCastExceptions.


Veja o cdigo da listagem 9.1. Esta listagem apresenta a classe Caixa que pode aceitar
qualquer tipo de objeto. A listagem 9.2 mostra o uso dessa classe. Observe na listagem 9.3
um erro comum. Apesar da caixa aceitar qualquer tipo de objetos, so esperados apenas
objetos do tipo Integer o que, por falta de ateno, pode ser de outros tipos (a caixa aceita
qualquer tipo de dados).
Com Generics possvel restringir os tipos para tipos especficos. O cdigo da listagem
9.4 apresenta a nova caixa, com suporte a generics.
Observe, na listagem 9.5 que, na declarao da caixa, possvel informar qual o tipo de
objetos que a caixa conter, assim evitando erros de converso.
Voltando ao cdigo da CaixaGenrica (listagem 9.4) note a declarao da classe:
public class CaixaGenerica <E>

observe o uso de: < E >. Este trecho de cdigo Especifica que tudo o que for informado
dentro das chaves < ... > ser considerado apenas como E. No cdigo da listagem 9.5 foi
colocado < Integer >, ou seja, onde tiver E ser considerado Integer. Assim o mtodo:
public void setObjeto(E objeto)

ser considerado:
public void getObjeto(Integer objeto)

Se, na declarao da classe CaixaGenrica for utilizado < String > onde tiver < E > ser
considerado como String.
Assim, evita-se erros de converso por ser possvel informar o tipo que estar na caixa
no moment da sua declarao.

95

Verso 1.2-beta

genricos e colees

Listagem 9.1: Classe Caixa


1
2

package capitulo9;
public class Caixa {

private Object objeto;

4
5

public Object getObjeto() {


return objeto;
}

6
7
8
9

public void setObjeto(Object objeto) {


this.objeto = objeto;
}

10
11
12
13
14

Listagem 9.2: Classe CaixaDemo1


1
2
3

package capitulo9;
public class CaixaDemo1 {
public static void main(String[] args) {

Caixa caixaDeInteiros = new Caixa();

5
6

caixaDeInteiros.setObjeto(10);
Integer someInteger = (Integer) caixaDeInteiros.getObjeto();
System.out.println(someInteger);

7
8
9

10
11

Listagem 9.3: Classe CaixaDemo2


1
2
3

package capitulo9;
public class CaixaDemo2 {
public static void main(String[] args) {

Caixa caixaDeInteiros = new Caixa();

5
6

/*
* note que estamos adicionando String na caixa
* propositalmente para provocar um erro de converso
*/

7
8
9
10
11

caixaDeInteiros.setObjeto("10");

12
13

Integer someInteger = (Integer) caixaDeInteiros.getObjeto();


System.out.println(someInteger);

14
15

16
17

Listagem 9.4: Classe CaixaGenerica

96

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

1
2

genricos e colees

package capitulo9;
public class CaixaGenerica <E>{

private E objeto;

4
5

public E getObjeto() {
return objeto;
}

6
7
8
9

public void setObjeto(E objeto) {


this.objeto = objeto;
}

10
11
12
13
14

Listagem 9.5: Classe CaixaGenericaDemo


1
2
3

package capitulo9;
public class CaixaGenericaDemo {
public static void main(String[] args) {

CaixaGenerica<Integer> caixaDeInteiros = new CaixaGenerica<Integer>();

5
6

caixaDeInteiros.setObjeto(10);
Integer someInteger = caixaDeInteiros.getObjeto();
System.out.println(someInteger);

7
8
9

10
11

9.2.

Introduo a colees

Uma coleo um objeto que representa um grupo de objetos facilitando a manipulao


destes. Existem vrias formas de reunir informaes:
Listas
Conjuntos
Mapas
Filas
Pilhas

9.3.

Listas

As Listas apresentam as seguintes caractersticas:


Podem conter elementos duplicados

http://solutioin.com
Francisco Calaa, Otvio Calaa

97

Verso 1.2-beta

genricos e colees

Podem ser ordenadas


Para exemplificar, compare com as listas do mundo real. Pense em uma lista de compras que voc far em um supermercado. Os elementos desta lista podem ser ordenados,
seguindo um critrio qualquer. Outro detalhe que os elementos desta lista podem ser
duplicados.
A interface List a interface de todas as listas. Implementam esta interface as classes
ArrayList e Vector.
O cdigo da listagem 9.6 apresenta um exemplo do uso de listas. Note o uso da interface
List para declarar as listas. Neste exemplo foi utilizada a classe ArrayList para instanciar a
lista.
O cdigo:
Collections.sort(cores);

ordena a lista de cores em ordem alfabtica.


Listagem 9.6: Exemplo de uso de Lista
1
2
3
4

package capitulo9;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

5
6
7
8
9
10
11
12
13
14
15
16

public class ExemploLista {


public static void main(String[] args) {
List<String> cores = new ArrayList<String>();
cores.add("Azul");
cores.add("Vermelho");
cores.add("Preto");
cores.add("Cinza");
cores.add("Laranja");
cores.add("Amarelo");
cores.add("Verde");
cores.add("Azul");

17

for(String c : cores){
System.out.printf("Cor: %s\n",c);
}

18
19
20
21

Collections.sort(cores);
System.out.println("Cores aps ordenao");
for(String c : cores){
System.out.printf("Cor: %s\n",c);
}

22
23
24
25
26
27

28
29

98

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

9.4.

genricos e colees

Conjuntos

Os conjuntos apresentam as seguintes caractersticas:


No podem conter elementos duplicados
No podem ser ordenados
Para exemplificar, pense no conjunto de laranjas em uma sacola. No possvel dizer
qual a primeira laranja, ou seja, no possvel ordena-las. Tambm no possvel duplicar
laranjas. Cada laranja nica.
Os conjuntos so definidos pela interface Set. Implementam esta interface as classes
HashSet e TreeSet.
O cdigo da listagem 9.7 apresenta um exemplo do uso de conjuntos. Observe o uso da
interface Set para declarar o conjunto. Neste exemplo foi utilizada a classe HashSet para
instanciar o conjunto.
Nessa listagem foram inseridas, propositalmente, duas entradas para a cor azul. Aps a
execuo desta classe, observe que a sada do programa imprime a cor azul apenas uma
vez. Isto demonstra a incapacidade dos conjuntos em conter elementos duplicados. Note
tambm que a ordem impressa no igual a ordem inserida no cdigo.
Listagem 9.7: Exemplo de uso de Conjuntos
1
2
3

package capitulo9;
import java.util.HashSet;
import java.util.Set;

4
5
6
7
8
9
10
11
12
13

public class ExemploConjunto {


public static void main(String[] args) {
Set<String> cores = new HashSet<String>();
cores.add("Azul");
cores.add("Vermelho");
cores.add("Preto");
cores.add("Amarelo");
cores.add("Verde");
cores.add("Azul");//Repetido propositalmente

14

for(String c : cores){
System.out.printf("\nCor: %s",c);
}

15
16
17

18
19

9.5.

Mapas

Os mapas apresentam as seguintes caractersticas:


Associam chaves a valores

http://solutioin.com
Francisco Calaa, Otvio Calaa

99

Verso 1.2-beta

genricos e colees

As chaves no podem ser repetidas


O cdigo da listagem 9.8 apresenta um exemplo do uso de mapas. Assim como nos
exemplos de Listas e Conjuntos, foi utilizada uma interface para referenciar, no caso Map.
Uma das classes que implementa esta interface a classe HashMap. Observe nesse exemplo
a associao de vegetaes com regies brasileiras.
Se for adicionado uma outra chave cerrado, por exemplo, esta sobrescrever a existente
pois nos mapas no podem existir chaves duplicadas.
Listagem 9.8: Exemplo de uso de Mapas
1
2
3

package capitulo9;
import java.util.HashMap;
import java.util.Map;

4
5

import javax.swing.JOptionPane;

6
7
8
9

public class ExemploMapa {


public static void main(String[] args) {
Map<String, String> vegetacoes = new HashMap<String, String>();

10

vegetacoes.put("cerrado", "centro -oeste");


vegetacoes.put("floresta tropical", "norte");
vegetacoes.put("caatinga", "nordeste");
vegetacoes.put("mata atlntica", "costa brasileira");

11
12
13
14
15

String escolha = JOptionPane.showInputDialog("Digite uma vegetao:"


+ vegetacoes.keySet());
JOptionPane.showMessageDialog(null, vegetacoes.get(escolha));

16
17
18

19
20

A Listagem 9.9 apresenta um exemplo um pouco mais complexo de mapa. Neste exemplo realizada a contagem da quantidade de produtos com o mesmo nome existe na lista.
Observe que no final o cdigo:
for(Entry<String, Integer> e : mapaContagem.entrySet()){
System.out.printf("%s: %d\n", e.getKey(), e.getValue());
}

utilizado para percorrer os elementos do mapa que associa os produtos com suas
respectivas quantidades.
Listagem 9.9: Exemplo de uso de Mapas na contagem de elementos de uma lista
1
2
3
4
5
6

package capitulo9;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

7
8

100

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

genricos e colees

public class ExemploMapaContagem {

10

public static void main(String[] args) {

11
12

List<String> lista = new ArrayList<String>();


lista.add("Cerveja");
lista.add("Carvo");
lista.add("Picanha");
lista.add("Cerveja");
lista.add("Cerveja");
lista.add("Cerveja");
lista.add("Cerveja");
lista.add("Cerveja");
lista.add("Costela");
lista.add("Costela");
lista.add("Po com alho");
lista.add("Po com alho");
lista.add("Po com alho");
lista.add("Po com alho");

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

Map<String, Integer> mapaContagem = new HashMap<String, Integer>();


for (String s : lista) {
Integer qtd = mapaContagem.get(s);
if(qtd == null){
qtd = 0;
}
qtd++;
mapaContagem.put(s, qtd);
}

29
30
31
32
33
34
35
36
37
38

for(Entry<String, Integer> e : mapaContagem.entrySet()){


System.out.printf("%s: %d\n", e.getKey(), e.getValue());
}

39
40
41

42
43
44

9.5.1 Properties
As propriedades so mapas que podem ser persistidos, ou seja, salvos em algum lugar. Um
exemplo de arquivo properties :
#Propriedades do Sistema
telefone=3131-2363
descricao=Supermercado da Esquina
endereco=Rua 2

Observe a semelhana com os mapas, para cada entrada existe uma informao, ou
seja,para a entrada telefone tem-se a informao: 3131-2363.

http://solutioin.com
Francisco Calaa, Otvio Calaa

101

Verso 1.2-beta

genricos e colees

Java possui um tipo de mapa que tem a habilidade de persistir suas informaes, so as
Properties. Estas classes possuem o mtodo:
prop.store( . . .);

para a escrita dos dados, conforme pode ser visto na listagem 9.10
e o mtodo:
prop.load( . . . );

para carregar os dados a partir de um fluxo, conforme pode ser visto na listagem 9.11
Listagem 9.10: Exemplo de escrita em arquivos properties
1
2
3
4
5

package capitulo9;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

public class ExemploPropertiesEscrita {


public static void main(String[] args) {
Properties prop = new Properties();
prop.put("descricao", "Supermercado da Esquina");
prop.put("endereco", "Rua 2");
prop.put("telefone", "3131 -2363");
try {
FileOutputStream fos = new FileOutputStream("c:\\ prop.properties");
prop.store(fos, "Propriedades do Sistema");
fos.close();
System.out.println("Propriedades salvas");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Listagem 9.11: Exemplo de leitura de arquivos properties


1
2
3
4
5

package capitulo9;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

6
7

import javax.swing.JOptionPane;

8
9
10
11
12
13

public class ExemploPropertiesLeitura {


public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("c:\\ prop.properties");
Properties prop = new Properties();

102

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

prop.load(fis);
fis.close();
String nomeProp = JOptionPane.showInputDialog("Qual propriedade " +
"deseja ver? (descricao , endereco , telefone)" );
JOptionPane.showMessageDialog(null, prop.getProperty(nomeProp));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

14
15
16
17
18
19
20
21
22
23

24
25

genricos e colees

9.6.

Pilhas

Pilhas so estrutura de dados onde o ltimo elemento que entra o primeiro que sai - LIFO
(last-in-first-out). possvel exemplificar com uma pilha de livros. O primeiro livro a ser
emplilhado o ltimo que sai da pilha.
Um exemplo de pilha pode ser visto no cdigo da listagem 9.12. Aps executar este
exemplo o primeiro nome a ser impresso foi Carlos mas foi o ltimo a ser adicionado na
pilha.
Listagem 9.12: Exemplo de pilha
1

package capitulo9;

2
3

import java.util.Stack;

4
5

public class ExemploPilha {

public static void main(String[] args) {


Stack<String> alunos = new Stack<String>();
alunos.push("Maria");
alunos.push("Antonio");
alunos.push("Joaquim");
alunos.push("Carlos");

7
8
9
10
11
12
13

while(!alunos.empty()){
System.out.println(alunos.pop());
}

14
15
16

17
18
19

http://solutioin.com
Francisco Calaa, Otvio Calaa

103

Verso 1.2-beta

9.7.

genricos e colees

Filas

Filas so estruturas de dados onde o primeiro elemento que entra o primeiro elemento
que sai - FIFO (first-in-first-out). Como nas filas dos caixas, a primeira pessoa que entra a
primeira pessoa que poder pagar.
O cdigo da listagem 9.13 apresenta um exemplo de Fila.
Listagem 9.13: Exemplo de Fila
1

package capitulo9;

2
3
4

import java.util.LinkedList;
import java.util.Queue;

5
6

public class ExemploFila {

public static void main(String[] args) {


Queue<String> alunos = new LinkedList<String>();
alunos.offer("Maria");
alunos.offer("Antonio");
alunos.offer("Joaquim");
alunos.offer("Carlos");

8
9
10
11
12
13
14

while(!alunos.isEmpty()){
System.out.println(alunos.poll());
}

15
16
17

18
19
20

9.8.

Ordenao de Listas

Uma das caractersticas de Listas poder ser ordenada. Para ordenar uma lista pode-se
utilizar a interface Comparator e o mtodo sort da classe Collections.
Observe o exemplo onde existem alunos que sero ordenados por idade.
A classe Aluno est na listagem 9.14. Possui os atributos nome e idade.
O mtodo compare retorna um int, que pode ser:
negativo se o primeiro objeto for menor que o segundo
zero se os objetos forem iguais
positivo se o primeiro objeto for maior que o segundo
No se preocupe com o cdigo:
return (int)(a1.getIdade() - a2.getIdade();

104

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

genricos e colees

Apenas se atenha ao fato de que este mtodo retornar algo negativo se a1 for menor
que a2, zero se forem iguais e positivo se a1 for maior.
O cdigo do comparador por idade est na Listagem 9.15 e
Listagem 9.14: Classe Aluno do exemplo de ordenao
1

package capitulo9;

2
3

public class Aluno {

private String nome;

5
6

private int idade;

7
8

public Aluno(String nome, int idade) {


this.nome = nome;
this.idade = idade;
}

9
10
11
12
13

public String toString(){


return String.format("Aluno: %-10s - %3d", nome, idade);
}

14
15
16
17

public String getNome() {


return nome;
}

18
19
20
21

public void setNome(String nome) {


this.nome = nome;
}

22
23
24
25

public int getIdade() {


return idade;
}

26
27
28
29

public void setIdade(int idade) {


this.idade = idade;
}

30
31
32
33

Listagem 9.15: Comparador por idade


1
2

package capitulo9;
import java.util.Comparator;

3
4

public class ComparadorIdade implements Comparator<Aluno>{

public int compare(Aluno a1, Aluno a2) {


return a1.getIdade() - a2.getIdade();
}

6
7
8
9
10

http://solutioin.com
Francisco Calaa, Otvio Calaa

105

Verso 1.2-beta

genricos e colees

Listagem 9.16: Exemplo de ordenacao


1

package capitulo9;

2
3
4
5

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

6
7
8

public class ExemploOrdenacao {

public static void main(String[] args) {


List<Aluno> alunos = new ArrayList<Aluno>();
for(int i = 0; i < 15; i++){
int idade = (int)(Math.random() * 5) + 10;
String nome = "Aluno nr. " + i;
Aluno a = new Aluno(nome, idade);
alunos.add(a);
}

10
11
12
13
14
15
16
17
18

System.out.println("Lista original:");

19
20

for(Aluno a : alunos){
System.out.println(a);
}

21
22
23
24

System.out.println("\nLista ordenada por idade:");

25
26

Collections.sort(alunos, new ComparadorIdade());


for(Aluno a : alunos){
System.out.println(a);
}

27
28
29
30
31

32
33

9.9.

Exerccios

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!
1. O que so genricos?
2. Descreva sobre Listas.
3. Descreva sobre Conjuntos.

106

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

genricos e colees

4. Descrevas sobre Mapas.


5. Qual as diferenas entre listas e conjuntos?
6. O que so properties? Qual a classe responsvel por persistir as properties em um
arquivo?
7. O que pilha?
8. O que fila?
9. Quais os procedimentos necessrios para ordenar uma lista de Strings? E uma lista
de objetos da classe Pessoa?
10. Adicione o atributo nota na classe da Listagem 9.14. Crie a classe ComparadorNota
seguindo o exemplo da Listagem 9.15. Altere o cdigo da Listagem 9.16 para tambm
ordenar os alunos por nota.

http://solutioin.com
Francisco Calaa, Otvio Calaa

107

10

UML: UNIFIED MODELING LANGUAGE


Este captulo lhe fornecer uma viso rpida dos fundamentos da UML. Tenha em mente
que isto no um tutorial detalhado sobre UML, mas apenas uma rpida introduo a
UML que pode ser lida como um tutorial UML. Se voc gostaria de aprender mais sobre
a Linguagem de Modelagem Unificada, ou generalidades sobre anlise e desenho de software, consulte um dos muitos livros disponveis sobre o tpico. Existem tambm muitos
tutoriais na Internet os quais voc pode usar como ponto de partida.
A Unified Modelling Language (UML) uma linguagem ou notao de diagramas para
especificar, visualizar e documentar modelos de software orientados por objetos. O UML
no um mtodo de desenvolvimento, o que significa que no lhe diz o que fazer primeiro
ou o que fazer depois ou como desenhar o seu sistema, mas ajuda-o a visualizar o seu
desenho e a comunicar com os outros. O UML controlado pelo Object Management
Group (OMG) e a norma da indstria para descrever graficamente o software.
O UML est desenhado para o desenho de software orientado por objetos e tem uma
utilizao limitada para outros paradigmas de programao.
A UML composta por muitos elementos de modelo que representam as diferentes
partes de um sistema de software. Os elementos UML so usados para criar diagramas,
que representam um determinada parte, ou um ponto de vista do sistema.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

10.1.

Diagrama de Classe

Diagramas de Classe mostram as diferentes classes que fazem um sistema e como elas se
relacionam. Os Diagramas de Classe so chamados diagramas estticos porque mostram
as classes, com seus mtodos e atributos bem como os relacionamentos estticos entre elas:
quais classes conhecem quais classes ou quais classes so parte de outras classes, mas
no mostram a troca de mensagens entre elas.

10.1.1 Classe
Um Classe define os atributos e os mtodos de um conjunto de objetos. Todos os objetos
desta classe (instncias desta classe) compartilham o mesmo comportamento, e possuem

109

Verso 1.2-beta

uml: unified modeling language

o mesmo conjunto de atributos (cada objeto possui seu prprio conjunto). O termo Tipo
algumas vezes usado ao invs de Classe, mas importante mencionar que estes dois
termos no so a mesma coisa, e Tipo um termo mais genrico.
Em UML Classes so representadas por retngulos, com o nome da classe, e podem tambm mostrar os atributos e operaes da classe em dois outros compartimentos dentro
do retngulo.

Figura 10.1: Representao visual de uma Classe em UML

10.1.1.1 Atributos
Na UML, atributos so mostrados com pelo menos seu nome, e podem tambm mostrar
seu tipo, valor inicial e outras propriedades. Atributos podem tambm ser exibidos com
sua visibilidade:
+ indica atributos pblicos
# indica atributos protegidos
- indica atributos privados

10.1.1.2 Operaes
Operaes (mtodos) tambm so exibidos com pelo menos seu nome, e podem tambm mostrar seus parmetros e valores de retorno. Operaes podem, como os Atributos,
mostras sua visibilidade:
+ indica operaes pblicas
# indica operaes protegidas
- indica operaes privadas

10.1.2

Associaes de Classe

Classes podem relacionar-se (ser associada com) com outras de diferentes maneiras:

10.1.2.1 Generalizao
A herana um dos conceitos fundamentais da programao orientada por objetos, nos
quais uma classe ganha todos os atributos e operaes da classe que herda, podendo

110

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

uml: unified modeling language

sobrepor ou modificar algumas delas, assim como adicionar mais atributos ou operaes
prprias.
EM UML, uma associao Generalizao entre duas classes coloca-as numa hierarquia
representando o conceito de herana de uma classe derivada de uma classe base. Em UML,
Generalizaes so representadas por uma linha conectando duas classes, com uma seta
no lado da classe base.

Figura 10.2: Representao visual de uma generalizao em UML

10.1.2.2 Associaes
Um associao representa um relacionamento entre classes, e fornece a semntica comum
e a estrutura para muitos tipos de conexes entre objetos.
Associaes so o mecanismo que permite objetos comunicarem-se entre si. Elas descrevem a conexo entre diferentes classes (a conexo entre os objetos atuais chamada
conexo do objeto, ou link.
Associaes podem ter um regra que especifica o propsito da associao e pode ser
uni ou bidirecional (indicando se os dois objetos participantes do relacionamento podem
mandar mensagens para o outro, ou se apenas um deles sabe sobre o outro). Cada ponta
da associao tambm possui uma valor de multiplicidade, que dita como muitos objetos
neste lado da associao pode relacionar-se com o outro lado.
Em UML, associaes so representadas como linhas conectando as classes participantes
do relacionamento, e podem tambm mostrar a regra e a multiplicidade de cada um dos
participantes. A multiplicidade exibida como um intervalo [min...mx] de valores no
negativos, com uma estrela (*) no lado mximo representando infinito.

Figura 10.3: Representao visual de uma Associao em UML

10.1.2.3 Agregao
Agregaes so um tipo especial de associao no qual as duas classes participantes no
possuem em nvel igual, mas fazem um relacionamento todo-parte. Uma Agregao descreve como a classe que possui a regra do todo, composta (tem) de outras classes, que

http://solutioin.com
Francisco Calaa, Otvio Calaa

111

Verso 1.2-beta

uml: unified modeling language

possuem a regra das partes. Para Agregaes, a classe que age como o todo sempre tem
uma multiplicidade de um.
Em UML, Agregaes so representadas por uma associao que mostra um romboide
no lado do todo.

Figura 10.4: Representao visual de um relacionamento Agregao em UML

10.1.2.4 Composio
Composies so associaes que representam agregaes muito fortes. Isto significa que
Composies formam relacionamentos todo-parte tambm, mas o relacionamento to
forte que as partes no pode existir independentes. Elas existem somente dentro do todo,
e se o todo destrudo as partes morrem tambm.
Em UML, Composies so representadas por um romboide slido no lado do todo.

Figura 10.5: Representao visual de um relacionamento Composio em UML

10.2.

Diagrama de Caso de Uso

Diagramas de Caso de Uso descrevem relacionamentos e dependncias entre um grupo de


Caso de Uso e os Atores participantes no processo.
importante observar que Diagramas de Caso de Uso no so adequados para representar o desenho, e no podem descrever os mecanismos internos de um sistema. Diagramas
de Caso de Uso so feitos para facilitar a comunicao com os futuros usurios do sistema,
e com o cliente, e so especialmente teis para determinar os recursos necessrios que o
sistema deve ter. Diagramas de Caso de Uso dizem o qu o sistema deve fazer, mas no
fazem - e no podem - especificar como isto ser conseguido.

10.2.1 Caso de Uso


Um Caso de Uso descreve - do ponto de vista dos atores - um grupo de atividades num
sistema que produz um resultado concreto e tangvel.
Casos de Uso so descries de interaes tpicas entre os usurios de um sistema e o
sistema propriamente dito. Eles representam a interface externa do sistema e especificam
um conjunto de exigncias do que o sistema deve fazer (lembre-se: somente o qu, no
como).

112

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

uml: unified modeling language

Quando trabalhar com Casos de Uso, importante lembrar-se de algumas regras simples:
Cada Caso de Uso est relacionado com no mnimo um ator;
Cada Caso de Uso possui um iniciador (isto um ator);
Cada Caso de Uso liga-se a um resultado relevante (um resultado com valor de
negcio);
Casos de Uso tambm podem ter relacionamentos com outros Casos de Uso. Os trs
tipos mais comuns de relacionamento entre Casos de Uso so:
inclui-se que especifica que um Caso de Uso toma lugar dentro de outro Caso de
Uso
estende que especifica que em determinadas situaes, ou em algum ponto (chamado
um ponto de extenso) um Caso de Uso ser estendido por outro.
Generalizao especifica que um Caso de Uso herda as caractersticas do Super
Caso de Uso, e pode sobrepor algumas delas ou adicionar novas de maneira semelhante a herana entre classes.

10.2.2 Ator
Um ator uma entidade externa (fora do sistema) que interage com o sistema participando
(e frequentemente iniciando) um Caso de Uso. Atores podem ser pessoas reais (por exemplo usurios do sistema), outro sistema de computador ou eventos externos.
Atores no representam as pessoa fsica ou sistemas, mas sua regra. Isto significa que
quando uma pessoa interage com o sistema de diferentes maneiras (assumindo diferentes
regras) ela ser representada por diversos atores. Por exemplo um pessoa que fornece suporte ao cliente por telefone e recebe ordens do cliente para o sistema pode ser representado
por um ator da Equipe de Suporte e um ator Representante de Vendas

10.2.3 Descrio do Caso de Uso


Descrio do Caso de Uso so narrativas de texto do Caso de Uso. Elas usualmente tomam
a forma de uma nota ou um documento que de alguma maneira ligado ao Caso de Uso,
e explana o processo ou atividades que tomaro lugar no Caso de Uso.

10.3.

Demais diagramas

Alm dos diagramas de classe e de caso de uso, existem os outros seguintes diagramas:
Diagrama de Sequncia mostra objetos e uma sequncia das chamadas do mtodo
feitas para outros objetos.

http://solutioin.com
Francisco Calaa, Otvio Calaa

113

Verso 1.2-beta

uml: unified modeling language

Figura 10.6: Representao visual de alguns casos de uso

Diagrama de Colaborao mostra objetos e seus relacionamentos, colocando nfase


nos objetos que participam na troca de mensagens
Diagrama de Estado mostra estados, mudanas de estado e eventos num objeto ou
uma parte do sistema
Diagrama de Atividade mostra atividades e as mudanas de uma atividade para
outra com os eventos ocorridos em alguma parte do sistema
Diagrama de Componente mostra os componentes de programao de alto nvel
(como KParts ou Java Beans).
Diagrama de Distribuio mostra as instncias dos componentes e seus relacionamentos. Os Diagramas de Entidade-Associao mostram os dados e as relaes e as
restries entre os dados.

114

http://solutioin.com
Francisco Calaa, Otvio Calaa

11

THREADS
Thread, ou linha de execuo em portugus, uma forma de um processo dividir a si
mesmo em duas ou mais tarefas que podem ser executadas simultaneamente.
Uma linha de execuo permite que o usurio do seu programa, por exemplo, utilize
uma funcionalidade do ambiente enquanto outras linhas de execuo realizam outros clculos e operaes. Os sistemas que suportam apenas uma nica linha de execuo so
chamados de monothread e aqueles sistemas que suportam mltiplas linhas de execuo
so chamados de multithread.

11.1.

Processos e Threads

Em programao concorrente, h duas unidades bsicas: processos e threads. Em Java a


programao concorrente normalmente concebida com threads.
Um sistema computacional normalmente possui muitos processos e threads ativos. Esteja ele sendo executado em uma mquina com um processador ou em uma mquina
multiprocessada.

11.1.1 Processos
Um processo geralmente tem um conjunto completo e restrito de recursos para sua execuo, ou seja, cada processo tem seu prprio espao de memria.
Processos so sinonimos de programas e aplicaes. Como o espao de memria e restrito
a cada processo, a comunicao entre processos feita atravs do sistema operecional com
pipes e sockets. Esta comunicao pode ser feita entre processos na mesma mquina ou em
diferentes mquinas.

11.1.2 Threads
Threads so, algumas vezes, chamadas de processos leves. Threads existem dentro dos
processos, cada processo possui pelo menos uma thread. Threads podem compartilhar
recursos do processos, como memria e arquivos abertos. Isto muito eficiente para a
comunio de recursos.
Execuo multithread um caracteristica da plataforma Java. Cada aplicao Java composta de vrias thread. As threads tornam os programas mais eficientes pois, com elas,
possvel realizar mais de uma atividade simultaneamente. Uma thread possui a habilidade
de criar novas threads.

115

Verso 1.2-beta

11.2.

threads

Criao de Threads

Cada thread est associada com uma instancia da classe Thread. H duas formas de criar
uma Thread:
Implementando a interface Runnable
Estendendo a classe Thread
Independente da forma que se cria a thread o cdigo a ser executado pela thread deve
estar no mtodo run:
public void run()

Para iniciar a thread necessrio executar o mtodo start:


suaThread.start()

A listagem 11.1 apresenta um exemplo de Thread que criada estendendo a classe


Thread. O uso desta thread est na classe da listagem 11.2. Note o uso do mtodo start
para iniciar esta thread.
A listagem 11.3 apresenta um exemplo de Thread que criada implementado a interface
Runnable. O uso desta thread est na classe da listagem 11.4. Tambm foi utilizado o
mtodo start para iniciar a thread.
Listagem 11.1: Thread criada estendendo da classe Thread
1

package capitulo11;

2
3

public class PrimeiraThread extends Thread {

public PrimeiraThread(String nome) {


super(nome);
}

5
6
7
8

public void run() {


for (int i = 0; i < 10000; i++) {
System.out.printf("\n Thread: %s (executando) - %5d", getName(), i++);
}
}

9
10
11
12
13
14

Listagem 11.2: Execuo da Thread que estendeu a classe thread


1

package capitulo11;

2
3
4
5
6
7
8
9
10

public class ExemploThread {


public static void main(String[] args) {
PrimeiraThread thread1 = new PrimeiraThread(" **** ");
PrimeiraThread thread2 = new PrimeiraThread("####");
thread1.start();
thread2.start();
}
}

116

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

threads

Listagem 11.3: Thread criada implementando Runnable


1

package capitulo11;

2
3

public class SegundaThread implements Runnable {

private String nome;

5
6

public SegundaThread(String nome) {


this.nome = nome;
}

7
8
9
10

public void run() {


for (int i = 0; i < 10000; i++) {
System.out.printf("\n Thread: %s (executando) - %5d", nome, i++);
}
}

11
12
13
14
15
16

Listagem 11.4: Execuo da Thread que implementou Runnable


1

package capitulo11;

2
3
4
5
6

public class ExemploThread2 {


public static void main(String[] args) {
SegundaThread st1 = new SegundaThread(" **** ");
SegundaThread st2 = new SegundaThread("####");

Thread thread1 = new Thread(st1);


Thread thread2 = new Thread(st2);

8
9
10

thread1.start();
thread2.start();

11
12

13
14

11.3.

A classe Executors

A nova API de threads permite um melhor gerenciamento das threads utilizando pool.
Desta forma possvel criar um pool de Threads e especificar a quantidade mxima de
threads estar em execuo simultaneamente. A listagem 11.5 apresenta um exemplo de
utilizao do pool de threads. Neste exemplo o pool criado com o mtodo:
ExecutorService threads = Executors.newFixedThreadPool(2)

note que sero executadas apenas duas threads simultaneamente.


threads.execute(t1);
threads.execute(t2);
threads.execute(t3);

http://solutioin.com
Francisco Calaa, Otvio Calaa

117

Verso 1.2-beta

threads

so colocadas trs threads no pool. Como apenas duas threads sero executadas a terceira
ir esperar uma das duas anteriores terminar para comear sua execuo.
Listagem 11.5: Exemplo de utilizao do pool de threads
1

package capitulo11;

2
3

import java.util.concurrent.*;

4
5
6
7
8
9

public class ExemploThread3 {


public static void main(String[] args) {
SegundaThread t1 = new SegundaThread(" **** ");
SegundaThread t2 = new SegundaThread("####");
SegundaThread t3 = new SegundaThread("$$$$");

10

ExecutorService threads = Executors.newFixedThreadPool(2);


threads.execute(t1);
threads.execute(t2);
threads.execute(t3);
threads.shutdown();

11
12
13
14
15

16
17

11.4.

Mtodos sleep e yield

O mtodo Thread.sleep faz com que a thread suspenda sua execuo por um perodo especfico. Aps o trmino do periodo a thread volta ao estado de executvel podendo entrar
em execuo ou no dependendo da sua prioridade. A figura 11.1 ilustra esse mtodo.
O mtodo Thread.yield faz com que a thread desista de sua atual execuo. Suponha que
voc executa muitas threads no computador e que estas threads esto sendo mal gerenciadas e que algumas no conseguem concluir algumas atividades. Ao ser executado o
mtodo yield provocar a desistncia momentnea da thread em execuo e possibilitar
a entrada de outra thread para a execuo. Essa thread aguardar at a CPU tornar-se
disponvel novamente.
Note que ela poder voltar a ser executada quando o gerenciador de threads do sistema
solicitar. A figura 11.2 ilustra esse mtodo.

11.5.

Sincronizao

Quando duas threads compartilham dados comum que haja problemas com sincronizao. Para que voc entenda melhor este problema observe o exemplo. A classe Troca est
na listagem 11.6. Note que esta classe possui o mtodo trocar que recebe um boolean. Se o
boolean for true as variveis a e b recebero 5 e 7, sendo false recebero 11 e 13. A thread
est na listagem 11.7. A classe que instancia o objeto do tipo Troca e as threads est na
listagem 11.8. Note que criado apenas um objeto do tipo Troca e este objeto compartilhado entre as threads es1 e es2. Uma dessas threads instanciada com true a outra com

118

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

threads

Figura 11.1: Mtodo Thread.sleep

Figura 11.2: Mtodo Thread.yield

http://solutioin.com
Francisco Calaa, Otvio Calaa

119

Verso 1.2-beta

threads

false. isto far com que o comportamento do metodo trocar da classe Troca seja diferente
para cada thread. Ao executar este exemplo apresentada a seguinte sada:
5 = 11 e 7 = 13
11 = 5 e 13 = 7
5 = 11 e 7 = 13
11 = 5 e 13 = 7
5 = 11 e 7 = 13

Isto acontece porque as threads no esto sincronizadas. Uma thread inicia o trabalho,
a outra termina. Para resolver este problema necessrio sincronizar o mtodo trocar:
synchronized public void trocar(boolean bol). Ao acrescentar a palavra chave synchronized no mtodo far com que este no possa ser executado por duas threads simultaneamente.
Listagem 11.6: Objeto Troca que est compartilhado entre a threads
1

package capitulo11;

2
3
4

public class Troca {


private int a;

private int b;

6
7

public void trocar(boolean bol) throws InterruptedException {


if (bol) {
a = 5;
b = 7;
} else {
a = 11;
b = 13;
}
Thread.sleep(500);

8
9
10
11
12
13
14
15
16
17

if (bol) {
System.out.printf("%d = 5 e %d = 7 \n", a, b);
} else {
System.out.printf("%d = 11 e %d = 13 \n", a, b);
}

18
19
20
21
22

23
24

Listagem 11.7: Thread que acessar o objeto Troca


1

package capitulo11;

2
3
4
5

public class Operador implements Runnable {


private boolean bol;
private Troca obj;

6
7
8
9

public Operador(Troca obj, boolean bol) {


this.bol = bol;
this.obj = obj;

120

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

threads

10
11

public void run() {


while (true) {
try {
obj.trocar(bol);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

12
13
14
15
16
17
18
19
20
21

Listagem 11.8: Exemplo de threads no sincronizadas


1

package capitulo11;

2
3
4

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

5
6
7

public class ExemploSinc {

public static void main(String[] args) {


Troca obj = new Troca();
Operador es1 = new Operador(obj, true);
Operador es2 = new Operador(obj, false);

9
10
11
12
13

ExecutorService t1 = Executors.newFixedThreadPool(2);
t1.execute(es1);
t1.execute(es2);
t1.shutdown();

14
15
16
17

18
19

11.6.

O verificador de primos

Para exemplificar melhor o uso de threads as listagens 11.9 e 11.10 apresentam um Verificador de nmeros primos. Este exemplo consegue verificar vrios primos simultaneamente
porque a classe VerificadorPrimo da listagem 11.9 uma thread. A classe TestePrimo cria
uma nova thread de verificao a cada nmero informado pelo usurio.
Listagem 11.9: Thread que verifica se um nmero primo (utiliza um algoritmo lento de verificao
para demonstrar melhor o exemplo)
1

package capitulo11;

2
3

public class VerificadorPrimo extends Thread {

4
5

private long numero;

http://solutioin.com
Francisco Calaa, Otvio Calaa

121

Verso 1.2-beta

threads

public VerificadorPrimo(long numero) {


this.numero = numero;
}

7
8
9
10

public void run() {


boolean primo = true;
for (int i = 2; i < numero; i++) {
if ((numero % i) == 0) {
primo = false;
}
}

11
12
13
14
15
16
17
18

if (primo) {
System.out.printf("\nO nmero: %d primo", numero);
} else {
System.out.printf("\nO nmero: %d no primo", numero);
}

19
20
21
22
23

24
25

Listagem 11.10: Verificador de nmeros primos


1

package capitulo11;

2
3

import javax.swing.JOptionPane;

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

public class TestePrimo {


public static void main(String[] args) {
String resposta;
do {
resposta =
JOptionPane.showInputDialog("Digite um nmero");
try {
long numero = new Long(resposta);
VerificadorPrimo vf = new VerificadorPrimo(numero);
vf.start();
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,
"nmero invalido" );
}

19

} while (!resposta.equals("sair"));

20

21
22

122

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

threads

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

11.7.

Exerccios

1. O que so threads?
2. Qual a diferena entre processos e threads?
3. Descreva as duas formas de se criar uma thread.
4. O que so pool de threads?
5. Qual a diferena entre os mtodos sleep e yield?
6. Qual o objetivo de utilizao da palavra chave synchronized?

http://solutioin.com
Francisco Calaa, Otvio Calaa

123

12

S T R I N G S E D ATA S
Converter Datas em Strings e Strings em Datas um dos assuntos deste captulo. Esta
uma tarefa comum em softwares uma vez que a maior forma de entrada de dados em
um sistema texto e este texto deve, algumas vezes, ser convertido em data para correta
manipulao. Outra coisa,normalmente necessria, formatar uma data em textos para
que seja melhor apresentada ao usurio.
Na verso 5 do Java foi acrescentado a sada formatada assunto tambm abordado neste
captulo. Com a sada formatada mais simples a formatao de nmeros, datas e outros.

12.1.

As classes Date e Calendar

A classe Date utilizada para representar momentos no tempo. A maior parte dos seus
metodos esto deprecados, ou seja, no so mais utilizados. Para manipulao de datas e
horas existe a classe Calendar. Por ser uma classe abstrata utiliza-se o mtodo getInstance:
Calendar.getInstance();

Para obter a data e hora atuais pode ser utilizado o construtor default da classe Date:
Date hoje = new Date();

A listagem 12.1 apresenta um exemplo de uso da classe Calendar.


Listagem 12.1: Exemplo de uso da classe Calendar
1

package capitulo12;

2
3

import java.util.Calendar;

4
5

public class ExemploCalendar {

public static void main(String[] args) {


Calendar calendar = Calendar.getInstance();
int diaAno = calendar.get(Calendar.DAY_OF_YEAR);
int ano = calendar.get(Calendar.YEAR);

7
8
9
10
11

System.out.printf("\nEstamos no %d dia do ano de %d", diaAno, ano);

12

13
14
15

125

Verso 1.2-beta

12.2.

strings e datas

Formatao de Datas

muito comum um sistema necessitar converter uma data em uma String ou uma String
em uma data. Para estes casos possvel utilizar a classe SimpleDateFormat. Esta classe implementa a interface DateFormat e possui mtodos que so capazes tanto em formatar uma
data em um String ou em converter uma String em uma data. A listagem 12.2 apresenta
um exemplo de converso de String em data e formatao desta data em outra String.
Para converter uma String em uma data utiliza-se o mtodo parse. Este mtodo lana
uma exeo se a String no puder ser convertida.
O mtodo format formata uma data em uma String.
Listagem 12.2: Exemplo de formatao de datas
1

package capitulo12;

2
3
4
5
6

import
import
import
import

java.text.DateFormat;
java.text.ParseException;
java.text.SimpleDateFormat;
java.util.Date;

7
8

import javax.swing.JOptionPane;

9
10

public class ExemploFormatacaoData {

11

public static void main(String[] args) {


DateFormat formatadorEntrada = new SimpleDateFormat(
"dd/MM/yyyy" );
DateFormat formatadorSaida = new SimpleDateFormat(

12
13
14
15

"Data Informada: dd de MMMM de yyyy - (EEEE )" );

16
17

String dataTexto = JOptionPane


.showInputDialog("Digite uma data:");
try {
Date data = formatadorEntrada.parse(dataTexto);
String dataFormatada = formatadorSaida.format(data);
JOptionPane.showMessageDialog(null, "Data digitada: "
+ dataFormatada);
} catch (ParseException e) {
e.printStackTrace();
}

18
19
20
21
22
23
24
25
26
27
28

29
30
31

126

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

12.3.

strings e datas

A classe String

Strings so objetos que contm uma cadeia de caracteres. Em Java so imutveis, portanto
uma vez criadas no podem ser alteradas. Para exemplificar, caso ocorra uma concatenao
de Strings, um novo objeto criado, e o antigo, ser coletado pelo coletor de lixo. O mtodo
charAt utilizado para consultar caracteres pelo ndice.
Para comparar Strings, assim como qualquer outro objeto Java, utiliza-se o mtodo equals.
Este mtodo retorna true quando os valores entre as Strings so iguais e false caso sejam
diferentes.

12.4.

A classe StringBuffer

As classes StringBuffer e StringBuilder possibilitam a alterao de uma cadeia de caracteres


o que torna o processamento mais rpido uma vez que no necessrio criar Strings a cada
concatenao. A listagem 12.3 apresenta uma comparao de concatenao de Strings entre
String e StringBuffer.
Listagem 12.3: Comparao da concatenao de Strings entre StringBuffer e a classe String
1

package capitulo12;

2
3

public class RankingString {

4
5

private static int quantidade = 10000;

6
7
8

public static long concatenarComString() {


long t1 = System.currentTimeMillis();

String texto = "";


for (int i = 0; i < quantidade; i++) {
texto += "a";
}

10
11
12
13
14

long t2 = System.currentTimeMillis();
return t2 - t1;

15
16
17

18
19
20

public static long concatenarComStringBuffer() {


long t1 = System.currentTimeMillis();

21

StringBuffer texto = new StringBuffer("");


for (int i = 0; i < quantidade; i++) {
texto.append("a");
}

22
23
24
25
26

long t2 = System.currentTimeMillis();
return t2 - t1;

27
28
29

30

http://solutioin.com
Francisco Calaa, Otvio Calaa

127

Verso 1.2-beta

strings e datas

public static void main(String[] args) {


long tempoStringBuffer = concatenarComStringBuffer();
System.out.printf("Tempo com StringBuffer: %d ms \n", tempoStringBuffer);

31
32
33
34

long tempoString = concatenarComString();


System.out.printf("Tempo com String: %d ms \n", tempoString);

35
36

37
38

12.5.

Sada formatada

A sada formatada est disponvel a partir do Java 5.0. Igual sada formatada das linguagens C e C++ permite a formao de Strings utilizando uma String formatadora:
System.out.printf(\%s, \%s, texto1, texto2);

Observe que a string formatadora %s, %s recebe os parmetros texto1 e texto2 o os


formata uma aps o outro separados com uma vrgula.
Observe que a passatem dos parmetros texto1 e texto2 so impressos na mesma ordem
que aparecem. possvel alterar esta ordem utilizando indices.
O exemplo
System.out.printf(\%2\$s, \%1\$s, texto1, texto2);

ir imprimir os parmetros texto1 e texto2 na ordem contraria em que aparecem.

12.5.1 Caracteres de converso


Para formatar Strings possvel utilizar uma vasta quantidade de caracteres de converso,
dependendo do tipo da informao a ser formatada. A tabela 12.1 apresenta uma uma lista
dos caracteres de formatao utilizados com Java.
possvel ajustar o tamanho da sada do parmetro acrescentando um valor antes do
caractere de converso.:
%5d

imprimir um nmero inteiro decimal e reservar um espao de cinco caracteres para


isto.
Para nmeros com ponto flutuante ajustar a quantidade de casas decimais que devem
ser apresentadas. Isto se faz acrescentando um ponto e um nmero com a quantidade de
casas decimais a apresentar:
\%.2

Este exemplo apresentar um nmero com ponto flutuante com duas casas decimais.
A listagem 12.4 apresenta um exemplo com vrias opes de formatao.

128

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

%s

Utilizado com Strings

%d

Utilizado com nmeros inteiros decimais

%o

Utilizado com nmeros inteiros octais

%x

Utilizado com nmeros inteiros hexadecimais (utilize %X para que as letras


aparecam maisculas)

%f

Utilizado com nmeros com ponto flutuante

%t

Utilizado com datas. Deve ser combinado com os formatadores da tabela ??


para produzir um resultado.

strings e datas

Tabela 12.1: Caracteres de converso de String

%F

Formata uma data

%H

mostra a hora de uma data

%M

mostra o minuto de uma data

%S

mostra o segundo de uma data

%m

mostra o ms de uma data

%d

mostra o dia de uma data


Tabela 12.2: tablecaption

http://solutioin.com
Francisco Calaa, Otvio Calaa

129

Verso 1.2-beta

strings e datas

Listagem 12.4: Exemplo de sada formatada


1

package capitulo12;

2
3

import java.util.Date;

4
5

public class ExemploSaidaFormatada {

public static void main(String[] args) {

7
8

/*
* Exemplo de formatao de nmeros inteiros
*/
System.out.println("Formatao de inteiros");
int inteiro = 123;
System.out.printf("%10s %10s %10s", "DECIMAL", "OCTAL", "HEXADECIMAL");
System.out.printf("\n%1$10d %1$10o %1$10X", inteiro);

9
10
11
12
13
14
15
16

/*
* Exemplo de formatao de ponto flutuante
*/
System.out.println("\n\nFormatao de ponto flutuantes");
double flutuante = 1.2345;
System.out.printf("%.3f", flutuante);

17
18
19
20
21
22
23

/*
* Formatao de Datas e Horas
*/
System.out.println("\n\nFormatao de datas e horas");
Date hoje = new Date();
System.out.printf("Hora atual: %1$tH:%1$tM:%1$tS", hoje);
System.out.printf("\nData formatada: %1$tF", hoje);
System.out.printf("\nData atual: %1$td/%1$tm/%1$tY", hoje);

24
25
26
27
28
29
30
31
32

33
34

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

12.6.

Exerccios

1. Qual a diferena do uso das classes Date e Calendar?


2. Crie uma classe que receba a data no formato dd/MM/yyyy e converta para o formato yyyy-mm-dd utilizando a classe SimpleDateFormat.

130

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

strings e datas

3. Descreva a classe String.


4. Qual a diferena entre String e StringBuffer?

http://solutioin.com
Francisco Calaa, Otvio Calaa

131

13

JDBC
Um Sistema Gerenciador de Banco de Dados (SGBD) o conjunto de programas de computador responsveis pelo gerenciamento de uma base de dados. O principal objetivo
retirar da aplicao o trabalho e a responsabilidade de gerenciar o acesso e a segurana
de suas informaes. Em bancos de dados relacionais utilizada a linguagem SQL para
manipulao dos registros.
Normalmente as pessoas chamam os SGBDs de apenas Banco de Dados. No decorrer
deste captulo onde estiver o termo Banco de Dados entenda que so estas estruturas complexas de armazenamento de informaes.
JDBC (Java Database Connectivity) a API do Java para trabalhar com Banco de Dados.
Com ela possvel executar instrues ler registros executar funes no Banco de Dados.
Trata-se de um conjunto de interfaces e classes que possuem os mtodos necessrios para as
mais diversas atividades com um banco de dados. As interfaces so implementadas pelos
drivers JDBC que so especficos para cada banco.

13.1.

Conexo com banco de dados

Para se conectar em um Banco de dados com o JDBC necessrios as seguintes informaes:


O Driver do banco
A URL de conexo
O usurio
A senha
O caminho para o Driver (arquivo .jar)
A classe apresentada na listagem 13.1 mostra um exemplo de conexo com o Banco de
Dados. O Driver passado com o seguinte mtodo:
Class.forName("org.postgresql.Driver");

A url, usurio e a senha com o seguinte mtodo:


DriverManager.getConnection(
"jdbc:postgresql://localhost/treinamento",
"postgres", "123456");

133

Verso 1.2-beta

jdbc

A configurao do caminho para Driver feita nas propriedades do projeto, na opo


Java Build Path, conforme a figura 13.1.
Listagem 13.1: Classe Conexao
1

package capitulo13;

2
3

import java.sql.*;

4
5
6
7
8
9

public class Conexao {


private static String
private static String
private static String
private static String

driver = "org.postgresql.Driver";
url = "jdbc:postgresql :// localhost/treinamento";
usuario = "postgres";
senha = "123456";

10

public static Connection getConexao() {


try {
Class.forName(driver);
return DriverManager.getConnection(url, usuario, senha);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}

11
12
13
14
15
16
17
18
19
20
21
22
23

Figura 13.1: Configurao do CLASSPATH para o Driver JDBC

134

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

13.2.

jdbc

A linguagem SQL

SQL um linguagem de consulta a registros em um Banco de dados Relacional. As instrues SQL apresentadas a seguir utilizaro como referncia a tabela CLIENTE

13.2.1 SELECT
Instruo para consulta de registros. Sua sintaxe :
SELECT <LISTA DOS CAMPOS DA TABELA> FROM <TABELA>

Um Exemplo: Para buscar todos os registros da tabela CLIENTE pode ser utilizado o
seguinte SQL:
SELECT CODIGO, NOME, TELEFONE, ENDERECO, NASCIMENTO FROM CLIENTE

Um outra forma, no aconselhada, de busca de registros a utilizao do asterisco (*):


SELECT * FROM CLIENTE

13.2.2 Clusula WHERE


Permite filtrar os registros em uma consulta, alterao ou excluso. Sua sintaxe :
WHERE <NOME DO CAMPO> = <VALOR>

Para buscar o registro da tabela CLIENTE onde o cdigo vale 5:


SELECT CODIGO, NOME, TELEFONE, ENDERECO, NASCIMENTO FROM CLIENTE WHERE CODIGO = 5

13.2.3 O Operador LIKE


possvel realizar busca com aproximao de valores utilizando a expresso LIKE. Se o
objetivo buscar todos os nomes da tabela CLIENTE que comecem com Ma pode-se
utilizar a seguinte instruo SQL:
SELECT CODIGO, NOME, CPFCNPJ, ENDERECO, MUNICIPIO FROM CLIENTE WHERE NOME LIKE Ma%

O caracter % substituir com zero ou mais caracteres na busca. O caracter _ substituir apenas com um caracter.

http://solutioin.com
Francisco Calaa, Otvio Calaa

135

Verso 1.2-beta

13.2.4

jdbc

INSERT

Permite incluir registros em uma tabela no banco de dados. Sua sintaxe :


INSERT INTO <NOME DA TABELA> (<NOME DOS CAMPOS>) VALUES (<VALOR DOS CAMPOS>).

Para incluir um registro na tabela de CLIENTE pode ser utilizado o seguinte SQL:
INSERT INTO CLIENTE (NOME, CPFCNPJ, ENDERECO, MUNICIPIO, UF)
VALUES (ANA MARIA, 321.321.321-01, Rua 2 Centro, GOIANIA, GO).

13.2.5 UPDATE
Permite alterar registros em um tabela. Sua sintaxe :
UPDATE <NOME DA TABELA> SET <CAMPO> = <VALOR> WHERE <CAMPO> = <VALOR>

Note a existncia da clusula WHERE. Se no for especificada todos os registros da tabela


sero alterados para <VALOR>.
Para alterar o nome do CLIENTE com cdigo 5 para Joao Carlos pode ser utilizada a
seguinte instruo:
UPDATE CLIENTE SET NOME = Joao Carlos WHERE ID = 5

13.2.6 DELETE
Permite excluir registros em uma tabela. Sua sintaxe :
DELETE FROM <NOME DA TABELA> WHERE <CAMPO> = <VALOR>

Note o uso da clusula WHERE. Sem especifica-la todos os registros da tabela sero
excludos.
Para excluir o registro com cdigo 5 da tabela utilizada a seguinte instruo:
DELETE FROM CLIENTE WHERE ID = 5

13.3. Como executar instrues SQL e obter


registros
Aps realizada a conexo possvel executar instres SQL. Para isto necessrio a criao
de um Statement. Existem trs tipos de Statements:
Statement - para execuo de instrues estticas, ou seja, sem parmetros.

136

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

jdbc

PreparedStatement - para a execuo de instrues com parmetros


CallableStatement - para a execues de funes do Banco de Dados.
A classe da listagem 13.2 apresenta um exemplo de execuo de instrues.
Note que h dois tipos execues: as que tm a funo de buscar registros e as que tem
a funo de alterar registros.
O comando SQL utilizado para buscar registros o SELECT. Para a execuo de um
SELECT necessrio o mtodo executeQuery. Este mtodo retorna um ResultSet que possibilita a navegao no resultado. A interface ResultSet possui alguns mtodos teis e estes
esto listados na tabela 13.1.
next

ir ao prximo registro, retorna true se existir um


prximo registro e false se este no existir.

getString(<NOME DO CAMPO>)

retorna o valor (no formato String) contido no respectivo campo da tabela.

Tabela 13.1: Leitura de um ResultSet

Os comando SQL para alterao de registros so o INSERT, UPDATE e DELETE. Para a


execuo destes comandos podem ser utilizados os mtodos
execute
ou
executeUpdate

Listagem 13.2: Primeiro Exemplo de acesso a banco de dados


1

package capitulo13;

2
3

import java.sql.*;

4
5

public class ExemploJDBC {

6
7
8
9
10
11

public static void main(String[] args) {


Connection con = Conexao.getConexao();
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from cliente");

12
13
14
15
16
17
18
19

while (rs.next()) {
System.out.printf("%-30s%-30s%-30s%-30s%-30s\n",
rs.getString("nome"), rs.getString("cpfCnpj"),
rs.getString("endereco"),
rs.getString("municipio"),
rs.getString("uf"));
}

20
21
22
23

con.close();
} catch (SQLException e) {
e.printStackTrace();

http://solutioin.com
Francisco Calaa, Otvio Calaa

137

Verso 1.2-beta
}

24

25
26

jdbc

13.3.1

PreparedStatement

Com a interface PreparedStatement possvel passar parmetros para as instrues SQL.


No lugar dos parmetros so utilizados pontos de interrogao (?):
PreparedStatement pstmt = con.prepareStatement(SELECT * FROM CLIENTE WHERE ID = ?);
pstmt.setInt(1, 5);

Observe que aps a criao da instruo necessrio passar os parmetros com setInt.
Exite tambm o setString, setDate, setLong, enfim, uma infinidade de possibilidades de
passagem de valores para a instruo.

13.4.

Execuo em Lote

possvel executar instrues SQL em lote. Esta tcnica torna a execuo muito mais rpida do que executar uma instruo de cada vez. A listagem 13.3 apresenta um teste de
velocidade entre a utilizao
Listagem 13.3: Exemplo de execuo em Batch
1

package capitulo13;

2
3
4
5
6

import
import
import
import

java.sql.Connection;
java.sql.PreparedStatement;
java.sql.SQLException;
java.sql.Statement;

7
8

public class ExemploExecucaoBatch {

9
10

public static Connection con = Conexao.getConexao();

11
12
13
14
15
16
17
18
19

static void limparTabela(){


try {
Statement stmt = con.createStatement();
stmt.execute("delete from cliente");
} catch (SQLException e) {
e.printStackTrace();
}
}

20
21
22
23
24

public static long executarSemBatch(){


limparTabela();
long t1 = System.currentTimeMillis();
try {

138

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

jdbc

PreparedStatement pstmt = con.prepareStatement("insert into cliente "


+ "(nome , cpfCnpj , endereco , municipio , uf) "
+ "values (?, ?, ?, ?, ?)");
for(int i = 0; i < 50000; i++){
pstmt.setString(1, "nome");
pstmt.setString(2, "cpfCnpj");
pstmt.setString(3, "endereco");
pstmt.setString(4, "municipio");
pstmt.setString(5, "uf");
pstmt.execute();
}
} catch (SQLException e) {
e.printStackTrace();
}
long t2 = System.currentTimeMillis();
return t2 - t1;

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

41
42

public static long executarComBatch(){


limparTabela();
long t1 = System.currentTimeMillis();
try {
PreparedStatement pstmt = con.prepareStatement("insert into cliente "
+ "(nome , cpfCnpj , endereco , municipio , uf) "
+ "values (?, ?, ?, ?, ?)");
for(int i = 0; i < 50000; i++){
pstmt.setString(1, "nome");
pstmt.setString(2, "cpfCnpj");
pstmt.setString(3, "endereco");
pstmt.setString(4, "municipio");
pstmt.setString(5, "uf");
pstmt.addBatch();
}
pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
long t2 = System.currentTimeMillis();
return t2 - t1;
}

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

public static void main(String[] args) {


long t1 = executarComBatch();
System.out.printf("Com Batch: %d (ms)\n", t1);

67
68
69
70

long t2 = executarSemBatch();
System.out.printf("Sem Batch: %d (ms)\n", t2);

71
72

73
74

http://solutioin.com
Francisco Calaa, Otvio Calaa

139

Verso 1.2-beta

13.5.

jdbc

Tabela de Clientes

Para exemplificar os conceitos de Banco de Dados veja agora uma agenda de clientes. A
listagem 13.4 apresenta a classe Cliente.
Listagem 13.4: Classe Cliente
1

package capitulo13;

2
3

public class Cliente {

4
5

private int id;

6
7

private String nome;

8
9

private String cpfCnpj;

10
11

private String endereco;

12
13

private String municipio;

14
15

private String uf;

16
17
18
19

public int getId() {


return id;
}

20
21
22
23

public void setId(int id) {


this.id = id;
}

24
25
26
27

public String getNome() {


return nome;
}

28
29
30
31

public void setNome(String nome) {


this.nome = nome;
}

32
33
34
35

public String getCpfCnpj() {


return cpfCnpj;
}

36
37
38
39

public void setCpfCnpj(String cpfCnpj) {


this.cpfCnpj = cpfCnpj;
}

40
41
42
43

public String getEndereco() {


return endereco;
}

44
45

public void setEndereco(String endereco) {

140

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

jdbc

this.endereco = endereco;

46

47
48

public String getMunicipio() {


return municipio;
}

49
50
51
52

public void setMunicipio(String municipio) {


this.municipio = municipio;
}

53
54
55
56

public String getUf() {


return uf;
}

57
58
59
60

public void setUf(String uf) {


this.uf = uf;
}

61
62
63
64

A listagem 13.5 apresenta a classe ClienteDao. Observe que foi colocada nesta classe os
mtodos de acesso ao Banco de Dados como incluir, excluir e listar. Colocar os mtodos
que acessam o Banco de Dados fora da entidade Cliente uma boa prtica de programao
pois facilita a alterao da estrutura de dados.
Listagem 13.5: Classe ClienteDao - acessa os recursos no Banco de Dados
1

package capitulo13;

2
3
4
5
6
7
8
9

import
import
import
import
import
import
import

java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
java.sql.Statement;
java.util.ArrayList;
java.util.List;

10
11

public class ClienteDao {

12
13
14
15
16
17
18
19
20
21
22

private Cliente mapear(ResultSet rs) throws SQLException{


Cliente cliente = new Cliente();
cliente.setId(rs.getInt("id"));
cliente.setNome(rs.getString("nome"));
cliente.setCpfCnpj(rs.getString("cpfCnpj"));
cliente.setEndereco(rs.getString("endereco"));
cliente.setMunicipio(rs.getString("municipio"));
cliente.setUf(rs.getString("uf"));
return cliente;
}

23
24
25
26

public void incluir(Cliente cliente) {


Connection con = Conexao.getConexao();
try {

http://solutioin.com
Francisco Calaa, Otvio Calaa

141

Verso 1.2-beta

try {
PreparedStatement pstmt = con.prepareStatement("insert into cliente " +
"(nome , cpfcnpj , endereco , municipio , uf) values (?, ?, ?, ?, ?)" );
pstmt.setString(1, cliente.getNome());
pstmt.setString(2, cliente.getCpfCnpj());
pstmt.setString(3, cliente.getEndereco());
pstmt.setString(4, cliente.getMunicipio());
pstmt.setString(5, cliente.getUf());
pstmt.execute();
} finally {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

jdbc

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

public List<Cliente> listar() {


Connection con = Conexao.getConexao();
List<Cliente> resultado = new ArrayList<Cliente>();
try {
try {
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from cliente");
while (rs.next()) {
Cliente cliente = mapear(rs);
resultado.add(cliente);
}
} finally {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
return resultado;
}

63
64
65
66
67
68

69
70
71
72
73
74
75
76
77

public void excluir(int id){


Connection con = Conexao.getConexao();
try {
try {
PreparedStatement pstmt = con.prepareStatement("delete from cliente where
id = ?" );
pstmt.setInt(1, id);
pstmt.execute();
} finally {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}

142

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

jdbc

78
79

A listagem 13.6 apresenta a classe Agenda. Esta classe obtm as informaes com o
usurio do sistema armazena no Banco de Dados e apresenta a lista de clientes cadastrados.
Listagem 13.6: A Agenda
1

package capitulo13;

2
3

import java.util.List;

4
5

import javax.swing.JOptionPane;

6
7

public class ClienteInclusao {

public static void main(String[] args) {


Cliente cliente = new Cliente();
cliente.setNome(JOptionPane.showInputDialog("Nome:"));
cliente.setCpfCnpj(JOptionPane.showInputDialog("Cpf/Cnpj:"));
cliente.setEndereco(JOptionPane.showInputDialog("Endereo:"));
cliente.setMunicipio(JOptionPane.showInputDialog("Municpio:"));
cliente.setUf(JOptionPane.showInputDialog("UF:"));

9
10
11
12
13
14
15
16

ClienteDao cdao = new ClienteDao();


cdao.incluir(cliente);

17
18
19

List<Cliente> clientes = cdao.listar();


for(Cliente c : clientes){
System.out.printf("%-30s%-30s%-30s%-30s%-30s\n",
c.getNome(),
c.getCpfCnpj(),
c.getEndereco(),
c.getMunicipio(),
c.getUf());
}

20
21
22
23
24
25
26
27
28

29
30

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

13.6.

Exerccios

1. O que JDBC ?

http://solutioin.com
Francisco Calaa, Otvio Calaa

143

Verso 1.2-beta

jdbc

2. Descreva os passos necessrios para obter um conexao (Connection) Java com o Banco
de dados.
3. No exemplo da agenda implemente a funcionalidade que exclui clientes.
4. O que SQL? Quais os comandos bsicos e sua sintaxe?
5. Qual a diferena entre o Statement e o PreparedStatement?
6. Pesquise o motivo da execuo em lote ser mais rpida.

144

http://solutioin.com
Francisco Calaa, Otvio Calaa

14

J AVA P E R S I S T E N C E A P I C O M
H I B E R N AT E

14.1.

Mapeamento objeto relacional

Mapeamento objeto-relacional (ou ORM) uma tcnica de desenvolvimento utilizada para


reduzir o trabalho de programar sistemas orientados aos objetos que utilizam bancos de
dados relacionais. As tabelas do banco de dados so representadas atravs de classes e os
registos de cada tabela so representados como instncias das classes correspondentes.
Com esta tcnica, diminui-se consideravelmente a utilizao de comandos em linguagem
SQL. O desenvolvedor ir usar uma interface de programao simples que faz todo o
trabalho de persistncia.
No necessria uma correspondncia direta entre as tabelas de dados e as classes do
programa. A relao entre as tabelas onde originam os dados e o objeto que os disponibiliza configurada pelo programador, isolando o cdigo do programa das alteraes
organizao dos dados nas tabelas do banco de dados.
Em resumo, mapeamento objeto/relacional a automatizao das operaes entre o
mundo objeto e o mundo relacional. utilizado na persistncia de objetos em aplicaes
Java para tabelas em um banco de dados relacional.

14.2.

Configuraes iniciais

Para que os exemplos deste captulo funcionem, necessrio realizar algumas configuraes prvias. Inicialmente, crie uma pasta, dentro do diretrio src do seu projeto, chamada
META-INF. Copie para esta pasta o arquivo persistence.xml. O contedo deste arquivo est
na Listagem 18.12. Este arquivo tambm est disponibilizado na pasta AmbienteTrabalho/Material/materialJpa/config. A Figura 14.1 ilustra este passo.

Figura 14.1: Configurao do arquivo persistence.xml

145

Verso 1.2-beta

java persistence api com hibernate

O prximo passo a configurao das dependncias da JPA. Para isto, clique com o boto
direito do mouse sobre o projeto e v em Properties. Clique em Java Build Path. Adicione
os arquivos .jar que esto no diretrio AmbienteTrabalho/Material/materialJpa/libJpa. A Figura
14.2 ilustra este passo.

Figura 14.2: Configurao das dependncias da JPA.

14.3.

A criao do primeiro exemplo

Agora ser criado o modelo desenvolvido no capitulo de JDBC utilizando JPA. A classe
Cliente dever ser anotada com @Entity do pacote javax.persistence. A anotao @Entity
instrui ao provedor de persistncia de que a classe em questo dever ser mapeada para
um banco de dados e que tambm ser gerenciada pelo EntityManager. A listagem 14.1
apresenta as anotaes necessrias para utilizao da classe Cliente como entidade da JPA.
Listagem 14.1: Classe Cliente com as anotaes da JPA
1

package capitulo14;

2
3
4
5

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

6
7
8

@Entity
public class Cliente {

146

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

10
11
12

java persistence api com hibernate

@Id
@GeneratedValue
private int id;

13
14

private String nome;

15
16

private String cpfCnpj;

17
18

private String endereco;

19
20

private String municipio;

21
22

private String uf;

23
24
25
26

public int getId() {


return id;
}

27
28
29
30

public void setId(int id) {


this.id = id;
}

31
32
33
34

public String getNome() {


return nome;
}

35
36
37
38

public void setNome(String nome) {


this.nome = nome;
}

39
40
41
42

public String getCpfCnpj() {


return cpfCnpj;
}

43
44
45
46

public void setCpfCnpj(String cpfCnpj) {


this.cpfCnpj = cpfCnpj;
}

47
48
49
50

public String getEndereco() {


return endereco;
}

51
52
53
54

public void setEndereco(String endereco) {


this.endereco = endereco;
}

55
56
57
58

public String getMunicipio() {


return municipio;
}

59
60
61

public void setMunicipio(String municipio) {


this.municipio = municipio;

http://solutioin.com
Francisco Calaa, Otvio Calaa

147

Verso 1.2-beta

java persistence api com hibernate

62
63

public String getUf() {


return uf;
}

64
65
66
67

public void setUf(String uf) {


this.uf = uf;
}

68
69
70
71

14.4.

O arquivo persistence.xml

O arquivo persistence.xml o corao da JPA. nele que sero definidas as configuraes das conexes, entidades que sero persistidas e o comportamento do engine da JPA.
Este arquivo deve ficar dentro do diretrio META-INF do classpath da aplicao. As configuraes deste arquivo dependero da implementao JPA utilizada: Hibernate, TopLink,
KODO, etc.
A listagem 18.12 apresenta o exemplo do arquivo persistence.xml com a implementao
do Hibernate. As propriedades desse arquivo esto descritas na tabela 14.1.
hibernate.hbm2ddl.auto

update - cria as tabelas conforme as anotaes das entidades

hibernate.dialect

Configura o dialeto a ser usado no banco. Mais dialetos


podem ser vistos na Tabela 14.2

hibernate.connection.driver_class

Configura o driver do banco de dados

hibernate.connection.username

Configura o usurio do banco de dados

hibernate.connection.password

Configura a senha do banco de dados

hibernate.connection.url

Configura a url de conexo com o banco de dados

hibernate.show_sql

se true mostra no log as expresses SQL utilazadas


Tabela 14.1: Alguns dos parmetros do hibernate

Listagem 14.2: Arquivo persistence.xml do nosso projeto


1
2
3
4
5

6
7
8
9

<?xml version="1.0" encoding="UTF -8"?>


<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org /2001/ XMLSchema -instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns
/persistence/persistence _ 1 _ 0.xsd" >
<persistence-unit name="aulajpa">
<properties>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show _ sql" value="true"/>

10

148

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

11

12

13

14
15
16
17
18

java persistence api com hibernate

<property name="hibernate.dialect" value="org.hibernate.dialect.


PostgreSQLDialect" />
<property name="hibernate.connection.driver _ class" value="org.postgresql.
Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql: //
localhost/treinamento" />
<property name="hibernate.connection.username" value="postgres"/>
<property name="hibernate.connection.password" value="123456"/>
</properties>
</persistence-unit>
</persistence>

Banco de Dados

Dialeto

DB2

org.hibernate.dialect.DB2Dialect

DB2 AS/400

org.hibernate.dialect.DB2400Dialect

DB2 OS390

org.hibernate.dialect.DB2390Dialect

PostgreSQL

org.hibernate.dialect.PostgreSQLDialect

MySQL

org.hibernate.dialect.MySQLDialect

MySQL com InnoDB

org.hibernate.dialect.MySQLInnoDBDialect

MySQL com MyISAM

org.hibernate.dialect.MySQLMyISAMDialect

Oracle (qualque verso)

org.hibernate.dialect.OracleDialect

Oracle 9i

org.hibernate.dialect.Oracle9iDialect

Oracle 10g

org.hibernate.dialect.Oracle10gDialect

Sybase

org.hibernate.dialect.SybaseDialect

Sybase Anywhere

org.hibernate.dialect.SybaseAnywhereDialect

Microsoft SQL Server

org.hibernate.dialect.SQLServerDialect

SAP DB

org.hibernate.dialect.SAPDBDialect

Informix

org.hibernate.dialect.InformixDialect

HypersonicSQL

org.hibernate.dialect.HSQLDialect

Ingres

org.hibernate.dialect.IngresDialect

Progress

org.hibernate.dialect.ProgressDialect

Mckoi SQL

org.hibernate.dialect.MckoiDialect

Interbase

org.hibernate.dialect.InterbaseDialect

Pointbase

org.hibernate.dialect.PointbaseDialect

FrontBase

org.hibernate.dialect.FrontbaseDialect

Firebird

org.hibernate.dialect.FirebirdDialect
Tabela 14.2: Alguns dos dialetos do hibernate

http://solutioin.com
Francisco Calaa, Otvio Calaa

149

Verso 1.2-beta

14.5.

java persistence api com hibernate

O EntityManager

Inicialmente deve ser criada uma instncia de EntityManagerFactory. Isto realizado


atravs do cdigo:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("aulajpa");

neste momento, o engine da JPA ir validar as tabelas em relao s classes anotadas. Em


alguns engines (como o caso do Hibernate) possvel configurar para que, neste momento,
tambm sejam criadas as tabelas no banco de dados.
O EntityManager pode ser criado ou obtido de uma EntityManagerFactory. Voc precisa
utilizar um EntityManagerFactory para criar instncias de EntityManager.
O mtodo createEntityManager() retorna uma instncia de EntityManager. Esta instncia irgerenciar o contexto de persistncia. A classe da listagem 14.3 apresenta um exemplo
de utilizao do EntityManager.
Listagem 14.3: Classe ContatoDao exemplificando a utilizao do EntityManager
1

package capitulo14;

2
3

import java.util.List;

4
5
6
7
8

import
import
import
import

javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;

9
10

public class ClienteDaoJpa {

11
12

private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("


aulajpa" );

13
14

private EntityManager em = emf.createEntityManager();

15
16
17
18
19
20

public void incluir(Cliente cliente) {


em.getTransaction().begin();
em.persist(cliente);
em.getTransaction().commit();
}

21
22
23
24
25

public List<Cliente> listar() {


Query query = em.createNativeQuery("select * from cliente", Cliente.class);
return query.getResultList();
}

26
27
28
29
30
31
32

public void excluir(int id){


em.getTransaction().begin();
Cliente c = em.find(Cliente.class, id);
em.remove(c);
em.getTransaction().commit();
}

150

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java persistence api com hibernate

33
34

14.6.

A incluso de clientes com JPA

A classe da listagem 14.4 apresenta nossa agenda na verso JPA.


Listagem 14.4: Classe Agenda
1

package capitulo14;

2
3

import java.util.List;

4
5

import javax.swing.JOptionPane;

6
7

public class ClienteInclusaoJpa {

public static void main(String[] args) {


Cliente cliente = new Cliente();
cliente.setNome(JOptionPane.showInputDialog("Nome:"));
cliente.setCpfCnpj(JOptionPane.showInputDialog("Cpf/Cnpj:"));
cliente.setEndereco(JOptionPane.showInputDialog("Endereo:"));
cliente.setMunicipio(JOptionPane.showInputDialog("Municpio:"));
cliente.setUf(JOptionPane.showInputDialog("UF:"));

9
10
11
12
13
14
15
16

ClienteDaoJpa cdao = new ClienteDaoJpa();


cdao.incluir(cliente);

17
18
19

List<Cliente> clientes = cdao.listar();


for(Cliente c : clientes){
System.out.printf("%-30s%-30s%-30s%-30s%-30s\n",
c.getNome(),
c.getCpfCnpj(),
c.getEndereco(),
c.getMunicipio(),
c.getUf());
}

20
21
22
23
24
25
26
27
28

29
30

14.6.1 Persistindo entidades


Persistir uma entidade o ato de inseri-la em um banco de dados. Voc persiste entidades que ainda no foram criadas no banco de dados. Para isso utilize o mtodo persiste(entidade) do EntityManager.

http://solutioin.com
Francisco Calaa, Otvio Calaa

151

Verso 1.2-beta

14.6.2

java persistence api com hibernate

Localizando entidades

O EntityManager possui o mtodo find(classe, id) cujo objetivo o de localizar entidades


no banco de dados. Sua forma de utilizao :
em.find(Cliente.class, 2)

neste caso ser retornado o registro com id = 2 da tabela que persiste os objetos do tipo
Cliente.

14.6.3 Removendo entidades


Para remover entidades de um banco de dados utilize o mtodo remove(entidade). Somente podem ser removidas entidades que esto no estado de gerenciadas. Para isto
necessrio localiza-las antes com find().

14.6.4 Mesclando entidades


Se a entidade no estiver no estado de gerenciada possvel mesclar as alteraes com
as informaes do banco de dados. Isto realizado com o mtodo merge(entidade). Este
mtodo recebe uma entidade no gerenciada e retorna esta mesma entidade gerenciada.

14.7.

Relacionamento entre classes

Existem quatro tipos de relacionamentos:


Um para um - @OneToOne
Um para muitos - @OneToMany
Muitos para um - @ManyToOne
Muitos para muitos - @ManyToMany
Para exemplificar o relacionamento @OneToMany foram criadas as classes das listagens
14.6 e 14.5. Observe a utilizao da @OneToMany na propriedade disciplinas da classe
Curso. Esta anotao descreve a existncia de vrios cursos para cada disciplina.
A listagem 14.7 cria um objeto do tipo Disciplina e adiciona vrios objetos do tipo Curso
na disciplina. Aps isto utilizada a JPA-QL para consultar os cursos com suas respectivas
disciplinas.
Listagem 14.5: Classe Curso do exemplo de relacionamento @OneToMany
1

package capitulo14;

2
3

import static javax.persistence.CascadeType.ALL;

152

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java persistence api com hibernate

import static javax.persistence.FetchType.EAGER;

5
6
7

import java.util.ArrayList;
import java.util.List;

8
9
10
11
12
13

import
import
import
import
import

javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.JoinColumn;
javax.persistence.OneToMany;

14
15
16

@Entity
public class Curso {

17

@Id
@GeneratedValue
private int id;

18
19
20
21

private String nome;

22
23

@JoinColumn(name="curso _ id")
@OneToMany(cascade=ALL, fetch = EAGER)
private List<Disciplina> disciplinas = new ArrayList<Disciplina>();

24
25
26
27

public String toString() {


StringBuffer sb = new StringBuffer(nome);
sb.append("\n");
for(Disciplina disciplina : disciplinas){
sb.append("
" );
sb.append(disciplina);
sb.append("\n");
}
return sb.toString();
}

28
29
30
31
32
33
34
35
36
37
38

public int getId() {


return id;
}

39
40
41
42

public String getNome() {


return nome;
}

43
44
45
46

public void setNome(String nome) {


this.nome = nome;
}

47
48
49
50

public List<Disciplina> getDisciplinas() {


return disciplinas;
}

51
52
53
54

http://solutioin.com
Francisco Calaa, Otvio Calaa

153

Verso 1.2-beta

java persistence api com hibernate

Listagem 14.6: Classe Disciplina do exemplo de relacionamento @OneToMany


1

package capitulo14;

2
3
4
5

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

6
7
8

@Entity
public class Disciplina {

@Id
@GeneratedValue
private int id;

10
11
12
13

private String nome;

14
15

private int cargaHoraria;

16
17

public String toString() {


return String.format("%s - %s", nome, cargaHoraria);
}

18
19
20
21

public int getId() {


return id;
}

22
23
24
25

public String getNome() {


return nome;
}

26
27
28
29

public void setNome(String nome) {


this.nome = nome;
}

30
31
32
33

public int getCargaHoraria() {


return cargaHoraria;
}

34
35
36
37

public void setCargaHoraria(int cargaHoraria) {


this.cargaHoraria = cargaHoraria;
}

38
39
40
41

Listagem 14.7: Classe Escola do exemplo de relacionamento @OneToMany


1

package capitulo14;

2
3

import java.util.List;

4
5

public class Escola {

6
7

public static void main(String[] args) {

154

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java persistence api com hibernate

Disciplina disciplina1 = new Disciplina();


disciplina1.setNome("Matematica");

8
9
10

Disciplina disciplina2 = new Disciplina();


disciplina2.setNome("Portugues");

11
12
13

Disciplina disciplina3 = new Disciplina();


disciplina3.setNome("Fisica");

14
15
16

Curso curso = new Curso();


curso.setNome("Nucleo comum");
curso.getDisciplinas().add(disciplina1);
curso.getDisciplinas().add(disciplina2);
curso.getDisciplinas().add(disciplina3);

17
18
19
20
21
22

CursoDaoJpa cursoDaoJpa = new CursoDaoJpa();


cursoDaoJpa.incluir(curso);

23
24
25

List<Curso> cursos = cursoDaoJpa.listar();


for(Curso c : cursos){
System.out.println(c);
}

26
27
28
29
30

31
32
33

14.8.

Formas de obteno de ids

Uma chave primria a identidade de um determinado bean de entidade. Cada bean de


entidade deve ter uma chave primaria e esta deve ser nica. A chave primaria pode mapear
para uma ou mais propriedades.
A JPA permite quatro estratgias:
TABLE - designa uma tabela relacional definida pelo usurio a partir da qual as
chaves numricas sero geradas.
SEQUENCE - Interage com as sequences dos bancos de dados que suportam esta
tecnologia como Oracle, PostGres, HSQLDB, etc.
IDENTITY - Utilizada em bancos de dados com suporte a esta forma de gerao de
IDs como o SQL Server e o Derby.
AUTO - Utilizada em banco de dados que possuem a funcionalidade autoincrement.
No exemplo foi utilizada a estratgia SEQUENCE por ser esta suportada pelo banco de
dados Postgres, utilizado neste livro. A classe Cliente apresentada na listagem 14.1 contm
este exemplo.
Se desejar configurar o nome da sequence no banco de dados, utilize a seguinte sintaxe:

http://solutioin.com
Francisco Calaa, Otvio Calaa

155

Verso 1.2-beta

java persistence api com hibernate

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="produto_seq")
@SequenceGenerator(sequenceName="produto_seq", name="produto_seq",
allocationSize=1, initialValue=1)

14.9.

JPQL - A linguagem consulta da Jpa

O Java Persistence Query Language (JPQL) uma linguagem de consulta orientada a objetos definidos como parte da especificao da Java Persistence API (JPA).
Para realizar consultas de objetos utilizada a JPQL, uma linguagem de consulta de
objetos que ser traduzida, pela JPA, na linguagem de consulta estruturada: SQL.
A classe da 14.5 apresenta um exemplo de JPQL.
JPQL usado para fazer consultas em entidades armazenadas em um banco de dados
relacional. Ela fortemente inspirada na linguagem SQL, e suas consultas assemelham
sintaxe das consultas SQL. A diferena que operam com objetos de entidade JPA ao
invs de diretamente operar com as tabelas de banco de dados. Alm de recuperar objetos
(consultas SELECT), JPQL compatvel com atualizaes (UPDATE e DELETE).
Por exemplo, para retornar os cursos (Listagem 14.5) ordenados pelo nome, bastaria
utilizar:
select c from Curso c order by c.nome

Outro exemplo, para retornar apenas os cursos que contenham a disciplica com nome
FSICA, basta utilizar:
select c from Curso c left join fetch c.disciplinas d where d.nome = FSICA

14.9.1 Passagem de parmetros


Para passar parmetros para as consultas voc deve utilizar a seguinte estratgia:
Query query = em.createQuery(select c from Curso c where c.nome = :nome);
query.setParameter("nome", Java);

neste caso, sero retornados todos os registros que contm nome igual a Java.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

156

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

14.10.

java persistence api com hibernate

Exerccios

1. O que o mapeamento objeto-relacinal?


2. Quais os procedimentos necessrios para tornar um bean apto a trabalhar com JPA?
3. Para que serve o EntityManager?
4. Quais os tipos de relacionamentos existem na JPA?
5. O que o arquivo persistence.xml?
6. Quais as formas de obteno de primary keys existem na JPA?
7. O que JPA-QL ?

http://solutioin.com
Francisco Calaa, Otvio Calaa

157

15

A P L I C AT I V O S W E B
Construir aplicativos WEB consiste em misturar muitas tecnologias como HTML, CSS e
JavaScript em um aplicativo. A grande vantagem dos aplicativos WEB o fato que a execuo deles est no servidor e que a conectividade mxima. possvel utilizar aplicativos
WEB em qualquer regio do mundo bastando apenas estar conectado com o sistema.
possvel construir aplicativos WEB com Java. O que consistem em apenas utilizar a
tecnologia Java para gerar CSS, HTML e JavaScript.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

15.1.

XML

XML a abreviao de EXtensible Markup Language (Linguagem extensvel de marcao).


Trata-se de uma linguagem que considerada uma grande evoluo na internet.
O XML uma especificao tcnica desenvolvida pelo W3C (World Wide Web Consortium - entidade responsvel pela definio da de padres da internet), para ser um padro
de comunicao entre sistemas. Em Java alm de troca de informaes entre sistemas o
XML tambm muito utilizado para configurar recursos. O XML prov uma representao
estruturada dos dados. Isto o torna amplamente utilizado e de fcil utilizao. possvel
representar vrios tipos de estrutura de dados com XML.
O XML prov um padro que pode codificar o contedo, as semnticas e as esquematizaes para uma grande variedade de aplicaes desde simples at as mais complexas,
dentre elas:
Um simples documento.
Um registro estruturado tal como uma ordem de compra de produtos.
Um objeto com mtodos e dados como objetos Java ou controles ActiveX.
Um registro de dados. Um exemplo seria o resultado de uma consulta a bancos de
dados.
Apresentao grfica, como interface de aplicaes de usurio.
Entidades e tipos de esquema padres.

159

Verso 1.2-beta

aplicativos web

Todos os links entre informaes e pessoas na web.


O XML considerado de grande importncia na Internet e em grandes intranets porque
prov a capacidade de inter operao dos computadores por ter um padro flexvel e aberto
e independente de dispositivo. As aplicaes podem ser construdas e atualizadas mais rapidamente e tambm permitem mltiplas formas de visualizao dos dados estruturados.
Para ser considerado vlido um arquivo xml deve, obrigatoriamente:
ter todas as suas tags fechadas;
ter apenas uma tag principal;
todos os valores dos atributos devem ser escritos entre aspas.
Na listagem 15.1 apresentado um exemplo de arquivo xml.
Listagem 15.1: Exemplo de xml
1
2
3
4
5
6

<dados>
<pessoa nome="Manoel">
<endereco rua="Rua 2" numero="30" />
<endereco rua="Av Goias" numero="2" />
</pessoa>
</dados>

15.2.

HTML

HTML (acrnimo para a expresso inglesa HyperText Markup Language, que significa Linguagem de Marcao de Hipertexto) uma linguagem de marcao utilizada para produzir
pginas na Web. Documentos HTML podem ser interpretados por navegadores.

15.2.1 A estrutura bsica de um documento HTML


A estrutura de um documento HTML apresenta os seguintes componentes:
<html>
<head>
<title>Ttulo do Documento</title>
</head>
<body>
texto,
imagem,
links,
...
</body>
</html>

160

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta
<table>

aplicativos web

Gera uma tabela

<tr>

Uma linha em uma tabela

<td>

Uma clula em uma tabela

<link>

liga recursos na pgina

<form>

Cria um formulrio

<input>

Cria um campo de entrada


de dados
Tabela 15.1: Algumas tags HTML

As tags bsicas de HTML so:


< html >: define o incio de um documento HTML e indica ao navegador que todo
contedo posterior deve ser tratado como uma srie de cdigos HTML.
< head >: define o cabealho de um documento HTML, que traz informaes sobre
o documento que est sendo aberto.
< body >: define o contedo principal, o corpo do documento. Esta a parte do documento HTML que exibida no navegador. No corpo podem-se definir propriedades
comuns a toda a pgina, como cor de fundo, margens, e outras formataes.

15.2.1.1 Cabealho
Dentro do cabealho existem os seguintes comandos:
< title >: define o ttulo da pgina, que exibido na barra de ttulo dos navegadores.
< style >: define formatao em CSS.
< script >: define programao de certas funes em pgina com scripts, podendo
adicionar funes de JavaScript.
< link >: define ligaes da pgina com outros arquivos como feeds, CSS, scripts,
etc.
< meta >: define propriedades da pgina, como codificao de caracteres, descrio
da pgina, autor, etc. So meta informaes sobre documento. Tais campos so muitos
usados por motores de busca para obterem mais informaes sobre o documento,
afim de classific-lo melhor. Por exemplo, pode-se adicionar o cdigo < meta name="description"
content="descrio da sua pgina" / > no documento HTML para indicar ao motor
de busca que texto de descrio apresentar junto com a ligao para o documento.

15.2.2 Outras tags HTML


Algumas das tags HTML podem ser vistas na tabela 15.1.

http://solutioin.com
Francisco Calaa, Otvio Calaa

161

Verso 1.2-beta

15.3.

aplicativos web

JavaScript

JavaScript uma linguagem de programao criada pela Netscape em 1995, que a princpio
se chamava LiveScript, para atender, principalmente, as seguintes necessidades:
Validao de formulrios no lado cliente (programa navegador);
Interao com a pgina. Assim, foi feita como uma linguagem de script. Javascript
tem sintaxe semelhante do Java, mas totalmente diferente no conceito e no uso.
Possui as seguintes caractersticas
Oferece tipagem dinmica - tipos de variveis no so definidos;
interpretada, ao invs de compilada;
Oferece bom suporte a expresses regulares (caracterstica tambm comum a linguagens de script).
Sua unio com o CSS conhecida como DHTML. Usando o Javascript, possvel modificar dinamicamente os estilos dos elementos da pgina em HTML.
Dada sua enorme versatilidade e utilidade ao lidar com ambientes em rvore (como
um documento HTML), foi criado a partir desta linguagem um padro ECMA, o ECMA262, tambm conhecido como ECMAScript. Este padro seguido, por exemplo, pela linguagem ActionScript da Adobe.
O uso de JavaScript em pginas HTML deve ser informado ao navegador da seguinte
forma:
<script type="text/javascript">
/* aqui fica o script */
</script>

Caso contrrio, o navegador ir interpretar o script como sendo cdigo HTML, escrevendoo na pgina.
Na listagem 15.2 apresentado um exemplo de JavaScript. Neste exemplo existem duas
funes: clicar e formatarData. A funo clicar incrementa o valor o boto a cada vez que
clicado no boto. A funo formatarData formata uma data com as barras quando o campo
de data perde o foco.
Listagem 15.2: Exemplo de JavaScript
1
2
3
4

<html>
<head>
<title>Exemplo de JavaScript</title>
</head>

5
6
7

<script type="text/javascript">
var qtdVezes = 0;

162

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

8
9
10
11
12

aplicativos web

function clicar(comp){
qtdVezes++;
complemento = qtdVezes > 1 ? "es" : "";
comp.value = qtdVezes + " vez" + complemento;
}

13
14
15
16
17
18
19
20

function formatarData(comp){
data = comp.value;
data = data.substring(0,2) + "/" + data.substring(2,4) + "/" +
data.substring(4,8);
comp.value = data;
}
</script>

21
22
23
24
25
26
27
28

<body>
Clique no boto:
<input type="button" value="Clique" onclick="javascript:clicar(this)"/>
<br/>
Data:<input type="text" onblur="javascript:formatarData(this)"/>
</body>
</html>

15.4.

CSS

Cascading Style Sheets, ou simplesmente CSS, uma linguagem de estilo utilizada para
definir a apresentao de documentos escritos em uma linguagem de marcao, como
HTML ou XML. Seu principal benefcio prover a separao entre o formato e o contedo
de um documento.
Ao invs de colocar a formatao dentro do documento, o desenvolvedor cria um link
(ligao) para uma pgina que contm os estilos, procedendo de forma idntica para todas
as pginas de um site. Quando quiser alterar a aparncia do site basta portanto modificar
apenas um arquivo, o arquivo de estilo.
As especificaes do CSS podem ser obtidas no site da W3C "Word Wide Web Consortium", um consrcio de diversas empresas que buscam estabelecer padres para a internet.
importante notar que nenhum browser suporta igualmente as definies do CSS. Desta
forma, o webdesigner deve sempre testar suas folhas de estilo em browsers de vrios fabricantes, e preferencialmente em mais de uma verso, para se certificar de que o que foi
codificado realmente seja apresentado da forma desejada.
Com a variao de atualizaes dos navegadores (browsers) como Internet Explorer que
ficou sem nova verso de 2001 a 2006, o suporte ao CSS pode variar. O Internet Explorer
6, por exemplo, tem suporte total a CSS1 e praticamente nulo a CSS2. Navegadores mais
modernos como Opera, Internet Explorer 7 e Mozilla Firefox tem suporte maior, inclusive
at a CSS 3, ainda em desenvolvimento.
O cdigo:
/* comentrio em css */
body

http://solutioin.com
Francisco Calaa, Otvio Calaa

163

Verso 1.2-beta

aplicativos web

{
font-family: Arial, Verdana, sans-serif;
background-color: #FFFFFF;
margin: 5px 10px;
}

define fonte padro Arial, caso no exista substitui por Verdana, caso no exista define
qualquer fonte sem serifa. Define tambm a cor de fundo do corpo da pgina.
Na listagem 15.3 apresentado um exemplo de uma pgina HTML. Note a tag link:
<link href="estilo.css" type="text/css" rel="stylesheet"/>

Esta tag faz ligao com o arquivo da listagem 15.4 que o arquivo CSS. Observe que no
estilo.css existem definies de formatao das tags da pgina da listagem 15.3.
Listagem 15.3: Exemplo de pgina HTML
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

<html>
<head>
<link href="estilo.css" type="text/css" rel="stylesheet"/>
<title>Primeira pgina HTML</title>
</head>
<body>
<h1>Tabela de Cursos</h1>
<table>
<tr>
<th>Curso</th>
<th>Carga Horria</th>
<th>Instrutor</th>
</tr>
<tr>
<td>Java</td>
<td>80 Horas</td>
<td>Francisco</td>
</tr>
<tr>
<td>Delphi</td>
<td>160 Horas</td>
<td>Danilo</td>
</tr>
<tr>
<td>Linux</td>
<td>160 Horas</td>
<td>Diogo</td>
</tr>
</table>
</body>
</html>

Listagem 15.4: estilo.css - exemplo de css


1

h1{

164

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta
font-family: verdana;
font-size: 25pt;
color: #00aa22;
font-weight: bold;

2
3
4
5
6

aplicativos web

7
8

th{
font-family: verdana;
font-size: 15pt;
color: #0022aa;

9
10
11
12
13

}
td{
font-family: verdana;
font-size: 12pt;
color: #00aa22;
background-color: #ccccff;

14
15
16
17
18

15.5.

Aplicativos Web com Java

Para a construo de aplicativos WEB utilizando o Java ser necessrio todas as tecnologias
apresentadas:
Html, para construo do contedo
CSS, para construo da apresentao
JavaScript, para construo do dinamismo como as mscaras
A linguagem Java dever ser executada em um servidor e est auxiliar a criao de
contedo html, css e javascript. Existem vrios servidores WEB. Comumente chamado de
continer o servidor que executa o cdigo java.
Neste livro ser utilizado o continer WEB chamado tomcat na sua verso 5.5.

15.5.1 Instalao do Tomcat


Para instalar o tomcat siga as seguintes instrues:
Faa o download do tomcat atravs do site tomcat.apache.org
Descompacte o arquivo. (Preferencialmente dentro do diretrio AreaDeTabalho/MeusAplicativos).
Configure a varivel de ambiente
JAVA_HOME

para o diretrio raiz onde est instalado o JDK.


V ao diretorio bin do tomcat e execute o comando startup.bat
Abra o browser e acesse o endereo http://localhost:8080. Se aparecer uma pgina
ilustrada na figura 15.1 o tomcat est devidamente instalado.

http://solutioin.com
Francisco Calaa, Otvio Calaa

165

Verso 1.2-beta

aplicativos web

Figura 15.1: Tela inicial do tomcat

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

15.6.

Exerccios

1. O que so arquivos xml?


2. O que so arquivos html?
3. O que JavaScript?
4. Crie um script JavaScript para colocar a mscara de data em um campo.
5. O que css?
6. Pesquise sobre o padro w3c tableless.
7. Quais os procedimentos necessrios para instalao do tomcat?

166

http://solutioin.com
Francisco Calaa, Otvio Calaa

16

S E RV L E T S
Servlet uma tecnologia que insere novos recursos a um servidor, a definio mais usada
que so consideradas extenses de servidores, essa tecnologia disponibiliza ao desenvolvedor do sistema uma interface para o servidor de aplicao, atravs de uma API. As
aplicaes baseadas em Servlet geram contedo dinmico e interagem com os clientes, utilizando o modelo request/response (requisio e resposta) do protocolo HTTP. Apesar de
normalmente utilizam o protocolo HTTP, os Servlets no so restritos a ele.
Um Servlet necessita de um continer Web para ser executado. Este continer Web pode
ser um servidor de aplicaes como o JBoss, GlassFish, Apache Gernimo, etc ou apenas
um continer como o Tomcat.
A estrutura de um Servlet simples, basicamente so classes Java que implementam a
interface Servlet. Os servlets que respondero ao protocolo HTTP (a maioria) deveom estender a classe HttpServlet, que implementa a interface Servlet. Alm disto necessrio
configurar o Servlet no descritor de implantao da aplicao. Este descritor de implantao o arquivo web.xml.

16.1.

Estrutura de uma aplicao web Java

As aplicaes Java WEB seguem a estrutura apresentada na figura 16.1. Nesta figura
possvel observar os seguintes elementos:
app1 - o contexto. o diretrio onde fica armazenada a aplicao
WEB-INF - o diretrio onde ficam as classes java, as bibliotecas e os arquivos de
configurao.
classes - o diretrio onde ficam as classes Java. Este diretrio opcional, precisa
existir apenas se existirem classes Java na aplicao.
lib - o diretrio onde ficam os arquivos .jar. Este diretrio opcional, precisa existir
apenas se existirem arquivos .jar.
web.xml - o descritor de implantao. Este arquivo possui as configuraes gerais
da aplicao. Este arquivo obrigatrio.

16.2.

Construindo o primeiro Servlet

Para exemplificar a estrutura de um aplicativo WEB Java observe o exemplo. Na listagem


16.1 apresentada a classe do servlet. Observe que esta classe estende HttpServlet. O

167

Verso 1.2-beta

servlets

Figura 16.1: Exemplo de estrutura de uma aplicao WEB

mtodo doGet o mtodo executado quando ocorre uma requisio a esse servlet. Note
que nesse mtodo gerada uma resposta html que ser apresentada no browser.
Para que tudo funcione corretamente necessrio montar a estrutura de um aplicativo
web apresentado na figura 16.1. Primeiramente crie o diretrio app1. Dentro do diretrio
app1 crie o diretrio WEB-INF. dentro do diretrio WEB-INF crie o diretrio classes. Compile a classe PrimeiroServlet e aps isto coloque o pacote capitulo16 gerado dentro do
diretrio classes. Note que para compilar essa classe necessrio ter o arquivo servlet.jar
configurado no classpath de compilao. Este arquivo pode ser encontrado dentro de common/lib do tomcat instalado. Crie o descritor de implantao apresentado na listagem
18.10 e coloque-o dentro do diretrio WEB-INF. Certifique-se de ter ficado como a figura
16.1.
Aps ter montado esta estrutura coloque-a dentro do diretrio webapps do tomcat instalado no captulo anterior. Certifique-se de que o tomcat esteje sendo executado. Acesse
o endereo: http://localhost:8080/app1/prim. Se aparecer a figura 16.2 tudo funcionou
corretamente.
Listagem 16.1: Classe PrimeiroServlet. Um exemplo de servlet
1

package capitulo16;

2
3
4

import java.io.IOException;
import java.io.PrintWriter;

5
6
7
8
9
10

import
import
import
import
import

javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

11
12
13

@WebServlet("/PrimeiroServlet")
public class PrimeiroServlet extends HttpServlet {

14
15

16
17
18
19

public void doGet(HttpServletRequest request, HttpServletResponse response) throws


ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML >");
out.println("<HEAD ><TITLE >Primeiro Servlet </TITLE ></HEAD >");

168

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

out.println("<BODY >");
out.println("<H1>PRIMEIRO SERVLET FUNCIONANDO ...</H1>");
out.println("</BODY >");
out.println("</HTML >");
out.close();

20
21
22
23
24

25
26
27

Listagem 16.2: O descritor de implantao web.xml


1
2

<web-app>
<display-name>Exemplo de servlet</display-name>

3
4
5
6
7

<servlet>
<servlet-name>primeiro</servlet-name>
<servlet-class>capitulo16.PrimeiroServlet</servlet-class>
</servlet>

8
9
10
11
12
13

<servlet-mapping>
<servlet-name>primeiro</servlet-name>
<url-pattern>/prim</url-pattern>
</servlet-mapping>
</web-app>

Figura 16.2: O primeiro servlet funcionando

16.3.

Como fazer no eclipse

O eclipse nos ajuda a construir um projeto WEB de forma mais fcil. Isto no o isenta de
entender bem toda a estrutura de um aplicativo WEB.

http://solutioin.com
Francisco Calaa, Otvio Calaa

169

Verso 1.2-beta

servlets

V em File - New - Project. Escolha Dynamic Web Project, conforme ilustrado na figura
16.7.
Na tela seguinte possvel configurar o nome da aplicao e em qual servidor ser
executada. Escolha Apache Tomcat v5.5 conforme a figura 16.8. Se no aparecer esta opo
clique no boto New e configure.
Na tela seguinte possvel configurar os FrameWorks utilizados neste projeto. Deixe
como est. Esta tela est ilustrada na figura 16.9.
Por ltimo possvel configurar o nome do contexto. O diretrio onde ficar os arquivos
WEB e o diretrio onde ficaro os arquivos .java conforme mostra a figura 16.10.

Figura 16.3: Novo projeto Web no eclipse

16.4.

Atendendo requisies com o mtodo get

A listagem 16.3 apresenta a classe do servlet que receber as informaes atravs do mtodo
get. Note que todo o cdigo que atender a requisio fica dentro do mtodo doGet. Este
mtodo recebe dois parmetros um do tipo HttpServletRequest que possui as informaes
da requisio e um do tipo HttpServletResponse que possibilita a construo da resposta.
utilizado o mtodo getParameter:
String nascimento = request.getParameter("nascimento");

para buscar as informaes que vm da requisio.


A listagem 16.4 apresenta a pgina html que invocar o servlet e enviar as informaes
atravs do mtodo get. Note o uso da tag
<form action="ExemploGet" method="GET">

170

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

Figura 16.4: Novo projeto Web no eclipse

http://solutioin.com
Francisco Calaa, Otvio Calaa

171

Verso 1.2-beta

servlets

Figura 16.5: Novo projeto Web no eclipse

Figura 16.6: Novo projeto Web no eclipse

172

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

Figura 16.7: Novo projeto Web no eclipse

Figura 16.8: Configurao do nome do projeto

http://solutioin.com
Francisco Calaa, Otvio Calaa

173

Verso 1.2-beta

servlets

Figura 16.9: Configurao dos frameworks web

Figura 16.10: Configurao do diretrio dos fontes e dos arquivos web

174

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

o atributo action descreve qual recurso ser invocado quando for clicado no botao submit
e o atributo method descreve qual mtodo ser utilizado, no caso GET.
Observe que os parmetros que voc digitou no formulrio aparecem na url enviada
pelo browser. Esta a caracterstica do mtodo get: envia os parmetros atravs da URL.
Listagem 16.3: Servlet do exemplo de passagem de parmetros com o mtodo get
1

package capitulo16;

2
3
4

import java.io.IOException;
import java.io.PrintWriter;

5
6
7
8
9
10
11

import
import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

12
13
14

@WebServlet("/ExemploGet")
public class ExemploGet extends HttpServlet {

15

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String nome = request.getParameter("nome");
String nascimento = request.getParameter("nascimento");

16

17
18
19
20
21

out.println("<html >");
out.println("<body >");
out.printf("%s nasceu em %s", nome, nascimento);
out.println("</body >");
out.println("</html >");
out.close();

22
23
24
25
26
27

28
29

Listagem 16.4: Pgina Html que enviar as informaes atravs do mtodo get
1
2
3
4
5
6
7
8
9
10
11
12

<html>
<head>
<title>Exemplo Get</title>
</head>
<body>
<form action="ExemploGet" method="get">
Nome: <input type="text" name="nome" /><br/>
Data de nascimento: <input type="text" name="nascimento" /><br/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

http://solutioin.com
Francisco Calaa, Otvio Calaa

175

Verso 1.2-beta

16.5.

servlets

Atendendo requisies com o mtodo post

Diferente do mtodo get o mtodo post envia as informaes para o servidor no corpo da
solicitao. As informaes no aparecero na URL como no mtodo GET.
A listagem 16.5 apresenta o servlet que atender s requisies post. Note que agora foi
implementado o mtodo doPost.
A listagem 16.6 apresenta a pgina que enviar as informaes atravs do mtodo post.
Note que a unica diferena com o envio com mtodo GET o atributo method da tag form
que agora POST.
Listagem 16.5: Servlet do exemplo de passagem de parmetros com o mtodo post
1

package capitulo16;

2
3
4

import java.io.IOException;
import java.io.PrintWriter;

5
6
7
8
9
10
11

import
import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

12
13
14

@WebServlet("/ExemploPost")
public class ExemploPost extends HttpServlet {

15

protected void doPost(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

16

17
18
19

String nome = request.getParameter("nome");


String endereco = request.getParameter("endereco");
String salario = request.getParameter("salario");

20
21
22
23

out.println("<html >");
out.println("<body");
out.printf("Nome: %s <br/>", nome);
out.printf("Endereco: %s <br/>", endereco);
out.printf("Salario: %s <br/>", salario);
out.println("</body >");
out.println("</html >");
out.close();

24
25
26
27
28
29
30
31

32
33

Listagem 16.6: Pgina Html que enviar as informaes atravs do mtodo post
1
2
3

<html>
<head>
<title>Exemplo mtodo post</title>

176

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

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

servlets

</head>
<body>
<form action="ExemploPost" method="POST">
<pre>
Nome:
<input type="text" name="nome" />
Endereco: <input type="text" name="endereco" />
Salario: <input type="text" name="salario" />
<input type="submit" />
</pre>
</form>
</body>
</html>

16.6.

Redirect

Para exemplificar o redirect pense em um Call Center. Imagine voc ligando para um Call
Center para fazer uma reclamao de sua conta telefnica. Aps ser atendido pelo primeiro
atendente voc conta toda a histria que originou a ligao. O atentende espera at voc
terminar e diz: No comigo. Vou transfefir o senhor para o departamento responsvel.
Voc se irrita um pouco e diz: Tudo bem. Um novo antendente atente e solicita a voc
que conte o problema a ele. Voc conta o problema e ele o ouve at terminar. Quando
voc termina o novo atendente diz: Tambm no comigo. Vou transferir o senhor para o
departamento responsvel. A voc um pouco mais irritado espera. Na terceira vez conta,
novamente toda a histria e assim vai.
Neste caso ocorre um redirect. Quando feito um redirect entre recursos WEB com
o protocolo HTTP como se fosse necessrio contar novamente toda a histria ao novo
recurso e fica claro, para o solicitante, que houve mudana de servlet atendente.
As pginas das Listagens 16.9 e 16.10 apresentam o resultado.
Note o uso do mtodo sendRedirect:
response.sendRedirect(pagina);

para realizar o redirecionamento para a pgina de resultado. Com o redirect ser feita
uma nova requisio para as pginas e voc observar que, ao clicar no boto, automaticamente ser redirecionado para aprovado.html ou reprovado.html. Ficou claro que quem
originou a resposta foram as prprias pginas.
Listagem 16.7: Pgina inicial do exemplo com redirect
1
2
3
4
5
6
7
8
9

<html>
<head>
<title>Exemplo Redirect</title>
</head>
<body>
<form action="ExemploRedirect" method="post">
Salrio: <input type="text" name="salario"/>
<input type="submit" value="Enviar"/>
</form>

http://solutioin.com
Francisco Calaa, Otvio Calaa

177

Verso 1.2-beta

10
11

servlets

</body>
</html>

Listagem 16.8: Servlet do exemplo de Redirect


1

package capitulo16;

2
3

import java.io.IOException;

4
5
6
7
8
9
10

import
import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

11
12
13

@WebServlet("/ExemploRedirect")
public class ExemploRedirect extends HttpServlet {

14

protected void doPost(HttpServletRequest request,HttpServletResponse response)


throws ServletException, IOException {
double salario = Double.parseDouble(request.getParameter("salario"));
String pagina;
if(salario >= 5000){
pagina = "aprovado.html";
}else{
pagina = "reprovado.html";
}

15

16
17
18
19
20
21
22
23

response.sendRedirect(pagina);

24

25
26

Listagem 16.9: Tela que apresenta o resultado: aprovado


1
2
3
4
5
6
7
8

<html>
<head>
<title>Aprovado</title>
</head>
<body>
<h1 style="color: green;">LIMITE APROVADO</h1>
</body>
</html>

Listagem 16.10: Tela que apresenta o resultado: reprovado


1
2
3
4
5
6
7

<html>
<head>
<title>Rerovado</title>
</head>
<body>
<h1 style="color: red;">LIMITE REPROVADO</h1>
</body>

178

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

</html>

16.7.

Forward

Diferente do redirect o forward esconde quem realizou a resposta. Seria como se voc
tivesse ligado para o Call Center e contado o seu problema. O atendente falasse: -Espera um
pouco. Neste momento ele pergunta para um colega que o especialista naquele problema
o que fazer. Aps ter a resposta ele volta ao telefone e te conta a resposta. Voc no teve que
contar novamente sua histria. Voc tambm no conheceu quem realmente solucionou seu
problema pois a nica pessoa que voc teve contato foi o atendente inicial. Isto forward.
O servlet da listagem 16.12 apresenta um exemplo de forward. Para a realizao do
forward foram utilizadas as seguintes instrues:
RequestDispatcher rd = request.getRequestDispatcher(pagina);
rd.forward(request, response);

Note que aps clicar no boto voc v a resposta mas no percebe que foi gerada pelas
pginas aprovado.html ou reprovado.html.
Listagem 16.11: Pgina inicial do exemplo com forward
1
2
3
4
5
6
7
8
9
10
11

<html>
<head>
<title>Exemplo Forward</title>
</head>
<body>
<form action="ExemploForward" method="post">
Salrio: <input type="text" name="salario"/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>

Listagem 16.12: Servlet do exemplo de Forward


1

package capitulo16;

2
3

import java.io.IOException;

4
5
6
7
8
9
10

import
import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

11
12
13

@WebServlet("/ExemploForward")
public class ExemploForward extends HttpServlet{

14

http://solutioin.com
Francisco Calaa, Otvio Calaa

179

Verso 1.2-beta

servlets

protected void doPost(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
double salario = Double.parseDouble(request.getParameter("salario"));
String pagina;
if(salario >= 5000){
pagina = "aprovado.html";
}else{
pagina = "reprovado.html";
}

15

16
17
18
19
20
21
22
23

RequestDispatcher rd = request.getRequestDispatcher(pagina);
rd.forward(request, response);

24
25

26
27
28

16.8.

Escopo de objetos web

Enquanto o usurio estiver em uma pgina, os valores do componente sero lembrados


mesmo quando a pgina for reexibida, como quando o usurio clica em um boto que
retorna nulo. No entanto, quando o usurio sai da pgina, os valores do componente desaparecem.
Para tornar os valores disponveis para outras pginas, ou para a mesma pgina, caso o
usurio retorne pgina, voc precisa armazenar os valores. Quando voc cria um projeto
a partir do IDE, ele cria trs Beans gerenciados para armazenar os valores:
Request - requisio
Session - sesso
Application - aplicao
A figura 16.11 ilustra esses escopos.

16.8.1

Request

Tudo que armazenado no escopo de request vlido apenas enquanto durar uma requisio. Se o usurio clicar em algum link ou algum servlet realizar um redirec as informaes
armazenadas neste escopo se perdem.
Para acessar este escopo utilize os mtodo:
request.getAttribute(bean); // para buscar informaes do escopo
request.setAttribute(bean, bean); // para colocar informaes no escopo.

180

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

servlets

Figura 16.11: Ilustrao dos escopos WEB

16.8.2 Session
Tudo que armazenado no escopo de session vlido enquanto durar a sessao com o
usurio. Uma sesso normalmente representada com uma janela do browser aberta.
neste escopo que so armazenadas as informaes de login do usurio ou o carrinho de
compras em uma loja virtual.
Para acessar este escopo utilize o mtodo:
request.getSession().getAttribute(bean); //para buscar informaes do escopo
request.getSession().setAttribute(bean, bean); // para colocar informaes no escopo.

16.8.3 Application
Tudo que armazenado no escopo de application valido para todos os usurios mesmo
estando em browsers diferentes, mesmo estando em lugares diferentes. Em um chat seria
um bom local para armazenar as mensagens que devem ser vistas por todos.
Para acessar este escopo utilize o mtodo:
getServletContext().getAttribute(bean); //para buscar informaes do escopo
getServletContext().setAttribute(bean, bean); // para colocar informaes no escopo.

16.9.

Como distribuir uma aplicao web

No incio deste captulo foi apresentada a estrutura de um aplicativo web Java. Existem
uma srie de detalhes a serem seguidos e que dificultam a distribuio de aplicaes Java
uma vez que cada aplicativo consiste de vrios arquivos. Para solucionar este problema
possvel comprimir todos estes arquivos que esto no contexto utilizando o formato zip em
um arquivo com extenso .war.

http://solutioin.com
Francisco Calaa, Otvio Calaa

181

Verso 1.2-beta

servlets

Assim ao compactar o contedo da aplicao em um arquivo com extenso war tornar


mais fcil a distribuio dos aplicativos. Ateno compactado o contedo da pasta app1,
no a pasta app1.
O eclipse possui uma ferramenta que faz isto de forma automtica. Para isto, basta clicar
com o boto direito do mouse sobre o projeto e exportar o arquivo war.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

16.10.

Exerccios

1. O que um servlet?
2. Explique a estrutura de um aplicao Java.
3. Quais so os passos para implementao de um servlet ?
4. Qual o diretrio do tomcat onde ficam armazenados as aplicaes?
5. Diferencie os mtodos get e post.
6. Qual a diferenca entre redirect e forward?
7. Quais os escopos de um aplicativo web?
8. O que so arquivos .war ?

182

http://solutioin.com
Francisco Calaa, Otvio Calaa

17

J AVA S E RV E R PA G E S
JavaServer Pages - JSP - uma tecnologia que simplifica o processo de desenvolvimento
de aplicaes web. Com JSP, os desenvolvedores podem rapidamente incorporar elementos dinmicos em pginas da web, utilizando Java embutido e algumas tags. Estas tags
fornecem ao desenvolvedor um meio de acessar dados e lgica de negcio armazenados
em objetos Java sem ter que dominar as complexidades do desenvolvimento de aplicaes.
O JSP tambm oferece a vantagem de ser facilmente codificado, facilitando assim a elaborao e manuteno de uma aplicao. Alm disso, essa tecnologia permite separar a
programao lgica (parte dinmica) da programao visual (parte esttica), facilitando o
desenvolvimento de aplicaes mais robustas, onde programador e designer podem trabalhar no mesmo projeto, mas de forma independente.
Os arquivos jsps so convertido em servlets (arquivos .java) e compilados para arquivos
.class. Normalmente a primeira execuo do jsp mais lenta que as demais pois o continer
est realizando essa operao.

17.1.

Elementos do Jsp

possvel inserir cdigo Java dentro do servlet a ser gerado a partir do JSP. Isto pode ser
feito de trs formas:
Scriptlets: que insere dentro do servlet cdigo Java
Expresses: que tem seu valor escrito na pgina;
Declaraes: utilizadas para criarem mtodos e classes dentro do JSP.
Cada um destes elementos ser descrito a seguir.

17.1.1 Scriptlet
Scriptlets so trechos de cdigo Java dentro de pgianas HTML. Um Scriptlet fica entre as
tags
<% -- cdigo java -- %>

O Trecho de cdigo abaixo um exemplo de pgina HTML, com scriptlets JSP que
escrevem na tela: Ol Mundo

<%

183

Verso 1.2-beta

java server pages

String msg = "Ol Mundo";


out.println("Mensagem: "+msg+"!!");
%>

Scriptlets tem acesso algumas variveis definidas como request, session, etc.:
<%
String dados = request.getQueryString();
out.println("Dados anexados: " + dados);
%>
<% if (Math.random() < 0.5) { %>
Voc est com <B>Sorte</B>!
<% } else { %>
Voc no est com tanta <B>Sorte</B> assim!
<% } %>

17.1.2 Expresses
Uma expresso JSP usada para escrever variveis Java direntamente na pgina. Veja o
exemplo a seguir:
<%= Expresso Java %>

A expresso Java ser convertida em uma String e escrita na pgina. Por exemplo, o
cdigo seguinte:
Data atual: <%= new java.util.Date() %>

escreve a data utilizando o toString() da classe Date


A listagem 17.1 apresenta um exemplo de scriptlets e expresses. Aps implementado,
para visualizar este exemplo, acesso a seguinte url no browser: http://localhost:8080/capitulo17/exemploJsp.j
Listagem 17.1: Arquivo exemploJsp.jsp. Apresenta um exemplo de scriptlets e expresses
1
2
3
4
5
6

<html>
<head>
<title>Exemplo de JSP</title>
</head>
<body>
<%for(int i = 0; i < 15; i++){ %>

7
8

Linha: <%=i %> <br/>

9
10

<%} %>

11
12
13

</body>
</html>

184

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java server pages

17.1.3 Declaraes
Uma declarao JSP define mtodos, campos ou classes que sero inseridos no corpo do
Servlet gerado pela pgina. Portanto, o cdigo abaixo:
<%! void somar(int a, int b){ . . .} $ %> $

capaz de declarar um mtodo na pgina.

17.2.

Diretivas

Uma diretiva JSP afeta toda a estrutura da pgina. Este um exemplo de diretiva:
<%@ diretiva atributo=valor" %>

As diretivas existentes so:


include - incluso de um arquivo na posio da diretiva
page - informaes e metadados da pgina
taglib - incluso de taglibs

17.2.1 Diretiva include


A Listagem 17.2 apresenta o cdigo do menu, que ser inserido dentro das demais pginas.
Observe na Listagem 17.3 a utilizao da diretiva include com o objetivo de incluir o cdigo
do menu dentro da pgina index.jsp.
Listagem 17.2: Arquivo menu.jsp
1
2
3
4

<a
<a
<a
<a

href="index.jsp">Incio</a>
href="exemploJsp.jsp">Primeiro Exemplo</a>
href="clientes.jsp">Lista de Clientes</a>
href="clientes -jstl.jsp">Lista de Clientes com JSTL</a>

Listagem 17.3: Arquivo index.jsp


1

<html>
<head>

<title>Pgina inicial</title>

</head>
<body>

4
5

<%@include file="menu.jsp" %>

6
7

<h1>Pgina inicial</h1>

</body>

9
10

</html>

http://solutioin.com
Francisco Calaa, Otvio Calaa

185

Verso 1.2-beta

java server pages

Depois de implementar os exemplos das Listagens 17.2 e 17.3 adicione o cdigo:


<%@include file="menu.html" %>

no arquivo exemploJsp.jsp

17.2.2 Diretiva Page


Esta diretiva possui onze atributos diferentes. Observe primeiro como a sua sintaxe:
<%@ page atributo1="valor1" atributo2="valor2" atributo3="valor3" ... %>

Por possuir mltiplos atributos a linguagem JSP permite que se declare vrias diretivas
numa mesma pgina, porm a nico atributo que pode ser repetido o import.
Nas subsees seguir sero descritos os atributos desta diretiva.

17.2.2.1 ContentType
Este atributo indica qual o tipo MIME (Multipurpose Internet Mail Extensions) da resposta
est sendo gerada pela JSP. Os tipos mais comuns so: text/plain, text/html, text/xml. Logo abaixo segue o exemplo usado como padro para as JSPs.
<%@ page contentType="text/html" %>

17.2.2.2 pageEncoding
Define o caracter enconding da pgina.
<%@ page pageEncoding="UTF-8" %>

17.2.2.3 Extends
Serve para indicar a super classe que ser usada pelo container JSP no momento de
traduo da pgina em um Servlet Java. Exemplo:
<%@ page extends="com.solutioin.taglib.jsp.primeirapagina" %>

17.2.2.4 Import
Com o atribuo import, diferente do extends, capaz de estender um conjunto de classes
Java que podero ser usadas nas pginas JSPs. Exemplo:
<%@ page import="java.util.List" %>

17.2.2.5 Language
Usado, em geral, para especificar Java como a linguagem de criao de script para a pgina.
Exemplo:
<%@ page language="java" %>

186

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java server pages

17.2.2.6 Info
Usado para inserir informaes sumarizadas da pgina, no havendo restries ao seu
tamanho. Exemplo:
<%@ page info="Java Para Web" %>

17.2.2.7 Session
Session do tipo boolean, indica se a pgina est participando do gerenciamento de sesso.
Por exemplo, se quisermos dizer que uma pgina parte de uma sesso, utiliza-se a
seguinte sintaxe:
<%@ page session="true" %>

17.2.2.8 Buffer
Responsvel por controlar a sada bufferizada para uma pgina JSP. Se for ajustado para
none o contedo de uma JSP passado instantaneamente resposta HTTP. O tamanho
do buffer descrito em kilobytes. Exemplo:
<%@ page buffer="20kb" %> ou <%@ page buffer="none" %>

17.2.2.9 AutoFlush
Semelhante ao Buffer, tambm responsvel por controlar a sada buferizada, mais exatamente o comportamento do container JSP quando j esteja cheio o Buffer de sada. Neste
caso esvaziado automaticamente o Buffer de sada e o conted0o enviado para o servidor
HTTP que transmite para o Browser responsvel pela solicitao. Sendo do tipo boolean,
sua sintaxe dada abaixo:
<%@ page autoFlush="true" %>

17.2.2.10 isThreadSafe
Quando uma pgina JSP compilada em um Servlet, ela deve ser capaz de atender a
mltiplas solicitaes. Para isso devemos utilizar o atributo isThreadSafe, caso contrrio
necessrio defini-lo como false. Exemplo:
<%@ page isThreadSafe="false" %>

17.2.2.11 errorPage
ErrorPage indica uma pgina alternativa que ser exibida caso acontea um erro no previsto durante o processamento de uma pgina JSP no container. Exemplo:
<%@ page errorPage="/apostila/exemplos/erro.jsp" %>

http://solutioin.com
Francisco Calaa, Otvio Calaa

187

Verso 1.2-beta

java server pages

jsp:include

Inclui um arquivo que foi gerado em


tempo de execuo na pgina

jsp:useBean

Busca um Bean instanciado.

jsp:setProperty

Seta a propriedade de um JavaBean.

jsp:getProperty

Insere a propriedade do JavaBean na


pgina.

jsp:forward

Realiza um forward para outra pgina.

jsp:plugin

Gera um cdigo para embutir plugins


Java.
Tabela 17.1: tablecaption

17.2.2.12 isErrorPage
Responsvel por define uma pgina JSP que servir como a pgina de erro padro para um
grupo de pginas JSP. Sendo do tipo boolean, sua sintaxe descrita abaixo:
<%@ page isErrorPage="true"%>

17.3.

Aes do JSP

Comandos que executam aes durante o processamento do JSP


So comandos na sintaxe XML que controlam o comportamento da execuo do JSP. Com
aes JSP possvel inserir um arquivo dinamicamente, reutilizar um Java Bean, fazer um
forward para outra pgina ou gerar cdigo HTML para um plugin Java. Algumas aoes
disponveis so:

17.4.

Biblioteca de tags JSTL

A JSTL (Standard Tag Library for JavaServer Pages) foi criada para organizar melhor o cdigo
de um JSP evitando a insero de cdigo Java dentro das mesmas. Normalmente quem
edita as pginas JSP so web designers que no sabem programar em Java.
JSTL consiste em uma coleo de bibliotecas, tendo cada uma um propsito bem definido,
que permitem escrever pginas JSPs sem cdigo Java, aumentando assim a legibilidade do
cdigo e a interao entre desenvolvedores e web designers. Cada tag realiza um determinado tipo de processamento (equivalente a cdigo Java dentro de JSP). Exemplo de uma
pgina JSTL
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<body bgcolor="#FFFFFF">
<jsp:useBean id="agora" class="java.util.Date"/>

188

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java server pages

<br>
Hoje: <fmt:formatDate value="${agora}" />
<br> Agora: <fmt:formatDate value="${agora}" pattern="dd/MM/yyyy"/>
</body>
</html>

Verso Curta: 25/07/2005


Verso Longa: Segunda-feira, 25 de Julho de 2005

A taglib mais utilizada a central. Normalmente prefixada com c. Possui tags para
trabalhar com condicionais, loops, condicionais, dentre outras. Sua declarao :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

Uma tag muito utilizada a <c:forEach>. Esta tag permite percorrer uma lista de objetos
e apresenta-los na pgina.

17.4.1 EL - Expresso de Linguagem


As expresses EL esto sempre dentro de chaves, precedidas pelo smbolo cifro:
${ . . . }

Exemplo:
${cliente.nome}

So utilizadas para referenciar objetos no cdigo JSP:


Telefone: ${cliente.endereco}

ou ainda
<c:forEach items="${lista}" var="cliente">

O trecho de cdigo abaixo apresenta todos os contatos de uma lista:


<table border="1">
<c:forEach items="${lista}" var="cliente">
<tr>
<td>${cliente.id}</td>
<td>${cliente.nome}</td>
<td>${cliente.endereco}</td>
<td>${cliente.municipio}</td>
<td>${cliente.uf}</td>
<td><a href="ClienteControl?acao=excluir&id=${cliente.id}">excluir</a></td>
</tr>
</c:forEach>
</table>

http://solutioin.com
Francisco Calaa, Otvio Calaa

189

Verso 1.2-beta

17.5.

java server pages

MVC - Model View Control

Model-view-controller (MVC) um padro de arquitetura de software. Com o aumento


da complexidade das aplicaes desenvolvidas torna-se fundamental a separao entre os
dados (Model) e o layout (View). Desta forma, alteraes feitas no layout no afetam os
dados, e estes podero ser reorganizados sem alterar o layout.
O MVC resolve o problema do reaproveitamento do modelo atravs da separao das
tarefas de acesso aos dados e lgica de negcio da lgica de apresentao e de interaco
com o usurio. Para isto introduzido um componente entre a viso e o modelo: o Controller.
Neste sentido, as camadas do MVC representam:
Model: A representao "domnio" especfica da informao em que a aplicao opera.
Por exemplo, aluno, professor e turma fazem parte do domnio de um sistema acadmico.
comum haver confuso pensando que Model um outro nome para a camada de domnio.
Lgica de domnio adiciona sentido dados crus (por exemplo, calcular se hoje aniversrio do usurio, ou calcular o total de impostos e fretes sobre um determinado carrinho
de compras). Muitas aplicaes usam um mecanismo de armazenamento persistente (como
banco de dados) para armazenar dados. MVC no cita especificamente a camada para
acesso aos dados, porque subentende-se que estes mtodos estariam encapsulados pelo
Model.
View: "Renderiza" o model em uma forma especfica para a interao, geralmente uma
interface de usurio.
Controller: Processa e responde a eventos, geralmente aes do usurio, e pode invocar
alteraes no Model.

17.5.1 O cadastro de clientes


Agora ser apresentado uma verso WEB para o cadastro de clientes apresentado no Captulo 13. Para que este cadastro funcione necessrio criar o servlet ClienteControl. Este servlet
representa a camada de Controle do nosso exemplo. Seu cdigo est na Listagem 18.4.
Na listagem 17.5 apresentado o cdigo da tela.
Listagem 17.4: Servlet que representa o Controle
1

package capitulo17;

2
3

import java.io.IOException;

4
5
6
7
8
9
10

import
import
import
import
import
import

javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;

11
12
13

import capitulo13.Cliente;
import capitulo13.ClienteDao;

190

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

java server pages

14
15
16

@WebServlet("/ClienteControl")
public class ClienteControl extends HttpServlet {

17

protected void doGet(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
String acao = request.getParameter("acao");
ClienteDao clienteDao = new ClienteDao();
if(acao == null){
request.setAttribute("lista", clienteDao.listar());
RequestDispatcher rd = request .getRequestDispatcher("cliente.jsp");
rd.forward(request, response);
}else if(acao.equals("excluir")){
int id = Integer.parseInt(request.getParameter("id"));
clienteDao.excluir(id);
response.sendRedirect("ClienteControl");
}else if(acao.equals("confirmar")){
Cliente cliente = new Cliente();
cliente.setNome(request.getParameter("nome"));
cliente.setCpfCnpj(request.getParameter("cpfCnpj"));
cliente.setEndereco(request.getParameter("endereco"));
cliente.setMunicipio(request.getParameter("municipio"));
cliente.setUf(request.getParameter("uf"));
clienteDao.incluir(cliente);
response.sendRedirect("ClienteControl");
}
}

18

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

protected void doPost(HttpServletRequest request, HttpServletResponse response)


throws ServletException, IOException {
doGet(request, response);
}

41

42
43
44
45

Listagem 17.5: Pgina de cadastro de clientes


1

<%@ taglib prefix="c" uri="http ://java.sun.com/jsp/jstl/core"%>

2
3
4
5
6
7

<html>
<head>
<title>Cadastro de Clientes</title>
</head>
<body>

8
9

<%@ include file="menu.jsp" %>

10
11
12
13
14
15
16

<form action="ClienteControl">
<pre>
<input type="hidden"
Nome:
<input type="text"
CPF/CNPJ:
<input type="text"
Endereo:
<input type="text"

http://solutioin.com
Francisco Calaa, Otvio Calaa

name="acao" value="confirmar"/>
name="nome"/>
name="cpfCnpj"/>
name="endereco"/>

191

Verso 1.2-beta

17
18
19
20
21

java server pages

Municpio: <input type="text" name="municipio"/>


UF:
<input type="text" name="uf"/>
<input type="submit" value="Confirmar"/>
</pre>
</form>

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<table border="1" rules="all">


<c:forEach items="${lista}" var="cliente">
<tr>
<td>${cliente.id}</td>
<td>${cliente.nome}</td>
<td>${cliente.cpfCnpj}</td>
<td>${cliente.endereco}</td>
<td>${cliente.municipio}</td>
<td>${cliente.uf}</td>
<td><a href="ClienteControl?acao=excluir&id=${cliente.id}">excluir</a>
</td>
</tr>
</c:forEach>
</table>

37
38
39
40

</body>
</html>

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

17.6.

Exerccios

1. O o JSP?
2. Quais so os elementos de um JSP? Para que serve cada um deles?
3. Para que servem as diretivas ?
4. O que a Expresso de Linguagem?
5. Explique o MVC.
6. No exemplo da Agenda WEB crie a funcionalidade alterar contatos.

192

http://solutioin.com
Francisco Calaa, Otvio Calaa

18

I N T R O D U O A O J AVA S E RV E R F A C E S
JavaServer Faces um poderoso framework para desenvolvimento Java EE. Seus princpios
se baseiam no processamento de eventos gerados pelo usurio na pgina web como: um
clique no boto, alterao do contedo de um campo de texto.
O JSF usa o padro MVC como base de funcionamento. Para ser processada uma pgina
JSF ela deve passar por um controlador representado pelo Servlet FacesServlet.
A execuo de uma chamada JSF dada pela seguinte seqncia: o FacesServlet recebe a
chamada, cria o FacesContext, logo atribudo o controle ao ciclo de vida (LifeCycle) que
processa o contexto em 6 fases: reconstituio da view, aplicao dos valores da requisio,
validao dos dados, atualizao do modelo de dados, chamada ao aplicativo e gerao da
resposta.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

18.1.

Fazendo JavaServer Faces funcionar

Para criar o primeiro projeto JavaServer Faces necessrio criar um projeto do tipo Dynamic
Web Project. Na tela onde voc coloca o nome do projeto, configure o framework JavaServer
Faces v2.0 Project conforme ilustrado na Figura 18.1.
Clique em next. . . next. . . at encontrar a tela apresentada na Figura 18.3. Nesta tela, escolha: Disable Library Configuration conforme apresentado na figura.
Por ltimo copie os arquivos .jar, disponibilizados na pasta Material para o diretrio lib
do projeto, conforme ilustrado na Figura 18.3.

18.2.

Managed bean

O Managed Bean uma classe onde so colocados os cdigos Java que so executados
partir dos componentes da tela. Nele possvel escrever cdigo Java para atenter a eventos
da tela, recebe dados, e executa tarefas. Trata-se e um classe que deve ter um construtor
default, getters e setters. Um Managed Bean no necessita herdar de nenhuma classe.
Um exemplo de Managed Bean pode ser visto na listagem 18.1.
O Managed Bean deve ser declarado no arquivo faces-config.xml da seguinte forma:

193

Verso 1.2-beta

introduo ao javaserver faces

Figura 18.1: Escolha JavaServer Faces v2.0 Project

194

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

Figura 18.2: Escolha Disable Library Configuration

http://solutioin.com
Francisco Calaa, Otvio Calaa

195

Verso 1.2-beta

introduo ao javaserver faces

Figura 18.3: Copie estes jars para o diretrio lib

<managed-bean>
<managed-bean-name>exemploControl</managed-bean-name>
<managed-bean-class>aulajsf.ExemploControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Listagem 18.1: Exemplo do primeiro ManagedBean


1

package aulajsf;

2
3

import javax.faces.event.ActionEvent;

4
5

public class ExemploControl {

private String entrada;

7
8

private String saida;

9
10

public void executar(ActionEvent evt){


saida = String.format(" * %s - %s * ", entrada, entrada.toUpperCase());
}

11
12
13
14

public String getEntrada() {


return entrada;
}

15
16
17
18

196

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

public void setEntrada(String entrada) {


this.entrada = entrada;
}

19
20
21
22

public String getSaida() {


return saida;
}

23
24
25
26

public void setSaida(String saida) {


this.saida = saida;
}

27
28
29
30
31

18.3.

Tags bsicas

O JavaServer Faces possui dois conjuntos de tags:


tags para renderizao de componentes HTML
tags Core

18.3.1 Tags JSF para renderizao de HTML


As tags JSF HTML bsicas podem ser vistas na tabela 18.1. Observe que elas esto relacionadas com a taglib declarada com:
"http://java.sun.com/jsf/html"

As tags JSF HTML so utilizadas para construir componentes html na pgina como
tabelas, campos de entrada, etc. Existem projetos JSF como o Primefaces, Richfaces, Icefaces,
Myfaces que possuem mais componentes como calendrio, tabela ordenvel, menus, etc.

18.3.2 Tags Core do JSF


As tags core do JSF permitem passar informaes de configuraes para os componentes,
validaes, converses e metadados.
Algumas esto listadas na tabela 18.2. Esto na biblioteca de tags declarada :
"http://java.sun.com/jsf/core"

18.3.3 Exemplo de uso das Tags


Um exemplo de utilizao das tags JSF pode ser visto na listagem 18.2. Observe que todo
o contedo JSF foi colocado dentro das tags:

http://solutioin.com
Francisco Calaa, Otvio Calaa

197

Verso 1.2-beta

introduo ao javaserver faces

<h:head>

HTML head

<h:body>

HTML body

<h:form>

HTML form

<h:inputText>

Campo de entrada de texto (uma linha)

<h:inputTextarea>

Campo de entrada de texto (multilinhas)

<h:inputSecret>

Campo de entrada de senhas

<h:inputHidden>

Campo escondido

<h:outputLabel>

Rtulo para outros componentes

<h:outputLink>

link HTML

<h:outputFormat>

Igual a outputText, mas formata as mensagens

<h:outputText>

Sada de texto

<h:commandButton>

Boto: submit, reset ou pushbutton

<h:commandLink>

Link que atua como um boto

<h:message>

Apresenta a mensagem mais recente do componente

<h:messages>

Apresenta todas as mensagens

<h:graphicImage>

Apresenta uma imagem

<h:selectOneListbox>

Listbox com seleo de um elemento

<h:selectOneMenu>

ComboBox

<h:selectOneRadio>

Conjunto de botes radio

<h:selectBooleanCheckbox>

Checkbox

<h:selectManyCheckbox>

Conjunto de checkboxes

<h:selectManyListbox>

Listbox com seleo de vrios elementos

<h:selectManyMenu>

Menu multiselecionavel

<h:panelGrid>

tabela HTML

<h:panelGroup>

Agrupa dois ou mais componentes

<h:dataTable>

Uma tabela utilizada para grid de dados

<h:column>

Coluna em um dataTable
Tabela 18.1: Tags JSF para renderizao de componentes HTML

<f:view>

. . .

</f:view>

A tag:
<h:inputText />

utilizada para entrada de texto.


A tag:
<h:commandButton />

cria um boto que executa aes no Managed Bean.

198

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

<f:view>

Cria uma viso

<f:facet>

Possibilita configurar parmetros de componentes

<f:convertDateTime>

converte datas e horas


Tabela 18.2: Tags Core do JSF
Listagem 18.2: Exemplo da primerita tela JSF

1
2
3

<html xmlns="http://www.w3.org /1999/ xhtml"


xmlns:h="http :// java.sun.com/jsf/html"
xmlns:f="http ://java.sun.com/jsf/core">

4
5

<h:head>

6
7

</h:head>

8
9
10
11
12
13
14
15
16
17

<h:body>
<h:form>
<h:inputText value="#{ exemploControl.entrada}" />
<h:commandButton ajax="false"
actionListener="#{ exemploControl.executar}" value="Executar" />
<h:outputText value="#{ exemploControl.saida}" />
</h:form>
</h:body>
</html>

Dica:
Para acessar a tela da listagem 18.2 no browser, digite a url:
http://localhost:8080/aulajsf/faces/exemplo.xhtml
Aps iniciar o servidor.

18.4.

Expresses de Ligao - EL

Na listagem 18.2 foro utilizadas as expresses de ligaes:


#{ . . . }

para ligar os componentes da pgina com o managed bean. Por exemplo, a expresso
#{exemploControl.entrada}

liga o campo de entrada de texto com o atributo nome da classe ExemploControl (ManagedBean). A expresso
#{exemploControl.executar}

http://solutioin.com
Francisco Calaa, Otvio Calaa

199

Verso 1.2-beta

introduo ao javaserver faces

liga o mtodo executar com o boto.


No confunda as expresses de ligao do JSF com as expresses de linguagem vistas no
Captulo 17. As expresses de ligao:
#{ . . . }

So capazes de setar e buscar os valores do bean.


Enquanto que as expresses de linguagem:
${ . . . }

So apenas capazes de buscar os valores do bean.

18.4.1 Ligaes com atributos


Ao utilizar EL com atributos necessrio liga-las atravs do atributo value do componente
a ser ligado. Na listagem 18.2 os atributos: entrada e saida da classe ExemploControl foram
ligados com o atributo value dos componentes.
obrigatria a existncia do mtodo get para o atributo a ser ligado. A necessidade do
mtodo set apenas para os componentes que alteram valores como os campos de entrada.

18.4.2 Ligaes com mtodos


Ao utilizar EL com mtodos necessrio liga-las atravs dos atributos listados na tabela
18.3:
action

para aces

actionListener

para eventos de ao (clique do mouse no boto)

valueChangeListener

para eventos de mudana de valor

Tabela 18.3: Tabela de tipos de ligaes com mtodos

Observe que existem dois tipos de ligaes:


com aes
com listeners de eventos
As ligaes com aes so utilizadas com as navegaes entre pginas (assunto discutido
logo aps). A assinatura do mtodo de ao deve ser:
public String nomeMetodo()

Observe que este deve retornar uma String que ser utilizada para a navegao.
As ligaes com eventos so utilizadas com eventos de cliques e mudana de valores. As
assinaturas dos mtodos devem ser:

200

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

public void nomeMetodo(ActionEvent evento)

para listeners de eventos de ao e


public void nomeMetodo(ValueChangeEvent evento)

para listeners de eventos de mudana de valor.

18.5.

Configurar o Primefaces

Para o Primefaces funcionar corretamente, adicione o cdigo da Listagem 18.3 no arquivo


web.xml.
Listagem 18.3: Configurao do Primefaces
1
2
3
4

<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

22
23
24
25
26
27
28
29
30

<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>

http://solutioin.com
Francisco Calaa, Otvio Calaa

201

Verso 1.2-beta

18.6.

introduo ao javaserver faces

Cadastro de Clientes

Nesta seo implementaremos a tela para cadastrar clientes. Sero utilizadas as classes
implementadas no Captulo 13. Portanto, necessrio configurar o projeto aulajsf para se
referenciar ao projeto criado naquele captulo.
A Listagem 18.4 apresenta o ManagedBean, que neste caso age como Controlador, do
cadastro de clientes. Aps a implementao desta classe necessrio adicionar a seguinte
configurao no arquivo faces-config.xml:
<managed-bean>
<managed-bean-name>clienteControl</managed-bean-name>
<managed-bean-class>aulajsf.ClienteControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

Esta configurao far o ManagedBean ClienteControl acessvel partir do arquivo JSF.


A Listagem 18.5 apresenta o cdigo para criao da tela para manter clientes.
Listagem 18.4: Controlador do cadastro de Clientes
1

package aulajsf;

2
3
4

import java.util.ArrayList;
import java.util.List;

5
6
7
8

import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

9
10

import org.primefaces.event.RowEditEvent;

11
12
13

import capitulo13.Cliente;
import capitulo13.ClienteDao;

14
15

public class ClienteControl {

16
17

private Cliente cliente = new Cliente();

18
19

private ClienteDao clienteDao = new ClienteDao();

20
21

private List<Cliente> clientes = new ArrayList<Cliente>();

22
23
24
25
26
27
28
29
30
31

public void confirmar(ActionEvent evt){


if(cliente.getId() == 0){
clienteDao.incluir(cliente);
}else{
clienteDao.alterar(cliente);
}
cliente = new Cliente();
listar(evt);
}

202

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

32

public void gravar(RowEditEvent event){


Cliente c = (Cliente) event.getObject();
clienteDao.alterar(c);
}

33
34
35
36
37

public List<SelectItem> getUfs(){


List<SelectItem> result = new ArrayList<SelectItem>();
for(EnumUf uf : EnumUf.values()){
result.add(new SelectItem(uf.toString(), uf.getDescricao()));
}
return result;
}

38
39
40
41
42
43
44
45

public void excluirCliente(ActionEvent evt){


UIParameter param = (UIParameter) evt.getComponent().findComponent("cliExcluir");
Cliente c = (Cliente) param.getValue();
clienteDao.excluir(c.getId());
listar(evt);
}

46
47
48
49
50
51
52

public void listar(ActionEvent evt){


clientes = clienteDao.listar();
}

53
54
55
56

public Cliente getCliente() {


return cliente;
}

57
58
59
60

public void setCliente(Cliente cliente) {


this.cliente = cliente;
}

61
62
63
64

public List<Cliente> getClientes() {


return clientes;
}

65
66
67
68
69
70
71

Listagem 18.5: Arquivo cliente.xhtml


1
2
3
4

<html xmlns="http://www.w3.org /1999/ xhtml"


xmlns:h="http :// java.sun.com/jsf/html"
xmlns:f="http ://java.sun.com/jsf/core"
xmlns:p="http :// primefaces.org/ui">

5
6

<h:head>

7
8

</h:head>

9
10

<h:body>

http://solutioin.com
Francisco Calaa, Otvio Calaa

203

Verso 1.2-beta

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

introduo ao javaserver faces

<h:form>
<p:panel header="Manter Clientes">
<h:panelGrid columns="2">
<h:outputText value="Nome:" />
<p:inputText value="#{ clienteControl.cliente.nome}"></p:inputText>
<h:outputText value="CPF/CNPJ:" />
<p:inputText value="#{ clienteControl.cliente.cpfcnpj}"></p:inputText>
<h:outputText value="Endereo:" />
<p:inputText value="#{ clienteControl.cliente.endereco}"></p:inputText>
<h:outputText value=" M u n i c p i o :" />
<p:inputText value="#{ clienteControl.cliente.municipio}"></p:inputText>
<h:outputText value="UF:" />
<p:inputText value="#{ clienteControl.cliente.uf}"></p:inputText>
<p:commandButton ajax="false"
actionListener="#{ clienteControl.confirmar}" value="Confirmar"></p:commandButton>
<p:commandButton ajax="false"
actionListener="#{ clienteControl.listar}" value="Listar"></p:commandButton>
</h:panelGrid>

29
30
31
32
33
34
35

<p:dataTable value="#{ clienteControl.clientes}" var="cli"


editable="true">
<f:facet name="header">
<h:outputText value="Clientes" />
</f:facet>
<p:ajax event="rowEdit" listener="#{ clienteControl.gravar}"></p:ajax>

36

<p:column headerText="Nome" sortBy="#{cli.nome}"


filterBy="#{cli.nome}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{cli.nome}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{cli.nome}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Cpf/Cnpj" sortBy="#{cli.cpfcnpj}">
<h:outputText value="#{cli.cpfcnpj}" />
</p:column>
<p:column>
<p:tooltip for="editar" hideEffect="explode"
value="Clique aqui para editar #{cli.nome}" />
<p:rowEditor id="editar" />
</p:column>

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

<p:column headerText="UF" sortBy="#{cli.uf}" filterBy="#{cli.uf}">


<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{cli.uf}" />
</f:facet>
<f:facet name="input">

57
58
59
60
61
62

204

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

63
64
65
66
67
68
69

introduo ao javaserver faces

<p:selectOneMenu value="#{cli.uf}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{ clienteControl.ufs}"></f:selectItems>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>

70
71
72
73
74
75
76
77
78
79

<p:column>
<p:commandButton actionListener="#{ clienteControl.excluirCliente}"
icon="ui-icon -trash">
<f:param id="cliExcluir" value="#{cli}"></f:param>
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
</h:form>

80
81
82

</h:body>
</html>

18.7.

Cadastro de Produtos (com JPA)


Listagem 18.6: Classe Produto

package aulajsf;

2
3
4
5

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

6
7
8

@Entity
public class Produto {

9
10
11
12

@Id
@GeneratedValue
private int id;

13
14

private String descricao;

15
16

private double valor;

17
18

private int quantidade;

19
20
21
22

public int getId() {


return id;
}

23
24
25

public void setId(int id) {


this.id = id;

http://solutioin.com
Francisco Calaa, Otvio Calaa

205

Verso 1.2-beta

introduo ao javaserver faces

26
27

public String getDescricao() {


return descricao;
}

28
29
30
31

public void setDescricao(String descricao) {


this.descricao = descricao;
}

32
33
34
35

public double getValor() {


return valor;
}

36
37
38
39

public void setValor(double valor) {


this.valor = valor;
}

40
41
42
43

public int getQuantidade() {


return quantidade;
}

44
45
46
47

public void setQuantidade(int quantidade) {


this.quantidade = quantidade;
}

48
49
50
51
52

Listagem 18.7: Classe ProdutoDao


1

package aulajsf;

2
3

import java.util.List;

4
5
6
7
8

import
import
import
import

javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;

9
10

public class ProdutoDao {

11
12
13

private static EntityManagerFactory emf =


Persistence.createEntityManagerFactory("aulajpa");

14
15

private EntityManager em = emf.createEntityManager();

16
17
18
19
20
21

public void incluir(Produto p){


em.getTransaction().begin();
em.persist(p);
em.getTransaction().commit();
}

22
23

public void alterar(Produto p){

206

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

em.getTransaction().begin();
em.merge(p);
em.getTransaction().commit();

24
25
26

27
28

public Produto consultar(int id){


return em.find(Produto.class, id);
}

29
30
31
32

public void excluir(int id){


em.getTransaction().begin();
Produto p = consultar(id);
em.remove(p);
em.getTransaction().commit();
}

33
34
35
36
37
38
39

public List<Produto> listar(){


Query query = em.createQuery("select p from Produto p");
List<Produto> prods = query.getResultList();
return prods;
}

40
41
42
43
44
45

public List<Produto> listar(String descricao){


Query query = em.createQuery("select p from Produto p where upper(p.descricao)
like upper(: descricao)" );
query.setParameter("descricao", "%"+descricao+"%");
List<Produto> prods = query.getResultList();
return prods;
}

46
47

48
49
50
51
52
53

Listagem 18.8: Classe ProdutoControl


1

package aulajsf;

2
3
4

import java.util.ArrayList;
import java.util.List;

5
6

import javax.faces.event.ActionEvent;

7
8

import org.primefaces.event.RowEditEvent;

9
10

public class ProdutoControl {

11
12

private Produto produto = new Produto();

13
14

private List<Produto> produtos = new ArrayList<Produto>();

15
16

private ProdutoDao produtoDao = new ProdutoDao();

17
18
19

public void confirmar(ActionEvent evt){


produtoDao.alterar(produto);

http://solutioin.com
Francisco Calaa, Otvio Calaa

207

Verso 1.2-beta

introduo ao javaserver faces

listar(evt);
produto = new Produto();

20
21

22
23

public void listar(ActionEvent evt){


produtos = produtoDao.listar();
}

24
25
26
27

public void gravar(RowEditEvent e){


Produto p = (Produto) e.getObject();
produtoDao.alterar(p);

28
29
30
31

32
33

public Produto getProduto() {


return produto;
}

34
35
36
37

public void setProduto(Produto produto) {


this.produto = produto;
}

38
39
40
41

public List<Produto> getProdutos() {


return produtos;
}

42
43
44
45
46

Listagem 18.9: Tela produto.xhtml


1
2
3
4

<html xmlns="http ://www.w3.org /1999/ xhtml"


xmlns:h="http ://java.sun.com/jsf/html"
xmlns:f="http ://java.sun.com/jsf/core"
xmlns:p="http :// primefaces.org/ui">

5
6

<h:head>

7
8

</h:head>

9
10
11
12
13
14
15
16
17
18
19

<h:body>
<h:form>
<p:panel header="Manter Produtos">
<h:panelGrid columns="2">
<h:outputText value="Descrio:" />
<p:inputText value="#{ produtoControl.produto.descricao}"></p:inputText>
<h:outputText value="Quantidade:" />
<p:inputText value="#{ produtoControl.produto.quantidade}"></p:inputText>
<h:outputText value="Valor:" />
<p:inputText value="#{ produtoControl.produto.valor}"></p:inputText>

20

<p:commandButton ajax="false"
actionListener="#{ produtoControl.confirmar}" value="Confirmar"></p:commandButton>

21
22
23

208

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

24
25

introduo ao javaserver faces

<p:commandButton ajax="false"
actionListener="#{ produtoControl.listar}" value="Listar"></p:commandButton>

26
27

</h:panelGrid>

28
29
30

<p:dataTable value="#{ produtoControl.produtos}" var="prod"


editable="true">

31
32
33
34
35

<f:facet name="header">
<h:outputText value="Produtos" />
</f:facet>
<p:ajax event="rowEdit" listener="#{ produtoControl.gravar}"></p:ajax>

36
37
38
39
40
41
42
43
44
45
46
47

<p:column headerText="Nome" sortBy="#{prod.descricao}"


filterBy="#{prod.descricao}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{prod.descricao}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{prod.descricao}" />
</f:facet>
</p:cellEditor>
</p:column>

48
49
50
51
52
53
54

<p:column>
<p:commandButton ajax="false" value="Selecionar">
<f:setPropertyActionListener target="#{ produtoControl.produto}"
value="#{prod}"></f:setPropertyActionListener>
</p:commandButton>
</p:column>

55
56
57
58

<p:column>
<p:rowEditor></p:rowEditor>
</p:column>

59
60
61
62

</p:dataTable>
</p:panel>
</h:form>

63
64
65

</h:body>
</html>

Finalmente, os arquivos de configurao do projeto esto nas Listagens 18.10 e 18.11.


Listagem 18.10: web.xml
1
2
3

<?xml version="1.0" encoding="UTF -8"?>


<web-app xmlns:xsi="http://www.w3.org /2001/ XMLSchema -instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/
javaee/web -app _ 2 _ 5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/
javaee/web -app _ 3 _ 0.xsd"

http://solutioin.com
Francisco Calaa, Otvio Calaa

209

Verso 1.2-beta

5
6

introduo ao javaserver faces

version="3.0">
<display-name>capitulo18</display-name>

7
8
9
10
11

<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>

12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

29
30
31
32
33
34
35
36
37

<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>

38
39
40
41
42
43
44
45
46
47
48

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
</web-app>

Listagem 18.11: faces-config.xml


1
2
3
4

<?xml version="1.0" encoding="UTF -8"?>


<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org /2001/ XInclude"
xmlns:xsi="http://www.w3.org /2001/ XMLSchema -instance" xsi:schemaLocation="http://java
.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web -facesconfig _ 2 _ 0.xsd"

>

210

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

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

introduo ao javaserver faces

<managed-bean>
<managed-bean-name>exemploControl</managed-bean-name>
<managed-bean-class>aulajsf.ExemploControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>clienteControl</managed-bean-name>
<managed-bean-class>aulajsf.ClienteControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>produtoControl</managed-bean-name>
<managed-bean-class>aulajsf.ProdutoControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>produtoListControl</managed-bean-name>
<managed-bean-class>aulajsf.ProdutoListControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>

Na Listagem 18.12 apresentado o cdigo do arquivo persistence.xml, necessrio para o


funcionamento da JPA.
Listagem 18.12: persistence.xml
1
2
3

<?xml version="1.0" encoding="UTF -8"?>


<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org /2001/
XMLSchema -instance"

5
6
7
8
9

10

11
12
13
14
15
16

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns
/persistence/persistence _ 1 _ 0.xsd" >
<persistence-unit name="aulajpa">
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show _ sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"
/>
<property name="hibernate.connection.url" value="jdbc:postgresql: // localhost/
treinamento" />
<property name="hibernate.connection.driver _ class" value="org.postgresql.Driver" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
</properties>
</persistence-unit>
</persistence>

Dica:
No esquea de adicionar as dependncias da JPA nas libs do projeto
de JSF.

http://solutioin.com
Francisco Calaa, Otvio Calaa

211

Verso 1.2-beta

18.8.

introduo ao javaserver faces

Conversores

Inicialmente vamos verificar a necessidade de utilizar conversores JSF. Imagine uma tela de
uma aplicao web onde o usurio entra com uma informao no formato String. Suponha
que esta informao deva ser convertida em um valor numrico como uma idade ou um
salrio. Esta converso deve ser feita de forma automtica para que, no Managed Bean a
varivel j possa ser declarada como inteira ou ponto flutuante. Um outro exemplo pode
acontecer com datas. Nestes casos utilizamos conversores.
Por exemplo, para converter nmeros, utize:
<h:inputText id="salary" value="#{PessoaControl.salario}">
<f:convertNumber pattern="###,##0.00"/>
</h:inputText>

Para converter datas, utilize:


<h:inputText id="date" value="#{PessoaControl.dataNascimento}">
<f:convertDateTime pattern="dd/MM/yyyy"/>
</h:inputText>

18.8.1 Conversores personalizados


Em muitas situaes necessrio converter objetos de classes do modelo da aplicao
para serem utilizados em telas JSF. Por exemplo: Uma classe Produto deve ser convertida
para poder ser utilizada em algum componente JSF. Neste caso, utiliza-se os conversores
personalizados.
Listagem 18.13: Classe ProdutoControl
1

package aulajsf;

2
3
4

import java.util.ArrayList;
import java.util.List;

5
6

import javax.faces.event.ActionEvent;

7
8
9

public class ProdutoListControl {

10
11

private ProdutoDao produtoDao = new ProdutoDao();

12
13

private List<Produto> produtos = new ArrayList<Produto>();

14
15

private Produto produto;

16
17
18
19

public List<Produto> listarPorDescricao(String descricao){


return produtoDao.listar(descricao);
}

20

212

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

introduo ao javaserver faces

public void adicionar(ActionEvent evt){


produtos.add(produto);
}

21
22
23
24

public List<Produto> getProdutos() {


return produtos;
}

25
26
27
28

public Produto getProduto() {


return produto;
}

29
30
31
32

public void setProduto(Produto produto) {


this.produto = produto;
}

33
34
35
36
37

Listagem 18.14: Classe ProdutoControl


1

package aulajsf;

2
3
4

import java.util.HashMap;
import java.util.Map;

5
6
7
8
9

import
import
import
import

javax.faces.component.UIComponent;
javax.faces.context.FacesContext;
javax.faces.convert.Converter;
javax.faces.convert.FacesConverter;

10
11
12
13

@FacesConverter("produtoConverter")
public class ProdutoConverter implements Converter{

14

private static Map<String, Produto> mapa = new HashMap<String, Produto>();

15
16

@Override
public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
return mapa.get(value);
}

17
18
19
20
21

@Override
public String getAsString(FacesContext ctx, UIComponent comp, Object value) {
if(value instanceof Produto){
Produto p = (Produto) value;
mapa.put(String.valueOf(p.getId()), p);
return String.valueOf(p.getId());
}else{
return "";
}
}

22
23
24
25
26
27
28
29
30
31
32
33

http://solutioin.com
Francisco Calaa, Otvio Calaa

213

Verso 1.2-beta

introduo ao javaserver faces

Listagem 18.15: Tela produto.xhtml


1
2
3
4

<html xmlns="http ://www.w3.org /1999/ xhtml"


xmlns:h="http ://java.sun.com/jsf/html"
xmlns:f="http ://java.sun.com/jsf/core"
xmlns:p="http :// primefaces.org/ui">

5
6

<h:head>

7
8

</h:head>

9
10
11
12
13

<h:body>
<h:form enctype="multipart/form -data">
<p:panel header="Manter Produtos">
<p:autoComplete value="#{ produtoListControl.produto}" id="produto" completeMethod="
#{ produtoListControl.listarPorDescricao}"

14

15

var="p" itemLabel="#{p.descricao}" itemValue="#{p}" converter


="produtoConverter" forceSelection="true"/>
<p:commandButton value="Adicionar" actionListener="#{ produtoListControl.adicionar}"
update="produtos"></p:commandButton>

16
17
18
19
20

<p:dataTable value="#{ produtoListControl.produtos}" var="prod" id="produtos">


<f:facet name="header">
<h:outputText value="Produtos" />
</f:facet>

21

<p:column>
<h:outputText value="#{prod.descricao}"></h:outputText>
</p:column>

22
23
24
25

<p:column>
<h:outputText value="#{prod.valor}"></h:outputText>
</p:column>

26
27
28
29
30
31
32

</p:dataTable>
</p:panel>
</h:form>

33
34
35

</h:body>
</html>

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

214

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

18.9.

introduo ao javaserver faces

Exerccios

1. Descreva o framework JavaServer Faces


2. Quais os procedimentos para adicionar o JavaServer Faces em um aplicativo
3. O que um Managed Bean
4. Quais so as tags bsicas do JSF
5. O que uma expresso de ligao?

http://solutioin.com
Francisco Calaa, Otvio Calaa

215

19

PA D R E S D E P R O J E T O
Um Padro de Projeto de Software, tambm muito conhecido pelo seu termo original em
ingls, Design Pattern, descreve uma soluo geral reutilizvel para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. No um cdigo
final, uma descrio ou modelo de como resolver o problema do qual trata, que pode
ser usada em muitas situaes diferentes. Os Padres de Projeto normalmente definem as
relaes e interaes entre as classes ou objetos, sem especificar os detalhes das classes ou
objetos envolvidos, ou seja, esto num nvel de generalidade mais alto.
Um padro de projeto define :
seu nome,
o problema,
a soluo,
quando aplicar esta soluo e
suas consequncias.
Os padres de projeto visam facilitar a reutilizao de solues de projeto e estabelecem
um vocabulrio comum para ser utilizado no projeto, facilitando comunicao, documentao e aprendizado dos sistemas de software.

Alguns dos cdigos aqui descritos e mais informaes sobre este


assunto pode ser obtido em: http://solutioin.com/java
Acesse e verifique!

19.1.

Padres GoF

Gof vem do ingls


Os padres "GoF" so organizados em 3 grupos:
Padres de criao : relacionados criao de objetos
Padres estruturais : tratam das associaes entre classes e objetos.
Padres comportamentais : tratam das interaes e divises de responsabilidades
entre as classes ou objetos.

217

Verso 1.2-beta

padres de projeto

Padres de criao:
Abstract Factory
Builder
Factory Method
Prototype
Singleton
Padres estruturais
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Padres comportamentais
Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor

19.2.

Abstract Factory

Abstract Factory um padro de projeto de software (tambm conhecido como design


pattern em ingls). Este padro permite a criao de famlias de objetos relacionados ou
dependentes, atravs de uma nica interface e sem que a classe concreta seja especificada.

218

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

padres de projeto

19.2.1 Utilizao
O padro Abstract Factory pode ser utilizado na implementao de um toolkit que disponibilize controles que funcionem em diferentes interfaces grficas, tal como Motif, GTK+
(GNOME) ou Qt (KDE). Estas GUIs possuem diferentes padres de controles visuais e,
para facilitar a construo de aplicativos que interajam facilmente com diferentes interfaces
grficas, interessante que se defina interfaces comuns para acesso aos controles, independentemente da GUI utilizada. Este problema pode ser resolvido atravs de uma classe
abstrata que declara uma interface genrica para criao dos controles visuais e de uma
classe abstrata para criao de cada tipo de controle. O comportamento especfico, de cada
um dos padres tecnolgicos contemplados, implementado atravs de uma classe concreta. O aplicativo, ou "cliente", interage com o toolkit atravs das classes abstratas sem ter
conhecimento da implementao das classes concretas. Um exemplo bem simplista seria
um projeto com interface para Mobile e para Desktop, uma boa opo para reaproveitar os
mesmos controles de interface seria criar pacotes com classes abstratas e os pacotes com
as classes concretas implementando apenas as diferenas. Esse padro tambm se aplica
na padronizao de ambientes, por exemplo, tamanhos de botes, fontes, cores de fundo,
largura de bordas. Com isso e havendo uma poltica que exija que os desenvolvedores
usem essas classes em vez das nativas da linguagem, ajudar a padronizar a aparncia e
comportamento das aplicaes.

19.3.

Factory Method

Factory Method, na cincia da computao, um padro de projeto de software (design


pattern, em ingls) que define uma classe para criao de um objeto, mas permite que as
subclasses escolham qual classes instanciar. O factory method permite delegar a instanciao para as subclasses.

19.3.1 Utilizao
Este padro muito utilizado em frameworks para definir e manter relacionamentos entre objetos. O framework Spring, dependendo da configurao, pode utilizar um Factory
Method para criar os seus beans. Este padro pode ser utilizado na construo de um
framework que suporta aplicaes que apresentam mltiplos documentos ao usurio. Normalmente este tipo de aplicao manipula um nmero varivel de formatos de documento
e, por isso, este framework deve ser flexvel o bastante para suportar qualquer formato.
Uma soluo para este problema poderia disponibilizar, no framework, o cdigo para alguns dos formatos mais utilizados. Mas, na prtica, esta soluo seria uma implementao
pouco flexvel, e at mesmo incompleta, j que custoso implementar os mais variados
formatos. O padro Factory Method prope uma soluo que deixa para o cliente (a implementao da aplicao) a tarefa de suportar os formatos necessrios e para o framework
o papel de definio de uma abstrao que oferece uma interface nica para criao de
documentos. Este framework seria baseado em duas classes abstratas, que representam

http://solutioin.com
Francisco Calaa, Otvio Calaa

219

Verso 1.2-beta

padres de projeto

a Aplicao e o Documento. O cliente do framework fornece um par de classes concretas,


uma aplicao e o respectivo documento, para cada um dos formatos de Documento suportados pela Aplicao. Se for necessrio apresentar um documento que suporte desenho, por
exemplo, o cliente deve disponibilizar as classes AplicacaoDesenho e DocumentoDesenho
(supondo que o sufixo "Desenho" indique classes que suportam esta funcionalidade).
O objetivo do Factory Method est em diversas classes que implementam a mesma operao, retornarem o mesmo tipo abstrato, mas internamente instanciam diferentes classes
que o implementam. Com o Factory Method o criador do objeto faz uma escolha de qual
classe instanciar para o cliente. Para ser um Factory Method o mtodo precisa retornar uma
interface ou uma classe abstrata e, dependendo das necessidades do cliente, criar um objeto
determinado como retorno. Um exemplo clssico do Factory Method so os iteradores em
Java.

19.3.2 Command
Encapsular uma solicitao como um objeto, desta forma permitindo que clientes parametrizem
diferentes solicitaes, enfileirem ou faam o registro (log) de solicitaes e suportem operaes que podem ser desfeitas.

19.3.3 Problema
Algumas vezes necessrio emitir solicitaes para objetos nada sabendo sobre a operao
que est sendo solicitada ou sobre o receptor da mesma.
Utilizar quando:
Parametrizar objetos por uma ao a ser executada. Voc pode expressar tal parametrizao numa linguagem procedural atravs de uma funo callback, ou seja, uma funo
que registrada em algum lugar para ser chamada em um momento mais adiante.
Os Commands so uma substituio orientada a objetos para callbacks;
Especificar, enfileirar e executar solicitaes em tempos diferentes. Um objeto Command pode ter um tempo de vida independente da solicitao original. Se o receptor
de uma solicitao pode ser representado de uma maneira independente do espao
de endereamento, ento voc pode transferir um objeto Command para a solicitao
para um processo diferente e l atender a solicitao;
Suportar desfazer operaes. A operao Execute, de Command, pode armazenar estados para reverter seus efeitos no prprio comando. A interface do Command deve
ter acrescentada uma operao Unexecute, que o reverte.efeitos de uma chamada anterior de Execute. Os comandos executados so armazenados em uma lista histrica.
O nvel ilimitado de desfazer e refazer operaes obtido percorrendo esta lista para
trs e para frente, chamando operaes Unexecute e Execute, respectivamente.

220

http://solutioin.com
Francisco Calaa, Otvio Calaa

Verso 1.2-beta

padres de projeto

19.3.4 Aplicao
A chave deste padro uma classe abstrata Command, a qual declara uma interface para
execuo de operaes. Na sua forma mais simples, esta interface inclui uma operao
abstrata Execute. As subclasses concretas de Command especificam um par receptor-ao
atravs do armazenamento do receptor como uma varivel de instncia e pela implementao de Execute para invocar a solicitao. O receptor tem o conhecimento necessrio para
poder executar a solicitao.

19.4.

Data Access Object (DAO)

Este no um padro de projeto GoF. Objeto de acesso a dados (ou simplesmente DAO,
acrnimo de Data Access Object), um padro para persistncia de dados que permite
separar regras de negcio das regras de acesso a banco de dados. Numa aplicao que
utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as
conexes, mapear objetos Java para tipos de dados SQL ou executar comandos SQL, devem
ser feitas por classes de DAO.

19.4.1 Vantagens
A vantagem de usar objetos de acesso a dados a separao simples e rigorosa entre duas
partes importantes de uma aplicao que no devem e no podem conhecer quase que
nada uma da outra, e que podem evoluir frequentemente e independentemente. Alterar
a lgica de negcio podem esperar apenas a implementao de uma interface, enquanto
que modificaes na lgica de persistncia no alteram a lgica de negocio, desde que a
interface entre elas no seja modificada.
Pode ser usada em uma vasta porcentagem de aplicaes;
Esconde todos os detalhes relativos a armazenamento de dados do resto da aplicao;
Atua como um intermedirio entre a aplicao e o banco de dados;
Mitiga ou resolve problemas de comunicao entre a base de dados e a aplicao,
evitando estados inconsistentes de dados.
No contexto especfico da linguagem de programao Java, um objeto de acesso a dados como padro de projeto de software pode ser implementado de vrias maneiras. Pode
variar desde uma simples interface que separa partes de acesso a dados da lgica de negcio de uma aplicao at frameworks e produtos comerciais especficos. Os paradigmas
para programao usando DAOs demandam alguma proficincia. O uso de tecnologias
como Java persistence technologies e JDO garantem a implementao do padro de projeto
at certo ponto. Tecnologias como Enterprise JavaBeans trazem para a aplicao servidores
montados e que podem ser usados em aplicaes que usem um servidor de aplicao JEE.

http://solutioin.com
Francisco Calaa, Otvio Calaa

221

Verso 1.2-beta

padres de projeto

Produtos comerciais como o TopLink esto disponveis, baseados em mapeamento objetorelacional (ORM). Produtos ORM populares em cdigo aberto incluem Doctrine, Hibernate,
iBATIS e Apache OpenJPA.

19.5.

MVC

Model-view-controller (MVC) um modelo de desenvolvimento de Software, atualmente


considerado uma "arquitetura padro" utilizada na Engenharia de Software. O modelo
isola a "lgica" (A lgica da aplicao) da interface do usurio (Inserir e exibir dados),
permitindo desenvolver, editar e testar separadamente cada parte.

19.5.1 Componentes
O modelo (model) usado para definir e gerenciar o domnio da informao e notificar observadores sobre mudanas nos dados. Ele uma representao detalhada da informao
que a aplicao opera. A lgica de negcio adiciona valor semntico aos dados, e quando
h mudana de estado o modelo notifica seus observadores. Por exemplo, aluno, professor
e turma fazem parte do domnio de um sistema acadmico. Operaes como calcular a
mdia final do aluno ou o ndice de faltas da turma fazem parte da lgica de domnio. A
forma como o dado armazenado ou acessado no de interesse do MVC, assume-se que
de responsabilidade do modelo.
A viso (view) apresenta o modelo num formato adequado ao utilizador, na sada de dados, e diferentes vises podem existir para um mesmo modelo, para diferentes propsitos.
O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador
ao invocar objetos do modelo, e por fim uma viso baseada na entrada. Ele tambm
responsvel pela validao e filtragem da entrada de dados.
Um caso prtico uma aplicao web em que a viso um documento HTML (ou
derivado) gerado pela aplicao. O controlador recebe uma entrada GET ou POST aps
um estmulo do utilizador e decide como process-la, invocando objetos do domnio para
tratar a lgica de negcio, e por fim invocando uma viso para apresentar a sada.

19.5.2 Justificativa
Com o aumento da complexidade das aplicaes desenvolvidas,sempre visando a programao orientada a objeto nao devemos esquecer que torna-se relevante a separao entre os
dados e a apresentao das aplicaes. Desta forma, alteraes feitas no layout no afetam
a manipulao de dados, e estes podero ser reorganizados sem alterar o layout.
Esse padro resolve este problema atravs da separao das tarefas de acesso aos dados
e lgica de negcio, lgica de apresentao e de interao com o utilizador, introduzindo
um componente entre os dois, o controlador.

222

http://solutioin.com
Francisco Calaa, Otvio Calaa

M O N TA G E M D O A M B I E N T E D E
TRABALHO

A.1.

Obteno e instalao do JDK

O JDK deve ser obtido do site da Oracle1 . Quando voc acessar este site, notar a primeira
grande confuso enfrentada pelos iniciantes. O que baixar JDK ou JRE ? No nosso caso,
devemos baixar o Java SE 7 JDK, ou seja, clique no download do JDK.
Para instalar o JDK basta executar o instalador adequado obtido no site. Note que existem
opes de instalador para linux, windows e solaris para as arquiteturas 32 e 64 bits.
A diferena entre JDK e JRE que o JDK contm, alm da mquina virtual Java, vrias ferramentas para o desenvolvimento de um software Java. J o JRE contm apenas a mquina
virtual.

A.2.

O que a Mquina virtual Java

Todo software Java necessita de uma mquina virtual para execut-lo. ela quem acessa
o hardware da mquina. Em java, todo o cdigo escrito deve ser compilado. Este arquivo
compilado chamado de bytecode e executado pela mquina virtual.
Hoje existem mquinas virtuais JIT que recompilam o bytecode para cdigo nativo (que
pode ser executado diretamente no computador) tornando a execuo do software mais
rpida. Este trabalho feito pela JVM transparente, ou seja, no h a necessidade de se
preocupar como e quando ser feito isto.

A.3.

Obteno e instalao do eclipse

O Eclipse pode ser obtido no seu site: http://www.eclipse.org/downloads/. Neste livro


ser utilizado o Eclipse IDE for Java EE Developers.
Aps o trmino do download, basta descompactar o arquivo. Para iniciar o Eclipse basta
executar o aplicativo eclipse(Linux) ou eclipse.exe(Windows) situado dentro do diretrio
eclipse descompactado.

1 http://www.oracle.com/technetwork/java/javase/downloads/index.html

223

E R R O S C O M U N S E N F R E N TA D O S P O R
INICIANTES

B.1.

Excees que costumam serem vistas

B.1.1 ClassNotFoundException
B.1.2 NoSuchMethodError
B.1.3 LazyInitializationException
B.1.4 NoClassDefFoundError
B.1.5 NullPointerException
B.1.6 ClassCastException

B.2.

Erros comuns do HTTP

225

You might also like