Escolar Documentos
Profissional Documentos
Cultura Documentos
francisco calaça
otávio calaça
Esta licença também quer dizer que você VOCÊ NÃO PODE:
Qualquer uso indevido deste material, venda ou alteração estarão sugeitos às penas pre-
vistas na Lei Federal No 9.610, de 19 de fevereiro 1998.
Mais detalhes sobre esta licença bem como seu conteúdo 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 chicocx@gmail.com com o título:
Colaboradores
• Francisco Calaça Xavier
v
CONTEÚDO
1 introdução 1
1.1 Algoritmos 1
1.2 Lógica binária 1
1.3 Nascimento da ciência da computação 2
1.4 Java 2
2 preparação do ambiente de estudos 5
2.1 Padronização do ambiente de trabalho 5
2.2 Primeiros testes no ambiente de trabalho 6
2.3 Exercícios 7
3 lógica de programação em java 9
3.1 Fluxograma 9
3.2 Para entender os programas criados a partir de agora 10
3.2.1 Informações iniciais 10
3.3 Strings 11
3.4 Saída Formatada 12
3.5 Conceito de Variável 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 Conversões de variáveis 17
3.8 Operadores 17
3.8.1 Aritméticos 17
3.8.2 Atribuição 18
3.8.3 Incremento/Decremento 19
3.8.4 Relacionais 20
3.8.5 Lógicos 20
3.9 Estruturas de seleção 21
3.9.1 if . . . else 22
3.9.2 Operador condicional ou ternário 23
3.9.3 switch 24
3.10 Estruturas de Repetição 26
3.10.1 for 26
3.10.2 while 27
3.10.3 do . . . while 27
3.11 Exercícios 28
4 introdução à orientação a objetos 29
4.1 O conceitos Classe e Objeto 29
4.2 Elementos de uma classe 30
vii
4.2.1 Atributos 30 Versão 1.1 conteúdo
4.2.2 Métodos 31
4.2.3 Métodos construtores 32
4.2.4 Padrões de nomenclatura 33
4.3 Atributos e métodos static 34
4.3.1 Import static 35
4.4 Tipos Wrapper 36
4.4.1 Auto-boxing e Auto-unboxing 36
4.5 Regras de escopo 37
4.6 Sobrecarga de métodos 38
4.7 Exercícios 39
5 arrays 41
5.1 O que são arrays 41
5.2 Declaração e inicialização de arrays 42
5.3 Método main 44
5.4 Laço for aprimorado 46
5.5 Passagem de parâmetros no Java 46
5.6 Arrays multidimensionais 49
5.7 Lista de parâmetros com comprimento variável 49
5.8 Exercícios 50
6 um pouco mais de orientação a objetos 51
6.1 Coletor de lixo 51
6.2 A palavra-chave this 52
6.3 Variáveis do tipo final 54
6.4 Encapsulamento 54
6.5 Enumerações 57
6.6 Pacotes 57
6.6.1 Como usar tipos dentro de outros pacotes 59
6.7 Herança 60
6.7.1 Um exemplo de Herança 60
6.7.2 Sobrescrita de métodos 62
6.7.3 A palavra-chave super 62
6.8 Alguns Modificadores de acesso 62
6.8.1 private 62
6.8.2 pacote 62
6.8.3 protected 63
6.8.4 public 63
6.9 Classe object 63
6.9.1 método equals() 63
6.9.2 método toString() 64
6.10 Polimorfismo 65
6.10.1 Abstração 65
6.10.2 Exemplo de Polimorfismo 66
6.11 Conversão e casting 69
6.11.1 A palavra-chave instanceof 70
6.12 Métodos e classe do tipo final 70
viii http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 conteúdo
6.13 Interfaces 71
6.13.1 Interfaces em Java 71
6.14 Exercícios 73
7 tratamento de exceções 75
7.1 O que são exceções 75
7.2 Como tratar exceções 75
7.2.1 O bloco try 75
7.2.2 O bloco catch 76
7.3 Exceções checadas e exceções não checadas 78
7.4 Como declarar novos tipos de exceções 78
7.5 Como lançar exceções 79
7.6 Hierarquia das exceções 80
7.7 Exercícios 81
8 fluxo de dados 83
8.1 A classe File 83
8.2 Como escrever em arquivos 83
8.3 Como ler arquivos 84
8.4 Um editor de texto simples 85
8.5 Serialização de objetos 87
8.6 Um trocador de mensagens simples 88
8.7 Exercícios 91
9 genéricos e coleções 93
9.1 o que são genéricos 93
9.2 Introdução a coleções 95
9.3 Listas 95
9.4 Conjuntos 97
9.5 Mapas 97
9.5.1 Properties 99
9.6 Pilhas 101
9.7 Filas 102
9.8 Ordenação de Listas 102
9.9 Exercícios 104
10 uml: unified modeling language 107
10.1 Diagrama de Classe 107
10.1.1 Classe 107
10.1.2 Associações de Classe 108
10.2 Diagrama de Caso de Uso 110
10.2.1 Caso de Uso 110
10.2.2 Ator 111
10.2.3 Descrição do Caso de Uso 111
10.3 Demais diagramas 111
11 threads 113
11.1 Processos e Threads 113
11.1.1 Processos 113
11.1.2 Threads 113
11.2 Criação de Threads 114
http://solutioin.com ix
Francisco Calaça, Otávio Calaça
Versão 1.1 conteúdo
x http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 conteúdo
http://solutioin.com xi
Francisco Calaça, Otávio Calaça
Versão 1.1 conteúdo
xii http://solutioin.com
Francisco Calaça, Otávio Calaça
INTRODUÇÃO
1
A computação pode ser definida como a busca de uma solução para um problema, a partir
de entradas (inputs), e através de um algoritmo. É com isto que lida a teoria da computação,
subcampo da ciência da computação e da matemática. Durante milhares de anos, a com-
putação foi executada com caneta e papel, ou com giz e ardósia, ou mentalmente, por vezes
com o auxílio de tabelas, ou utensílios artesanais.
A primeira ferramenta conhecida para a computação foi o ábaco, inventado na Mesopotâmia
em torno de 2400 a.C. Sua versão original era consistia em desenhar linhas na areia com
rochas. Os ábaco ainda são usadas como instrumento de cálculo hoje.
1.1. Algoritmos
O matemático indiano Brahmagupta explicou pela primeira vez no século VII, o sistema
de numeração hindu-arábico. Nesta época aparecem os relatos de uso do 0. Por volta de
820, o matemático persa Al-Khwarizmi escreveu o livro Calculando com Numerais Hindus.
Este matemático foi responsável pela difusão do sistema de numeração hindu-arábico no
Oriente Médio, e posteriormente na Europa. No século XII começaram traduzir este livro
para o latim: Algoritmi de numero Indorum. Tais livros apresentaram novos conceitos
para definir sequências de passos para completar tarefas (definição de algorítimos), como
aplicações de aritmética e álgebra. Por derivação do nome, atualmente usa-se o termo
algorítmo.
1
Versão 1.1 introdução
1.4. Java
A linguagem de programação orientada a objetos Java foi criada em 1991 pelo engenheiro
James Gosling, da Sun, e anunciada em 1995. O projeto da sua criação 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 criação de uma nova
linguagem, então denominada Oak (palavra inglesa para as árvores da família Quercus,
como o carvalho) em "homenagem" à árvore que se encontrava plantada do lado de fora
do escritório de James Gosling.
Em 1994 esta linguagem foi renomeada para Java porque, após 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 especificações da linguagem Java são mantidas uniformes através de um processo
comunitário gerido pela Sun Microsystems, o JCP (Java Community Process). Fazem parte
do JCP várias empresas como a Oracle, Google, IBM, Nokia dentre outras. Para mais infor-
mações sobre o JCP acesse o site http://jcp.org.
As características principais da linguagem Java são:
• é orientada a objetos;
2 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução
• é independente de plataforma;
http://solutioin.com 3
Francisco Calaça, Otávio Calaça
P R E PA R A Ç Ã O D O A M B I E N T E D E
2
ESTUDOS
Neste capítulo 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
contém uma vasta quantidade de aplicativos necessários 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 con-
tém vários recursos, necessários para a construção eficiente de um software.
Hoje é possível encontrar diversas IDE’s para desenvolvimento em Java. Dentre elas
estão o Eclipse1 e o NetBeans2 , que são ide’s Open Source e que contam com colabração de
grandes comunidades e empresas ao redor do mundo. Os exemplos deste livro serão feitos
utilizando o Eclipse. Apesar disto, nada impede você de instalar o netbeans e também testar
estes exemplos nele.
1 http://www.eclipse.org
2 http://www.netbeans.org
5
Versão 1.1 preparação 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. Após ter realizado o download
no seu computador, descompacte o arquivo em algum lugar de sua preferência e pronto!
Você já está apto para começar os estudos em Java. Bons estudos!
Dica:
Se você ficou curioso em como este ambiente foi montado, acesse o
Apêncie A que saberá como.
No momento, não se preocupe com as instruções 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 usuário está ilustrada no código da Listagem
2.2. Observe, que após executar este código, a mensagem é apresentada em uma janela,
conforme ilustrado na Figura 2.2.
Para um terceiro exemplo, será apresentado um código que faz a leitura de informações
teclado. Isto será bastante útil nesta primeira fase do curso, onde estamos estudando os
elementos iniciais da programação. A Listagem 2.3 exemplifica uma das formas de se obter
informações do usuário.
6 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 preparação do ambiente de estudos
2.3. Exercícios
1. Crie uma classe que apresente no console a seguinte mensagem: “Meu primeiro
código Java”.
2. Crie uma classe que apresente em uma janela a mensagem: “Estou ficando bom
nisto”.
3. Crie uma classe que solicite ao usuário as seguintes informações: nome, endereço e
telefone. Após o usuário ter digitado estas informações, apresente em uma janela.
http://solutioin.com 7
Francisco Calaça, Otávio Calaça
L Ó G I C A D E P R O G R A M A Ç Ã O E M J AVA
3
Todo programa é constituído por uma sequência lógica de passos que executará tarefas
necessárias para a solução do problema a que o programa se propõem.
Neste capítulo, serão apresentados os passos necessários para construção de um pro-
grama simples em Java.
3.1. Fluxograma
Fluxograma é uma representação esquemática do processo. Ilustra graficamente a transição
de informações ao longo da execução deste processo.
É útil para compreensão de controle de fluxo quando o algoritmo é complexo ou extenso.
A Figura 3.1 ilustra um fluxograma. Observe que cada ação é representada por um retân-
gulo. O losango representa uma tomada de decisão. As elípses representam o início e o fim
do processo.
9
Versão 1.1 lógica de programação em java
• nomes de classes iniciam com letras maiúsculas e o restante das letras são minúsculas.
Exemplo: PrimeiraClasse, PessoaFisica, etc.
• nomes de métodos iniciam com letras minúsculas. Uma nova palavra no nome inicia
com letra maiúscula (sem o caracter sublinhado _). Exemplo: realizarAcao(), fazer-
Algo(), etc.
O significado de cada uma destas palavras será descrito posteriormente. É necessário que
o leitor apenas utilize esta assinatura como está.
1 CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada
palavra é iniciada com Maiúsculas e unidas sem espaços. É um padrão largamente utilizado em diversas
linguagens de programação, como Java, Ruby, PHP e Python, principalmente nas definições de Classes e Ob-
jetos. Exemplo: iPod, GameCube, OpenOffice.org, CamelCase, dataNascimento, enderecoEntregaMercadoria,
ItemPedido.
10 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
3.2.1.7 Comentários
Existem três tipos de comentários em Java, conforme apresentado na Listagem 3.1.
4 /*
5 * Comentário
6 * de
7 * bloco
8 */
9
10
11 /**
12 * Exemplo de comentário
13 * de Javadoc.
14 *
15 */
3.3. Strings
Strings são cadeias de caracteres. Em java são representadas pela classe String e são expres-
sas entre aspas. Strings literais como “abcdef” também são instâncias desta classe.
É possível utilizar o operador + para concatenação 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 estão descritos na tablela da figura 3.2.
A listagem 3.2 apresenta mais exemplos de sequências de escape. A saída deste exemplo
é:
http://solutioin.com 11
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
10 }
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:
12 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
Caracter Aplicado em
%s String
%d Inteiro
%f Ponto flutuante
13 }
String nome;
int idade;
String endereco;
http://solutioin.com 13
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
De acordo com a Java Language Specification2 , null, true e false são tecnicamente chama-
dos de valores literais, e não keywords. Se você tentar criar algum identificador com estes
valores, você também terá um erro de compilação.
Utilizamos, em Java, as seguintes regras para criação do identificador:
• não pode ser true nem false - literais que representam os tipos lógicos (booleanos);
• deve ser a combinação de uma ou mais letras e dígitos (letras maíusculas, minúsculas,
números, sublinha (_) e cifrão ($)).
2 http://docs.oracle.com/javase/specs/
14 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
Y_1
nome
Pessoa
j3
_teste
• ponto flutuante
• caractere
• booleano.
Por padrão, os tipos primitivos inteiros são do tipo int, ou seja, se apenas for escrito
o número 5, este será do tipo int. Para explicitar o tipo long deve-se acrescentar, após o
número, a letra L (maiúscula ou minúscula):
http://solutioin.com 15
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
1234.566
4343.1212
Por padrão, os tipos primitivos com casas decimais são do tipo double, ou seja, se ape-
nas for escrito o número 3.5, este será do tipo double. Para explicitar o tipo float deve-se
acrescentar, após o número, a letra F (maiúscula ou minúscula):
Dica:
O Unicode possui o objetivo explícito de transcender as limitações
de codificações de carácter tradicionais, como as definidas pelo
padrão ISO 8859, que possuem grande uso em vários países mas
que permanecem em sua maioria incompatíveis umas com as outras.
Várias codificações de carácter tradicionais compartilham um prob-
lema comum, ao permitirem processamento bilíngue (geralmente us-
ando caracteres romanos e a língua local), mas não processamento
multilíngue (processamento de línguas arbitrárias misturadas umas
com as outras).
16 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
Observe que para realizar a operação de cast basta colocar o tipo que se deseja converter
entre parêntesis na frente da variável a ser convertida.
O código da listagem 3.4 apresenta um exemplo do que acontece quando é feito um cast
de uma variável maior para uma menor. Existe o risco de truncamento do número. A saída
deste exemplo é:
Numero:300
Após truncamento:44
Isto ocorre porque 300 escrito em binário é: 100101100. Contando os primeiros oito bits
da direita para esquerda, temos: 00101100. Este valor em decimal vale 44. O restante do
número em binário fui truncado, ou seja, descartado.
9 }
3.8. Operadores
Quando o computador foi concebido ele era puramente uma máquina de cálculos. Apesar
de atualmente o computador estar associado a diversas atividades da vida cotidiana, o
mesmo ainda não passa de uma super máquina de fazer cálculos. Desta forma, a linguagem
Java possui diverosos operadores cujo objetivo é realizar este cálculos. Nesta seção serão
apresentados os operadores que irão nos auxiliar em operações matemáticas e lógicas.
3.8.1 Aritméticos
A aritmética do Java é realizada por meio dos cinco operadores. Eles são divididos em dois
grupos, os de maior prioridade, listados na Tabela 3.5 e os de menor prioridade, listados
http://solutioin.com 17
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
na Tabela 3.6. Os operadores de maior prioridade são executados antes dos operadores
de menor prioridade, ou seja, se em uma expressão matemática existirem os dois tipos
inicialmente realiza-se as operações de maior prioridade e somente após são executados os
operadores de menor prioridade. A expressão:
5 + 3 * 5
x = (5 + 3) * 2
o valor da variável x será 16 pois a soma será feita primeiro devido aos parêntesis.
3.8.2 Atribuição
Em Java é utilizado o operador = para realizar a atribuição. Sua ordem de execução é da
direita para a esquerda, ou seja, os valores mais à direita são atribuídos às variáveis mais a
esquerda: x = 4 equivale a dizer que o valor 4 será atribuído à variável x e, após a execução
desta instrução a variável x passará a conter o valor 4.
18 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
x += 3;
3.8.3 Incremento/Decremento
Os operadores de incremento e decremento são utilizados quando existe a necessidade de
somar ou subtrair em apenas uma unidade os valores contidos em uma variável utilizando
dois sinais de soma, para incremento e dois sinais de subtração 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 19
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
x = 4;
y = ++x + 5;
x = 4;
y = x++ + 5;
3.8.4 Relacionais
São utilizados para comparar duas variáveis. O resultado da comparação é um valor
booleano. A relação de comparadores do Java pode ser vista na Tabela 3.8.
Operador Operação
== Igualdade
!= Diferença
> Maior que
>= Maior ou igual que
< Menor que
<= Menor ou igual que
3.8.5 Lógicos
Existem quatro operações lógicas:
20 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
A tabela verdade do Operador E pode ser vista na figura 3.10. A tablea verdade do
Operador OU pode ser vista na figura 3.9. A tabela verdade do Operador OU EXCLUSIVO
pode ser vista na figura 3.11.
Os operadores lógicos do Java podem ser vistos na tabela da figura 3.12. Observe que
existem dois tipos de operadores OU (| e ||) e dois tipos de operadores E (& e &&).
Basicamente o que diferem estes dois tipos de operadores são o seguinte:
http://solutioin.com 21
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
Operador Operação
|| OU curto-circuito
&& E curto-circuito
| OU lógico
& E lógico
ˆ OU exclusivo
! Não lógico
3.9.1 if . . . else
A instrução if . . . else se comporta da seguinte maneira. Quando o teste do “if” for ver-
dadeiro, é executado o código que se encontra logo em seguida do if. No caso do teste ser
falso, é executado o código que se encontra logo em seguida do else. O bloco else não é
obrigatório. A figura 3.4 ilustra o fluxo da instrução if . . . else. Na listagem 3.5 pode ser
visto um exemplo de uso.
Sua sintaxe é:
if(teste){
//executa somente se o teste for verdadeiro
}else{
//executa somente se o teste for falso
}
22 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
10 if (nota >= 5) {
11 JOptionPane.showMessageDialog(null, "Aprovado");
12 } else {
13 JOptionPane.showMessageDialog(null, "Reprovado");
14 }
15 }
16 }
Dica:
Para converter String em int, utilize o código:
http://solutioin.com 23
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
8 int n1 = Integer.parseInt(primeiroNumero);
9 int n2 = Integer.parseInt(segundoNumero);
10
3.9.3 switch
Diferente das instruções if e if . . . else, a instrução switch permite um maior número de pos-
sibilidades de caminhos de execução. A palavra chave switch pode ser utilizada somente
com o tipo primitivo int (byte, short, char por conversão automática e seus tipos Wrappers),
o tipo Enum e, a partir da versão 7 do Java, String. Na listagem 3.8 está o código exemplo
da instrução switch.
Sua sintaxe é:
switch(tipo){
case a:
//instrucao;
case b:
//instrucao;
24 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
default:
//instrucao;
}
É comum utilizar a instrução switch juntamente com o break para que apenas uma opção
seja executada.
http://solutioin.com 25
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
45 break;
46 default:
47 msg = "Número incorreto";
48 }
49 JOptionPane.showMessageDialog(null, msg);
50 }
51 }
3.10.1 for
A instrução for provê um caminho rápido para percorer uma faixa de valores. Com esta
instrução é possível repetir determinadas instruções enquanto a condição for verdadeira. A
sintaxe do for é a seguinte:
for (inicialização; condição; incremento) {
instruções(s)
}
26 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
3.10.2 while
A instrução while executa um bloco de instruções enquanto uma condição particular for
verdadeira (true). Sua sintaxe é:
while (teste) {
statement(s)
}
A expressão while avalia o teste, que deve retornar um tipo booleano. Se a espressão
avaliada for verdadeira (true), o bloco while executa as instruções dentro do bloco. A ex-
pressão while continua testando o teste até que este seja falso (false). O código da listagem
3.10 calcula a soma de inteiros enquanto a opção de saída não é informada.
7 int qtd = 0;
8 double soma = 0;
9
10 while (status != 1) {
11 String numStr1 = JOptionPane.showInputDialog("Digite um inteiro");
12 int n1 = Integer.parseInt(numStr1);
13
14 soma += n1;
15 qtd++;
16
17 String msg = "Digite 1 para sair ou qualquer outro número para continuar";
18 String statusStr = JOptionPane.showInputDialog(msg);
19
20 status = Integer.parseInt(statusStr);
21
22 }
23
27 }
28 }
3.10.3 do . . . while
A linguagem Java provê a instrução do . . . while que pode ser vista abaixo:
http://solutioin.com 27
Francisco Calaça, Otávio Calaça
Versão 1.1 lógica de programação em java
do {
statement(s)
} while (teste);
A principal diferença entre do . . . while e while é que while primeiro avalia o teste e somente
após executa o loop, enquanto do . . . while primeiro executa a instrução e somente após isto
é avaliado o teste. Em resumo, do . . . while garante pelo menos uma execução das instruções
do bloco.
3.11. Exercícios
1. Crie um código que executa a seguinte ação: solicita ao usuário uma idade. Se esta for
maior ou igual a 16, imprime: “Pode votar”. Se não for, imprime: “Não pode votar”.
************
************
************
************
4. Crie um código que solicita ao usuário um número entre 1 e 7. Após isto, o sistema
imprime: Domingo se o número for 1, Segunda se o número for 2, Terça se o número
for 3, etc. . .
5. Altere o código da listagem 3.10 para utilizar do. . . while no lugar de while.
28 http://solutioin.com
Francisco Calaça, Otávio Calaça
I N T R O D U Ç Ã O À O R I E N TA Ç Ã O A
4
OBJETOS
• Classe, significa grupo ou conjunto. Representa um tipo de dados que pode conter
atributos e métodos, como por exemplo, Carro. A classe Carro define todo o conjunto
de carros. A este conjunto é possível associar atributos como potência, número de
passageiros, etc. Mas lembre-se, trata-se de apenas um conjunto, este ainda pode
estar vazio.
29
Versão 1.1 introdução à orientação a objetos
Assim uma classe é o arquivo, o código digitado, enquanto o objeto será construído pelo
programa, a partir da classe, e executado pelo computador.
Para declarar classes utiliza-se a palavra chave class:
class Carro {
//campos, construtores, e declaração de métodos
}
Para instanciar, ou criar, objetos a partir de uma classe utiliza-se o operador: new.
Note que uma classe é também um tipo. Você acabou de criar um novo tipo de variáveis
no Java! O tipo Carro.
Antes de serem instanciadas, as variáveis objeto valem null. A palavra chave null é
utilizada para expressar a não existencia de uma instância de um objeto em determinada
variável, ou seja, representa o nulo. Esta forma, uma variável não instanciada possui o valor
null.
4.2.1 Atributos
Atributos de uma classe são as propriedades da mesma. No exemplo do Carro, atributos
poderiam ser: cor, dataDeFabricacao, potência, etc. Observe que atributos são substantivos que
descrevem a Classe e que são 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. Após a execução da classe da Listagem 4.2, você verá
a seguinte saída:
30 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
4 obj.cor = "Branco";
5 obj.velocidade = 80;
6
4.2.2 Métodos
Métodos são como funções. Possuem instruções que são executadas quando o método é
invocado. Em Orientação a Objetos os métodos descrevem ações realizadas pelos objetos.
Em Java os métodos devem possuir tipo de retorno:
int realizaAlgo(){
//instruções
return 5;
}
Neste caso é obrigatório explicitar o que o método retorna com a palavra chave return.
Se o método não retornar algo, o tipo de retorno utilizado é void (note que sempre deve
ser informado o tipo de retorno. Mesmo quando o método não retorna nada!):
void realizaAlgo(){
//instruções
}
A Listagem 4.3 inclui métodos na classe Carro. Estes métodos são responsáveis por al-
terar a velocidade e parar o carro. A Listagem 4.4 apresenta um exemplo de execução destes
métodos. Após sua execução, você verá a seguinte saída:
Mudando a velocidade para 80,000000 Km/h
Velocidade atual: 80,000000 Km/h
Parando veículo. Velocidade 0 Km/h. Cor: Branco
http://solutioin.com 31
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
3 double velocidade;
4 String cor;
5
6 void mudarVelocidade(double v) {
7 velocidade = v;
8 System.out.printf("\n\nMudando a velocidade para %f Km/h", velocidade)
;
9 }
10
11 void pararCarro() {
12 System.out.printf("\nVelocidade atual: %f Km/h", velocidade);
13 System.out.printf("\nParando veículo. Velocidade 0 Km/h. Cor: %s", cor
);
14 }
15 }
Dica:
Construtor padrão é aquele que não recebe parâmetros.
32 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
http://solutioin.com 33
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
Dica:
Esta padronização, dentre outras da linguagem Java, estão descritas
no documento chamado: Code Conventions for the Java Program-
ming Language. Este documento pode ser acessado através do site:
http://www.oracle.com/technetwork/java/codeconv-138413.html
6 public ObjetoTeste() {
7 quantidadeInstancias ++;
8 }
9
10 }
34 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
13 }
Observe no código da listagem 4.9 a utilização de vários métodos do tipo static das
classes JOptionPane e Math. A cada utilização de um método destas classes como:
JOptionPane.showMessageDialog(...);
Um exemplo equivalente está no código da listagem 4.10. Nesta classe foi utilizado o
import static o que tornou desnecessário a referência das classes JOptionPane e Math:
showMessageDialog(...);
http://solutioin.com 35
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
12
19 }
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 maiúscula, exceto para os tipos int que é Integer e char que é Character.
Algumas destas funcionalidades são: a conversão de tipo primitivo para objeto, conver-
são para String, conversão à partir de String, etc.
36 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
9 /*
10 * Exemplo de auto unboxing. Observe a utilização da classe Integer para
11 * conversão da String 56 em tipo int.
12 */
13 int quantidade = new Integer("56");
14
15 }
16 }
http://solutioin.com 37
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
possui a assinatura acao(String), pois o método se chama acao e recebe uma String como
parâmetro de entrada.
Não entra no conceito de assinatura de um método o seu tipo de retorno, ou seja, dois
métodos:
38 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução à orientação a objetos
4.7. Exercícios
1. Qual a diferença entre classe e objeto?
6. O que é um escopo?
9. Crie uma classe java com atributos e métodos (à sua escolha). Crie outra classe que
instancia a primeira, seta seus atributos e invoca seus métodos.
http://solutioin.com 39
Francisco Calaça, Otávio Calaça
A R R AY S
5
Arrays são estruturas de dados que permitem o armazenamento de objetos o que fa-
cilita a manipulação e transporte destes. No mundo real são utilizadas caixas quando é
necessário agrupar ou transportar objetos. No mundo do Java uma das estruturas utilizadas
são Arrays. Para trabalhar adequadamente com Arrays é necessário que você saiba como
inicializa-los. O próprio método 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 rápida e mais simples de implementar. Trata-se do for aprimorado.
int n = numeros[4];
Este exemplo acessa o quinto elemento do array (a numeração 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 não 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:
41
Versão 1.1 arrays
Figura 5.1: Um array pode ser comparado a um porta ovos, cada elemento do array pode ser com-
parado a um ovo
int [] primeiroArray;
Como nas declarações de variáveis de qualquer tipo no Java, a declaração possui duas
partes: o tipo e o nome da variável. Note que o tipo do array é escrito como tipo[], onde
tipo é o tipo de dados que será colocado no array.
Também é possível, ao declarar arrays, colocar os colchetes após a variável:
primeiroArray[0] = 2;
primeiroArray[1] = 3;
. . .
primeiroArray[8] = 4;
primeiroArray[9] = 5;
Observe neste exemplo que é, na mesma linha, declarado um array, inicializado com 10
elementos e, cada elemento, é inicializado com um determinado valor.
Uma observação importante, que costuma cair nas provas de certificação, é que quando o
array é de tipos primitivos todos os elementos deste são inicializados com 0 ou false, se for
42 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
de tipo boolean. Em array de Objetos, os elementos não são inicializados, todos continuarão
valendo null.
Array possui um atributo chamado length. Este atributo possui a quantidade de elemen-
tos do array.
O código da listagem 5.1 apresenta um exemplo de declaração e inicialização 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 não foram inicializados mas após a iteração entre
seus elementos é possível notar que os elementos do array de int valem 0 e os elementos
dos array de tipo String valem null.
A saída deste exemplo é a seguinte:
http://solutioin.com 43
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
18 }
19 }
• Ser static pois, como é o primeiro método a ser acessado em um programa Java, ainda
não é possível existir uma instância de um objeto, logo, é necessário um método static,
que pode ser acessado fora de qualquer instância de um objeto;
• Deve, sempre, receber um array de String como parâmetro. São os parâmetros para o
programa.
O código da listagem 5.2 ilustra como obter os parâmetros informados pela linha de
comando a um programa Java. Neste exemplo observe a utilização do atributo length no
laço for.
Para configurar o eclipse basta clicar no botão descrito na figura 5.2. Após isto crie
um novo Java Application, conforme ilustrado na figura 5.3. Clique na aba Arguments
e coloque os parâmetros no campo Program Arguments.
Para executar via linha de comandos basta acrescentar, após a classe, os parâmetros para
a aplicação, conforme ilustrado na figura 5.4.
44 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
Figura 5.4: Passagem de parâmetros para uma aplicação Java via linha de comando
http://solutioin.com 45
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
Observe que este for necessita apenas de dois parâmetros: A variável que receberá cada
item do array e o array. Este for percorrerá todo o array transportes e coloca, cada elemento
deste, na variável meioTransporte.
• Quando a variável passada é primitiva (byte, short, int long, float, double, char e
boolean), o valor é copiado para a variável que está recebendo, ou seja, esta pode
sofer alterações que não serão replicadas no valor da variável passada.
• Quando é passado uma variável Objeto, o valor desta também é copiado. A diferença
é que o valor de uma variável Objeto é apenas a referência a este Objeto, por isto,
tem-se a impressão que ocorreu uma passagem por referência, mas ainda é por valor,
pois este foi copiado. Lembre-se o valor de uma variável Objeto é a referência a este
objeto. Se, neste caso, for alterada a variável passada, esta também sofre alterações na
origem.
Para poder entender melhor isto, veja o código da listagem 5.5. Esta classe utiliza a classe
Pessoa descrita na listagem 6.4.
46 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
Antes:
1 2 3 4 5 6 7 8 9
Depois:
11 12 13 14 15 16 17 18 19
http://solutioin.com 47
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
4 public Pessoa(String n) {
5 nome = n;
6 }
7 }
48 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
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();
http://solutioin.com 49
Francisco Calaça, Otávio Calaça
Versão 1.1 arrays
5.8. Exercícios
1. O que são arrays?
7. Crie uma classe chamada Calculadora. Esta classe deverá possuir os métodos somar
e multiplicar que recebam uma quantidade variável de parâmetros do tipo double.
O método somar retorna a soma de todos eles e o método multiplicar o valor do
produto entre eles.
50 http://solutioin.com
Francisco Calaça, Otávio Calaça
U M P O U C O M A I S D E O R I E N TA Ç Ã O A
6
OBJETOS
No capítulo 4 foi realizada uma introdução à orientação a objetos. Neste capítulo será
apresentado mais detalhes deste novo paradigma: Encapsulamento, Herança, Abstração e
Polimorfismo. Estes elementos promovem o melhor reuso de software o que torna possível
a concepção de sistemas mais complexos e menos propensos a erros.
Outro assunto abordado neste capítulo é o coletor de lixo. Algumas tecnologias deman-
dam uma preocupação do desenvolvedor em desalocar recursos. Em Java não é necessário
preocupar-se com isto. Os objetos criados uma vez não mais referenciados são coletados
pelo Garbage Collector (Coletor de lixo).
++ Construindo o objeto: 0
e toda as vezes que estas instâncias são finalizadas pelo gc, é executado o método
void finalize(). Desta forma, é impressa a linha:
-- Finalizando o objeto: 0
++ Construindo o objeto: 0
++ Construindo o objeto: 1
51
Versão 1.1 um pouco mais de orientação 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
3 int numero;
4
5 public ObjetoColetado(int n) {
6 numero = n;
7 System.out.printf("\n++ Construindo o objeto: %d", numero);
8 }
9
14 }
10 }
• como método
52 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
• como referência
Quando utilizada como método, este acessa o construtor da própria classe. Observe que
um dos construtores do código abaixo:
//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 parâmetros para outro
construtor.
Quando utilizada como referência esta referencia o objeto da própria classe. Com this é
possível acessar os elementos da instância do objeto a partir da classe. Note que a palavra
chave this não pode ser utilizada dentro de contextos static porque nestes contextos não
são acessados a partir de instâncias 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:
//construtor
public Ponto(int a, int b) {
x = a;
y = b;
}
}
//construtor
public Ponto(int x, int y) {
http://solutioin.com 53
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação 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 referência this indica que this.x e this.y são as
variáveis x e y da classe e não do construtor. Assim:
this.x = x;
• É obrigatória a inicialização;
• Após ser inicializada seu valor não pode mais ser alterado;
6.4. Encapsulamento
Encapsulamento significa, na íntegra, colocar dentro de uma cápsula. Imagine o seguinte
cenário:
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 não será aberto. Como entregar
os avisos? Dificil! O que fazer para facilitar a entrega de informações aos visistantes do
parque?
Solução: 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 fácil avisar a todos uma vez que é obrigatória a passagem dos visitantes
pela portaria.
Encapsulamento é justamente isto. Significa fechar todas as entradas a um atributo e
construir uma portaria onde é possível entrar e sair valores para melhorar o controle sobre
os valores deste atributo.
Encapsulamento é um dos pilares da Orientação a Objetos e no java é feito da seguinte
forma:
54 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
String nome;
Apesar dos termos get e set estarem em inglês é obrigatório que estes sejam usados desta
forma. Mais adiante este padrão será necessário para correto funcionamento de determi-
nadas API’s.
Não se preocupe com isto. Hoje a maior parte das IDE’s fazem este trabalho.
No eclipse basta criar a classe, escrever os atributos nela (com o modificador private),
conforme a figura 6.1. Após isto clique com o botão direito na tela e selecione a opção
source - Generate getters and setters, conforme a figura 6.2. Clique nos parâmetros que
deseja criar os métodos getters e setters conforme a figura 6.3. A figura 6.4 apresenta os
métodos criados.
http://solutioin.com 55
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
Figura 6.2: Exemplo do encapsulamento no eclipse: Invocando o assistente para criação do encap-
sulamento
Figura 6.3: Exemplo do encapsulamento no eclipse: Escolha dos campos que serão encapsulados
56 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
6.5. Enumerações
As enumerações (ou enums) são tipos especiais de Java que permite lista limitada dos
valores. Estes valores podem ser passados às indicações de controle (switch(), if() ex.)
Em liberações prévias, a maneira padrão representar um tipo enumerated era o teste
padrão interno de Enum: teste padrão interno de Enum - tem problemas severos!
• Como os tipos são int é possível passar o número 10, por exemplo, que não corre-
sponde a nenhuma estação do ano.
• É provável 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 localização, melhorar a organização e os conflitos de nomes entre classes é
utilizado pacotes que agrupam tipos relacionados.
Definição: Um pacote é um agrupamento de tipos relacionados que facilitam o gerencia-
mento de algumas classes.
http://solutioin.com 57
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
Os tipos (classes, enumerações, interfaces) que fazem parte da plataforma java sao mem-
bros de vários pacotes como:
É possível colocar as suas classes dentro de pacotes também, utilizando a palavra chave
package:
package livro.capitulo08;
Não é permitida a existência de mais que uma declaração package. Isto se dá pelo fato
de que um tipo (classe, enum ou interface) pode estar em apenas um pacote.
A declaração package deve ser a primeira declaração do arquivo. Antes dos import’s,
antes de tudo.
Suponha que você escreveu um grupo de classes que representa objetos gráficos, como
círculos, retângulos, linhas e pontos.
Você deve colocar estas classes em um pacote por várias rasões, incluindo:
• Você ou outros programadores podem facilmente determinar que estes tipos estão
relacionados entre si.
• Você e outros programadores sabem onde encontrar os tipos que fornecem funcional-
idades gráficas.
• Os nomes dos seus tipos não conflitarão com os nomes de tipos com outros pacotes
• Você pode permitir tipos que serão acessados apenas por elementos de dentro do
mesmo pacote ou tipos que serão acessados externamente
58 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
A listagem 6.3 apresenta esses três exemplos. Nesta listagem é possível ver a declaração
de:
15 /*
16 * Note a referência direta à List, sem a necessidade
17 * de realizar um import.
18 */
19 java.util.List lista = new java.util.ArrayList();
20
21 /*
22 * Esta classe foi importada do pacote java.io, através
23 * da declaração:
24 * import java.io.*;
25 */
26 File arquivo = new File("c:\\ arquivo.txt");
27 }
28 }
http://solutioin.com 59
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
6.7. Herança
Na Orientação a Objetos uma classe pode derivar de outras classes atributos e métodos.
Uma classe que deriva, ou herda de outra classe é chamada de subclasse (também
classe derivada, classe extendida, ou classe filha). A classe é herdada por uma subclasse é
chamada de superclasse (também classe ancestral, classe pai).
A Herança define uma especialização. Desta forma uma subclasse, pode ser entendida
como uma especialização de determinada classe. Por exemplo, seja a classe Medico. Uma
especialização é Pediatra. Desta forma, um Pediatra possui todos os métodos e atributos
de Medico, afinal um Pediatra ainda é Medico. Mas, além destes, possui também atributos
e métodos específicos de Pediatra.
Exceto a classe Object, que não possui superclasses, todas as classes tem uma, e somente
uma superclasse direta (herança simples). Se uma classe não tiver herdando de outra ex-
plicitamente, então esta herda da classe Object de forma implícita.
Heraça somente é aplicado a atributos e métodos de classes. Construtores não são herda-
dos por herança.
60 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
8 pessoa.imprimirDados();
9 aluno.imprimirDados();
10 }
11
12 }
http://solutioin.com 61
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
• como método
• como referência.
Quando utilizada como método, este acessa o método 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 referência, este acessa métodos ou membros da classe Pai. Note
no método imprimirDados() o uso de super.imprimirDados(); para também imprimir os
dados de pessoa.
6.8.1 private
A palavra private restringe o acesso do método ou do atributo somente à classe que o
definiu, ou seja, um método 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 não é possível acessar o atributo nome de fora desta classe.
6.8.2 pacote
É utilizado quando não existe nenhum modificador de acesso antes da variável. Restringe
o acesso somente a classes definidas dentro do mesmo pacote, ou seja, quando não é infor-
mado nenhum modificador de acesso, o elemento pode apenas ser acessado de uma classe
que esta no mesmo pacote.
62 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
6.8.3 protected
Ele é um pouco mais liberal que o modificador padrão ou pacote, pois ele permite que um
método 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 método público pode ser acessado por qualquer classe em qualquer pacote. Utilizado
para estabelecer uma interface entre os componentes do programa.
É boa prática definir todos os membros de uma classe private e ir aumentando a acessi-
bilidade quando for necessário. Evite criar tudo do tipo public.
retorna apenas o valor true apenas se seus operandos forem precisamente o mesmo objeto.
Porém, o operador equals retorna quando os objetos contém o mesmo estado, através da
comparação 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, são carros diferentes. En-
tretanto,
meuCarro.equals(seuCarro);
poderia ser true se os atributos de ambos os carros fossem idênticos, por exemplo, mesmo
ano, mesma cor, etc.
A listagem 6.7 apresenta um exemplo de comparação de objetos. Note que apesar das
Strings possuirem o mesmo valor: texto, ao compará-las com == não é visto o resultado
esperado. Apenas com equals.
http://solutioin.com 63
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
s1 = texto
s2 = texto
s1 diferente de s2 com ==
s1 igual a s2 com equals
10 if (s1 == s2) {
11 System.out.println("s1 igual a s2 com ==");
12 } else {
13 System.out.println("s1 diferente de s2 com ==");
14 }
15
16 if (s1.equals(s2)) {
17 System.out.println("s1 igual a s2 com equals");
18 } else {
19 System.out.println("s1 diferente de s2 com equals");
20 }
21
22 }
23
24 }
System.out.println(exemplo);
Este código imprime o objeto e, ao ser convertido em String para a impressão, a máquina
virtual executará o método toString para descobrir como fazer isto.
64 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
6.10. Polimorfismo
Uma característica importante das classes reside no fato de que as subclasses de uma dada
classe são 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 herança define, desta forma, o relacionamento É
UM. Nestes casos também é possível que exista a sobrescrita de métodos. Isto permite a
realização de uma mesma operação sobre diferentes tipos de classes, desde que mantenham
algo em comum. Este efeito se chama Polimorfismo.
6.10.1 Abstração
Para que você entenda melhor a abstração veja um exemplo com o mundo real. Tome
inicialmente algumas verdades:
• Todo método abstrato não possui corpo, ou seja, no lugar dos é colocado ponto-
vírgula: ;.
http://solutioin.com 65
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
• Quando uma classe possui pelo menos um método abstrato, esta também deve ser
declarada como abstrata
• Empregado
• EmpregadoAssalariado
• EmpregadoComissionado
• EmpregadoHorista
66 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
array de tipos Empregado. Quando este array é iterado pelo for os dados salariais são
impressos de acordo com o tipo de empregado. Isto é o polimorfismo: Apesar de todos os
empregados possuirem o método calcularSalario, este se comporta de forma diferente em
função do tipo do empregado.
Polimorfismo quer dizer: várias formas de executar a mesma ação, ou seja, várias formas
de executar o calcularSalario.
15 }
http://solutioin.com 67
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
10 this.qtdHoras = qtdHoras;
11 this.valorHora = valorHora;
12 }
13
68 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
20 }
21
14 }
15
16 }
http://solutioin.com 69
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
20 }
21
22 }
70 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
6.13. Interfaces
Interfaces são equivalentes a classes com todos os métodos abstratos. A palavra chave
interface é utilizada para declara-la.
Há um vários motivos na engenharia de software onde é importante que os progra-
madores concordem com um contrato que diz como determinados componentes de soft-
ware se comunicarão. Cada grupo precisa estar habilitado a escrever código sem o conhec-
imento de como este trabalha. Geralmente estes contratos são as interfaces.
É como dirigir! Vários 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, câmbio, etc, se comportarão conforme ele espera. Não é necessário saber se o
carro possui direção elétrica ou hidráulica, como foi implementado os freios ou se o motor
funciona com combustíveis renováveis ou não. Basta conhecer a interface de comunicação
que é oferecida ao motorista.
Outro exemplo são os eletrodomésticos. Quando você adquire um eletrodoméstico, como
um liquidificador, não é necessário preocupar-se se os plugues deste servirá nas tomadas
de nossas casas. Existe a certeza que sim porque o fabricante do eletrodoméstico construiu
o plugue de acordo com a interface das tomadas residenciais.
5 void alimentar();
6 void locomover();
7
http://solutioin.com 71
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
8 }
13 @Override
14 public String toString() {
15 return "Aguia";
16 }
17 }
13 @Override
14 public String toString() {
15 return "Tigre";
16 }
17
18 }
72 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
16 }
17
18 }
6.14. Exercícios
1. O que é o coletor de lixo?
3. O que é encapsulamento?
7. O que é herança?
http://solutioin.com 73
Francisco Calaça, Otávio Calaça
Versão 1.1 um pouco mais de orientação a objetos
74 http://solutioin.com
Francisco Calaça, Otávio Calaça
T R ATA M E N T O D E E X C E Ç Õ E S
7
Os aplicativos devem estar preparados para resolver situações inesperadas como quando
um usuário digita um campo texto onde devia ser numérico ou uma data fora do padrão.
Nestes casos ocorrem exceções à forma normal da execução da rotina. Neste capítulo será
apresentado o mecanismo de exceções do Java, as palavras chaves try cath throw e throws.
try {
código que pode lançar exeção
}
catch(Exception e){
código que será exeucutado quando uma exceção ocorrer.
}
Observe que todo o código que poderá lançar alguma exceção é colocado dentro de um
bloco try.
75
Versão 1.1 tratamento de exceções
Como exercício, escreva este código e execute. Tente executá-lo passando informações
incorretas, como zero no denominador, ou valores não numéricos.
Para tratar estes erros adequadamente utilize o bloco try . . . catch.
O código da listagem 7.2 apresenta o código da listagem 7.1 com tratamento de erros.
Observe que os possíveis locais para ocorrencia de erros são:
Quando o usuário informar um valor não numérico e este o programa tentar converte-lo
para int.
outro local:
catch (NumberFormatException e) {
showMessageDialog(null, "Informe apenas números inteiros.");
} catch (ArithmeticException e) {
showMessageDialog(null, "O denominador não pode ser ZERO.");
}
Observe que é possível colocar quantos blocos catch’s quantos forem necessários e que
as exceções possuem tipos, neste caso, NumberFormatException para erros de formatação
numérica e ArithmeticException para erros de aritimética, como divisão por zero.
Em cada bloco catch foi adicionado o código necessário para tratar este tipo de erro,
neste caso, apenas a apresentação de uma mensagem ao usuário.
76 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 tratamento de exceções
3 import javax.swing.JOptionPane;
4
20 JOptionPane.showMessageDialog(null, texto);
21 }
22 }
3 import javax.swing.JOptionPane;
4
11 try {
12 int numerador = new Integer(numeradorString);
13 int denominador = new Integer(denominadorString);
14
21 JOptionPane.showMessageDialog(null, texto);
22 } catch (NumberFormatException e) {
23 JOptionPane.showMessageDialog(null, "Informe apenas números inteiros.");
24 } catch (ArithmeticException e) {
25 JOptionPane.showMessageDialog(null, "O denominador não pode ser ZERO.");
26 }
http://solutioin.com 77
Francisco Calaça, Otávio Calaça
Versão 1.1 tratamento de exceções
27 }
28 }
78 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 tratamento de exceções
9 }
3 import javax.swing.JOptionPane;
4
15 /*
16 * Verifica o login e a senha do usuário.
17 * Esta verificação normalmente é feita com dados vindos de um Banco de Dados
18 * ou LDAP. Colocamos o usuario e a senha no código para facilitar
19 * o entendimento.
20 */
21 if(!"java".equals(login) || !"123".equals(senha)){
22 throw new AutenticacaoException("Usuário ou senha inválidos");
23 }
24 }
http://solutioin.com 79
Francisco Calaça, Otávio Calaça
Versão 1.1 tratamento de exceções
25
37 }
80 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 tratamento de exceções
7.7. Exercícios
1. Explique o que são exceções.
http://solutioin.com 81
Francisco Calaça, Otávio Calaça
FLUXO DE DADOS
8
No mundo corporativo é vital a transferência de informações entre computadores. Esta
troca é feita através de fluxos de informação. Qualquer troca de dados, como rede, arquivos,
dispositivos IO é vista como um fluxo de dados em Java.
Este capítulo apresentará exemplos de fluxo de dados de arquivos e de rede com a
construção de um editor de texto simples e a construção de um trocador de mensagens
entre computadores.
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.util.Formatter;
83
Versão 1.1 fluxo de dados
22 }
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.util.Scanner;
6
84 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
21 }
22
23 }
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 informações 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 código:
botaoAbrir.addActionListener(this);
botaoSalvar.addActionListener(this);
http://solutioin.com 85
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
1 package capitulo8;
2 import java.awt.BorderLayout;
3 import java.awt.Container;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.io.File;
7 import java.io.FileNotFoundException;
8 import java.util.Formatter;
9 import java.util.Scanner;
10 import java.util.StringTokenizer;
11
12 import javax.swing.JButton;
13 import javax.swing.JFileChooser;
14 import javax.swing.JFrame;
15 import javax.swing.JOptionPane;
16 import javax.swing.JScrollPane;
17 import javax.swing.JTextArea;
18
24 public EditorTexto(){
25 Container c = getContentPane();
26
27 c.setLayout(new BorderLayout());
28 c.add(botaoAbrir, BorderLayout.NORTH);
29 c.add(botaoSalvar, BorderLayout.SOUTH);
30 c.add(new JScrollPane(areaTexto), BorderLayout.CENTER);
31
32 botaoAbrir.addActionListener(this);
33 botaoSalvar.addActionListener(this);
34
35 setTitle("Editor de Texto");
36 setSize(800,600);
37 setDefaultCloseOperation(EXIT_ON_CLOSE);
38 setVisible(true);
39 }
40
44 try {
45 if(e.getSource() == botaoAbrir){
46 jfc.showOpenDialog(this);
47 File file = jfc.getSelectedFile();
48 abrirArquivo(file);
49 }else if(e.getSource() == botaoSalvar){
50 jfc.showSaveDialog(this);
51 File file = jfc.getSelectedFile();
52 salvarArquivo(file);
86 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
53 }
54 }catch (FileNotFoundException e1) {
55 JOptionPane.showMessageDialog(null, "Arquivo não encontrado!");
56 }
57 }
58
para que não haja problemas com versões de classes. Esta é a única garantia que o objeto
trafegado, apesar de estar com os pacotes, métodos, etc idênticos possuam a mesma versão
de suas classes nos computadores envolvidos.
O eclipse possui um assistente para criar este atributo.
http://solutioin.com 87
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
não se preocupe em criar este atributo. Peça para o eclipse criar para você.
A classe Enviador, apresentada na listagem 8.5 envia as mensagens. O código responsável
por isto é:
a classe Socket cria uma comunicação com o ip 127.0.0.1 (que é a sua máquina local)
na porta 12345. A classe ObjectOutputStream cria um fluxo de dados de saida e utiliza
o socket criado na linha anterior. O método 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 laço infinito while(true). Este laço fará com que o
receptor receba mensagens enquanto estiver rodando.
a classe ServerSocket cria um socket na máquina e abre a porta 12345 (esta deverá estar
disponível). O método server.accept() aguarda até alguém enviar uma mensagem por meio
destar porta (lembre-se do Enviador que enviará mensagens por esta porta). Foi utilizado
o método readObject() para ler o objeto que está sendo trafegado, no caso, Mensagem.
3 import java.io.Serializable;
4
88 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
11
3 import java.io.IOException;
4 import java.io.ObjectOutputStream;
5 import java.net.Socket;
6 import java.net.UnknownHostException;
7
8 import javax.swing.JOptionPane;
9
19 try {
20 Socket socket = new Socket("127.0.0.1", 12345);
21 ObjectOutputStream oos = new ObjectOutputStream(socket
22 .getOutputStream());
23 oos.writeObject(mens);
24 } catch (UnknownHostException e) {
25 e.printStackTrace();
26 } catch (IOException e) {
27 e.printStackTrace();
28 }
29
http://solutioin.com 89
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
30 } while (!resposta.equals("sair"));
31 }
32 }
3 import java.io.ObjectInput;
4 import java.io.ObjectInputStream;
5 import java.net.ServerSocket;
6 import java.net.Socket;
7
21 ois.close();
22 socket.close();
23 server.close();
24 } catch (Throwable e) {
25 e.printStackTrace();
26 } finally {
27 try {
28 server.close();
29 } catch (Exception e) {
30 e.printStackTrace();
31 }
32 }
33
34 }
35 }
36
37 }
90 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 fluxo de dados
8.7. Exercícios
http://solutioin.com 91
Francisco Calaça, Otávio Calaça
GENÉRICOS E COLEÇÕES
9
Em um capítulo anterior foi abordado os Arrays. Um dos problemas dos arrays é a impos-
sibilidade de alterar seu tamanho. Neste capítulo serão abordadas outras coleções como
Listas, Conjuntos e Mapas. Estas coleções permitem ter seu tamanho alterado em tempo
de execução e se comportam de forma diferente se aproximando ao comportamento do
mundo real.
observe o uso de: < E >. Este trecho de código Especifica que tudo o que for informado
dentro das chaves < ... > será considerado apenas como E. No código da listagem 9.5 foi
colocado < Integer >, ou seja, onde tiver “E” será considerado “Integer”. Assim o método:
será considerado:
Se, na declaração da classe CaixaGenérica for utilizado < String > onde tiver < E > será
considerado como String.
Assim, evita-se erros de conversão por ser possível informar o tipo que estará na caixa
no moment da sua declaração.
93
Versão 1.1 genéricos e coleções
14 }
7 caixaDeInteiros.setObjeto(10);
8 Integer someInteger = (Integer) caixaDeInteiros.getObjeto();
9 System.out.println(someInteger);
10 }
11 }
7 /*
8 * note que estamos adicionando String na caixa
9 * propositalmente para provocar um erro de conversão
10 */
11
12 caixaDeInteiros.setObjeto("10");
13
94 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
1 package capitulo9;
2 public class CaixaGenerica <E>{
3
4 private E objeto;
5
6 public E getObjeto() {
7 return objeto;
8 }
9
14 }
7 caixaDeInteiros.setObjeto(10);
8 Integer someInteger = caixaDeInteiros.getObjeto();
9 System.out.println(someInteger);
10 }
11 }
• Listas
• Conjuntos
• Mapas
• Filas
• Pilhas
9.3. Listas
As Listas apresentam as seguintes características:
http://solutioin.com 95
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
Para exemplificar, compare com as listas do mundo real. Pense em uma lista de com-
pras que você fará em um supermercado. Os elementos desta lista podem ser ordenados,
seguindo um critério 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 código 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 código:
Collections.sort(cores);
18 for(String c : cores){
19 System.out.printf("Cor: %s\n",c);
20 }
21
22 Collections.sort(cores);
23 System.out.println("Cores após ordenação");
24 for(String c : cores){
25 System.out.printf("Cor: %s\n",c);
26 }
27
28 }
29 }
96 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
9.4. Conjuntos
Os conjuntos apresentam as seguintes características:
Para exemplificar, pense no conjunto de laranjas em uma sacola. Não é possível dizer
qual é a primeira laranja, ou seja, não é possível ordena-las. Também não é possível duplicar
laranjas. Cada laranja é única.
Os conjuntos são definidos pela interface Set. Implementam esta interface as classes
HashSet e TreeSet.
O código 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. Após a
execução desta classe, observe que a saída do programa imprime a cor azul apenas uma
vez. Isto demonstra a incapacidade dos conjuntos em conter elementos duplicados. Note
também que a ordem impressa não é igual a ordem inserida no código.
15 for(String c : cores){
16 System.out.printf("\nCor: %s",c);
17 }
18 }
19 }
9.5. Mapas
Os mapas apresentam as seguintes características:
http://solutioin.com 97
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
O código 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 associação de vegetações com regiões brasileiras.
Se for adicionado uma outra chave “cerrado”, por exemplo, esta sobrescreverá a existente
pois nos mapas não podem existir chaves duplicadas.
5 import javax.swing.JOptionPane;
6
A Listagem 9.9 apresenta um exemplo um pouco mais complexo de mapa. Neste exem-
plo é realizada a contagem da quantidade de produtos com o mesmo nome existe na lista.
Observe que no final o código:
é utilizado para percorrer os elementos do mapa que associa os produtos com suas
respectivas quantidades.
98 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
44 }
9.5.1 Properties
As propriedades são 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 semelhança com os mapas, para cada entrada existe uma informação, ou
seja,para a entrada telefone tem-se a informação: 3131-2363.
http://solutioin.com 99
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
Java possui um tipo de mapa que tem a habilidade de persistir suas informações, são as
Properties. Estas classes possuem o método:
prop.store( . . .);
para a escrita dos dados, conforme pode ser visto na listagem 9.10
e o método:
prop.load( . . . );
para carregar os dados a partir de um fluxo, conforme pode ser visto na listagem 9.11
7 import javax.swing.JOptionPane;
8
100 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
14 prop.load(fis);
15 fis.close();
16 String nomeProp = JOptionPane.showInputDialog("Qual propriedade " +
17 "deseja ver? (descricao , endereco , telefone)" );
18 JOptionPane.showMessageDialog(null, prop.getProperty(nomeProp));
19 } catch (FileNotFoundException e) {
20 e.printStackTrace();
21 } catch (IOException e) {
22 e.printStackTrace();
23 }
24 }
25 }
9.6. Pilhas
Pilhas são estrutura de dados onde o último elemento que entra é o primeiro que sai - LIFO
(last-in-first-out). É possível 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 código da listagem 9.12. Após executar este
exemplo o primeiro nome a ser impresso foi “Carlos” mas foi o último a ser adicionado na
pilha.
3 import java.util.Stack;
4
14 while(!alunos.empty()){
15 System.out.println(alunos.pop());
16 }
17 }
18
19 }
http://solutioin.com 101
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
9.7. Filas
Filas são 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 código da listagem 9.13 apresenta um exemplo de Fila.
3 import java.util.LinkedList;
4 import java.util.Queue;
5
15 while(!alunos.isEmpty()){
16 System.out.println(alunos.poll());
17 }
18 }
19
20 }
102 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
Apenas se atenha ao fato de que este método retornará algo negativo se a1 for menor
que a2, zero se forem iguais e positivo se a1 for maior.
O código do comparador por idade está na Listagem 9.15 e
10 }
http://solutioin.com 103
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
19 System.out.println("Lista original:");
20
21 for(Aluno a : alunos){
22 System.out.println(a);
23 }
24
32 }
33 }
9.9. Exercícios
104 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 genéricos e coleções
7. O que é pilha?
8. O que é fila?
9. Quais os procedimentos necessários para ordenar uma lista de String’s? 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 código da Listagem 9.16 para também
ordenar os alunos por nota.
http://solutioin.com 105
Francisco Calaça, Otávio Calaça
UML: UNIFIED MODELING LANGUAGE
10
Este capítulo lhe fornecerá uma visão rápida dos fundamentos da UML. Tenha em mente
que isto não é um tutorial detalhado sobre UML, mas apenas uma rápida introdução 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 análise e desenho de soft-
ware, consulte um dos muitos livros disponíveis sobre o tópico. Existem também muitos
tutoriais na Internet os quais você pode usar como ponto de partida.
A Unified Modelling Language (UML) é uma linguagem ou notação de diagramas para
especificar, visualizar e documentar modelos de ’software’ orientados por objetos. O UML
não é um método de desenvolvimento, o que significa que não 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 indústria para descrever graficamente o ’software’.
O UML está desenhado para o desenho de ’software’ orientado por objetos e tem uma
utilização limitada para outros paradigmas de programação.
A UML é composta por muitos elementos de modelo que representam as diferentes
partes de um sistema de software. Os elementos UML são usados para criar diagramas,
que representam um determinada parte, ou um ponto de vista do sistema.
10.1.1 Classe
Um Classe define os atributos e os métodos de um conjunto de objetos. Todos os objetos
desta classe (instâncias desta classe) compartilham o mesmo comportamento, e possuem
107
Versão 1.1 uml: unified modeling language
o mesmo conjunto de atributos (cada objeto possui seu próprio conjunto). O termo “Tipo”
é algumas vezes usado ao invés de Classe, mas é importante mencionar que estes dois
termos não são a mesma coisa, e Tipo é um termo mais genérico.
Em UML Classes são representadas por retângulos, com o nome da classe, e podem tam-
bém mostrar os atributos e operações da classe em dois outros “compartimentos” dentro
do retângulo.
10.1.1.1 Atributos
Na UML, atributos são mostrados com pelo menos seu nome, e podem também mostrar
seu tipo, valor inicial e outras propriedades. Atributos podem também ser exibidos com
sua visibilidade:
10.1.1.2 Operações
Operações (métodos) também são exibidos com pelo menos seu nome, e podem tam-
bém mostrar seus parâmetros e valores de retorno. Operações podem, como os Atributos,
mostras sua visibilidade:
10.1.2.1 Generalização
A herança é um dos conceitos fundamentais da programação orientada por objetos, nos
quais uma classe “ganha” todos os atributos e operações da classe que herda, podendo
108 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 uml: unified modeling language
sobrepor ou modificar algumas delas, assim como adicionar mais atributos ou operações
próprias.
EM UML, uma associação Generalização entre duas classes coloca-as numa hierarquia
representando o conceito de herança de uma classe derivada de uma classe base. Em UML,
Generalizações são representadas por uma linha conectando duas classes, com uma seta
no lado da classe base.
10.1.2.2 Associações
Um associação representa um relacionamento entre classes, e fornece a semântica comum
e a estrutura para muitos tipos de “conexões” entre objetos.
Associações são o mecanismo que permite objetos comunicarem-se entre si. Elas de-
screvem a conexão entre diferentes classes (a conexão entre os objetos atuais é chamada
conexão do objeto, ou link.
Associações podem ter um regra que especifica o propósito da associação 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 associação também possui uma valor de multiplicidade, que dita como muitos objetos
neste lado da associação pode relacionar-se com o outro lado.
Em UML, associações são representadas como linhas conectando as classes participantes
do relacionamento, e podem também mostrar a regra e a multiplicidade de cada um dos
participantes. A multiplicidade é exibida como um intervalo [min...máx] de valores não
negativos, com uma estrela (*) no lado máximo representando infinito.
10.1.2.3 Agregação
Agregações são um tipo especial de associação no qual as duas classes participantes não
possuem em nível igual, mas fazem um relacionamento “todo-parte”. Uma Agregação de-
screve como a classe que possui a regra do todo, é composta (tem) de outras classes, que
http://solutioin.com 109
Francisco Calaça, Otávio Calaça
Versão 1.1 uml: unified modeling language
possuem a regra das partes. Para Agregações, a classe que age como o todo sempre tem
uma multiplicidade de um.
Em UML, Agregações são representadas por uma associação que mostra um romboide
no lado do todo.
10.1.2.4 Composição
Composições são associações que representam agregações muito fortes. Isto significa que
Composições formam relacionamentos todo-parte também, mas o relacionamento é tão
forte que as partes não pode existir independentes. Elas existem somente dentro do todo,
e se o todo é destruído as partes morrem também.
Em UML, Composições são representadas por um romboide sólido no lado do todo.
110 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 uml: unified modeling language
Quando trabalhar com Casos de Uso, é importante lembrar-se de algumas regras simples:
• Cada Caso de Uso liga-se a um resultado relevante (um resultado com “valor de
negócio”);
Casos de Uso também podem ter relacionamentos com outros Casos de Uso. Os três
tipos mais comuns de relacionamento entre Casos de Uso são:
• «inclui-se» que especifica que um Caso de Uso toma lugar dentro de outro Caso de
Uso
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 exem-
plo usuários do sistema), outro sistema de computador ou eventos externos.
Atores não representam as pessoa física 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 su-
porte 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”
http://solutioin.com 111
Francisco Calaça, Otávio Calaça
Versão 1.1 uml: unified modeling language
112 http://solutioin.com
Francisco Calaça, Otávio Calaça
THREADS
11
Thread, ou linha de execução em português, é uma forma de um processo dividir a si
mesmo em duas ou mais tarefas que podem ser executadas simultaneamente.
Uma linha de execução permite que o usuário do seu programa, por exemplo, utilize
uma funcionalidade do ambiente enquanto outras linhas de execução realizam outros cál-
culos e operações. Os sistemas que suportam apenas uma única linha de execução são
chamados de monothread e aqueles sistemas que suportam múltiplas linhas de execução
são chamados de multithread.
11.1.1 Processos
Um processo geralmente tem um conjunto completo e restrito de recursos para sua exe-
cução, ou seja, cada processo tem seu próprio espaço de memória.
Processos são sinonimos de programas e aplicações. Como o espaço de memória e restrito
a cada processo, a comunicação entre processos é feita através do sistema operecional com
pipes e sockets. Esta comunicação pode ser feita entre processos na mesma máquina ou em
diferentes máquinas.
11.1.2 Threads
Threads são, 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 memória e arquivos abertos. Isto é muito eficiente para a
comunição de recursos.
Execução multithread é um caracteristica da plataforma Java. Cada aplicação Java é com-
posta de várias thread. As threads tornam os programas mais eficientes pois, com elas, é
possível realizar mais de uma atividade simultaneamente. Uma thread possui a habilidade
de criar novas threads.
113
Versão 1.1 threads
Independente da forma que se cria a thread o código a ser executado pela thread deve
estar no método run:
public void run()
Para iniciar a thread é necessário executar o método 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 método 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. Também foi utilizado o
método start para iniciar a thread.
114 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
11 thread1.start();
12 thread2.start();
13 }
14 }
threads.execute(t1);
threads.execute(t2);
threads.execute(t3);
http://solutioin.com 115
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
são colocadas três threads no pool. Como apenas duas threads serão executadas a terceira
irá esperar uma das duas anteriores terminar para começar sua execução.
3 import java.util.concurrent.*;
4
11.5. Sincronização
Quando duas threads compartilham dados é comum que haja problemas com sincroniza-
ção. Para que você entenda melhor este problema observe o exemplo. A classe Troca está
na listagem 11.6. Note que esta classe possui o método trocar que recebe um boolean. Se o
boolean for true as variáveis a e b receberão 5 e 7, sendo false receberão 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 é compartil-
hado entre as threads es1 e es2. Uma dessas threads é instanciada com true a outra com
116 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
http://solutioin.com 117
Francisco Calaça, Otávio Calaça
Versão 1.1 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 saída:
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 não estão sincronizadas. Uma thread inicia o trabalho,
a outra termina. Para resolver este problema é necessário sincronizar o método trocar:
synchronized public void trocar(boolean bol). Ao acrescentar a palavra chave synchro-
nized no método fará com que este não possa ser executado por duas threads simultanea-
mente.
6 private int b;
7
18 if (bol) {
19 System.out.printf("%d = 5 e %d = 7 \n", a, b);
20 } else {
21 System.out.printf("%d = 11 e %d = 13 \n", a, b);
22 }
23 }
24 }
118 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
10 }
11
3 import java.util.concurrent.ExecutorService;
4 import java.util.concurrent.Executors;
5
14 ExecutorService t1 = Executors.newFixedThreadPool(2);
15 t1.execute(es1);
16 t1.execute(es2);
17 t1.shutdown();
18 }
19 }
http://solutioin.com 119
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
19 if (primo) {
20 System.out.printf("\nO número: %d é primo", numero);
21 } else {
22 System.out.printf("\nO número: %d não é primo", numero);
23 }
24 }
25 }
3 import javax.swing.JOptionPane;
4
20 } while (!resposta.equals("sair"));
21 }
22 }
120 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 threads
11.7. Exercícios
1. O que são threads?
http://solutioin.com 121
Francisco Calaça, Otávio Calaça
S T R I N G S E D ATA S
12
Converter Datas em Strings e Strings em Datas é um dos assuntos deste capítulo. 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
manipulação. Outra coisa,normalmente é necessária, é formatar uma data em textos para
que seja melhor apresentada ao usuário.
Na versão 5 do Java foi acrescentado a saída formatada assunto também abordado neste
capítulo. Com a saída formatada é mais simples a formatação de números, datas e outros.
Calendar.getInstance();
Para obter a data e hora atuais pode ser utilizado o construtor default da classe Date:
3 import java.util.Calendar;
4
15 }
123
Versão 1.1 strings e datas
3 import java.text.DateFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7
8 import javax.swing.JOptionPane;
9
29 }
30
31 }
124 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 strings e datas
15 long t2 = System.currentTimeMillis();
16 return t2 - t1;
17 }
18
27 long t2 = System.currentTimeMillis();
28 return t2 - t1;
29 }
30
http://solutioin.com 125
Francisco Calaça, Otávio Calaça
Versão 1.1 strings e datas
Observe que a string formatadora “%s, %s” recebe os parâmetros texto1 e texto2 o os
formata uma após o outro separados com uma vírgula.
Observe que a passatem dos parâmetros texto1 e texto2 são impressos na mesma ordem
que aparecem. É possível alterar esta ordem utilizando indices.
O exemplo
%5d
\%.2
Este exemplo apresentará um número com ponto flutuante com duas casas decimais.
A listagem 12.4 apresenta um exemplo com várias opções de formatação.
126 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 strings e datas
http://solutioin.com 127
Francisco Calaça, Otávio Calaça
Versão 1.1 strings e datas
3 import java.util.Date;
4
9 /*
10 * Exemplo de formatação de números inteiros
11 */
12 System.out.println("Formatação de inteiros");
13 int inteiro = 123;
14 System.out.printf("%10s %10s %10s", "DECIMAL", "OCTAL", "HEXADECIMAL");
15 System.out.printf("\n%1$10d %1$10o %1$10X", inteiro);
16
17 /*
18 * Exemplo de formatação de ponto flutuante
19 */
20 System.out.println("\n\nFormatação de ponto flutuantes");
21 double flutuante = 1.2345;
22 System.out.printf("%.3f", flutuante);
23
24 /*
25 * Formatação de Datas e Horas
26 */
27 System.out.println("\n\nFormatação de datas e horas");
28 Date hoje = new Date();
29 System.out.printf("Hora atual: %1$tH:%1$tM:%1$tS", hoje);
30 System.out.printf("\nData formatada: %1$tF", hoje);
31 System.out.printf("\nData atual: %1$td/%1$tm/%1$tY", hoje);
32
33 }
34 }
12.6. Exercícios
1. Qual a diferença do uso das classes Date e Calendar?
2. Crie uma classe que receba a data no formato dd/MM/yyyy e converta para o for-
mato yyyy-mm-dd utilizando a classe SimpleDateFormat.
128 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 strings e datas
http://solutioin.com 129
Francisco Calaça, Otávio Calaça
JDBC
13
Um Sistema Gerenciador de Banco de Dados (SGBD) é o conjunto de programas de com-
putador responsáveis pelo gerenciamento de uma base de dados. O principal objetivo é
retirar da aplicação o trabalho e a responsabilidade de gerenciar o acesso e a segurança
de suas informações. Em bancos de dados relacionais é utilizada a linguagem SQL para
manipulação dos registros.
Normalmente as pessoas chamam os SGBDs de apenas Banco de Dados. No decorrer
deste capítulo onde estiver o termo Banco de Dados entenda que são estas estruturas com-
plexas de armazenamento de informações.
JDBC (Java Database Connectivity) é a API do Java para trabalhar com Banco de Dados.
Com ela é possível executar instruções ler registros executar funções no Banco de Dados.
Trata-se de um conjunto de interfaces e classes que possuem os métodos necessários para as
mais diversas atividades com um banco de dados. As interfaces são implementadas pelos
drivers JDBC que são específicos para cada banco.
• O Driver do banco
• A URL de conexão
• O usuário
• A senha
Class.forName("org.postgresql.Driver");
DriverManager.getConnection(
"jdbc:postgresql://localhost/treinamento",
"postgres", "123456");
131
Versão 1.1 jdbc
3 import java.sql.*;
4
132 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
13.2.1 SELECT
Instrução para consulta de registros. Sua sintaxe é:
Um Exemplo: Para buscar todos os registros da tabela CLIENTE pode ser utilizado o
seguinte SQL:
SELECT CODIGO, NOME, TELEFONE, ENDERECO, NASCIMENTO FROM CLIENTE WHERE CODIGO = 5
SELECT CODIGO, NOME, CPFCNPJ, ENDERECO, MUNICIPIO FROM CLIENTE WHERE NOME LIKE ’Ma%’
O caracter “%” substituirá com zero ou mais caracteres na busca. O caracter _ substi-
tuirá apenas com um caracter.
http://solutioin.com 133
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
13.2.4 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:
13.2.5 UPDATE
Permite alterar registros em um tabela. Sua sintaxe é:
Note a existência da cláusula WHERE. Se não for especificada todos os registros da tabela
serão alterados para <VALOR>.
Para alterar o nome do CLIENTE com código 5 para Joao Carlos pode ser utilizada a
seguinte instrução:
13.2.6 DELETE
Permite excluir registros em uma tabela. Sua sintaxe é:
Note o uso da cláusula WHERE. Sem especifica-la todos os registros da tabela serão
excluídos.
Para excluir o registro com código 5 da tabela é utilizada a seguinte instrução:
134 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
Os comando SQL para alteração de registros são o INSERT, UPDATE e DELETE. Para a
execução destes comandos podem ser utilizados os métodos
execute
ou
executeUpdate
3 import java.sql.*;
4
13 while (rs.next()) {
14 System.out.printf("%-30s%-30s%-30s%-30s%-30s\n",
15 rs.getString("nome"), rs.getString("cpfCnpj"),
16 rs.getString("endereco"),
17 rs.getString("municipio"),
18 rs.getString("uf"));
19 }
20
21 con.close();
22 } catch (SQLException e) {
23 e.printStackTrace();
http://solutioin.com 135
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
24 }
25 }
26 }
13.3.1 PreparedStatement
Com a interface PreparedStatement é possível passar parâmetros para as instruções SQL.
No lugar dos parâmetros são utilizados pontos de interrogação (?):
Observe que após a criação da instrução é necessário passar os parâmetros com setInt.
Exite também o setString, setDate, setLong, enfim, uma infinidade de possibilidades de
passagem de valores para a instrução.
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.SQLException;
6 import java.sql.Statement;
7
136 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
66
71 long t2 = executarSemBatch();
72 System.out.printf("Sem Batch: %d (ms)\n", t2);
73 }
74 }
http://solutioin.com 137
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
138 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
46 this.endereco = endereco;
47 }
48
A listagem 13.5 apresenta a classe ClienteDao. Observe que foi colocada nesta classe os
métodos de acesso ao Banco de Dados como incluir, excluir e listar. Colocar os métodos
que acessam o Banco de Dados fora da entidade Cliente é uma boa prática de programação
pois facilita a alteração da estrutura de dados.
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8 import java.util.ArrayList;
9 import java.util.List;
10
http://solutioin.com 139
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
27 try {
28 PreparedStatement pstmt = con.prepareStatement("insert into cliente " +
29 "(nome , cpfcnpj , endereco , municipio , uf) values (?, ?, ?, ?, ?)" );
30 pstmt.setString(1, cliente.getNome());
31 pstmt.setString(2, cliente.getCpfCnpj());
32 pstmt.setString(3, cliente.getEndereco());
33 pstmt.setString(4, cliente.getMunicipio());
34 pstmt.setString(5, cliente.getUf());
35 pstmt.execute();
36 } finally {
37 con.close();
38 }
39 } catch (SQLException e) {
40 e.printStackTrace();
41 }
42 }
43
140 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
78
79 }
A listagem 13.6 apresenta a classe Agenda. Esta classe obtém as informações com o
usuário do sistema armazena no Banco de Dados e apresenta a lista de clientes cadastrados.
3 import java.util.List;
4
5 import javax.swing.JOptionPane;
6
13.6. Exercícios
1. O que é JDBC ?
http://solutioin.com 141
Francisco Calaça, Otávio Calaça
Versão 1.1 jdbc
2. Descreva os passos necessários para obter um conexao (Connection) Java com o Banco
de dados.
142 http://solutioin.com
Francisco Calaça, Otávio Calaça
J AVA P E R S I S T E N C E A P I C O M
14
H I B E R N AT E
143
Versão 1.1 java persistence api com hibernate
O próximo passo é a configuração das dependências da JPA. Para isto, clique com o botão
direito do mouse sobre o projeto e vá em Properties. Clique em Java Build Path. Adicione
os arquivos .jar que estão no diretório AmbienteTrabalho/Material/materialJpa/libJpa. A Figura
14.2 ilustra este passo.
3 import javax.persistence.Entity;
4 import javax.persistence.GeneratedValue;
5 import javax.persistence.Id;
6
7 @Entity
8 public class Cliente {
9
144 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
10 @Id
11 @GeneratedValue
12 private int id;
13
http://solutioin.com 145
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
62 }
63
146 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
http://solutioin.com 147
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
14.5. O EntityManager
Inicialmente deve ser criada uma instância de EntityManagerFactory. Isto é realizado
através do código:
neste momento, o engine da JPA irá validar as tabelas em relação às classes anotadas. Em
alguns engines (como é o caso do Hibernate) é possível configurar para que, neste momento,
também 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 instâncias de EntityManager.
O método createEntityManager() retorna uma instância de EntityManager. Esta instân-
cia irágerenciar o contexto de persistência. A classe da listagem 14.3 apresenta um exemplo
de utilização do EntityManager.
3 import java.util.List;
4
5 import javax.persistence.EntityManager;
6 import javax.persistence.EntityManagerFactory;
7 import javax.persistence.Persistence;
8 import javax.persistence.Query;
9
148 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
33
34 }
3 import java.util.List;
4
5 import javax.swing.JOptionPane;
6
http://solutioin.com 149
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
em.find(Cliente.class, 2)
neste caso será retornado o registro com id = 2 da tabela que persiste os objetos do tipo
Cliente.
• Um para um - @OneToOne
150 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
6 import java.util.ArrayList;
7 import java.util.List;
8
9 import javax.persistence.Entity;
10 import javax.persistence.GeneratedValue;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14
15 @Entity
16 public class Curso {
17
18 @Id
19 @GeneratedValue
20 private int id;
21
24 @JoinColumn(name="curso _ id")
25 @OneToMany(cascade=ALL, fetch = EAGER)
26 private List<Disciplina> disciplinas = new ArrayList<Disciplina>();
27
http://solutioin.com 151
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
3 import javax.persistence.Entity;
4 import javax.persistence.GeneratedValue;
5 import javax.persistence.Id;
6
7 @Entity
8 public class Disciplina {
9
10 @Id
11 @GeneratedValue
12 private int id;
13
3 import java.util.List;
4
152 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
31 }
32
33 }
• TABLE - designa uma tabela relacional definida pelo usuário a partir da qual as
chaves numéricas serão geradas.
• SEQUENCE - Interage com as sequences dos bancos de dados que suportam esta
tecnologia como Oracle, PostGres, HSQLDB, etc.
No exemplo foi utilizada a estratégia SEQUENCE por ser esta suportada pelo banco de
dados Postgres, utilizado neste livro. A classe Cliente apresentada na listagem 14.1 contém
este exemplo.
Se desejar configurar o nome da sequence no banco de dados, utilize a seguinte sintaxe:
http://solutioin.com 153
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="produto_seq")
@SequenceGenerator(sequenceName="produto_seq", name="produto_seq",
allocationSize=1, initialValue=1)
Outro exemplo, para retornar apenas os cursos que contenham a disciplica com nome
FÍSICA, basta utilizar:
select c from Curso c left join fetch c.disciplinas d where d.nome = ’FÍSICA’
neste caso, serão retornados todos os registros que contém nome igual a Java.
154 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java persistence api com hibernate
14.10. Exercícios
1. O que é o mapeamento objeto-relacinal?
2. Quais os procedimentos necessários para tornar um bean apto a trabalhar com JPA?
7. O que é JPA-QL ?
http://solutioin.com 155
Francisco Calaça, Otávio Calaça
A P L I C AT I V O S W E B
15
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 exe-
cução deles está no servidor e que a conectividade é máxima. É possível utilizar aplicativos
WEB em qualquer região do mundo bastando apenas estar conectado com o sistema.
É possível construir aplicativos WEB com Java. O que consistem em apenas utilizar a
tecnologia Java para gerar CSS, HTML e JavaScript.
15.1. XML
XML é a abreviação de EXtensible Markup Language (Linguagem extensível de marcação).
Trata-se de uma linguagem que é considerada uma grande evolução na internet.
O XML é uma especificação técnica desenvolvida pelo W3C (World Wide Web Consor-
tium - entidade responsável pela definição da de padrões da internet), para ser um padrão
de comunicação entre sistemas. Em Java além de troca de informações entre sistemas o
XML também é muito utilizado para configurar recursos. O XML provê uma representação
estruturada dos dados. Isto o torna amplamente utilizado e de fácil utilização. É possível
representar vários tipos de estrutura de dados com XML.
O XML provê um padrão que pode codificar o conteúdo, as semânticas e as esquema-
tizações para uma grande variedade de aplicações desde simples até as mais complexas,
dentre elas:
• Um simples documento.
157
Versão 1.1 aplicativos web
15.2. HTML
HTML (acrônimo para a expressão inglesa HyperText Markup Language, que significa Lin-
guagem de Marcação de Hipertexto) é uma linguagem de marcação utilizada para produzir
páginas na Web. Documentos HTML podem ser interpretados por navegadores.
<html>
<head>
<title>Título do Documento</title>
</head>
<body>
texto,
imagem,
links,
...
</body>
</html>
158 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
• < html >: define o início de um documento HTML e indica ao navegador que todo
conteúdo posterior deve ser tratado como uma série de códigos HTML.
• < head >: define o cabeçalho de um documento HTML, que traz informações sobre
o documento que está sendo aberto.
• < body >: define o conteúdo principal, o corpo do documento. Esta é a parte do doc-
umento HTML que é exibida no navegador. No corpo podem-se definir propriedades
comuns a toda a página, como cor de fundo, margens, e outras formatações.
15.2.1.1 Cabeçalho
Dentro do cabeçalho existem os seguintes comandos:
• < title >: define o título da página, que é exibido na barra de título dos navegadores.
• < script >: define programação de certas funções em página com scripts, podendo
adicionar funções de JavaScript.
• < link >: define ligações da página com outros arquivos como feeds, CSS, scripts,
etc.
• < meta >: define propriedades da página, como codificação de caracteres, descrição
da página, autor, etc. São meta informações sobre documento. Tais campos são muitos
usados por motores de busca para obterem mais informações sobre o documento,
afim de classificá-lo melhor. Por exemplo, pode-se adicionar o código < meta name="description"
content="descrição da sua página" / > no documento HTML para indicar ao motor
de busca que texto de descrição apresentar junto com a ligação para o documento.
http://solutioin.com 159
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
15.3. JavaScript
JavaScript é uma linguagem de programação criada pela Netscape em 1995, que a princípio
se chamava LiveScript, para atender, principalmente, as seguintes necessidades:
• Interação com a página. Assim, foi feita como uma linguagem de script. Javascript
tem sintaxe semelhante à do Java, mas é totalmente diferente no conceito e no uso.
Sua união com o CSS é conhecida como DHTML. Usando o Javascript, é possível modi-
ficar dinamicamente os estilos dos elementos da página 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 padrão ECMA, o ECMA-
262, também conhecido como ECMAScript. Este padrão é seguido, por exemplo, pela lin-
guagem ActionScript da Adobe.
O uso de JavaScript em páginas HTML deve ser informado ao navegador da seguinte
forma:
<script type="text/javascript">
</script>
Caso contrário, o navegador irá interpretar o script como sendo código HTML, escrevendo-
o na página.
Na listagem 15.2 é apresentado um exemplo de JavaScript. Neste exemplo existem duas
funções: clicar e formatarData. A função clicar incrementa o valor o botão a cada vez que é
clicado no botão. A função formatarData formata uma data com as barras quando o campo
de data perde o foco.
6 <script type="text/javascript">
7 var qtdVezes = 0;
160 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
8 function clicar(comp){
9 qtdVezes++;
10 complemento = qtdVezes > 1 ? "es" : "";
11 comp.value = qtdVezes + " vez" + complemento;
12 }
13
14 function formatarData(comp){
15 data = comp.value;
16 data = data.substring(0,2) + "/" + data.substring(2,4) + "/" +
17 data.substring(4,8);
18 comp.value = data;
19 }
20 </script>
21
22 <body>
23 Clique no botão:
24 <input type="button" value="Clique" onclick="javascript:clicar(this)"/>
25 <br/>
26 Data:<input type="text" onblur="javascript:formatarData(this)"/>
27 </body>
28 </html>
15.4. CSS
Cascading Style Sheets, ou simplesmente CSS, é uma linguagem de estilo utilizada para
definir a apresentação de documentos escritos em uma linguagem de marcação, como
HTML ou XML. Seu principal benefício é prover a separação entre o formato e o conteúdo
de um documento.
Ao invés de colocar a formatação dentro do documento, o desenvolvedor cria um link
(ligação) para uma página que contém os estilos, procedendo de forma idêntica para todas
as páginas de um site. Quando quiser alterar a aparência do site basta portanto modificar
apenas um arquivo, o arquivo de estilo.
As especificações do CSS podem ser obtidas no site da W3C "Word Wide Web Consor-
tium", um consórcio de diversas empresas que buscam estabelecer padrões para a internet.
É importante notar que nenhum browser suporta igualmente as definições do CSS. Desta
forma, o webdesigner deve sempre testar suas folhas de estilo em browsers de vários fab-
ricantes, e preferencialmente em mais de uma versão, para se certificar de que o que foi
codificado realmente seja apresentado da forma desejada.
Com a variação de atualizações dos navegadores (browsers) como Internet Explorer que
ficou sem nova versão 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 código:
/* comentário em css */
body
http://solutioin.com 161
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
{
font-family: Arial, Verdana, sans-serif;
background-color: #FFFFFF;
margin: 5px 10px;
}
define fonte padrão Arial, caso não exista substitui por Verdana, caso não exista define
qualquer fonte sem serifa. Define também a cor de fundo do corpo da página.
Na listagem 15.3 é apresentado um exemplo de uma página HTML. Note a tag link:
Esta tag faz ligação com o arquivo da listagem 15.4 que é o arquivo CSS. Observe que no
estilo.css existem definições de formatação das tags da página da listagem 15.3.
162 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
2 font-family: verdana;
3 font-size: 25pt;
4 color: #00aa22;
5 font-weight: bold;
6 }
7
8 th{
9 font-family: verdana;
10 font-size: 15pt;
11 color: #0022aa;
12 }
13 td{
14 font-family: verdana;
15 font-size: 12pt;
16 color: #00aa22;
17 background-color: #ccccff;
18 }
JAVA_HOME
http://solutioin.com 163
Francisco Calaça, Otávio Calaça
Versão 1.1 aplicativos web
15.6. Exercícios
1. O que são arquivos xml?
3. O que é JavaScript?
5. O que é css?
164 http://solutioin.com
Francisco Calaça, Otávio Calaça
S E RV L E T S
16
Servlet é uma tecnologia que insere novos recursos a um servidor, a definição mais usada
é que são consideradas extensões de servidores, essa tecnologia disponibiliza ao desen-
volvedor do sistema uma interface para o servidor de aplicação, através de uma API. As
aplicações baseadas em Servlet geram conteúdo dinâmico e interagem com os clientes, uti-
lizando o modelo request/response (requisição e resposta) do protocolo HTTP. Apesar de
normalmente utilizam o protocolo HTTP, os Servlets não são restritos a ele.
Um Servlet necessita de um contêiner Web para ser executado. Este contêiner Web pode
ser um servidor de aplicações como o JBoss, GlassFish, Apache Gerônimo, etc ou apenas
um contêiner como o Tomcat.
A estrutura de um Servlet é simples, basicamente são classes Java que implementam a
interface Servlet. Os servlets que responderão ao protocolo HTTP (a maioria) deveom es-
tender a classe HttpServlet, que implementa a interface Servlet. Além disto é necessário
configurar o Servlet no descritor de implantação da aplicação. Este descritor de implan-
tação é o arquivo web.xml.
• classes - É o diretório onde ficam as classes Java. Este diretório é opcional, precisa
existir apenas se existirem classes Java na aplicação.
• lib - É o diretório onde ficam os arquivos .jar. Este diretório é opcional, precisa existir
apenas se existirem arquivos .jar.
165
Versão 1.1 servlets
método doGet é o método executado quando ocorre uma requisição a esse servlet. Note
que nesse método é gerada uma resposta html que será apresentada no browser.
Para que tudo funcione corretamente é necessário montar a estrutura de um aplicativo
web apresentado na figura 16.1. Primeiramente crie o diretório app1. Dentro do diretório
app1 crie o diretório WEB-INF. dentro do diretório WEB-INF crie o diretório classes. Com-
pile a classe PrimeiroServlet e após isto coloque o pacote capitulo16 gerado dentro do
diretório classes. Note que para compilar essa classe é necessário ter o arquivo servlet.jar
configurado no classpath de compilação. Este arquivo pode ser encontrado dentro de com-
mon/lib do tomcat instalado. Crie o descritor de implantação apresentado na listagem
18.10 e coloque-o dentro do diretório WEB-INF. Certifique-se de ter ficado como a figura
16.1.
Após ter montado esta estrutura coloque-a dentro do diretório webapps do tomcat in-
stalado no capítulo anterior. Certifique-se de que o tomcat esteje sendo executado. Acesse
o endereço: http://localhost:8080/app1/prim. Se aparecer a figura 16.2 tudo funcionou
corretamente.
3 import java.io.IOException;
4 import java.io.PrintWriter;
5
6 import javax.servlet.ServletException;
7 import javax.servlet.annotation.WebServlet;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 @WebServlet("/PrimeiroServlet")
13 public class PrimeiroServlet extends HttpServlet {
14
166 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
20 out.println("<BODY >");
21 out.println("<H1>PRIMEIRO SERVLET FUNCIONANDO ...</H1>");
22 out.println("</BODY >");
23 out.println("</HTML >");
24 out.close();
25 }
26
27 }
4 <servlet>
5 <servlet-name>primeiro</servlet-name>
6 <servlet-class>capitulo16.PrimeiroServlet</servlet-class>
7 </servlet>
8
9 <servlet-mapping>
10 <servlet-name>primeiro</servlet-name>
11 <url-pattern>/prim</url-pattern>
12 </servlet-mapping>
13 </web-app>
http://solutioin.com 167
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
Vá em File - New - Project. Escolha Dynamic Web Project, conforme ilustrado na figura
16.7.
Na tela seguinte é possível configurar o nome da aplicação e em qual servidor será
executada. Escolha Apache Tomcat v5.5 conforme a figura 16.8. Se não aparecer esta opção
clique no botão New e configure.
Na tela seguinte é possível configurar os FrameWorks utilizados neste projeto. Deixe
como está. Esta tela está ilustrada na figura 16.9.
Por último é possível configurar o nome do contexto. O diretório onde ficará os arquivos
WEB e o diretório onde ficarão os arquivos .java conforme mostra a figura 16.10.
168 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
http://solutioin.com 169
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
170 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
http://solutioin.com 171
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
172 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
o atributo action descreve qual recurso será invocado quando for clicado no botao submit
e o atributo method descreve qual método será utilizado, no caso GET.
Observe que os parâmetros que você digitou no formulário aparecem na url enviada
pelo browser. Esta é a característica do método get: envia os parâmetros através da URL.
3 import java.io.IOException;
4 import java.io.PrintWriter;
5
6 import javax.servlet.RequestDispatcher;
7 import javax.servlet.ServletException;
8 import javax.servlet.annotation.WebServlet;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 @WebServlet("/ExemploGet")
14 public class ExemploGet extends HttpServlet {
15
22 out.println("<html >");
23 out.println("<body >");
24 out.printf("%s nasceu em %s", nome, nascimento);
25 out.println("</body >");
26 out.println("</html >");
27 out.close();
28 }
29 }
Listagem 16.4: Página Html que enviará as informações através do método get
1 <html>
2 <head>
3 <title>Exemplo Get</title>
4 </head>
5 <body>
6 <form action="ExemploGet" method="get">
7 Nome: <input type="text" name="nome" /><br/>
8 Data de nascimento: <input type="text" name="nascimento" /><br/>
9 <input type="submit" value="Enviar"/>
10 </form>
11 </body>
12 </html>
http://solutioin.com 173
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
3 import java.io.IOException;
4 import java.io.PrintWriter;
5
6 import javax.servlet.RequestDispatcher;
7 import javax.servlet.ServletException;
8 import javax.servlet.annotation.WebServlet;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 @WebServlet("/ExemploPost")
14 public class ExemploPost extends HttpServlet {
15
24 out.println("<html >");
25 out.println("<body");
26 out.printf("Nome: %s <br/>", nome);
27 out.printf("Endereco: %s <br/>", endereco);
28 out.printf("Salario: %s <br/>", salario);
29 out.println("</body >");
30 out.println("</html >");
31 out.close();
32 }
33 }
Listagem 16.6: Página Html que enviará as informações através do método post
1 <html>
2 <head>
3 <title>Exemplo método post</title>
174 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
4 </head>
5 <body>
6 <form action="ExemploPost" method="POST">
7 <pre>
8 Nome: <input type="text" name="nome" />
9 Endereco: <input type="text" name="endereco" />
10 Salario: <input type="text" name="salario" />
11 <input type="submit" />
12 </pre>
13 </form>
14 </body>
15 </html>
16.6. Redirect
Para exemplificar o redirect pense em um Call Center. Imagine você ligando para um Call
Center para fazer uma reclamação de sua conta telefônica. Após ser atendido pelo primeiro
atendente você conta toda a história que originou a ligação. O atentende espera até você
terminar e diz: Não é comigo. Vou transfefir o senhor para o departamento responsável.
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: Também não é comigo. Vou transferir o senhor para o
departamento responsável. Aí você um pouco mais irritado espera. Na terceira vez conta,
novamente toda a história e assim vai.
Neste caso ocorre um redirect. Quando é feito um redirect entre recursos WEB com
o protocolo HTTP é como se fosse necessário contar novamente toda a história ao novo
recurso e fica claro, para o solicitante, que houve mudança de “servlet atendente”.
As páginas das Listagens 16.9 e 16.10 apresentam o resultado.
Note o uso do método sendRedirect:
response.sendRedirect(pagina);
para realizar o redirecionamento para a página de resultado. Com o redirect será feita
uma nova requisição para as páginas e você observará que, ao clicar no botão, automati-
camente será redirecionado para aprovado.html ou reprovado.html. Ficou claro que quem
originou a resposta foram as próprias páginas.
http://solutioin.com 175
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
10 </body>
11 </html>
3 import java.io.IOException;
4
5 import javax.servlet.RequestDispatcher;
6 import javax.servlet.ServletException;
7 import javax.servlet.annotation.WebServlet;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 @WebServlet("/ExemploRedirect")
13 public class ExemploRedirect extends HttpServlet {
14
24 response.sendRedirect(pagina);
25 }
26 }
176 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
8 </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. Após ter a resposta ele volta ao telefone e te conta a resposta. Você não teve que
contar novamente sua história. Você também não 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 realização do
forward foram utilizadas as seguintes instruções:
RequestDispatcher rd = request.getRequestDispatcher(pagina);
rd.forward(request, response);
Note que após clicar no botão você vê a resposta mas não percebe que foi gerada pelas
páginas aprovado.html ou reprovado.html.
3 import java.io.IOException;
4
5 import javax.servlet.RequestDispatcher;
6 import javax.servlet.ServletException;
7 import javax.servlet.annotation.WebServlet;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 @WebServlet("/ExemploForward")
13 public class ExemploForward extends HttpServlet{
14
http://solutioin.com 177
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
24 RequestDispatcher rd = request.getRequestDispatcher(pagina);
25 rd.forward(request, response);
26 }
27
28 }
• Request - requisição
• Session - sessão
• Application - aplicação
16.8.1 Request
Tudo que é armazenado no escopo de request é válido apenas enquanto durar uma requi-
sição. Se o usuário clicar em algum link ou algum servlet realizar um redirec as informações
armazenadas neste escopo se perdem.
Para acessar este escopo utilize os método:
178 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
16.8.2 Session
Tudo que é armazenado no escopo de session é válido enquanto durar a sessao com o
usuário. Uma sessão normalmente é representada com uma janela do browser aberta. É
neste escopo que são armazenadas as informações de login do usuário ou o carrinho de
compras em uma loja virtual.
Para acessar este escopo utilize o método:
16.8.3 Application
Tudo que é armazenado no escopo de application é valido para todos os usuários 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 método:
http://solutioin.com 179
Francisco Calaça, Otávio Calaça
Versão 1.1 servlets
16.10. Exercícios
1. O que é um servlet?
180 http://solutioin.com
Francisco Calaça, Otávio Calaça
J AVA S E RV E R PA G E S
17
JavaServer Pages - JSP - é uma tecnologia que simplifica o processo de desenvolvimento
de aplicações web. Com JSP, os desenvolvedores podem rapidamente incorporar elemen-
tos dinâmicos em páginas da web, utilizando Java embutido e algumas tags. Estas tags
fornecem ao desenvolvedor um meio de acessar dados e lógica de negócio armazenados
em objetos Java sem ter que dominar as complexidades do desenvolvimento de aplicações.
O JSP também oferece a vantagem de ser facilmente codificado, facilitando assim a elab-
oração e manutenção de uma aplicação. Além disso, essa tecnologia permite separar a
programação lógica (parte dinâmica) da programação visual (parte estática), facilitando o
desenvolvimento de aplicações mais robustas, onde programador e designer podem trabal-
har no mesmo projeto, mas de forma independente.
Os arquivos jsp’s são convertido em servlet’s (arquivos .java) e compilados para arquivos
.class. Normalmente a primeira execução do jsp é mais lenta que as demais pois o contêiner
está realizando essa operação.
17.1.1 Scriptlet
Scriptlets são trechos de código Java dentro de págianas HTML. Um Scriptlet fica entre as
tags
O Trecho de código abaixo é um exemplo de página HTML, com scriptlets JSP que
escrevem na tela: “Olá Mundo”
<%
181
Versão 1.1 java server pages
Scriptlets tem acesso à algumas variáveis definidas como request, session, etc.:
<%
String dados = request.getQueryString();
out.println("Dados anexados: " + dados);
%>
17.1.2 Expressões
Uma expressão JSP é usada para escrever variáveis Java direntamente na página. Veja o
exemplo a seguir:
A expressão Java será convertida em uma String e escrita na página. Por exemplo, o
código seguinte:
10 <%} %>
11
12 </body>
13 </html>
182 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
17.1.3 Declarações
Uma declaração JSP define métodos, campos ou classes que serão inseridos no corpo do
Servlet gerado pela página. Portanto, o código abaixo:
17.2. Diretivas
Uma diretiva JSP afeta toda a estrutura da página. Este é um exemplo de diretiva:
8 <h1>Página inicial</h1>
9 </body>
10 </html>
http://solutioin.com 183
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
no arquivo exemploJsp.jsp
Por possuir múltiplos atributos a linguagem JSP permite que se declare várias diretivas
numa mesma página, porém a único atributo que pode ser repetido é o import.
Nas subseções à seguir serão 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 são: “text/plain”, “text/html”, “tex-
t/xml”. Logo abaixo segue o exemplo usado como padrão para as JSPs.
17.2.2.2 pageEncoding
Define o caracter enconding da página.
17.2.2.3 Extends
Serve para indicar a super classe que será usada pelo container JSP no momento de
tradução da página em um Servlet Java. Exemplo:
17.2.2.4 Import
Com o atribuo import, diferente do extends, é capaz de estender um conjunto de classes
Java que poderão ser usadas nas páginas JSPs. Exemplo:
17.2.2.5 Language
Usado, em geral, para especificar Java como a linguagem de criação de script para a página.
Exemplo:
184 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
17.2.2.6 Info
Usado para inserir informações sumarizadas da página, não havendo restrições ao seu
tamanho. Exemplo:
17.2.2.7 Session
Session é do tipo boolean, indica se a página está participando do gerenciamento de sessão.
Por exemplo, se quisermos dizer que uma página é parte de uma sessão, utiliza-se a
seguinte sintaxe:
17.2.2.8 Buffer
Responsável por controlar a saída bufferizada para uma página JSP. Se for ajustado para
“none” o conteúdo de uma JSP é passado instantaneamente à resposta HTTP. O tamanho
do buffer é descrito em kilobytes. Exemplo:
17.2.2.9 AutoFlush
Semelhante ao Buffer, também é responsável por controlar a saída buferizada, mais exata-
mente o comportamento do container JSP quando já esteja cheio o Buffer de saída. Neste
caso é esvaziado automaticamente o Buffer de saída e o conteúd0o enviado para o servidor
HTTP que transmite para o Browser responsável pela solicitação. Sendo do tipo boolean,
sua sintaxe é dada abaixo:
17.2.2.10 isThreadSafe
Quando uma página JSP é compilada em um Servlet, ela deve ser capaz de atender a
múltiplas solicitações. Para isso devemos utilizar o atributo isThreadSafe, caso contrário é
necessário defini-lo como “false”. Exemplo:
17.2.2.11 errorPage
ErrorPage indica uma página alternativa que será exibida caso aconteça um erro não pre-
visto durante o processamento de uma página JSP no container. Exemplo:
http://solutioin.com 185
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
17.2.2.12 isErrorPage
Responsável por define uma página JSP que servirá como a página de erro padrão para um
grupo de páginas JSP. Sendo do tipo boolean, sua sintaxe é descrita abaixo:
186 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
<br>
Hoje: <fmt:formatDate value="${agora}" />
A taglib mais utilizada é a central. Normalmente é prefixada com “c”. Possui tags para
trabalhar com condicionais, loops, condicionais, dentre outras. Sua declaração é:
<%@ 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 página.
Exemplo:
${cliente.nome}
ou ainda
<c:forEach items="${lista}" var="cliente">
http://solutioin.com 187
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
3 import java.io.IOException;
4
5 import javax.servlet.RequestDispatcher;
6 import javax.servlet.ServletException;
7 import javax.servlet.annotation.WebServlet;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 import capitulo13.Cliente;
13 import capitulo13.ClienteDao;
188 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
14
15 @WebServlet("/ClienteControl")
16 public class ClienteControl extends HttpServlet {
17
45 }
3 <html>
4 <head>
5 <title>Cadastro de Clientes</title>
6 </head>
7 <body>
8
11 <form action="ClienteControl">
12 <pre>
13 <input type="hidden" name="acao" value="confirmar"/>
14 Nome: <input type="text" name="nome"/>
15 CPF/CNPJ: <input type="text" name="cpfCnpj"/>
16 Endereço: <input type="text" name="endereco"/>
http://solutioin.com 189
Francisco Calaça, Otávio Calaça
Versão 1.1 java server pages
38
39 </body>
40 </html>
17.6. Exercícios
1. O é o JSP?
5. Explique o MVC.
190 http://solutioin.com
Francisco Calaça, Otávio Calaça
I N T R O D U Ç Ã O A O J AVA S E RV E R F A C E S
18
JavaServer Faces é um poderoso framework para desenvolvimento Java EE. Seus princípios
se baseiam no processamento de eventos gerados pelo usuário na página web como: um
clique no botão, alteração do conteúdo de um campo de texto.
O JSF usa o padrão MVC como base de funcionamento. Para ser processada uma página
JSF ela deve passar por um controlador representado pelo Servlet FacesServlet.
A execução de uma chamada JSF é dada pela seguinte seqüência: o FacesServlet recebe a
chamada, cria o FacesContext, logo é atribuído o controle ao ciclo de vida (LifeCycle) que
processa o contexto em 6 fases: reconstituição da view, aplicação dos valores da requisição,
validação dos dados, atualização do modelo de dados, chamada ao aplicativo e geração da
resposta.
191
Versão 1.1 introdução ao javaserver faces
192 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
http://solutioin.com 193
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução 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>
3 import javax.faces.event.ActionEvent;
4
194 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
31 }
As tags JSF HTML são utilizadas para construir componentes html na página como
tabelas, campos de entrada, etc. Existem projetos JSF como o Primefaces, Richfaces, Icefaces,
Myfaces que possuem mais componentes como calendário, tabela ordenável, menus, etc.
http://solutioin.com 195
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
<f:view> . . . </f:view>
A tag:
<h:inputText />
<h:commandButton />
196 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
5 <h:head>
6
7 </h:head>
8
9 <h:body>
10 <h:form>
11 <h:inputText value="#{ exemploControl.entrada}" />
12 <h:commandButton ajax="false"
13 actionListener="#{ exemploControl.executar}" value="Executar" />
14 <h:outputText value="#{ exemploControl.saida}" />
15 </h:form>
16 </h:body>
17 </html>
Dica:
Para acessar a tela da listagem 18.2 no browser, digite a url:
http://localhost:8080/aulajsf/faces/exemplo.xhtml
Após iniciar o servidor.
#{ . . . }
para ligar os componentes da página com o managed bean. Por exemplo, a expressão
#{exemploControl.entrada}
liga o campo de entrada de texto com o atributo nome da classe ExemploControl (Man-
agedBean). A expressão
#{exemploControl.executar}
http://solutioin.com 197
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
#{ . . . }
${ . . . }
• com ações
As ligações com ações são utilizadas com as navegações entre páginas (assunto discutido
logo após). A assinatura do método de ação deve ser:
Observe que este deve retornar uma String que será utilizada para a navegação.
As ligações com eventos são utilizadas com eventos de cliques e mudança de valores. As
assinaturas dos métodos devem ser:
198 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
6 <context-param>
7 <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
8 <param-value>.xhtml</param-value>
9 </context-param>
10 <context-param>
11 <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
12 <param-value>*.xhtml</param-value>
13 </context-param>
14 <filter>
15 <filter-name>PrimeFaces FileUpload Filter</filter-name>
16 <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
17 </filter>
18 <filter-mapping>
19 <filter-name>PrimeFaces FileUpload Filter</filter-name>
20 <servlet-name>Faces Servlet</servlet-name>
21 </filter-mapping>
22
23 <servlet>
24 <servlet-name>Resource Servlet</servlet-name>
25 <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
26 </servlet>
27 <servlet-mapping>
28 <servlet-name>Resource Servlet</servlet-name>
29 <url-pattern>/primefaces_resource/*</url-pattern>
30 </servlet-mapping>
http://solutioin.com 199
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
<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>
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.faces.component.UIParameter;
7 import javax.faces.event.ActionEvent;
8 import javax.faces.model.SelectItem;
9
10 import org.primefaces.event.RowEditEvent;
11
12 import capitulo13.Cliente;
13 import capitulo13.ClienteDao;
14
200 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
32
69
70
71 }
6 <h:head>
7
8 </h:head>
9
10 <h:body>
http://solutioin.com 201
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
11 <h:form>
12 <p:panel header="Manter Clientes">
13 <h:panelGrid columns="2">
14 <h:outputText value="Nome:" />
15 <p:inputText value="#{ clienteControl.cliente.nome}"></p:inputText>
16 <h:outputText value="CPF/CNPJ:" />
17 <p:inputText value="#{ clienteControl.cliente.cpfcnpj}"></p:inputText>
18 <h:outputText value="Endereço:" />
19 <p:inputText value="#{ clienteControl.cliente.endereco}"></p:inputText>
20 <h:outputText value=" M u n i c à p i o :" />
21 <p:inputText value="#{ clienteControl.cliente.municipio}"></p:inputText>
22 <h:outputText value="UF:" />
23 <p:inputText value="#{ clienteControl.cliente.uf}"></p:inputText>
24 <p:commandButton ajax="false"
25 actionListener="#{ clienteControl.confirmar}" value="Confirmar"></p:commandButton>
26 <p:commandButton ajax="false"
27 actionListener="#{ clienteControl.listar}" value="Listar"></p:commandButton>
28 </h:panelGrid>
29
202 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
63 <p:selectOneMenu value="#{cli.uf}">
64 <f:selectItem itemLabel="Selecione" />
65 <f:selectItems value="#{ clienteControl.ufs}"></f:selectItems>
66 </p:selectOneMenu>
67 </f:facet>
68 </p:cellEditor>
69 </p:column>
70
71 <p:column>
72 <p:commandButton actionListener="#{ clienteControl.excluirCliente}"
73 icon="ui-icon -trash">
74 <f:param id="cliExcluir" value="#{cli}"></f:param>
75 </p:commandButton>
76 </p:column>
77 </p:dataTable>
78 </p:panel>
79 </h:form>
80
81 </h:body>
82 </html>
3 import javax.persistence.Entity;
4 import javax.persistence.GeneratedValue;
5 import javax.persistence.Id;
6
7 @Entity
8 public class Produto {
9
10 @Id
11 @GeneratedValue
12 private int id;
13
http://solutioin.com 203
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
26 }
27
52 }
3 import java.util.List;
4
5 import javax.persistence.EntityManager;
6 import javax.persistence.EntityManagerFactory;
7 import javax.persistence.Persistence;
8 import javax.persistence.Query;
9
204 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
24 em.getTransaction().begin();
25 em.merge(p);
26 em.getTransaction().commit();
27 }
28
53 }
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.faces.event.ActionEvent;
7
8 import org.primefaces.event.RowEditEvent;
9
http://solutioin.com 205
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
20 listar(evt);
21 produto = new Produto();
22 }
23
32 }
33
46 }
6 <h:head>
7
8 </h:head>
9
10 <h:body>
11 <h:form>
12 <p:panel header="Manter Produtos">
13 <h:panelGrid columns="2">
14 <h:outputText value="Descrição:" />
15 <p:inputText value="#{ produtoControl.produto.descricao}"></p:inputText>
16 <h:outputText value="Quantidade:" />
17 <p:inputText value="#{ produtoControl.produto.quantidade}"></p:inputText>
18 <h:outputText value="Valor:" />
19 <p:inputText value="#{ produtoControl.produto.valor}"></p:inputText>
20
21 <p:commandButton ajax="false"
22 actionListener="#{ produtoControl.confirmar}" value="Confirmar"></p:commandButton>
23
206 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
24 <p:commandButton ajax="false"
25 actionListener="#{ produtoControl.listar}" value="Listar"></p:commandButton>
26
27 </h:panelGrid>
28
32 <f:facet name="header">
33 <h:outputText value="Produtos" />
34 </f:facet>
35 <p:ajax event="rowEdit" listener="#{ produtoControl.gravar}"></p:ajax>
36
49 <p:column>
50 <p:commandButton ajax="false" value="Selecionar">
51 <f:setPropertyActionListener target="#{ produtoControl.produto}"
52 value="#{prod}"></f:setPropertyActionListener>
53 </p:commandButton>
54 </p:column>
55
56 <p:column>
57 <p:rowEditor></p:rowEditor>
58 </p:column>
59
60 </p:dataTable>
61 </p:panel>
62 </h:form>
63
64 </h:body>
65 </html>
http://solutioin.com 207
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
5 version="3.0">
6 <display-name>capitulo18</display-name>
7
8 <context-param>
9 <param-name>primefaces.THEME</param-name>
10 <param-value>blitzer</param-value>
11 </context-param>
12
13 <context-param>
14 <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
15 <param-value>.xhtml</param-value>
16 </context-param>
17 <context-param>
18 <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
19 <param-value>*.xhtml</param-value>
20 </context-param>
21 <filter>
22 <filter-name>PrimeFaces FileUpload Filter</filter-name>
23 <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
24 </filter>
25 <filter-mapping>
26 <filter-name>PrimeFaces FileUpload Filter</filter-name>
27 <servlet-name>Faces Servlet</servlet-name>
28 </filter-mapping>
29
30 <servlet>
31 <servlet-name>Resource Servlet</servlet-name>
32 <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
33 </servlet>
34 <servlet-mapping>
35 <servlet-name>Resource Servlet</servlet-name>
36 <url-pattern>/primefaces_resource/*</url-pattern>
37 </servlet-mapping>
38
39 <servlet>
40 <servlet-name>Faces Servlet</servlet-name>
41 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
42 <load-on-startup>1</load-on-startup>
43 </servlet>
44 <servlet-mapping>
45 <servlet-name>Faces Servlet</servlet-name>
46 <url-pattern>/faces/*</url-pattern>
47 </servlet-mapping>
48 </web-app>
208 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
5 <managed-bean>
6 <managed-bean-name>exemploControl</managed-bean-name>
7 <managed-bean-class>aulajsf.ExemploControl</managed-bean-class>
8 <managed-bean-scope>session</managed-bean-scope>
9 </managed-bean>
10 <managed-bean>
11 <managed-bean-name>clienteControl</managed-bean-name>
12 <managed-bean-class>aulajsf.ClienteControl</managed-bean-class>
13 <managed-bean-scope>session</managed-bean-scope>
14 </managed-bean>
15 <managed-bean>
16 <managed-bean-name>produtoControl</managed-bean-name>
17 <managed-bean-class>aulajsf.ProdutoControl</managed-bean-class>
18 <managed-bean-scope>session</managed-bean-scope>
19 </managed-bean>
20 <managed-bean>
21 <managed-bean-name>produtoListControl</managed-bean-name>
22 <managed-bean-class>aulajsf.ProdutoListControl</managed-bean-class>
23 <managed-bean-scope>session</managed-bean-scope>
24 </managed-bean>
25 </faces-config>
Dica:
Não esqueça de adicionar as dependências da JPA nas libs do projeto
de JSF.
http://solutioin.com 209
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
18.8. Conversores
Inicialmente vamos verificar a necessidade de utilizar conversores JSF. Imagine uma tela de
uma aplicação web onde o usuário entra com uma informação no formato String. Suponha
que esta informação deva ser convertida em um valor numérico como uma idade ou um
salário. Esta conversão deve ser feita de forma automática para que, no Managed Bean a
variável já possa ser declarada como inteira ou ponto flutuante. Um outro exemplo pode
acontecer com datas. Nestes casos utilizamos conversores.
Por exemplo, para converter números, utize:
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import javax.faces.event.ActionEvent;
7
210 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
37 }
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import javax.faces.component.UIComponent;
7 import javax.faces.context.FacesContext;
8 import javax.faces.convert.Converter;
9 import javax.faces.convert.FacesConverter;
10
11
12 @FacesConverter("produtoConverter")
13 public class ProdutoConverter implements Converter{
14
17 @Override
18 public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
19 return mapa.get(value);
20 }
21
22 @Override
23 public String getAsString(FacesContext ctx, UIComponent comp, Object value) {
24 if(value instanceof Produto){
25 Produto p = (Produto) value;
26 mapa.put(String.valueOf(p.getId()), p);
27 return String.valueOf(p.getId());
28 }else{
29 return "";
30 }
31 }
32
33 }
http://solutioin.com 211
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
6 <h:head>
7
8 </h:head>
9
10 <h:body>
11 <h:form enctype="multipart/form -data">
12 <p:panel header="Manter Produtos">
13 <p:autoComplete value="#{ produtoListControl.produto}" id="produto" completeMethod="
#{ produtoListControl.listarPorDescricao}"
14 var="p" itemLabel="#{p.descricao}" itemValue="#{p}" converter
="produtoConverter" forceSelection="true"/>
15 <p:commandButton value="Adicionar" actionListener="#{ produtoListControl.adicionar}"
update="produtos"></p:commandButton>
16
22 <p:column>
23 <h:outputText value="#{prod.descricao}"></h:outputText>
24 </p:column>
25
26 <p:column>
27 <h:outputText value="#{prod.valor}"></h:outputText>
28 </p:column>
29
30 </p:dataTable>
31 </p:panel>
32 </h:form>
33
34 </h:body>
35 </html>
212 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 introdução ao javaserver faces
18.9. Exercícios
1. Descreva o framework JavaServer Faces
http://solutioin.com 213
Francisco Calaça, Otávio Calaça
PA D R Õ E S D E P R O J E T O
19
Um Padrão de Projeto de Software, também muito conhecido pelo seu termo original em
inglês, Design Pattern, descreve uma solução geral reutilizável para um problema recor-
rente no desenvolvimento de sistemas de software orientados a objetos. Não é um código
final, é uma descrição ou modelo de como resolver o problema do qual trata, que pode
ser usada em muitas situações diferentes. Os Padrões de Projeto normalmente definem as
relações e interações entre as classes ou objetos, sem especificar os detalhes das classes ou
objetos envolvidos, ou seja, estão num nível de generalidade mais alto.
Um padrão de projeto define :
• seu nome,
• o problema,
• a solução,
• suas consequências.
215
Versão 1.1 padrões de projeto
Padrões de criação:
• Abstract Factory
• Builder
• Factory Method
• Prototype
• Singleton
Padrões estruturais
• Adapter
• Bridge
• Composite
• Decorator
• Facade
• Flyweight
• Proxy
Padrões comportamentais
• Chain of Responsibility
• Command
• Interpreter
• Iterator
• Mediator
• Memento
• Observer
• State
• Strategy
• Template Method
• Visitor
216 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 padrões de projeto
19.2.1 Utilização
O padrão Abstract Factory pode ser utilizado na implementação de um toolkit que disponi-
bilize controles que funcionem em diferentes interfaces gráficas, tal como Motif, GTK+
(GNOME) ou Qt (KDE). Estas GUIs possuem diferentes padrões de controles visuais e,
para facilitar a construção de aplicativos que interajam facilmente com diferentes interfaces
gráficas, é interessante que se defina interfaces comuns para acesso aos controles, inde-
pendentemente da GUI utilizada. Este problema pode ser resolvido através de uma classe
abstrata que declara uma interface genérica para criação dos controles visuais e de uma
classe abstrata para criação de cada tipo de controle. O comportamento específico, de cada
um dos padrões tecnológicos contemplados, é implementado através de uma classe conc-
reta. O aplicativo, ou "cliente", interage com o toolkit através das classes abstratas sem ter
conhecimento da implementação das classes concretas. Um exemplo bem simplista seria
um projeto com interface para Mobile e para Desktop, uma boa opção para reaproveitar os
mesmos controles de interface seria criar pacotes com classes abstratas e os pacotes com
as classes concretas implementando apenas as diferenças. Esse padrão também se aplica
na padronização de ambientes, por exemplo, tamanhos de botões, fontes, cores de fundo,
largura de bordas. Com isso e havendo uma política que exija que os desenvolvedores
usem essas classes em vez das nativas da linguagem, ajudará a padronizar a aparência e
comportamento das aplicações.
19.3.1 Utilização
Este padrão é muito utilizado em frameworks para definir e manter relacionamentos en-
tre objetos. O framework Spring, dependendo da configuração, pode utilizar um Factory
Method para criar os seus beans. Este padrão pode ser utilizado na construção de um
framework que suporta aplicações que apresentam múltiplos documentos ao usuário. Nor-
malmente este tipo de aplicação manipula um número variável de formatos de documento
e, por isso, este framework deve ser flexível o bastante para suportar qualquer formato.
Uma solução para este problema poderia disponibilizar, no framework, o código para al-
guns dos formatos mais utilizados. Mas, na prática, esta solução seria uma implementação
pouco flexível, e até mesmo incompleta, já que é custoso implementar os mais variados
formatos. O padrão Factory Method propõe uma solução que deixa para o cliente (a imple-
mentação da aplicação) a tarefa de suportar os formatos necessários e para o framework
o papel de definição de uma abstração que oferece uma interface única para criação de
documentos. Este framework seria baseado em duas classes abstratas, que representam
http://solutioin.com 217
Francisco Calaça, Otávio Calaça
Versão 1.1 padrões de projeto
19.3.2 Command
Encapsular uma solicitação como um objeto, desta forma permitindo que clientes parametrizem
diferentes solicitações, enfileirem ou façam o registro (log) de solicitações e suportem oper-
ações que podem ser desfeitas.
19.3.3 Problema
Algumas vezes é necessário emitir solicitações para objetos nada sabendo sobre a operação
que está sendo solicitada ou sobre o receptor da mesma.
Utilizar quando:
• Parametrizar objetos por uma ação a ser executada. Você pode expressar tal parametriza-
ção numa linguagem procedural através de uma função callback, ou seja, uma função
que é registrada em algum lugar para ser chamada em um momento mais adiante.
Os Commands são uma substituição orientada a objetos para callbacks;
218 http://solutioin.com
Francisco Calaça, Otávio Calaça
Versão 1.1 padrões de projeto
19.3.4 Aplicação
A chave deste padrão è uma classe abstrata Command, a qual declara uma interface para
execução de operações. Na sua forma mais simples, esta interface inclui uma operação
abstrata Execute. As subclasses concretas de Command especificam um par receptor-ação
através do armazenamento do receptor como uma variável de instância e pela implemen-
tação de Execute para invocar a solicitação. O receptor tem o conhecimento necessário para
poder executar a solicitação.
19.4.1 Vantagens
A vantagem de usar objetos de acesso a dados é a separação simples e rigorosa entre duas
partes importantes de uma aplicação que não devem e não podem conhecer quase que
nada uma da outra, e que podem evoluir frequentemente e independentemente. Alterar
a lógica de negócio podem esperar apenas a implementação de uma interface, enquanto
que modificações na lógica de persistência não alteram a lógica de negocio, desde que a
interface entre elas não seja modificada.
http://solutioin.com 219
Francisco Calaça, Otávio Calaça
Versão 1.1 padrões de projeto
19.5. MVC
Model-view-controller (MVC) é um modelo de desenvolvimento de Software, atualmente
considerado uma "arquitetura padrão" utilizada na Engenharia de Software. O modelo
isola a "lógica" (A lógica da aplicação) da interface do usuário (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 domínio da informação e notificar ob-
servadores sobre mudanças nos dados. Ele é uma representação detalhada da informação
que a aplicação opera. A lógica de negócio adiciona valor semântico aos dados, e quando
há mudança de estado o modelo notifica seus observadores. Por exemplo, aluno, professor
e turma fazem parte do domínio de um sistema acadêmico. Operações como calcular a
média final do aluno ou o índice de faltas da turma fazem parte da lógica de domínio. A
forma como o dado é armazenado ou acessado não é de interesse do MVC, assume-se que
é de responsabilidade do modelo.
A visão (view) apresenta o modelo num formato adequado ao utilizador, na saída de da-
dos, e diferentes visões podem existir para um mesmo modelo, para diferentes propósitos.
O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador
ao invocar objetos do modelo, e por fim uma visão baseada na entrada. Ele também é
responsável pela validação e filtragem da entrada de dados.
Um caso prático é uma aplicação web em que a visão é um documento HTML (ou
derivado) gerado pela aplicação. O controlador recebe uma entrada GET ou POST após
um estímulo do utilizador e decide como processá-la, invocando objetos do domínio para
tratar a lógica de negócio, e por fim invocando uma visão para apresentar a saída.
19.5.2 Justificativa
Com o aumento da complexidade das aplicações desenvolvidas,sempre visando a progra-
mação orientada a objeto nao devemos esquecer que torna-se relevante a separação entre os
dados e a apresentação das aplicações. Desta forma, alterações feitas no layout não afetam
a manipulação de dados, e estes poderão ser reorganizados sem alterar o layout.
Esse padrão resolve este problema através da separação das tarefas de acesso aos dados
e lógica de negócio, lógica de apresentação e de interação com o utilizador, introduzindo
um componente entre os dois, o controlador.
220 http://solutioin.com
Francisco Calaça, Otávio Calaça
M O N TA G E M D O A M B I E N T E D E
A
TRABALHO
1 http://www.oracle.com/technetwork/java/javase/downloads/index.html
221