Java PDF
Java PDF
francisco calaa
otvio calaa
LICENA
Esta apostila disponibilizada sob os termos da licena Creative Commons - AttributionNonCommercial-NoDerivs 3.0 Unported.
Isto quer dizer que VOC PODE:
Copiar este material de forma no comercial;
Redistribuir este material de forma no comercial;
Imprimir este material de forma no comercial;
Esta licena tambm quer dizer que voc VOC NO PODE:
Vender este material a terceiros;
Alterar este material;
Qualquer uso indevido deste material, venda ou alterao estaro sugeitos s penas previstas na Lei Federal No 9.610, de 19 de fevereiro 1998.
Mais detalhes sobre esta licena bem como seu contedo original pode ser acessado em:
http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode
Bons estudos. . .
iii
C O L A B O R E C O M E S TA A P O S T I L A
Precisamos de colaboradores para melhorar esta apostila. Se voc deseja entrar para nosso
time, mande um email para [email protected] com o ttulo:
DESEJO COLABORAR COM A APOSTILA DE JAVA.
Responderemos a voc com informaes sobre o que ainda necessrio fazer.
Nas prximas verses, voc ver seu nome adicionado na lista de colaboradores e poder
se gabar, mostrando isto ao seus amigos. Colabore !
Colaboradores
Francisco Calaa Xavier
Otvio Calaa Xavier
Edicarlos Pimenta Gonalves
Deuslirio Junior
CONTEDO
1
introduo
1
1.1 Algoritmos
1
1.2 Lgica binria
1
1.3 Nascimento da cincia da computao
2
1.4 Java
2
2 preparao do ambiente de estudos
5
2.1 Padronizao do ambiente de trabalho
5
2.2 Primeiros testes no ambiente de trabalho
6
2.3 Exerccios
7
3 lgica de programao em java
9
3.1 Fluxograma
9
3.2 Para entender os programas criados a partir de agora
3.2.1 Informaes iniciais
10
3.3 Strings
11
3.4 Sada Formatada
12
3.5 Conceito de Varivel
13
3.6 Palavras reservadas e identificadores
14
3.7 Tipos Primitivos
15
3.7.1 Tipos primitivos inteiros
15
3.7.2 Tipos primitivos de ponto flutuante
15
3.7.3 Tipo primitivo char
16
3.7.4 Tipo primitivo boolean
16
3.7.5 Converses de variveis
17
3.8 Operadores
17
3.8.1 Aritmticos
17
3.8.2 Atribuio
18
3.8.3 Incremento/Decremento
19
3.8.4 Relacionais
20
3.8.5 Lgicos
20
3.9 Estruturas de seleo
22
3.9.1 if . . . else
22
3.9.2 Operador condicional ou ternrio
24
3.9.3 switch
25
3.10 Estruturas de Repetio
26
3.10.1 for
26
3.10.2 while
27
3.10.3 do . . . while
28
3.11 Exerccios
28
4 introduo orientao a objetos
31
4.1 O conceitos Classe e Objeto
31
4.2 Elementos de uma classe
32
10
vii
Verso 1.2-beta
4.2.1 Atributos
32
4.2.2 Mtodos
33
4.2.3 Mtodos construtores
34
4.2.4 Padres de nomenclatura
35
4.3 Atributos e mtodos static
36
4.3.1 Import static
37
4.4 Tipos Wrapper
38
4.4.1 Auto-boxing e Auto-unboxing
38
4.5 Regras de escopo
39
4.6 Sobrecarga de mtodos
40
4.7 Exerccios
41
5 arrays
43
5.1 O que so arrays
43
5.2 Declarao e inicializao de arrays
44
5.3 Mtodo main
46
5.4 Lao for aprimorado
48
5.5 Passagem de parmetros no Java
48
5.6 Arrays multidimensionais
51
5.7 Lista de parmetros com comprimento varivel
51
5.8 Exerccios
52
6 um pouco mais de orientao a objetos
53
6.1 Coletor de lixo
53
6.2 A palavra-chave this
54
6.3 Variveis do tipo final
56
6.4 Encapsulamento
56
6.5 Enumeraes
59
6.6 Pacotes
59
6.6.1 Como usar tipos dentro de outros pacotes
61
6.7 Herana
62
6.7.1 Um exemplo de Herana
62
6.7.2 Sobrescrita de mtodos
64
6.7.3 A palavra-chave super
64
6.8 Alguns Modificadores de acesso
64
6.8.1 private
64
6.8.2 pacote
64
6.8.3 protected
65
6.8.4 public
65
6.9 Classe object
65
6.9.1 mtodo equals()
65
6.9.2 mtodo toString()
66
6.10 Polimorfismo
67
6.10.1 Abstrao
67
6.10.2 Exemplo de Polimorfismo
68
6.11 Converso e casting
71
6.11.1 A palavra-chave instanceof
72
6.12 Mtodos e classe do tipo final
72
viii
contedo
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
10
11
contedo
6.13 Interfaces
73
6.13.1 Interfaces em Java
73
6.14 Exerccios
75
tratamento de excees
77
7.1 O que so excees
77
7.2 Como tratar excees
77
7.2.1 O bloco try
77
7.2.2 O bloco catch
78
7.3 Excees checadas e excees no checadas
80
7.4 Como declarar novos tipos de excees
80
7.5 Como lanar excees
81
7.6 Hierarquia das excees
82
7.7 Exerccios
83
fluxo de dados
85
8.1 A classe File
85
8.2 Como escrever em arquivos
85
8.3 Como ler arquivos
86
8.4 Um editor de texto simples
87
8.5 Serializao de objetos
89
8.6 Um trocador de mensagens simples
90
8.7 Exerccios
93
genricos e colees
95
9.1 o que so genricos
95
9.2 Introduo a colees
97
9.3 Listas
97
9.4 Conjuntos
99
9.5 Mapas
99
9.5.1 Properties 101
9.6 Pilhas 103
9.7 Filas 104
9.8 Ordenao de Listas 104
9.9 Exerccios 106
uml: unified modeling language
109
10.1 Diagrama de Classe 109
10.1.1 Classe 109
10.1.2 Associaes de Classe 110
10.2 Diagrama de Caso de Uso 112
10.2.1 Caso de Uso 112
10.2.2 Ator 113
10.2.3 Descrio do Caso de Uso 113
10.3 Demais diagramas
113
threads
115
11.1 Processos e Threads 115
11.1.1 Processos
115
11.1.2 Threads 115
11.2 Criao de Threads 116
http://solutioin.com
Francisco Calaa, Otvio Calaa
ix
Verso 1.2-beta
12
13
14
15
contedo
136
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
15.2.1 A estrutura bsica de um documento HTML
15.2.2 Outras tags HTML
161
15.3 JavaScript 162
15.4 CSS
163
15.5 Aplicativos Web com Java 165
15.5.1 Instalao do Tomcat 165
15.6 Exerccios 166
16 servlets
167
16.1 Estrutura de uma aplicao web Java 167
16.2 Construindo o primeiro Servlet 167
16.3 Como fazer no eclipse
169
16.4 Atendendo requisies com o mtodo get 170
16.5 Atendendo requisies com o mtodo post 176
16.6 Redirect
177
16.7 Forward 179
16.8 Escopo de objetos web 180
16.8.1 Request
180
16.8.2 Session 181
16.8.3 Application 181
16.9 Como distribuir uma aplicao web 181
16.10Exerccios 182
17 java server pages
183
17.1 Elementos do Jsp 183
17.1.1 Scriptlet 183
17.1.2 Expresses
184
17.1.3 Declaraes 185
17.2 Diretivas 185
17.2.1 Diretiva include 185
17.2.2 Diretiva Page
186
17.3 Aes do JSP
188
17.4 Biblioteca de tags JSTL 188
17.4.1 EL - Expresso de Linguagem 189
17.5 MVC - Model View Control 190
17.5.1 O cadastro de clientes 190
17.6 Exerccios 192
18 introduo ao javaserver faces
193
18.1 Fazendo JavaServer Faces funcionar 193
18.2 Managed bean 193
18.3 Tags bsicas 197
18.3.1 Tags JSF para renderizao de HTML 197
18.3.2 Tags Core do JSF 197
18.3.3 Exemplo de uso das Tags 197
18.4 Expresses de Ligao - EL 199
18.4.1 Ligaes com atributos 200
18.4.2 Ligaes com mtodos 200
18.5 Configurar o Primefaces 201
http://solutioin.com
Francisco Calaa, Otvio Calaa
contedo
160
xi
Verso 1.2-beta
18.6 Cadastro de Clientes 202
18.7 Cadastro de Produtos (com JPA) 205
18.8 Conversores
212
18.8.1 Conversores personalizados 212
18.9 Exerccios 215
19 padres de projeto
217
19.1 Padres GoF
217
19.2 Abstract Factory 218
19.2.1 Utilizao 219
19.3 Factory Method 219
19.3.1 Utilizao 219
19.3.2 Command 220
19.3.3 Problema 220
19.3.4 Aplicao 221
19.4 Data Access Object (DAO) 221
19.4.1 Vantagens 221
19.5 MVC 222
19.5.1 Componentes
222
19.5.2 Justificativa 222
a montagem do ambiente de trabalho
223
a.1 Obteno e instalao do JDK
223
a.2 O que a Mquina virtual Java 223
a.3 Obteno e instalao do eclipse 223
b erros comuns enfrentados por iniciantes
b.1 Excees que costumam serem vistas 225
b.1.1 ClassNotFoundException 225
b.1.2 NoSuchMethodError 225
b.1.3 LazyInitializationException 225
b.1.4 NoClassDefFoundError 225
b.1.5 NullPointerException
225
b.1.6 ClassCastException 225
b.2 Erros comuns do HTTP
225
xii
contedo
225
http://solutioin.com
Francisco Calaa, Otvio Calaa
INTRODUO
A computao pode ser definida como a busca de uma soluo para um problema, a partir
de entradas (inputs), e atravs de um algoritmo. com isto que lida a teoria da computao,
subcampo da cincia da computao e da matemtica. Durante milhares de anos, a computao foi executada com caneta e papel, ou com giz e ardsia, ou mentalmente, por vezes
com o auxlio de tabelas, ou utenslios artesanais.
A primeira ferramenta conhecida para a computao foi o baco, inventado na Mesopotmia
em torno de 2400 a.C. Sua verso original consistia em desenhar linhas na areia com rochas.
Os bacos ainda so usadas como instrumento de clculo hoje.
1.1.
Algoritmos
1.2.
Lgica binria
O matemtico indiano Pingala inventou o sistema de numerao binrio por volta do sculo
III a.C. Este sistema de numerao ainda utilizado atualmente no processamento de todos computadores, o sistema estabelece que sequncias de uns e zeros podem representar
qualquer nmero. Fisicamente estas sequncias so substituidas pelos estados ligado e
desligado.
George Boole, em 1854, publicou a lgebra booleana com um sistema completo que permitia a construo de modelos matemticos para o processamento computacional. Em 1801
apareceu o tear controlado por carto perfurado, inveno de Joseph Marie Jacquard. Neste
tear os buracos indicavam os uns, e reas no furadas indicavam os zeros. O sistema ainda
no pode ser considerado um computador, mas demonstrou que as mquinas poderiam
ser controladas pelo sistema binrio.
Verso 1.2-beta
1.3.
introduo
Antes da dcada de 1920, computador era um termo associado a pessoas que realizavam
clculos, geralmente fsicos e matemticos. Milhares de computadores, em sua maioria mulheres, eram empregados em projetos no comrcio, governo e pesquisa. Aps a dcada de
1920, a expresso mquina computacional comeou a ser usada para referir-se a qualquer
mquina que realize o trabalho de um profissional computador.
No final da dcada de 1940 o termo mquina computacional perdeu espao para o termo
computador. As mquinas digitais estavam cada vez mais difundidas. Alan Turing, um dos
pioneiros da Cincia da Computao, inventou a Mquina de Turing, que posteriormente
evoluiu para o computador moderno.
Em 1930 os engenheiros eletricistas j podiam construir circuitos eletrnicos para resolver
problemas lgicos e matemticos, mas a maioria o fazia sem qualquer processo, de forma
particular, sem rigor terico, ou qualquer estudo ou padronizao. Isso mudou com a tese
de mestrado de Claude E. Shannon de 1937, A Symbolic Analysis of Relay and Switching
Circuits. Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de George
Boole, e percebeu que tal conceito poderia ser aplicado em conjuntos eletro-mecnicos para
resolver problemas de lgica. Tal idia, que utiliza propriedades de circuitos eletrnicos
para a lgica, o conceito bsico de todos os computadores digitais. Shannon desenvolveu
a teoria da informao no artigo de 1948 A Mathematical Theory of Communication, cujo
contedo serve como fundamento para reas de estudo como compresso de dados e criptografia.
1.4.
Java
A linguagem de programao orientada a objetos Java foi criada em 1991 pelo engenheiro
James Gosling, da Sun, e anunciada em 1995. O projeto da sua criao surgiu num contexto
de um outro projeto, em que certos problemas da linguagem C++, como, por exemplo, a
falta de funcionalidades do garbage collection, levaram a optar pela criao de uma nova
linguagem, ento denominada Oak (palavra inglesa para as rvores da famlia Quercus,
como o carvalho) em "homenagem" rvore que se encontrava plantada do lado de fora
do escritrio de James Gosling.
Em 1994 esta linguagem foi renomeada para Java porque, aps uma pesquisa de marcas,
foi descoberta que j existia uma linguagem de computador denominada Oak. Desta forma,
em 1996 o Java 1.0 foi finalmente apresentado comunidade.
Em 2009, a Oracle adquire a Sun Microsystems e tornou-se a detentora dos direitos e da
marca Java.
As especificaes da linguagem Java so mantidas uniformes atravs de um processo
comunitrio gerido pela Sun Microsystems, o JCP (Java Community Process). Fazem parte
do JCP vrias empresas como a Oracle, Google, IBM, Nokia dentre outras. Para mais informaes sobre o JCP acesse o site http://jcp.org.
As caractersticas principais da linguagem Java so:
orientada a objetos;
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
introduo
independente de plataforma;
integra mecanismos e bibliotecas de funes para programao distribuda;
foi projetada para executar cdigo remotamente sem perda de segurana.
http://solutioin.com
Francisco Calaa, Otvio Calaa
P R E PA R A O D O A M B I E N T E D E
ESTUDOS
Neste captulo voc montrar seu ambiente de estudos Java. A sua principal ferramenta
o JDK (Java Development Kit). Esta sigla significa: Kit de Desenvolvimento Java. O JDK
contm uma vasta quantidade de aplicativos necessrios para resolver problemas do dia a
dia do desenvolvimento Java.
Outra ferramenta importante a IDE (Integrated Development Environment). Esta sigla
significa: Ambiente de desenvolvimento integrado. Trata-se de uma ferramenta que contm vrios recursos, necessrios para a construo eficiente de um software.
Hoje possvel encontrar diversas IDEs para desenvolvimento em Java. Dentre elas
esto o Eclipse1 e o NetBeans2 , que so ides Open Source e que contam com colabrao de
grandes comunidades e empresas ao redor do mundo. Os exemplos deste livro sero feitos
utilizando o Eclipse. Apesar disto, nada impede voc de instalar o netbeans e tambm testar
estes exemplos nele.
2.1.
muito importante ter um ambiente de trabalho organizado e padronizado para prosseguimento dos estudos. Esta padronizao te ajudar a encontrar dependncias, aplicativos e
exemplos e est ilustrada na Figura 2.1.
Onde em:
Aplicativos: contm os aplicativos utilizados no desenvolvimento de software. Exemplo: JDK, eclipse, etc.
Material: contm bibliotecas, tutoriais, etc
Projetos: contm os seus projetos criados no decorrer da sua aprendizagem.
1 http://www.eclipse.org
2 http://www.netbeans.org
Verso 1.2-beta
Se voc quiser, pode baixar um arquivo compactado contendo esta estrutura j montada.
Este arquivo pode ser obtido no site http://solutioin.com/java. Aps ter realizado o download
no seu computador, descompacte o arquivo em algum lugar de sua preferncia e pronto!
Voc j est apto para comear os estudos em Java. Bons estudos!
Dica:
Se voc ficou curioso em como este ambiente foi montado, acesse o
Apncie A que saber como.
2.2.
Primeiro, inicialize o eclipse. Isto pode ser feito executando o programa eclipse (Linux) ou
eclipse.exe (Windows) da pasta eclipse, dentro da pasta Aplicativos da estrutura baixada.
Com o eclipse inicializado, crie um novo projeto Java. Depois crie uma classe. Ser a
primeira classe criada neste curso. O objetivo que voc entenda como funciona um programa bem simples em Java. O cdigo deste exemplo inicial est apresentado na Listagem
2.1. Esta classe, aps executada, gera a sada no console:
Veja como fcil
No momento, no se preocupe com as instrues desta classe. O que voc deve entender
agora que o comando da linha 3 imprime no console o texto que se encontra entre aspas.
Outra forma de apresentar texto para o usurio est ilustrada no cdigo da Listagem
2.2. Observe, que aps executar este cdigo, a mensagem apresentada em uma janela,
conforme ilustrado na Figura 2.2.
Listagem 2.2: Exemplo de apresentao de mensagem
1
import javax.swing.JOptionPane;
2
3
4
5
6
7
Para um terceiro exemplo, ser apresentado um cdigo que faz a leitura de informaes
teclado. Isto ser bastante til nesta primeira fase do curso, onde estamos estudando os
elementos iniciais da programao. A Listagem 2.3 exemplifica uma das formas de se obter
informaes do usurio.
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
2.3.
Exerccios
1. Crie uma classe que apresente no console a seguinte mensagem: Meu primeiro
cdigo Java.
2. Crie uma classe que apresente em uma janela a mensagem: Estou ficando bom
nisto.
3. Crie uma classe que solicite ao usurio as seguintes informaes: nome, endereo e
telefone. Aps o usurio ter digitado estas informaes, apresente em uma janela.
http://solutioin.com
Francisco Calaa, Otvio Calaa
L G I C A D E P R O G R A M A O E M J AVA
Todo programa constitudo por uma sequncia lgica de passos que executar tarefas
necessrias para a soluo do problema a que o programa se propem.
Neste captulo, sero apresentados os passos necessrios para construo de um programa simples em Java.
3.1.
Fluxograma
Verso 1.2-beta
O significado de cada uma destas palavras ser descrito posteriormente. necessrio que
o leitor apenas utilize esta assinatura como est.
1 CamelCase a denominao em ingls para a prtica de escrever palavras compostas ou frases, onde cada
palavra iniciada com Maisculas e unidas sem espaos. um padro largamente utilizado em diversas
linguagens de programao, como Java, Ruby, PHP e Python, principalmente nas definies de Classes e Objetos. Exemplo: iPod, GameCube, OpenOffice.org, CamelCase, dataNascimento, enderecoEntregaMercadoria,
ItemPedido.
10
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
3.2.1.7 Comentrios
Existem trs tipos de comentrios em Java, conforme apresentado na Listagem 3.1.
Listagem 3.1: Exemplo de comentrios
1
//Comentrio de linha
2
3
4
5
6
7
8
/*
* Comentrio
* de
* bloco
*/
9
10
11
12
13
14
15
/**
* Exemplo de comentrio
* de Javadoc.
*
*/
3.3.
Strings
Strings so cadeias de caracteres. Em java so representadas pela classe String e so expressas entre aspas. Strings literais como abcdef tambm so instncias desta classe.
possvel utilizar o operador + para concatenao de Strings:
Primeira String + Segunda String
resulta em:
Primeira String Segunda String
Existem alguns caracteres que necessitam de alguns truques para serem expressos em
Strings. Eles esto descritos na tablela da figura 3.2.
A listagem 3.2 apresenta mais exemplos de sequncias de escape. A sada deste exemplo
:
http://solutioin.com
Francisco Calaa, Otvio Calaa
11
Verso 1.2-beta
4
5
6
7
8
9
10
3.4.
Sada Formatada
O Java possui o recurso de sada formatada. Com este recurso possvel definir uma String
de formatao e aps isto, passar parmetros para a mesma. Isto evita concatenao excessiva de String e aumenta a legibilidade do cdigo. A utilizao destes caracteres est
descrita na Tabela 12.1. Para cada caractere de converso existe um parmetro que ser
colocado no seu lugar:
("O aluno %s foi %s", "Marcos", "aprovado")
Neste caso palavra Marcos ser colocada no lugar do primeiro %s e a palavra aprovado
ser colocada no lugar do segundo %s resultando no seguinte:
"O aluno Marcos foi aprovado"
12
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Caracter
Aplicado em
%s
String
%d
Inteiro
%f
Ponto flutuante
import javax.swing.JOptionPane;
2
3
4
6
7
8
9
10
11
12
13
3.5.
Conceito de Varivel
Para resolver problemas em programas de computador necessrio manipular vrios dados, sejam eles nmeros ou caracteres. Se voc precisa calcular o resultado de uma nica
conta, provavelmente o melhor seria utilizar uma calculadora. A utilidade de se escrever
um programa aparece quando usamos vrias variveis. Estas possuem a capacidade de conter valores. Desta forma, possvel ento calcular o resultado de vrias contas. As variveis
so declaradas com um identificador e seu nome. Exemplo:
String nome;
int idade;
String endereco;
http://solutioin.com
Francisco Calaa, Otvio Calaa
13
Verso 1.2-beta
3.6.
continue
for
new
switch
assert
default
goto
package
synchronized
boolean
do
if
private
this
break
double
implements
protected
throw
byte
else
import
public
throws
case
enum
instanceof
return
transient
catch
extends
int
short
try
char
final
interface
static
void
class
finally
long
strictfp
volatile
const
float
native
super
while
De acordo com a Java Language Specification2 , null, true e false so tecnicamente chamados de valores literais, e no keywords. Se voc tentar criar algum identificador com estes
valores, voc tambm ter um erro de compilao.
Utilizamos, em Java, as seguintes regras para criao do identificador:
no pode ser uma palavra reservada (Tabela 3.2);
no pode ser true nem false - literais que representam os tipos lgicos (booleanos);
no pode ser null - literal que represanta o tipo nulo;
no pode conter espaos em brancos ou outros caracteres de formatao;
deve ser a combinao de uma ou mais letras e dgitos (letras mausculas, minsculas,
nmeros, sublinha (_) e cifro ($)).
Os identificadores no podem comear com nmeros. As letras maisculas e minsculas
diferenciam os identificadores, ou seja, x um identificador diferente de X, nome diferente
de Nome, etc.
Exemplos:
X
2 http://docs.oracle.com/javase/specs/
14
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Y_1
nome
Pessoa
j3
_teste
3.7.
Tipos Primitivos
Tipos primitivos so tipos que no necessitam instanciao, ou seja, sua declarao j cria
a varivel na memria no sendo necessrio construtores.
Existem oito tipos primitivos em Java que so divididos em quatro grupos:
inteiros
ponto flutuante
caractere
booleano.
Tamanho
Intervalo
byte
1 byte
128 at +127
short
2 bytes
int
4 bytes
2.147.483.648 at 2.147.483.647
long
8 bytes
9.223.372.036.854.775.808 at 9.223.372.036.854.775.807
Tabela 3.3: Tipos primitivos inteiros do Java
Por padro, os tipos primitivos inteiros so do tipo int, ou seja, se apenas for escrito
o nmero 5, este ser do tipo int. Para explicitar o tipo long deve-se acrescentar, aps o
nmero, a letra L (maiscula ou minscula):
long numero = 45L;
http://solutioin.com
Francisco Calaa, Otvio Calaa
15
Verso 1.2-beta
1234.566
4343.1212
Tipo
Tamanho
Intervalo
float
4 byte
+/ 3.4E 38 at +/ 3.4E + 38
double
8 bytes
Por padro, os tipos primitivos com casas decimais so do tipo double, ou seja, se apenas for escrito o nmero 3.5, este ser do tipo double. Para explicitar o tipo float deve-se
acrescentar, aps o nmero, a letra F (maiscula ou minscula):
float numero = 3.5F;
Dica:
O Unicode possui o objetivo explcito de transcender as limitaes
de codificaes de carcter tradicionais, como as definidas pelo
padro ISO 8859, que possuem grande uso em vrios pases mas
que permanecem em sua maioria incompatveis umas com as outras.
Vrias codificaes de carcter tradicionais compartilham um problema comum, ao permitirem processamento bilngue (geralmente usando caracteres romanos e a lngua local), mas no processamento
multilngue (processamento de lnguas arbitrrias misturadas umas
com as outras).
16
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Observe que para realizar a operao de cast basta colocar o tipo que se deseja converter
entre parntesis na frente da varivel a ser convertida.
O cdigo da listagem 3.4 apresenta um exemplo do que acontece quando feito um cast
de uma varivel maior para uma menor. Existe o risco de truncamento do nmero. A sada
deste exemplo :
Numero:300
Aps truncamento:44
Isto ocorre porque 300 escrito em binrio : 100101100. Contando os primeiros oito bits
da direita para esquerda, temos: 00101100. Este valor em decimal vale 44. O restante do
nmero em binrio fui truncado, ou seja, descartado.
Listagem 3.4: Exemplo de truncamento de nmeros
1
3
4
5
6
7
8
9
3.8.
Operadores
Quando o computador foi concebido ele era puramente uma mquina de clculos. Apesar de atualmente o computador estar associado a diversas atividades da vida cotidiana, o
mesmo ainda no passa de uma super mquina de fazer clculos. Desta forma, a linguagem
Java possui vrios operadores cujo objetivo realizar este clculos. Nesta seo sero apresentados os operadores que iro nos auxiliar em operaes matemticas e lgicas.
3.8.1 Aritmticos
A aritmtica do Java realizada por meio dos cinco operadores. Eles so divididos em dois
grupos, os de maior prioridade, listados na Tabela 3.5 e os de menor prioridade, listados
http://solutioin.com
Francisco Calaa, Otvio Calaa
17
Verso 1.2-beta
o valor da varivel x ser 16 pois a soma ser feita primeiro devido aos parntesis.
3.8.2 Atribuio
Em Java utilizado o operador = para realizar a atribuio. Sua ordem de execuo da
direita para a esquerda, ou seja, os valores mais direita so atribudos s variveis mais a
esquerda: x = 4 equivale a dizer que o valor 4 ser atribudo varivel x e, aps a execuo
desta instruo a varivel x passar a conter o valor 4.
18
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Operador
Operao realizada
Multiplicao
Diviso
Operador
Operao realizada
Adio
Subtrao
Em Java, possvel combinar o operador de atribuio (=) com os operadores de aritmtica. Desta forma so criados mais operadores de atribuio. Estes operadores esto
listados na Tabela 3.7.
Uma dica, para entender melhor estes operadores, colocar o operador de aritmtica
antes do operador de atribuio. Sendo assim, se for necessrio realizar as operaes de
soma e atribuio, primeiro escreva o operador de soma e depois o de atribuio: + =,
x += 3;
Exemplo
Equivalente a
+=
s += 7
s=s+7
-=
s -= 7
s=s-7
*=
m *= 7
m=s*7
/=
d /= 7
d=s/7
%=
r %= 7
r=s%7
3.8.3 Incremento/Decremento
Os operadores de incremento e decremento so utilizados quando existe a necessidade de
somar ou subtrair em apenas uma unidade os valores contidos em uma varivel utilizando
dois sinais de soma, para incremento e dois sinais de subtrao para decremento: Assim,
x + + incrementar o valor de x e x decrementar o valor de x. Estes operadores se
dividem em dois grupos:
http://solutioin.com
Francisco Calaa, Otvio Calaa
19
Verso 1.2-beta
3.8.4 Relacionais
So utilizados para comparar duas variveis. O resultado da comparao um valor
booleano. A relao de comparadores do Java pode ser vista na Tabela 3.8.
Operador
Operao
==
Igualdade
!=
Diferena
>
Maior que
>=
<
<=
3.8.5 Lgicos
Existem quatro operaes lgicas, cujos operadores esto ilustrados na Figura 3.9:
1. E, o resultado de uma operao lgica E s verdadeiro se os dois operandos tambm
forem verdadeiros;
20
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Operador
Operao
||
OU curto-circuito
&&
E curto-circuito
OU lgico
&
E lgico
OU exclusivo
No lgico
A tabela verdade do Operador E pode ser vista na figura 3.11, do Operador OU na figura
3.10 e a tabela do Operador OU EXCLUSIVO na figura 3.12.
Observe na Figura 3.9 que existem dois tipos de operadores para a operao OU: | (OU
simples) e || (OU curto-circuito) e dois tipos de operadores para a operao E: & (simples)
e && (E curto-circuito).
Basicamente o que diferem estes dois tipos de operadores so o seguinte. OU e E curtocircuito (|| e &&) so utilizados apenas para operaes condicionais. Em uma operao
condicional, j sendo possvel a obteno do resultado, analisando apenas o primeiro
operando, no analisado o segundo operando. Neste caso a resposta j retornada, da o
nome curto circuito. Exemplo:
V || ? = V
F && ? = F
http://solutioin.com
Francisco Calaa, Otvio Calaa
21
Verso 1.2-beta
Entrada 1
Entrada 2
Sada
Entrada 1
Entrada 2
Sada
3.9.
Estruturas de seleo
Estrutura de seleo (expresso condicional ou ainda construo condicional) uma estrutura de desvio do fluxo de controle que executa diferentes instrues dependendo se a
seleo (ou condio) verdadeira ou falsa, em que a expresso processada e transformada em um valor booleano.
3.9.1 if . . . else
A instruo if . . . else se comporta da seguinte maneira. Quando o teste do if for verdadeiro, executado o cdigo que se encontra logo em seguida do if. No caso do teste ser
falso, executado o cdigo que se encontra logo em seguida do else. O bloco else no
obrigatrio. A figura 3.4 ilustra o fluxo da instruo if . . . else. Na listagem 3.5 pode ser
visto um exemplo de uso.
Sua sintaxe :
Entrada 1
Entrada 2
Sada
22
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
if(teste){
//executa somente se o teste for verdadeiro
}else{
//executa somente se o teste for falso
}
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
if (nota >= 5) {
JOptionPane.showMessageDialog(null, "Aprovado");
} else {
JOptionPane.showMessageDialog(null, "Reprovado");
}
10
11
12
13
14
15
16
http://solutioin.com
Francisco Calaa, Otvio Calaa
23
Verso 1.2-beta
Dica:
Para converter String em int, utilize o cdigo:
int nota = Integer.parseInt(notaString);
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
9
10
11
import javax.swing.JOptionPane;
2
3
4
5
6
int n1 = Integer.parseInt(primeiroNumero);
int n2 = Integer.parseInt(segundoNumero);
8
9
10
11
12
13
14
24
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
15
3.9.3 switch
Diferente das instrues if e if . . . else, a instruo switch permite um maior nmero de
possibilidades de caminhos de execuo. A palavra chave switch pode ser utilizada somente
com o tipo primitivo int (byte, short, char por converso automtica e seus tipos Wrappers),
o tipo Enum e, a partir da verso 7 do Java, String.
Sua sintaxe :
switch(tipo){
case a:
//instrucao;
case b:
//instrucao;
default:
//instrucao;
}
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
http://solutioin.com
Francisco Calaa, Otvio Calaa
25
Verso 1.2-beta
case 6:
msg = "Junho";
break;
case 7:
msg = "Julho";
break;
case 8:
msg = "Agosto";
break;
case 9:
msg = "Setembro";
break;
case 10:
msg = "Outubro";
break;
case 11:
msg = "Novembro";
break;
case 12:
msg = "Dezembro";
break;
default:
msg = "Nmero incorreto";
}
JOptionPane.showMessageDialog(null, msg);
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
3.10.
Estruturas de Repetio
Estrutura de repetio uma estrutura de desvio do fluxo de controle que realiza e repete
diferentes aes, dependendo se uma condio verdadeira ou falsa, em que a expresso
processada e transformada em um valor booleano. Esto associados a uma estrutura
de repetio uma condio (tambm chamada "expresso de controle" ou "condio de
parada") e um bloco de cdigo: verifica-se a condio, e caso seja verdadeira, o bloco
executado. Aps o final da execuo do bloco, a condio verificada novamente, e caso
ela ainda seja verdadeira, o cdigo executado novamente.
3.10.1
for
A instruo for prov um caminho rpido para percorer uma faixa de valores. Com esta
instruo possvel repetir determinadas instrues enquanto a condio for verdadeira. A
sintaxe do for a seguinte:
for (inicializao; condio; incremento) {
instrues(s)
}
26
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
3.10.2 while
A instruo while executa um bloco de instrues enquanto uma condio particular for
verdadeira (true). Sua sintaxe :
while (teste) {
statement(s)
}
A expresso while avalia o teste, que deve retornar um tipo booleano. Se a espresso
avaliada for verdadeira (true), o bloco while executa as instrues dentro do bloco. A expresso while continua testando o teste at que este seja falso (false). O cdigo da listagem
3.10 calcula a soma de inteiros enquanto a opo de sada no informada.
Listagem 3.10: Exemplo de utilizao do lao while
1
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
int qtd = 0;
double soma = 0;
9
10
11
12
while (status != 1) {
String numStr1 = JOptionPane.showInputDialog("Digite um inteiro");
int n1 = Integer.parseInt(numStr1);
13
http://solutioin.com
Francisco Calaa, Otvio Calaa
27
Verso 1.2-beta
soma += n1;
qtd++;
14
15
16
String msg = "Digite 1 para sair ou qualquer outro nmero para continuar";
String statusStr = JOptionPane.showInputDialog(msg);
17
18
19
status = Integer.parseInt(statusStr);
20
21
22
23
24
25
26
27
28
3.10.3
do . . . while
A linguagem Java prov a instruo do . . . while que pode ser vista abaixo:
do {
statement(s)
} while (teste);
A principal diferena entre do . . . while e while que while primeiro avalia o teste e somente
aps executa o loop, enquanto do . . . while primeiro executa a instruo e somente aps isto
avaliado o teste. Em resumo, do . . . while garante pelo menos uma execuo das instrues
do bloco.
3.11.
Exerccios
1. Crie um cdigo que executa a seguinte ao: solicita ao usurio uma idade. Se esta for
maior ou igual a 16, imprime: Pode votar. Se no for, imprime: No pode votar.
2. Melhore o cdigo do exerccio anterior para imprimir tambm Voto obrigatrio quando
a idade estiver entre 18 e 70 anos.
3. Crie um cdigo que imprima o seguinte:
************
************
************
************
4. Crie um cdigo que solicita ao usurio um nmero entre 1 e 7. Aps isto, o sistema
imprime: Domingo se o nmero for 1, Segunda se o nmero for 2, Tera se o nmero
for 3, etc. . .
28
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
5. Altere o cdigo da listagem 3.10 para utilizar do. . . while no lugar de while.
http://solutioin.com
Francisco Calaa, Otvio Calaa
29
I N T R O D U O O R I E N TA O A
OBJETOS
O Objetivo da orientao a objetos facilitar o reuso de software. Hoje ao ir a uma loja
para comprar uma lmpada, a nica coisa que necessrio saber a potncia desta. O
fabricante da lmpada, sem ter medido nada na sua sala, consegue fabricar uma lmpada
que servir para voc. Hoje fcil reutilizar lmpadas por conta que estas seguem alguns
padres que facilitam sua utilizao. No necessrio rever toda a fiao da sua residncia
quando uma lmpada queima, nem substituir nada. Basta tirar a lmpada defeituosa e
colocar outra nova no seu lugar.
Desta forma, a orientao a objetos traz para o mundo do software as facilidades encontradas no mundo real.
Neste captulo voc ver os conceitos inicias da orientao a objetos, tais como classes e
seus elementos.
4.1.
31
Verso 1.2-beta
Assim uma classe o arquivo, o cdigo digitado, enquanto o objeto ser construdo pelo
programa, a partir da classe, e executado pelo computador.
Para declarar classes utiliza-se a palavra chave class:
class Carro {
//campos, construtores, e declarao de mtodos
}
Para instanciar, ou criar, objetos a partir de uma classe utiliza-se o operador: new.
Carro seuCarro = new Carro();
Note que uma classe tambm um tipo. Voc acabou de criar um novo tipo de variveis
no Java! O tipo Carro.
Antes de serem instanciadas, as variveis objeto valem null. A palavra chave null
utilizada para expressar a no existencia de uma instncia de um objeto em determinada
varivel, ou seja, representa o nulo. Esta forma, uma varivel no instanciada possui o valor
null.
4.2.
Uma classe possui atributos e mtodos. Existe tambm um tipo especial de mtodo: o mtodo
construtor. Nesta seo sero apresentados estes elementos.
4.2.1 Atributos
Atributos de uma classe so as propriedades da mesma. No exemplo do Carro, atributos
poderiam ser: cor, dataDeFabricacao, potncia, etc. Observe que atributos so substantivos que
descrevem a Classe e que so exclusivos de cada objeto, ou seja, apesar de todos os Carros
possuirem o atributo cor, cada Carro pode ter uma cor diferente. Na classe da listagem 4.1
existem os atributos cor e velocidade. Aps a execuo da classe da Listagem 4.2, voc ver
a seguinte sada:
Cor: Branco - Velocidade:80.0
32
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
obj.cor = "Branco";
obj.velocidade = 80;
4
5
6
8
9
4.2.2 Mtodos
Mtodos so como funes. Possuem instrues que so executadas quando o mtodo
invocado. Em Orientao a Objetos os mtodos descrevem aes realizadas pelos objetos.
Em Java os mtodos devem possuir tipo de retorno:
int realizaAlgo(){
//instrues
return 5;
}
Neste caso obrigatrio explicitar o que o mtodo retorna com a palavra chave return.
Se o mtodo no retornar algo, o tipo de retorno utilizado void (note que sempre deve
ser informado o tipo de retorno. Mesmo quando o mtodo no retorna nada!):
void realizaAlgo(){
//instrues
}
A Listagem 4.3 inclui mtodos na classe Carro. Estes mtodos so responsveis por alterar a velocidade e parar o carro. A Listagem 4.4 apresenta um exemplo de execuo destes
mtodos. Aps sua execuo, voc ver a seguinte sada:
Mudando a velocidade para 80,000000 Km/h
Velocidade atual: 80,000000 Km/h
Parando veculo. Velocidade 0 Km/h. Cor: Branco
Mudando a velocidade para 60,000000 Km/h
Velocidade atual: 60,000000 Km/h
Parando veculo. Velocidade 0 Km/h. Cor: Vermelho
http://solutioin.com
Francisco Calaa, Otvio Calaa
33
Verso 1.2-beta
double velocidade;
String cor;
3
4
5
void mudarVelocidade(double v) {
velocidade = v;
System.out.printf("\n\nMudando a velocidade para %f Km/h", velocidade)
;
}
6
7
8
9
10
void pararCarro() {
System.out.printf("\nVelocidade atual: %f Km/h", velocidade);
System.out.printf("\nParando veculo. Velocidade 0 Km/h. Cor: %s", cor
);
}
11
12
13
14
15
8
9
10
11
12
13
Dica:
Construtor padro aquele que no recebe parmetros.
34
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
5
6
7
8
9
10
11
http://solutioin.com
Francisco Calaa, Otvio Calaa
35
Verso 1.2-beta
Dica:
Esta padronizao, dentre outras da linguagem Java, esto descritas
no documento chamado: Code Conventions for the Java Programming Language. Este documento pode ser acessado atravs do site:
http://www.oracle.com/technetwork/java/codeconv-138413.html
4.3.
At agora todos os atributos e mtodos de uma classe s estavam acessveis atravz de suas
instncias. Se voc observar o campo out da classe System ver que possvel acessa-lo
diretamente da classe, sem qualquer instncia.
Os campos podem ser da classe ou do objeto. At agora todos os campos criados foram
de objetos, pois s so acessveis a partir de objetos. Para que determinados atributos
possam ser compartilhados por todos os objetos de determinada classe, estes atributos
devem possuir o modificador static.
Na listagem 4.7 apresentada uma classe com um atributo static. Observe que este
atributo incrementado a cada nova instncia desta classe. A classe da listagem 4.8 cria
trs objetos do tipo ObjetoTeste e no final acessa a varivel quantidadeInstancias para saber
este nmero. Note que possvel acessar elementos statics sem a necessidade de instanciar
a classe.
Listagem 4.7: Objeto para testes da palavra chave static
1
2
4
5
public ObjetoTeste() {
quantidadeInstancias ++;
}
6
7
8
9
10
4
5
6
7
8
9
10
11
12
36
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
13
Observe no cdigo da listagem 4.9 a utilizao de vrios mtodos do tipo static das
classes JOptionPane e Math. A cada utilizao de um mtodo destas classes como:
JOptionPane.showMessageDialog(...);
Um exemplo equivalente est no cdigo da listagem 4.10. Nesta classe foi utilizado o
import static o que tornou desnecessrio a referncia das classes JOptionPane e Math:
showMessageDialog(...);
import javax.swing.JOptionPane;
2
3
4
5
6
7
8
9
10
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,
JOptionPane.showMessageDialog(null,
11
12
13
14
15
16
"Numero:" + numero);
4
5
6
7
8
9
10
11
http://solutioin.com
Francisco Calaa, Otvio Calaa
37
Verso 1.2-beta
12
showMessageDialog(null,
showMessageDialog(null,
showMessageDialog(null,
showMessageDialog(null,
13
14
15
16
"Numero:" + numero);
"Raiz Quadrada:" + raizQuadrada);
"Cubo:" + cubo);
"Seno:" + seno);
17
18
19
4.4.
Tipos Wrapper
38
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
/*
* Exemplo de auto unboxing. Observe a utilizao da classe Integer para
* converso da String 56 em tipo int.
*/
int quantidade = new Integer("56");
9
10
11
12
13
14
15
16
4.5.
Regras de escopo
Entenda por escopo rea de atuao. Os escopos do Java so definidos por chaves. As variveis declaradas dentro de um escopo somente podem ser acessadas dentro deste mesmo
escopo.
Observe que os blocos if, while, for, mtodos, etc. definem escopos. Seus cdigos so
escritos entre chaves. Todas as variveis declaradas dentro de um bloco if somente podem
ser acessadas dentro de um bloco if. Cada mtodo define um novo escopo, por isto as
variveis declaradas dentro de um mtodo no podem ser acessadas por outro mtodo, ou
seja, outro escopo.
Observe o cdigo da listagem 4.12. Neste cdigo existe um bloco for no mtodo main.
Dentro do bloco for foi declarada as variveis numero e i. Estas variveis no podem ser
acessadas fora do bloco for.
Listagem 4.12: Exemplo de regras de escopo
1
2
3
4
5
6
7
8
http://solutioin.com
Francisco Calaa, Otvio Calaa
39
Verso 1.2-beta
4.6.
Sobrecarga de mtodos
possui a assinatura acao(String), pois o mtodo se chama acao e recebe uma String como
parmetro de entrada.
No entra no conceito de assinatura de um mtodo o seu tipo de retorno, ou seja, dois
mtodos:
void acao(String texto)
int acao(String texto)
14
15
16
17
18
19
20
21
40
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
4.7.
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
41
A R R AY S
Arrays so estruturas de dados que permitem o armazenamento de objetos o que facilita a manipulao e transporte destes. No mundo real so utilizadas caixas quando
necessrio agrupar ou transportar objetos. No mundo do Java uma das estruturas utilizadas
so Arrays. Para trabalhar adequadamente com Arrays necessrio que voc saiba como
inicializa-los. O prprio mtodo main recebe um array de strings quando feito String []
args.
O Java 5 trouxe uma nova estrutura for, mais adequada para percorrer valores de arrays.
Esta estrutura mais rpida e mais simples de implementar. Trata-se do for aprimorado.
5.1.
O que so arrays
Um array um objeto continer utilizado para armazenar outros objetos. Possui um tamanho
fixo. O tamanho de um array estabelecido quando este criado. Aps sua criao no
mais possvel alterar este tamanho. Em captulos posteriores ser apresentado as colees
que podem ter seus tamanhos alterados.
Cada item em um array chamado de elemento e cada elemento pode ser acessado por
um ndice numrico. Este ndice um inteiro e sempre se inicia com 0, ou seja, um array
com 10 elementos ter os ndices de 0 at 9.
Um bom exemplo para ilustrar um array a caixa de ovos. Pense em uma caixa de ovos
com 9 unidades. A caixa de ovos um array com 9 elementos. Todos do tipo ovo. A figura
5.1 ilustra isto. Note que quando se cria um array este uma caixa de ovos vazia mas com
um espao pr-determinado, no caso 9. Este espao o tamanho do array. Somente aps a
criao do array possvel colocar elementos nele.
Para acessar determinado elemento de um array necessrio utilizar colchetes:
int n = numeros[4];
Este exemplo acessa o quinto elemento do array (a numerao dos ndices de um array
inicia com 0, por isto o indice 4 representa o quinto elemento).
Se ocorrer uma tentativa de acesso a um elemento no existente em um array ocorrer
um erro. Por exemplo, ao tentar acessar o sexto elemento de um array com 3 elementos
ser visto um erro:
int [] numeros = new int[3];
int n = numeros[5];
43
Verso 1.2-beta
arrays
Figura 5.1: Um array pode ser comparado a um porta ovos, cada elemento do array pode ser comparado a um ovo
5.2.
Como nas declaraes de variveis de qualquer tipo no Java, a declarao possui duas
partes: o tipo e o nome da varivel. Note que o tipo do array escrito como tipo[], onde
tipo o tipo de dados que ser colocado no array.
Tambm possvel, ao declarar arrays, colocar os colchetes aps a varivel:
int primeiroArray [];
Observe neste exemplo que , na mesma linha, declarado um array, inicializado com 10
elementos e, cada elemento, inicializado com um determinado valor.
Uma observao importante, que costuma cair nas provas de certificao, que quando o
array de tipos primitivos todos os elementos deste so inicializados com 0 ou false, se for
44
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
arrays
7
8
9
http://solutioin.com
Francisco Calaa, Otvio Calaa
45
Verso 1.2-beta
arrays
10
11
12
13
14
15
16
17
18
19
5.3.
Mtodo main
46
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
arrays
Figura 5.4: Passagem de parmetros para uma aplicao Java via linha de comando
http://solutioin.com
Francisco Calaa, Otvio Calaa
47
Verso 1.2-beta
5.4.
arrays
O Java 5 trouxe uma nova funcionalidade para iterao de arrays: o for aprimorado. Esta
nova forma de utilizao do for permite iteraes de colees e arrays de forma compacta
e mais fcil de ser lida. Para demonstrar um exemplo, considere o exemplo da listagem 5.3.
Neste exemplo utilizada a seguinte estrutura for:
for (String meioTransporte : transportes) {
. . .
}
Observe que este for necessita apenas de dois parmetros: A varivel que receber cada
item do array e o array. Este for percorrer todo o array transportes e coloca, cada elemento
deste, na varivel meioTransporte.
Listagem 5.3: Exemplo de uso do for aprimorado
1
2
3
5
6
7
8
9
5.5.
Em Java todos os parmetros so passados por valor. Isto significa que o valor da varivel
passado sempre ser copiado para o valor da varivel que est recebendo o parmetro. Mas
isto provoca dois tipos de comportamentos diferentes:
Quando a varivel passada primitiva (byte, short, int long, float, double, char e
boolean), o valor copiado para a varivel que est recebendo, ou seja, esta pode
sofer alteraes que no sero replicadas no valor da varivel passada.
Quando passado uma varivel Objeto, o valor desta tambm copiado. A diferena
que o valor de uma varivel Objeto apenas a referncia a este Objeto, por isto,
tem-se a impresso que ocorreu uma passagem por referncia, mas ainda por valor,
pois este foi copiado. Lembre-se o valor de uma varivel Objeto a referncia a este
objeto. Se, neste caso, for alterada a varivel passada, esta tambm sofre alteraes na
origem.
Para poder entender melhor isto, veja o cdigo da listagem 5.5. Esta classe utiliza a classe
Pessoa descrita na listagem 6.4.
48
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
arrays
Observe, na classe da listagem 5.5, a existncia de dois mtodos chamados metodoQualquer. O primeiro mtodo recebe um int, que um tipo primitivo, e o segundo mtodo
recebe uma Pessoa, que um objeto.
Quando invocado o metodoQualquer pela primeira vez no mtodo main, foi passado
como parmetro a varivel valor que um tipo primitivo. Note que o valor desta varivel
no mudou, antes e depois da execuo do metodoQualquer continuou tendo 4 como valor.
Quando invocado o metodoQualquer passando um objeto do tipo Pessoa, este teve
sua referncia copiada. Assim quando alterado em metodoQualquer, esta alterao ser
percebida no mtodo main. Observe que, apesar de se ter a impresso que ocorreu uma
passagem por referncia, no foi isto que ocorreu no Java. O que ocorreu foi uma passagem
por valor. Lembre-se que em Java as varveis Objeto armazenam apenas a referncia a um
objeto. Na passagem de parmetros por valor, o valor (no caso a referncia ao objeto do
tipo Pessoa) foi copiado para o mtodo metodoQualquer.
A figura 5.5 ilustra a cpia de uma referncia. Observe que, apesar de serem variveis e
referncia diferentes, o Objeto o mesmo. Assim, uma alterao realizada pela referncia
referencia 01 - varivel 01 tambm ser percebida pela referncia referencia 02 - varivel
02.
Um outro exemplo est no cdigo da listagem 5.6. Lembre-se que array um objeto,
logo ter sua referncia copiada. O mtodo alteraArray recebe um array de int. Este array
(que um objeto) criado no mtodo main e passado como parmetro para o mtodo
passagemArray. Gerando a seguinte sada:
Antes:
1
Depois:
11
12
13
14
15
16
17
18
19
http://solutioin.com
Francisco Calaa, Otvio Calaa
49
Verso 1.2-beta
public Pessoa(String n) {
nome = n;
}
4
5
6
7
arrays
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
8
9
10
11
12
13
14
15
16
17
18
19
20
50
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
5.6.
arrays
Arrays multidimensionais
possvel, mas no aconselhado, utilizar arrays multidimensionais no Java. Basta acrescentar o par abre e fecha colchetes para cada dimenso. Note que os arrays criados at agora
possuem dimenso unitria. Um exemplo de array bi-dimenssional :
int [][] matriz = new int [3][4];
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
Francisco Calaa, Otvio Calaa
51
Verso 1.2-beta
arrays
10
11
12
13
14
5.8.
Exerccios
1. O que so arrays?
2. Quais as formas de se declarar um array?
3. Explique o for aprimorado.
4. Como passar parmetros para o mtodo main?
5. Explique a passagem de parmetros no Java.
6. O que so lista de parmetros com comprimento varivel?
7. Crie uma classe chamada Calculadora. Esta classe dever possuir os mtodos somar
e multiplicar que recebam uma quantidade varivel de parmetros do tipo double.
O mtodo somar retorna a soma de todos eles e o mtodo multiplicar o valor do
produto entre eles.
52
http://solutioin.com
Francisco Calaa, Otvio Calaa
U M P O U C O M A I S D E O R I E N TA O A
OBJETOS
No captulo 4 foi realizada uma introduo orientao a objetos. Neste captulo ser
apresentado mais detalhes deste novo paradigma: Encapsulamento, Herana, Abstrao e
Polimorfismo. Estes elementos promovem o melhor reuso de software o que torna possvel
a concepo de sistemas mais complexos e menos propensos a erros.
Outro assunto abordado neste captulo o coletor de lixo. Algumas tecnologias demandam uma preocupao do desenvolvedor em desalocar recursos. Em Java no necessrio
preocupar-se com isto. Os objetos criados uma vez no mais referenciados so coletados
pelo Garbage Collector (Coletor de lixo).
6.1.
Coletor de lixo
chamado de heap space o espao onde ficam armazenados os objetos Java instanciados.
Os objetos so criados pelo operador new e alocados no heap space em tempo de execuo.
A coleta do lixo o processo automtico que remove os objetos que no esto sendo mais
referenciados liberando espao neste heap space.
O coletor de lixo ou gc (garbage collector em ingls) um processo executado paralelamente
aplicao e responsvel pela liberao de memria.
Nas listagens 6.1 e 6.2 apresentado uma demonstrao de funcionamento do coletor de
lixo. Todas as instncias de ObjetoColetado, ao serem instanciadas, escrevem a linha:
++ Construindo o objeto: 0
e toda as vezes que estas instncias so finalizadas pelo gc, executado o mtodo
void finalize(). Desta forma, impressa a linha:
-- Finalizando o objeto: 0
53
Verso 1.2-beta
++ Construindo o objeto: 2
++ Construindo o objeto: 3
-- Finalizando o objeto: 3
-- Finalizando o objeto: 2
. . .
++ Construindo o objeto: 1200
++ Construindo o objeto: 1201
int numero;
3
4
public ObjetoColetado(int n) {
numero = n;
System.out.printf("\n++ Construindo o objeto: %d", numero);
}
5
6
7
8
9
10
11
12
13
14
4
5
6
7
8
9
10
6.2.
A palavra-chave this
54
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
como referncia
Quando utilizada como mtodo, este acessa o construtor da prpria classe. Observe que
um dos construtores do cdigo abaixo:
public class Ponto {
public int x = 0;
public int y = 0;
//construtor
public Ponto(int a, int b) {
x = a;
y = b;
}
public Ponto() {
this(0, 0);
}
}
invoca um outro construtor com a chamada this(0, 0) passando os parmetros para outro
construtor.
Quando utilizada como referncia esta referencia o objeto da prpria classe. Com this
possvel acessar os elementos da instncia do objeto a partir da classe. Note que a palavra
chave this no pode ser utilizada dentro de contextos static porque nestes contextos no
so acessados a partir de instncias da classe e sim diretamente. Lembre-se this acessa
membros do objeto criado a partir da classe em que utilizado.
Por exemplo a classe Ponto pode ser escrita assim:
public class Ponto {
public int x = 0;
public int y = 0;
//construtor
public Ponto(int a, int b) {
x = a;
y = b;
}
}
http://solutioin.com
Francisco Calaa, Otvio Calaa
55
Verso 1.2-beta
this.x = x;
this.y = y;
}
}
Cada argumento do segundo exemplo se possui o mesmo nome dos atributos da classe:
x e y. Para diferencia-los utilizado this. A referncia this indica que this.x e this.y so as
variveis x e y da classe e no do construtor. Assim:
this.x = x;
6.3.
6.4.
Encapsulamento
56
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Apesar dos termos get e set estarem em ingls obrigatrio que estes sejam usados desta
forma. Mais adiante este padro ser necessrio para correto funcionamento de determinadas APIs.
No se preocupe com isto. Hoje a maior parte das IDEs fazem este trabalho.
No eclipse basta criar a classe, escrever os atributos nela (com o modificador private),
conforme a figura 6.1. Aps isto clique com o boto direito na tela e selecione a opo
source - Generate getters and setters, conforme a figura 6.2. Clique nos parmetros que
deseja criar os mtodos getters e setters conforme a figura 6.3. A figura 6.4 apresenta os
mtodos criados.
http://solutioin.com
Francisco Calaa, Otvio Calaa
57
Verso 1.2-beta
Figura 6.2: Exemplo do encapsulamento no eclipse: Invocando o assistente para criao do encapsulamento
Figura 6.3: Exemplo do encapsulamento no eclipse: Escolha dos campos que sero encapsulados
58
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
6.5.
Enumeraes
As enumeraes (ou enums) so tipos especiais de Java que permite lista limitada dos
valores. Estes valores podem ser passados s indicaes de controle (switch(), if() ex.)
Em liberaes prvias, a maneira padro representar um tipo enumerated era o teste
padro interno de Enum: teste padro interno de Enum - tem problemas severos!
final static public int INVERNO = 0;
final static public int PRIMAVERA = 1;
final static public int VERAO = 2;
final static public int OUTONO = 3;
6.6.
Pacotes
http://solutioin.com
Francisco Calaa, Otvio Calaa
59
Verso 1.2-beta
Os tipos (classes, enumeraes, interfaces) que fazem parte da plataforma java sao membros de vrios pacotes como:
Pacote java.lang, classes fundamentais do java
Pacote java.io, classes para leitura e escrita em dispositivos
possvel colocar as suas classes dentro de pacotes tambm, utilizando a palavra chave
package:
package livro.capitulo08;
No permitida a existncia de mais que uma declarao package. Isto se d pelo fato
de que um tipo (classe, enum ou interface) pode estar em apenas um pacote.
A declarao package deve ser a primeira declarao do arquivo. Antes dos imports,
antes de tudo.
Suponha que voc escreveu um grupo de classes que representa objetos grficos, como
crculos, retngulos, linhas e pontos.
public class Circulo {
. . .
}
public class Retangulo{
. . .
}
public class Ponto{
. . .
}
public class Linha{
. . .
}
Voc deve colocar estas classes em um pacote por vrias rases, incluindo:
Voc ou outros programadores podem facilmente determinar que estes tipos esto
relacionados entre si.
Voc e outros programadores sabem onde encontrar os tipos que fornecem funcionalidades grficas.
Os nomes dos seus tipos no conflitaro com os nomes de tipos com outros pacotes
Voc pode permitir tipos que sero acessados apenas por elementos de dentro do
mesmo pacote ou tipos que sero acessados externamente
60
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
import java.io.*;
import java.util.Date;
3
4
6
7
8
9
10
11
12
13
14
/*
* Note a referncia direta List, sem a necessidade
* de realizar um import.
*/
java.util.List lista = new java.util.ArrayList();
15
16
17
18
19
20
/*
* Esta classe foi importada do pacote java.io, atravs
* da declarao:
* import java.io.*;
*/
File arquivo = new File("c:\\ arquivo.txt");
21
22
23
24
25
26
27
28
http://solutioin.com
Francisco Calaa, Otvio Calaa
61
Verso 1.2-beta
6.7.
Herana
Na Orientao a Objetos uma classe pode derivar de outras classes atributos e mtodos.
Uma classe que deriva, ou herda de outra classe chamada de subclasse (tambm
classe derivada, classe extendida, ou classe filha). A classe herdada por uma subclasse
chamada de superclasse (tambm classe ancestral, classe pai).
A Herana define uma especializao. Desta forma uma subclasse, pode ser entendida
como uma especializao de determinada classe. Por exemplo, seja a classe Medico. Uma
especializao Pediatra. Desta forma, um Pediatra possui todos os mtodos e atributos
de Medico, afinal um Pediatra ainda Medico. Mas, alm destes, possui tambm atributos
e mtodos especficos de Pediatra.
Exceto a classe Object, que no possui superclasses, todas as classes tem uma, e somente
uma superclasse direta (herana simples). Se uma classe no tiver herdando de outra explicitamente, ento esta herda da classe Object de forma implcita.
Heraa somente aplicado a atributos e mtodos de classes. Construtores no so herdados por herana.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
62
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
21
22
23
24
25
26
27
28
29
30
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
4
5
6
7
pessoa.imprimirDados();
aluno.imprimirDados();
8
9
10
11
12
http://solutioin.com
Francisco Calaa, Otvio Calaa
63
Verso 1.2-beta
6.8.
6.8.1 private
A palavra private restringe o acesso do mtodo ou do atributo somente classe que o
definiu, ou seja, um mtodo ou atributo privado s poder ser acesso dentro da classe que
o definiu.! A listagem 6.4 descreve uma classe que possui um atributo com esse modificador.
Veja que no possvel acessar o atributo nome de fora desta classe.
6.8.2 pacote
utilizado quando no existe nenhum modificador de acesso antes da varivel. Restringe
o acesso somente a classes definidas dentro do mesmo pacote, ou seja, quando no informado nenhum modificador de acesso, o elemento pode apenas ser acessado de uma classe
que esta no mesmo pacote.
64
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
6.8.3 protected
Ele um pouco mais liberal que o modificador padro ou pacote, pois ele permite que um
mtodo de uma classe definida em um pacote possa ser acessado por uma classe definida
em outro pacote desde que esta classe seja filha da anterior.
6.8.4 public
Um mtodo pblico pode ser acessado por qualquer classe em qualquer pacote. Utilizado
para estabelecer uma interface entre os componentes do programa.
boa prtica definir todos os membros de uma classe private e ir aumentando a acessibilidade quando for necessrio. Evite criar tudo do tipo public.
6.9.
Classe object
A classe Object uma classe que serve de superclasse para todas as classes existentes em
Java. Isso significa que ao criar uma classe, se no for especificada nenhuma superclasse
aps a palavra extends, ento a classe Object ser assumida automaticamente como superclasse. Portanto toda classe subclasse de Object, e com isso herda alguns mtodos
automaticamente.
retorna apenas o valor true apenas se seus operandos forem precisamente o mesmo objeto.
Porm, o operador equals retorna quando os objetos contm o mesmo estado, atravs da
comparao campo-a-campo.
Por exemplo, eu e voc podemos ter carro do mesmo modelo. Nesse caso:
meuCarro == seuCarro
seria false pois embora nossos carros sejam do mesmo modelo, so carros diferentes. Entretanto,
meuCarro.equals(seuCarro);
poderia ser true se os atributos de ambos os carros fossem idnticos, por exemplo, mesmo
ano, mesma cor, etc.
A listagem 6.7 apresenta um exemplo de comparao de objetos. Note que apesar das
Strings possuirem o mesmo valor: texto, ao compar-las com == no visto o resultado
esperado. Apenas com equals.
http://solutioin.com
Francisco Calaa, Otvio Calaa
65
Verso 1.2-beta
3
4
5
6
7
8
9
if (s1 == s2) {
System.out.println("s1 igual a s2 com ==");
} else {
System.out.println("s1 diferente de s2 com ==");
}
10
11
12
13
14
15
if (s1.equals(s2)) {
System.out.println("s1 igual a s2 com equals");
} else {
System.out.println("s1 diferente de s2 com equals");
}
16
17
18
19
20
21
22
23
24
Este cdigo imprime o objeto e, ao ser convertido em String para a impresso, a mquina
virtual executar o mtodo toString para descobrir como fazer isto.
Listagem 6.8: Exemplo de utilizao do mtodo toString
1
66
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
4
5
6
7
8
9
10
11
12
6.10.
Polimorfismo
Uma caracterstica importante das classes reside no fato de que as subclasses de uma dada
classe so consideradas do mesmo tipo de seu parente.
Assim no exemplo anterior de Pessoa e Aluno, pode-se dizer que Aluno do tipo Pessoa,
ou seja, Aluno uma Pessoa. Note que a herana define, desta forma, o relacionamento
UM. Nestes casos tambm possvel que exista a sobrescrita de mtodos. Isto permite a
realizao de uma mesma operao sobre diferentes tipos de classes, desde que mantenham
algo em comum. Este efeito se chama Polimorfismo.
6.10.1 Abstrao
Para que voc entenda melhor a abstrao veja um exemplo com o mundo real. Tome
inicialmente algumas verdades:
1. Todo animal locomove;
2. Todo Peixe um animal;
3. Todo Sapo um animal;
4. Todo Tigre um animal;
Pergunta: Como o Animal Locomove? A resposta complicada pois Peixes, Sapos e
Tigres se locomovem de forma diferente. Na verdade a resposta : depende.
Mas, para cumprir a verdade 1, que todo animal se locomove, necessrio definir um
mtodo locomover em animal. Mesmo no sabendo ainda como este o faz: nadando, pulando ou correndo.
neste cenrio que entra o conceito de abstrao: Existe, mas no possvel saber como
, como feito.
Desta forma, o mtodo locomover deve ser abstrato utilzando a palavra chave abstract.
Para isto deve-se cumprir algumas regras:
Todo mtodo abstrato no possui corpo, ou seja, no lugar dos
vrgula: ;.
http://solutioin.com
Francisco Calaa, Otvio Calaa
colocado ponto-
67
Verso 1.2-beta
Quando uma classe possui pelo menos um mtodo abstrato, esta tambm deve ser
declarada como abstrata
As classes abstratas no podem ser instanciadas.
As classes filhas de uma classe abstrata devem, obrigatoriamente ou implementar os
mtodos abstratos da classe pai, ou tambm ser abstrata.
6.10.2
Exemplo de Polimorfismo
Para explicar melhor o Polimorfismo veja o exemplo da folha de pagamento de uma empresa.
O cdigo da listagem 6.9 apresenta a classe Empregado. Observe que esta classe abstrata (pelo modificador abstract na sua declarao). O mtodo calcularSalario tambm
abstrato, pois apesar de todos os empregados possuirem salrio, esta caracterstica s
poder ser descrita se for possvel saber o tipo de empregado: Assalariado, Comissionado
ou Horista.
A classe Empregado herda de Pessoa os atributos nome e telefone, no sendo mais
necessrios sua implementao. Essa classe tambm sobrescreve o mtodo toString que
define um comportamento personalizado quando for necessrio a conversso de objetos
do tipo Empregado em String.
O cdigo da listagem 6.10 apresenta a classe EmpregadoAssalariado. Esta classe herda
de Empregado alguns mtodos, inclusive os de Pessoa. possvel dizer que EmpregadoAssalariado um Empregado e por consequencia, uma Pessoa.
A classe EmpregadoAssalariado no abstrata, logo deve obrigatoriamente implementar
o mtodo calcularSalario. Observe que, para EmpregadoAssalariado, possvel dizer como
se calcula o salrio. Basta retornar o salrio mensal do empregado.
O cdigo da listagem 6.11 apresenta a classe EmpregadoComissionado. Esta classe tambm herda de Empregado alguns mtodos.
Note que o mtodo calcularSalario de EmpregadoComissionado retorna o resultado da
multiplicao das vendas brutas com o valor da comisso do empregado.
O cdigo da listagem 6.12 apresenta a classe EmpregadoHorista. Esta classe tambm
filha de Empregado. O seu mtodo calcularSalario tambm especfico apenas para empregados que trabalham por hora.
At agora foro apresentadas quatro classes em nosso exemplo:
Empregado
EmpregadoAssalariado
EmpregadoComissionado
EmpregadoHorista
Todos estes empregados so do tipo Pessoa. Os empregados assalariados, horistas e
comissionados so do tipo empregados. Isto se deve por causa da herana.
Para finalizar este exemplo ser construda a classe FolhaPagamento, descrita na listagem
6.13. Obseve neste exemplo que todos os empregados so instanciados e colocados em um
68
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
array de tipos Empregado. Quando este array iterado pelo for os dados salariais so
impressos de acordo com o tipo de empregado. Isto o polimorfismo: Apesar de todos os
empregados possuirem o mtodo calcularSalario, este se comporta de forma diferente em
funo do tipo do empregado.
Polimorfismo quer dizer: vrias formas de executar a mesma ao, ou seja, vrias formas
de executar o calcularSalario.
Listagem 6.9: Cdigo da classe Empregado
1
2
4
5
6
7
8
9
10
11
12
13
14
15
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http://solutioin.com
Francisco Calaa, Otvio Calaa
69
Verso 1.2-beta
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
4
5
6
7
8
9
this.qtdHoras = qtdHoras;
this.valorHora = valorHora;
10
11
12
13
14
15
16
17
18
19
70
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
20
21
22
23
24
25
26
27
28
29
30
31
32
33
4
5
6
7
8
9
10
11
12
13
14
15
16
6.11.
Converso e casting
Aps ter sido colocados, no exemplo da seo anterior, todos os empregados no Array
empregados como pode ser obtido o valor da comisso do empregado comissionado?
Observe que dentro do lao for isto no mais possvel pois todos os empregados so
tratados como do tipo Empregado.
Para isto existe o casting. A traduo de casting atuar. Com o casting possvel fazer
o Empregado atuar como EmpregadoComissionado e assim buscar o valor da comisso.
Assim como nos filmes no qualquer ator que pode atuar em um determinado papel,
tambm no ser qualquer objeto que poder atuar como EmpregadoComissionado, apenas aqueles que foram instanciados como tal.
O casting feito colocando o tipo desejado dentro de parntesis na frente do objeto:
EmpregadoComissionado empComiss = (EmpregadoComissionado) empregados[i];
http://solutioin.com
Francisco Calaa, Otvio Calaa
71
Verso 1.2-beta
6.11.1
A palavra-chave instanceof
Para testar o objeto instancia de determinada classe e consequentemente pode ser feito
uma operao de casting dele para essa classe utilizado a palavra-chave instanceof.
O cdigo da listagem 6.14 apresenta um exemplo de utilizao do operador instanceof.
Observe o teste do objeto empregados[i]. Este teste retornar true se esse objeto for do tipo
EmpregadoComissionado.
if(empregados[i] instanceof EmpregadoComissionado){
. . .
}
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
6.12.
Em uma seo anterior foi apresentado que variveis do tipo final representam constantes.
O modificador final tambm pode ser usando em classes e em mtodos.
Uma classe do tipo final no pode ser herdada, ou seja, no pode ter sub-classes.
Um mtodo do tipo final no pode ser sobrescrito.
72
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
6.13.
Interfaces
4
5
6
void alimentar();
void locomover();
http://solutioin.com
Francisco Calaa, Otvio Calaa
73
Verso 1.2-beta
5
6
7
8
9
10
11
12
@Override
public String toString() {
return "Aguia";
}
13
14
15
16
17
5
6
7
8
9
10
11
12
@Override
public String toString() {
return "Tigre";
}
13
14
15
16
17
18
6
7
8
74
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
9
10
11
12
13
14
15
16
17
18
6.14.
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
75
Verso 1.2-beta
76
http://solutioin.com
Francisco Calaa, Otvio Calaa
T R ATA M E N T O D E E X C E E S
Os aplicativos devem estar preparados para resolver situaes inesperadas como quando
um usurio digita um campo texto onde devia ser numrico ou uma data fora do padro.
Nestes casos ocorrem excees forma normal da execuo da rotina. Neste captulo ser
apresentado o mecanismo de excees do Java, as palavras chaves try cath throw e throws.
7.1.
O que so excees
7.2.
Observe que todo o cdigo que poder lanar alguma exceo colocado dentro de um
bloco try.
77
Verso 1.2-beta
tratamento de excees
Observe que possvel colocar quantos blocos catchs quantos forem necessrios e que
as excees possuem tipos, neste caso, NumberFormatException para erros de formatao
numrica e ArithmeticException para erros de aritimtica, como diviso por zero.
Em cada bloco catch foi adicionado o cdigo necessrio para tratar este tipo de erro,
neste caso, apenas a apresentao de uma mensagem ao usurio.
78
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
tratamento de excees
package capitulo7;
2
3
import javax.swing.JOptionPane;
4
5
7
8
9
10
11
12
13
14
15
16
17
18
19
JOptionPane.showMessageDialog(null, texto);
20
21
22
package capitulo7;
2
3
import javax.swing.JOptionPane;
4
5
6
7
8
9
10
11
12
13
try {
int numerador = new Integer(numeradorString);
int denominador = new Integer(denominadorString);
14
15
16
17
18
19
20
21
22
23
24
25
26
JOptionPane.showMessageDialog(null, texto);
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Informe apenas nmeros inteiros.");
} catch (ArithmeticException e) {
JOptionPane.showMessageDialog(null, "O denominador no pode ser ZERO.");
}
http://solutioin.com
Francisco Calaa, Otvio Calaa
79
Verso 1.2-beta
}
27
28
tratamento de excees
7.3.
7.4.
Toda exceo deve, obrigatoriamente, herdar de Exception. O cdigo da listagem 7.3 apresenta um exemplo. Lembre-se que quando a exceo herda de RuntimeException (que
subclasse de Exception) esta torna-se uma exceo no checada. Se a exceo no herdar
de RuntimeException (ou suas subclasses) ela passa a ser uma exceo checada.
Observe que a classe Exception herda de Throwable, ou seja, toda exceo do tipo
throwable.
Listagem 7.3: Exemplo de declarao de uma nova exceo
1
package capitulo7;
80
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
tratamento de excees
5
6
7
8
9
7.5.
package capitulo7;
2
3
import javax.swing.JOptionPane;
4
5
6
7
8
9
10
11
12
13
14
/*
* Verifica o login e a senha do usurio.
* Esta verificao normalmente feita com dados vindos de um Banco de Dados
* ou LDAP. Colocamos o usuario e a senha no cdigo para facilitar
* o entendimento.
*/
if(!"java".equals(login) || !"123".equals(senha)){
throw new AutenticacaoException("Usurio ou senha invlidos");
}
15
16
17
18
19
20
21
22
23
24
http://solutioin.com
Francisco Calaa, Otvio Calaa
81
Verso 1.2-beta
tratamento de excees
25
26
27
28
29
30
31
32
33
34
35
36
37
7.6.
A Hierarquia das excees apresentada na figura 7.1. A classe pai de todas as Excees
Throwable. Observe que existem duas derivaes: Exception e Error. Error so erros no
tratveis em cdigo como falta de memria. Exception so excees tratveis. A classe Exception possui uma subclasse especial: RuntimeException. Todas as excees que derivam
de RuntimeException so excees no verificadadas (nao existe obrigtoriedade no seu
tratamento). As outras excees, que no herdam de RuntimeException, mas so subclasses
de Exception so excees verificadas (existe a obrigatoriedade no seu tratamento).
82
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
tratamento de excees
7.7.
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
83
FLUXO DE DADOS
No mundo corporativo vital a transferncia de informaes entre computadores. Esta
troca feita atravs de fluxos de informao. Qualquer troca de dados, como rede, arquivos,
dispositivos IO vista como um fluxo de dados em Java.
Este captulo apresentar exemplos de fluxo de dados de arquivos e de rede com a
construo de um editor de texto simples e a construo de um trocador de mensagens
entre computadores.
8.1.
A classe File
A classe File existe para representar um arquivo. Ela no utilizada para escrever, ler, ou
alterar arquivos. Simplesmente para represent-los. Possui um construtor onde informado
a localizao do arquivo:
File arquivo = new File(c:\\arquivo.txt)
8.2.
Para escrever em arquivos ser utilizada a classe Formatter do pacote java.util. Existem
outras formas de escrever em um arquivo utilizando classes como FileWriter, DataOutputStream, etc. Para entender os exemplos preocupe-se apenas com a classe Formatter.
O cdigo da listagem 8.1 apresenta um exemplo de escrita em arquivos. Note o uso da
classe Formatter para realizar a escrita. Nesse exemplo tambm foi utilizado a classe File.
Observe o uso do mtodo close(). Este mtodo fecha o fluxo. Nunca se esquea dele.
Listagem 8.1: Exemplo de escrita em arquivos
1
package capitulo8;
2
3
4
5
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
85
Verso 1.2-beta
fluxo de dados
6
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
8.3.
Para ler um arquivo texto ser utilizada a classe Scanner do pacote java.util. Como na escrita existem outras formas de ler arquivos. Para entender os exemplos preocupe-se apenas
com a classe Scanner.
O cdigo da listagem 8.2 apresenta um exemplo de leitura de arquivos. Note o uso da
classe Scanner para ler o arquivo. Assim como no exemplo de escrita, a classe File foi
utilizada para representar um arquivo. Aps a leitura do arquivo no se esquea de fechar
o fluxo com o mtodo close().
Listagem 8.2: Exemplo de leitura em arquivos
1
package capitulo8;
2
3
4
5
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
6
7
9
10
11
12
13
14
15
16
17
18
19
20
86
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
fluxo de dados
21
22
23
8.4.
Este tpico apresentar um editor de texto que reunir todos os conhecimentos apresentados at agora. O cdigo est na listagem 10.6. O cdigo:
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(botaoAbrir, BorderLayout.NORTH);
c.add(botaoSalvar, BorderLayout.SOUTH);
c.add(new JScrollPane(areaTexto), BorderLayout.CENTER);
cria a tela. Note o uso da classe BorderLayout. Esta classe define um layout que posiciona
componentes com informaes NORTH para o topo, SOUTH para colocar algo abaixo,
CENTER para colocar algo no centro, etc.
A tela do editor de texto apresenta na figura 10.6.
O cdigo:
botaoAbrir.addActionListener(this);
botaoSalvar.addActionListener(this);
http://solutioin.com
Francisco Calaa, Otvio Calaa
87
Verso 1.2-beta
1
2
3
4
5
6
7
8
9
10
fluxo de dados
package capitulo8;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
import java.util.Scanner;
import java.util.StringTokenizer;
11
12
13
14
15
16
17
import
import
import
import
import
import
javax.swing.JButton;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JOptionPane;
javax.swing.JScrollPane;
javax.swing.JTextArea;
18
19
20
21
22
23
24
25
public EditorTexto(){
Container c = getContentPane();
26
c.setLayout(new BorderLayout());
c.add(botaoAbrir, BorderLayout.NORTH);
c.add(botaoSalvar, BorderLayout.SOUTH);
c.add(new JScrollPane(areaTexto), BorderLayout.CENTER);
27
28
29
30
31
botaoAbrir.addActionListener(this);
botaoSalvar.addActionListener(this);
32
33
34
setTitle("Editor de Texto");
setSize(800,600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
35
36
37
38
39
40
41
42
43
try {
if(e.getSource() == botaoAbrir){
jfc.showOpenDialog(this);
File file = jfc.getSelectedFile();
abrirArquivo(file);
}else if(e.getSource() == botaoSalvar){
jfc.showSaveDialog(this);
File file = jfc.getSelectedFile();
salvarArquivo(file);
44
45
46
47
48
49
50
51
52
88
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
fluxo de dados
}
}catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(null, "Arquivo no encontrado!");
}
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
8.5.
Serializao de objetos
At agora os fluxos apresentados foram apenas de String. possvel tambm trafegar objetos em fluxos de dados. Objetos Java podem ser salvos em arquivos, transmitido pela rede,
etc. Para que os objetos possam ser transmitidos de um lugar para o outro necessrio que
eles implementem a interface Serializable do pacote java.util. Quando a classe implementa
esta interface necessrio criar um atributo:
private static final long serialVersionUID = 1L;
para que no haja problemas com verses de classes. Esta a nica garantia que o objeto
trafegado, apesar de estar com os pacotes, mtodos, etc idnticos possuam a mesma verso
de suas classes nos computadores envolvidos.
O eclipse possui um assistente para criar este atributo.
http://solutioin.com
Francisco Calaa, Otvio Calaa
89
Verso 1.2-beta
8.6.
fluxo de dados
no se preocupe em criar este atributo. Pea para o eclipse criar para voc.
A classe Enviador, apresentada na listagem 8.5 envia as mensagens. O cdigo responsvel
por isto :
Socket socket = new Socket("127.0.0.1", 12345);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(mens);
a classe Socket cria uma comunicao com o ip 127.0.0.1 (que a sua mquina local)
na porta 12345. A classe ObjectOutputStream cria um fluxo de dados de saida e utiliza
o socket criado na linha anterior. O mtodo writeObjetct(mens) escreve o objeto no fluxo
criado na linha anterior.
A classe Receptor, apresentada na listagem 8.6 recebe as mensagens e as imprime no
console. Note que esta classe possui um lao infinito while(true). Este lao far com que o
receptor receba mensagens enquanto estiver rodando.
server = new ServerSocket(12345);
Socket socket = server.accept();
ObjectInput ois = new ObjectInputStream(socket.getInputStream());
Mensagem mens = (Mensagem) ois.readObject();
System.out.println(mens);
a classe ServerSocket cria um socket na mquina e abre a porta 12345 (esta dever estar
disponvel). O mtodo server.accept() aguarda at algum enviar uma mensagem por meio
destar porta (lembre-se do Enviador que enviar mensagens por esta porta). Foi utilizado
o mtodo readObject() para ler o objeto que est sendo trafegado, no caso, Mensagem.
Listagem 8.4: Classe Mensagem
1
package capitulo8;
2
3
import java.io.Serializable;
4
5
7
8
9
10
90
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
fluxo de dados
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package capitulo8;
2
3
4
5
6
import
import
import
import
java.io.IOException;
java.io.ObjectOutputStream;
java.net.Socket;
java.net.UnknownHostException;
7
8
import javax.swing.JOptionPane;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
try {
Socket socket = new Socket("127.0.0.1", 12345);
ObjectOutputStream oos = new ObjectOutputStream(socket
.getOutputStream());
oos.writeObject(mens);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
29
http://solutioin.com
Francisco Calaa, Otvio Calaa
91
Verso 1.2-beta
} while (!resposta.equals("sair"));
30
31
32
fluxo de dados
package capitulo8;
2
3
4
5
6
import
import
import
import
java.io.ObjectInput;
java.io.ObjectInputStream;
java.net.ServerSocket;
java.net.Socket;
7
8
10
11
12
13
14
15
16
17
18
19
20
ois.close();
socket.close();
server.close();
} catch (Throwable e) {
e.printStackTrace();
} finally {
try {
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
92
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
8.7.
fluxo de dados
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
93
GENRICOS E COLEES
Em um captulo anterior foi abordado os Arrays. Um dos problemas dos arrays a impossibilidade de alterar seu tamanho. Neste captulo sero abordadas outras colees como
Listas, Conjuntos e Mapas. Estas colees permitem ter seu tamanho alterado em tempo
de execuo e se comportam de forma diferente se aproximando ao comportamento do
mundo real.
9.1.
o que so genricos
observe o uso de: < E >. Este trecho de cdigo Especifica que tudo o que for informado
dentro das chaves < ... > ser considerado apenas como E. No cdigo da listagem 9.5 foi
colocado < Integer >, ou seja, onde tiver E ser considerado Integer. Assim o mtodo:
public void setObjeto(E objeto)
ser considerado:
public void getObjeto(Integer objeto)
Se, na declarao da classe CaixaGenrica for utilizado < String > onde tiver < E > ser
considerado como String.
Assim, evita-se erros de converso por ser possvel informar o tipo que estar na caixa
no moment da sua declarao.
95
Verso 1.2-beta
genricos e colees
package capitulo9;
public class Caixa {
4
5
6
7
8
9
10
11
12
13
14
package capitulo9;
public class CaixaDemo1 {
public static void main(String[] args) {
5
6
caixaDeInteiros.setObjeto(10);
Integer someInteger = (Integer) caixaDeInteiros.getObjeto();
System.out.println(someInteger);
7
8
9
10
11
package capitulo9;
public class CaixaDemo2 {
public static void main(String[] args) {
5
6
/*
* note que estamos adicionando String na caixa
* propositalmente para provocar um erro de converso
*/
7
8
9
10
11
caixaDeInteiros.setObjeto("10");
12
13
14
15
16
17
96
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
1
2
genricos e colees
package capitulo9;
public class CaixaGenerica <E>{
private E objeto;
4
5
public E getObjeto() {
return objeto;
}
6
7
8
9
10
11
12
13
14
package capitulo9;
public class CaixaGenericaDemo {
public static void main(String[] args) {
5
6
caixaDeInteiros.setObjeto(10);
Integer someInteger = caixaDeInteiros.getObjeto();
System.out.println(someInteger);
7
8
9
10
11
9.2.
Introduo a colees
9.3.
Listas
http://solutioin.com
Francisco Calaa, Otvio Calaa
97
Verso 1.2-beta
genricos e colees
package capitulo9;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
5
6
7
8
9
10
11
12
13
14
15
16
17
for(String c : cores){
System.out.printf("Cor: %s\n",c);
}
18
19
20
21
Collections.sort(cores);
System.out.println("Cores aps ordenao");
for(String c : cores){
System.out.printf("Cor: %s\n",c);
}
22
23
24
25
26
27
28
29
98
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
9.4.
genricos e colees
Conjuntos
package capitulo9;
import java.util.HashSet;
import java.util.Set;
4
5
6
7
8
9
10
11
12
13
14
for(String c : cores){
System.out.printf("\nCor: %s",c);
}
15
16
17
18
19
9.5.
Mapas
http://solutioin.com
Francisco Calaa, Otvio Calaa
99
Verso 1.2-beta
genricos e colees
package capitulo9;
import java.util.HashMap;
import java.util.Map;
4
5
import javax.swing.JOptionPane;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A Listagem 9.9 apresenta um exemplo um pouco mais complexo de mapa. Neste exemplo realizada a contagem da quantidade de produtos com o mesmo nome existe na lista.
Observe que no final o cdigo:
for(Entry<String, Integer> e : mapaContagem.entrySet()){
System.out.printf("%s: %d\n", e.getKey(), e.getValue());
}
utilizado para percorrer os elementos do mapa que associa os produtos com suas
respectivas quantidades.
Listagem 9.9: Exemplo de uso de Mapas na contagem de elementos de uma lista
1
2
3
4
5
6
package capitulo9;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
7
8
100
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
genricos e colees
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
9.5.1 Properties
As propriedades so mapas que podem ser persistidos, ou seja, salvos em algum lugar. Um
exemplo de arquivo properties :
#Propriedades do Sistema
telefone=3131-2363
descricao=Supermercado da Esquina
endereco=Rua 2
Observe a semelhana com os mapas, para cada entrada existe uma informao, ou
seja,para a entrada telefone tem-se a informao: 3131-2363.
http://solutioin.com
Francisco Calaa, Otvio Calaa
101
Verso 1.2-beta
genricos e colees
Java possui um tipo de mapa que tem a habilidade de persistir suas informaes, so as
Properties. Estas classes possuem o mtodo:
prop.store( . . .);
para a escrita dos dados, conforme pode ser visto na listagem 9.10
e o mtodo:
prop.load( . . . );
para carregar os dados a partir de um fluxo, conforme pode ser visto na listagem 9.11
Listagem 9.10: Exemplo de escrita em arquivos properties
1
2
3
4
5
package capitulo9;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package capitulo9;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
6
7
import javax.swing.JOptionPane;
8
9
10
11
12
13
102
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
prop.load(fis);
fis.close();
String nomeProp = JOptionPane.showInputDialog("Qual propriedade " +
"deseja ver? (descricao , endereco , telefone)" );
JOptionPane.showMessageDialog(null, prop.getProperty(nomeProp));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
14
15
16
17
18
19
20
21
22
23
24
25
genricos e colees
9.6.
Pilhas
Pilhas so estrutura de dados onde o ltimo elemento que entra o primeiro que sai - LIFO
(last-in-first-out). possvel exemplificar com uma pilha de livros. O primeiro livro a ser
emplilhado o ltimo que sai da pilha.
Um exemplo de pilha pode ser visto no cdigo da listagem 9.12. Aps executar este
exemplo o primeiro nome a ser impresso foi Carlos mas foi o ltimo a ser adicionado na
pilha.
Listagem 9.12: Exemplo de pilha
1
package capitulo9;
2
3
import java.util.Stack;
4
5
7
8
9
10
11
12
13
while(!alunos.empty()){
System.out.println(alunos.pop());
}
14
15
16
17
18
19
http://solutioin.com
Francisco Calaa, Otvio Calaa
103
Verso 1.2-beta
9.7.
genricos e colees
Filas
Filas so estruturas de dados onde o primeiro elemento que entra o primeiro elemento
que sai - FIFO (first-in-first-out). Como nas filas dos caixas, a primeira pessoa que entra a
primeira pessoa que poder pagar.
O cdigo da listagem 9.13 apresenta um exemplo de Fila.
Listagem 9.13: Exemplo de Fila
1
package capitulo9;
2
3
4
import java.util.LinkedList;
import java.util.Queue;
5
6
8
9
10
11
12
13
14
while(!alunos.isEmpty()){
System.out.println(alunos.poll());
}
15
16
17
18
19
20
9.8.
Ordenao de Listas
Uma das caractersticas de Listas poder ser ordenada. Para ordenar uma lista pode-se
utilizar a interface Comparator e o mtodo sort da classe Collections.
Observe o exemplo onde existem alunos que sero ordenados por idade.
A classe Aluno est na listagem 9.14. Possui os atributos nome e idade.
O mtodo compare retorna um int, que pode ser:
negativo se o primeiro objeto for menor que o segundo
zero se os objetos forem iguais
positivo se o primeiro objeto for maior que o segundo
No se preocupe com o cdigo:
return (int)(a1.getIdade() - a2.getIdade();
104
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
genricos e colees
Apenas se atenha ao fato de que este mtodo retornar algo negativo se a1 for menor
que a2, zero se forem iguais e positivo se a1 for maior.
O cdigo do comparador por idade est na Listagem 9.15 e
Listagem 9.14: Classe Aluno do exemplo de ordenao
1
package capitulo9;
2
3
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package capitulo9;
import java.util.Comparator;
3
4
6
7
8
9
10
http://solutioin.com
Francisco Calaa, Otvio Calaa
105
Verso 1.2-beta
genricos e colees
package capitulo9;
2
3
4
5
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
6
7
8
10
11
12
13
14
15
16
17
18
System.out.println("Lista original:");
19
20
for(Aluno a : alunos){
System.out.println(a);
}
21
22
23
24
25
26
27
28
29
30
31
32
33
9.9.
Exerccios
106
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
genricos e colees
http://solutioin.com
Francisco Calaa, Otvio Calaa
107
10
10.1.
Diagrama de Classe
Diagramas de Classe mostram as diferentes classes que fazem um sistema e como elas se
relacionam. Os Diagramas de Classe so chamados diagramas estticos porque mostram
as classes, com seus mtodos e atributos bem como os relacionamentos estticos entre elas:
quais classes conhecem quais classes ou quais classes so parte de outras classes, mas
no mostram a troca de mensagens entre elas.
10.1.1 Classe
Um Classe define os atributos e os mtodos de um conjunto de objetos. Todos os objetos
desta classe (instncias desta classe) compartilham o mesmo comportamento, e possuem
109
Verso 1.2-beta
o mesmo conjunto de atributos (cada objeto possui seu prprio conjunto). O termo Tipo
algumas vezes usado ao invs de Classe, mas importante mencionar que estes dois
termos no so a mesma coisa, e Tipo um termo mais genrico.
Em UML Classes so representadas por retngulos, com o nome da classe, e podem tambm mostrar os atributos e operaes da classe em dois outros compartimentos dentro
do retngulo.
10.1.1.1 Atributos
Na UML, atributos so mostrados com pelo menos seu nome, e podem tambm mostrar
seu tipo, valor inicial e outras propriedades. Atributos podem tambm ser exibidos com
sua visibilidade:
+ indica atributos pblicos
# indica atributos protegidos
- indica atributos privados
10.1.1.2 Operaes
Operaes (mtodos) tambm so exibidos com pelo menos seu nome, e podem tambm mostrar seus parmetros e valores de retorno. Operaes podem, como os Atributos,
mostras sua visibilidade:
+ indica operaes pblicas
# indica operaes protegidas
- indica operaes privadas
10.1.2
Associaes de Classe
Classes podem relacionar-se (ser associada com) com outras de diferentes maneiras:
10.1.2.1 Generalizao
A herana um dos conceitos fundamentais da programao orientada por objetos, nos
quais uma classe ganha todos os atributos e operaes da classe que herda, podendo
110
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
sobrepor ou modificar algumas delas, assim como adicionar mais atributos ou operaes
prprias.
EM UML, uma associao Generalizao entre duas classes coloca-as numa hierarquia
representando o conceito de herana de uma classe derivada de uma classe base. Em UML,
Generalizaes so representadas por uma linha conectando duas classes, com uma seta
no lado da classe base.
10.1.2.2 Associaes
Um associao representa um relacionamento entre classes, e fornece a semntica comum
e a estrutura para muitos tipos de conexes entre objetos.
Associaes so o mecanismo que permite objetos comunicarem-se entre si. Elas descrevem a conexo entre diferentes classes (a conexo entre os objetos atuais chamada
conexo do objeto, ou link.
Associaes podem ter um regra que especifica o propsito da associao e pode ser
uni ou bidirecional (indicando se os dois objetos participantes do relacionamento podem
mandar mensagens para o outro, ou se apenas um deles sabe sobre o outro). Cada ponta
da associao tambm possui uma valor de multiplicidade, que dita como muitos objetos
neste lado da associao pode relacionar-se com o outro lado.
Em UML, associaes so representadas como linhas conectando as classes participantes
do relacionamento, e podem tambm mostrar a regra e a multiplicidade de cada um dos
participantes. A multiplicidade exibida como um intervalo [min...mx] de valores no
negativos, com uma estrela (*) no lado mximo representando infinito.
10.1.2.3 Agregao
Agregaes so um tipo especial de associao no qual as duas classes participantes no
possuem em nvel igual, mas fazem um relacionamento todo-parte. Uma Agregao descreve como a classe que possui a regra do todo, composta (tem) de outras classes, que
http://solutioin.com
Francisco Calaa, Otvio Calaa
111
Verso 1.2-beta
possuem a regra das partes. Para Agregaes, a classe que age como o todo sempre tem
uma multiplicidade de um.
Em UML, Agregaes so representadas por uma associao que mostra um romboide
no lado do todo.
10.1.2.4 Composio
Composies so associaes que representam agregaes muito fortes. Isto significa que
Composies formam relacionamentos todo-parte tambm, mas o relacionamento to
forte que as partes no pode existir independentes. Elas existem somente dentro do todo,
e se o todo destrudo as partes morrem tambm.
Em UML, Composies so representadas por um romboide slido no lado do todo.
10.2.
112
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
Quando trabalhar com Casos de Uso, importante lembrar-se de algumas regras simples:
Cada Caso de Uso est relacionado com no mnimo um ator;
Cada Caso de Uso possui um iniciador (isto um ator);
Cada Caso de Uso liga-se a um resultado relevante (um resultado com valor de
negcio);
Casos de Uso tambm podem ter relacionamentos com outros Casos de Uso. Os trs
tipos mais comuns de relacionamento entre Casos de Uso so:
inclui-se que especifica que um Caso de Uso toma lugar dentro de outro Caso de
Uso
estende que especifica que em determinadas situaes, ou em algum ponto (chamado
um ponto de extenso) um Caso de Uso ser estendido por outro.
Generalizao especifica que um Caso de Uso herda as caractersticas do Super
Caso de Uso, e pode sobrepor algumas delas ou adicionar novas de maneira semelhante a herana entre classes.
10.2.2 Ator
Um ator uma entidade externa (fora do sistema) que interage com o sistema participando
(e frequentemente iniciando) um Caso de Uso. Atores podem ser pessoas reais (por exemplo usurios do sistema), outro sistema de computador ou eventos externos.
Atores no representam as pessoa fsica ou sistemas, mas sua regra. Isto significa que
quando uma pessoa interage com o sistema de diferentes maneiras (assumindo diferentes
regras) ela ser representada por diversos atores. Por exemplo um pessoa que fornece suporte ao cliente por telefone e recebe ordens do cliente para o sistema pode ser representado
por um ator da Equipe de Suporte e um ator Representante de Vendas
10.3.
Demais diagramas
Alm dos diagramas de classe e de caso de uso, existem os outros seguintes diagramas:
Diagrama de Sequncia mostra objetos e uma sequncia das chamadas do mtodo
feitas para outros objetos.
http://solutioin.com
Francisco Calaa, Otvio Calaa
113
Verso 1.2-beta
114
http://solutioin.com
Francisco Calaa, Otvio Calaa
11
THREADS
Thread, ou linha de execuo em portugus, uma forma de um processo dividir a si
mesmo em duas ou mais tarefas que podem ser executadas simultaneamente.
Uma linha de execuo permite que o usurio do seu programa, por exemplo, utilize
uma funcionalidade do ambiente enquanto outras linhas de execuo realizam outros clculos e operaes. Os sistemas que suportam apenas uma nica linha de execuo so
chamados de monothread e aqueles sistemas que suportam mltiplas linhas de execuo
so chamados de multithread.
11.1.
Processos e Threads
11.1.1 Processos
Um processo geralmente tem um conjunto completo e restrito de recursos para sua execuo, ou seja, cada processo tem seu prprio espao de memria.
Processos so sinonimos de programas e aplicaes. Como o espao de memria e restrito
a cada processo, a comunicao entre processos feita atravs do sistema operecional com
pipes e sockets. Esta comunicao pode ser feita entre processos na mesma mquina ou em
diferentes mquinas.
11.1.2 Threads
Threads so, algumas vezes, chamadas de processos leves. Threads existem dentro dos
processos, cada processo possui pelo menos uma thread. Threads podem compartilhar
recursos do processos, como memria e arquivos abertos. Isto muito eficiente para a
comunio de recursos.
Execuo multithread um caracteristica da plataforma Java. Cada aplicao Java composta de vrias thread. As threads tornam os programas mais eficientes pois, com elas,
possvel realizar mais de uma atividade simultaneamente. Uma thread possui a habilidade
de criar novas threads.
115
Verso 1.2-beta
11.2.
threads
Criao de Threads
Cada thread est associada com uma instancia da classe Thread. H duas formas de criar
uma Thread:
Implementando a interface Runnable
Estendendo a classe Thread
Independente da forma que se cria a thread o cdigo a ser executado pela thread deve
estar no mtodo run:
public void run()
package capitulo11;
2
3
5
6
7
8
9
10
11
12
13
14
package capitulo11;
2
3
4
5
6
7
8
9
10
116
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
threads
package capitulo11;
2
3
5
6
7
8
9
10
11
12
13
14
15
16
package capitulo11;
2
3
4
5
6
8
9
10
thread1.start();
thread2.start();
11
12
13
14
11.3.
A classe Executors
A nova API de threads permite um melhor gerenciamento das threads utilizando pool.
Desta forma possvel criar um pool de Threads e especificar a quantidade mxima de
threads estar em execuo simultaneamente. A listagem 11.5 apresenta um exemplo de
utilizao do pool de threads. Neste exemplo o pool criado com o mtodo:
ExecutorService threads = Executors.newFixedThreadPool(2)
http://solutioin.com
Francisco Calaa, Otvio Calaa
117
Verso 1.2-beta
threads
so colocadas trs threads no pool. Como apenas duas threads sero executadas a terceira
ir esperar uma das duas anteriores terminar para comear sua execuo.
Listagem 11.5: Exemplo de utilizao do pool de threads
1
package capitulo11;
2
3
import java.util.concurrent.*;
4
5
6
7
8
9
10
11
12
13
14
15
16
17
11.4.
O mtodo Thread.sleep faz com que a thread suspenda sua execuo por um perodo especfico. Aps o trmino do periodo a thread volta ao estado de executvel podendo entrar
em execuo ou no dependendo da sua prioridade. A figura 11.1 ilustra esse mtodo.
O mtodo Thread.yield faz com que a thread desista de sua atual execuo. Suponha que
voc executa muitas threads no computador e que estas threads esto sendo mal gerenciadas e que algumas no conseguem concluir algumas atividades. Ao ser executado o
mtodo yield provocar a desistncia momentnea da thread em execuo e possibilitar
a entrada de outra thread para a execuo. Essa thread aguardar at a CPU tornar-se
disponvel novamente.
Note que ela poder voltar a ser executada quando o gerenciador de threads do sistema
solicitar. A figura 11.2 ilustra esse mtodo.
11.5.
Sincronizao
Quando duas threads compartilham dados comum que haja problemas com sincronizao. Para que voc entenda melhor este problema observe o exemplo. A classe Troca est
na listagem 11.6. Note que esta classe possui o mtodo trocar que recebe um boolean. Se o
boolean for true as variveis a e b recebero 5 e 7, sendo false recebero 11 e 13. A thread
est na listagem 11.7. A classe que instancia o objeto do tipo Troca e as threads est na
listagem 11.8. Note que criado apenas um objeto do tipo Troca e este objeto compartilhado entre as threads es1 e es2. Uma dessas threads instanciada com true a outra com
118
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
threads
http://solutioin.com
Francisco Calaa, Otvio Calaa
119
Verso 1.2-beta
threads
false. isto far com que o comportamento do metodo trocar da classe Troca seja diferente
para cada thread. Ao executar este exemplo apresentada a seguinte sada:
5 = 11 e 7 = 13
11 = 5 e 13 = 7
5 = 11 e 7 = 13
11 = 5 e 13 = 7
5 = 11 e 7 = 13
Isto acontece porque as threads no esto sincronizadas. Uma thread inicia o trabalho,
a outra termina. Para resolver este problema necessrio sincronizar o mtodo trocar:
synchronized public void trocar(boolean bol). Ao acrescentar a palavra chave synchronized no mtodo far com que este no possa ser executado por duas threads simultaneamente.
Listagem 11.6: Objeto Troca que est compartilhado entre a threads
1
package capitulo11;
2
3
4
private int b;
6
7
8
9
10
11
12
13
14
15
16
17
if (bol) {
System.out.printf("%d = 5 e %d = 7 \n", a, b);
} else {
System.out.printf("%d = 11 e %d = 13 \n", a, b);
}
18
19
20
21
22
23
24
package capitulo11;
2
3
4
5
6
7
8
9
120
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
threads
10
11
12
13
14
15
16
17
18
19
20
21
package capitulo11;
2
3
4
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
5
6
7
9
10
11
12
13
ExecutorService t1 = Executors.newFixedThreadPool(2);
t1.execute(es1);
t1.execute(es2);
t1.shutdown();
14
15
16
17
18
19
11.6.
O verificador de primos
Para exemplificar melhor o uso de threads as listagens 11.9 e 11.10 apresentam um Verificador de nmeros primos. Este exemplo consegue verificar vrios primos simultaneamente
porque a classe VerificadorPrimo da listagem 11.9 uma thread. A classe TestePrimo cria
uma nova thread de verificao a cada nmero informado pelo usurio.
Listagem 11.9: Thread que verifica se um nmero primo (utiliza um algoritmo lento de verificao
para demonstrar melhor o exemplo)
1
package capitulo11;
2
3
4
5
http://solutioin.com
Francisco Calaa, Otvio Calaa
121
Verso 1.2-beta
threads
7
8
9
10
11
12
13
14
15
16
17
18
if (primo) {
System.out.printf("\nO nmero: %d primo", numero);
} else {
System.out.printf("\nO nmero: %d no primo", numero);
}
19
20
21
22
23
24
25
package capitulo11;
2
3
import javax.swing.JOptionPane;
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
} while (!resposta.equals("sair"));
20
21
22
122
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
threads
11.7.
Exerccios
1. O que so threads?
2. Qual a diferena entre processos e threads?
3. Descreva as duas formas de se criar uma thread.
4. O que so pool de threads?
5. Qual a diferena entre os mtodos sleep e yield?
6. Qual o objetivo de utilizao da palavra chave synchronized?
http://solutioin.com
Francisco Calaa, Otvio Calaa
123
12
S T R I N G S E D ATA S
Converter Datas em Strings e Strings em Datas um dos assuntos deste captulo. Esta
uma tarefa comum em softwares uma vez que a maior forma de entrada de dados em
um sistema texto e este texto deve, algumas vezes, ser convertido em data para correta
manipulao. Outra coisa,normalmente necessria, formatar uma data em textos para
que seja melhor apresentada ao usurio.
Na verso 5 do Java foi acrescentado a sada formatada assunto tambm abordado neste
captulo. Com a sada formatada mais simples a formatao de nmeros, datas e outros.
12.1.
A classe Date utilizada para representar momentos no tempo. A maior parte dos seus
metodos esto deprecados, ou seja, no so mais utilizados. Para manipulao de datas e
horas existe a classe Calendar. Por ser uma classe abstrata utiliza-se o mtodo getInstance:
Calendar.getInstance();
Para obter a data e hora atuais pode ser utilizado o construtor default da classe Date:
Date hoje = new Date();
package capitulo12;
2
3
import java.util.Calendar;
4
5
7
8
9
10
11
12
13
14
15
125
Verso 1.2-beta
12.2.
strings e datas
Formatao de Datas
muito comum um sistema necessitar converter uma data em uma String ou uma String
em uma data. Para estes casos possvel utilizar a classe SimpleDateFormat. Esta classe implementa a interface DateFormat e possui mtodos que so capazes tanto em formatar uma
data em um String ou em converter uma String em uma data. A listagem 12.2 apresenta
um exemplo de converso de String em data e formatao desta data em outra String.
Para converter uma String em uma data utiliza-se o mtodo parse. Este mtodo lana
uma exeo se a String no puder ser convertida.
O mtodo format formata uma data em uma String.
Listagem 12.2: Exemplo de formatao de datas
1
package capitulo12;
2
3
4
5
6
import
import
import
import
java.text.DateFormat;
java.text.ParseException;
java.text.SimpleDateFormat;
java.util.Date;
7
8
import javax.swing.JOptionPane;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
126
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
12.3.
strings e datas
A classe String
Strings so objetos que contm uma cadeia de caracteres. Em Java so imutveis, portanto
uma vez criadas no podem ser alteradas. Para exemplificar, caso ocorra uma concatenao
de Strings, um novo objeto criado, e o antigo, ser coletado pelo coletor de lixo. O mtodo
charAt utilizado para consultar caracteres pelo ndice.
Para comparar Strings, assim como qualquer outro objeto Java, utiliza-se o mtodo equals.
Este mtodo retorna true quando os valores entre as Strings so iguais e false caso sejam
diferentes.
12.4.
A classe StringBuffer
package capitulo12;
2
3
4
5
6
7
8
10
11
12
13
14
long t2 = System.currentTimeMillis();
return t2 - t1;
15
16
17
18
19
20
21
22
23
24
25
26
long t2 = System.currentTimeMillis();
return t2 - t1;
27
28
29
30
http://solutioin.com
Francisco Calaa, Otvio Calaa
127
Verso 1.2-beta
strings e datas
31
32
33
34
35
36
37
38
12.5.
Sada formatada
A sada formatada est disponvel a partir do Java 5.0. Igual sada formatada das linguagens C e C++ permite a formao de Strings utilizando uma String formatadora:
System.out.printf(\%s, \%s, texto1, texto2);
Este exemplo apresentar um nmero com ponto flutuante com duas casas decimais.
A listagem 12.4 apresenta um exemplo com vrias opes de formatao.
128
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
%s
%d
%o
%x
%f
%t
strings e datas
%F
%H
%M
%S
%m
%d
http://solutioin.com
Francisco Calaa, Otvio Calaa
129
Verso 1.2-beta
strings e datas
package capitulo12;
2
3
import java.util.Date;
4
5
7
8
/*
* Exemplo de formatao de nmeros inteiros
*/
System.out.println("Formatao de inteiros");
int inteiro = 123;
System.out.printf("%10s %10s %10s", "DECIMAL", "OCTAL", "HEXADECIMAL");
System.out.printf("\n%1$10d %1$10o %1$10X", inteiro);
9
10
11
12
13
14
15
16
/*
* Exemplo de formatao de ponto flutuante
*/
System.out.println("\n\nFormatao de ponto flutuantes");
double flutuante = 1.2345;
System.out.printf("%.3f", flutuante);
17
18
19
20
21
22
23
/*
* Formatao de Datas e Horas
*/
System.out.println("\n\nFormatao de datas e horas");
Date hoje = new Date();
System.out.printf("Hora atual: %1$tH:%1$tM:%1$tS", hoje);
System.out.printf("\nData formatada: %1$tF", hoje);
System.out.printf("\nData atual: %1$td/%1$tm/%1$tY", hoje);
24
25
26
27
28
29
30
31
32
33
34
12.6.
Exerccios
130
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
strings e datas
http://solutioin.com
Francisco Calaa, Otvio Calaa
131
13
JDBC
Um Sistema Gerenciador de Banco de Dados (SGBD) o conjunto de programas de computador responsveis pelo gerenciamento de uma base de dados. O principal objetivo
retirar da aplicao o trabalho e a responsabilidade de gerenciar o acesso e a segurana
de suas informaes. Em bancos de dados relacionais utilizada a linguagem SQL para
manipulao dos registros.
Normalmente as pessoas chamam os SGBDs de apenas Banco de Dados. No decorrer
deste captulo onde estiver o termo Banco de Dados entenda que so estas estruturas complexas de armazenamento de informaes.
JDBC (Java Database Connectivity) a API do Java para trabalhar com Banco de Dados.
Com ela possvel executar instrues ler registros executar funes no Banco de Dados.
Trata-se de um conjunto de interfaces e classes que possuem os mtodos necessrios para as
mais diversas atividades com um banco de dados. As interfaces so implementadas pelos
drivers JDBC que so especficos para cada banco.
13.1.
133
Verso 1.2-beta
jdbc
package capitulo13;
2
3
import java.sql.*;
4
5
6
7
8
9
driver = "org.postgresql.Driver";
url = "jdbc:postgresql :// localhost/treinamento";
usuario = "postgres";
senha = "123456";
10
11
12
13
14
15
16
17
18
19
20
21
22
23
134
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
13.2.
jdbc
A linguagem SQL
SQL um linguagem de consulta a registros em um Banco de dados Relacional. As instrues SQL apresentadas a seguir utilizaro como referncia a tabela CLIENTE
13.2.1 SELECT
Instruo para consulta de registros. Sua sintaxe :
SELECT <LISTA DOS CAMPOS DA TABELA> FROM <TABELA>
Um Exemplo: Para buscar todos os registros da tabela CLIENTE pode ser utilizado o
seguinte SQL:
SELECT CODIGO, NOME, TELEFONE, ENDERECO, NASCIMENTO FROM CLIENTE
O caracter % substituir com zero ou mais caracteres na busca. O caracter _ substituir apenas com um caracter.
http://solutioin.com
Francisco Calaa, Otvio Calaa
135
Verso 1.2-beta
13.2.4
jdbc
INSERT
Para incluir um registro na tabela de CLIENTE pode ser utilizado o seguinte SQL:
INSERT INTO CLIENTE (NOME, CPFCNPJ, ENDERECO, MUNICIPIO, UF)
VALUES (ANA MARIA, 321.321.321-01, Rua 2 Centro, GOIANIA, GO).
13.2.5 UPDATE
Permite alterar registros em um tabela. Sua sintaxe :
UPDATE <NOME DA TABELA> SET <CAMPO> = <VALOR> WHERE <CAMPO> = <VALOR>
13.2.6 DELETE
Permite excluir registros em uma tabela. Sua sintaxe :
DELETE FROM <NOME DA TABELA> WHERE <CAMPO> = <VALOR>
Note o uso da clusula WHERE. Sem especifica-la todos os registros da tabela sero
excludos.
Para excluir o registro com cdigo 5 da tabela utilizada a seguinte instruo:
DELETE FROM CLIENTE WHERE ID = 5
136
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
jdbc
getString(<NOME DO CAMPO>)
package capitulo13;
2
3
import java.sql.*;
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (rs.next()) {
System.out.printf("%-30s%-30s%-30s%-30s%-30s\n",
rs.getString("nome"), rs.getString("cpfCnpj"),
rs.getString("endereco"),
rs.getString("municipio"),
rs.getString("uf"));
}
20
21
22
23
con.close();
} catch (SQLException e) {
e.printStackTrace();
http://solutioin.com
Francisco Calaa, Otvio Calaa
137
Verso 1.2-beta
}
24
25
26
jdbc
13.3.1
PreparedStatement
Observe que aps a criao da instruo necessrio passar os parmetros com setInt.
Exite tambm o setString, setDate, setLong, enfim, uma infinidade de possibilidades de
passagem de valores para a instruo.
13.4.
Execuo em Lote
possvel executar instrues SQL em lote. Esta tcnica torna a execuo muito mais rpida do que executar uma instruo de cada vez. A listagem 13.3 apresenta um teste de
velocidade entre a utilizao
Listagem 13.3: Exemplo de execuo em Batch
1
package capitulo13;
2
3
4
5
6
import
import
import
import
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.SQLException;
java.sql.Statement;
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
138
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
jdbc
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
long t2 = executarSemBatch();
System.out.printf("Sem Batch: %d (ms)\n", t2);
71
72
73
74
http://solutioin.com
Francisco Calaa, Otvio Calaa
139
Verso 1.2-beta
13.5.
jdbc
Tabela de Clientes
Para exemplificar os conceitos de Banco de Dados veja agora uma agenda de clientes. A
listagem 13.4 apresenta a classe Cliente.
Listagem 13.4: Classe Cliente
1
package capitulo13;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
140
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
jdbc
this.endereco = endereco;
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
A listagem 13.5 apresenta a classe ClienteDao. Observe que foi colocada nesta classe os
mtodos de acesso ao Banco de Dados como incluir, excluir e listar. Colocar os mtodos
que acessam o Banco de Dados fora da entidade Cliente uma boa prtica de programao
pois facilita a alterao da estrutura de dados.
Listagem 13.5: Classe ClienteDao - acessa os recursos no Banco de Dados
1
package capitulo13;
2
3
4
5
6
7
8
9
import
import
import
import
import
import
import
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
java.sql.Statement;
java.util.ArrayList;
java.util.List;
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http://solutioin.com
Francisco Calaa, Otvio Calaa
141
Verso 1.2-beta
try {
PreparedStatement pstmt = con.prepareStatement("insert into cliente " +
"(nome , cpfcnpj , endereco , municipio , uf) values (?, ?, ?, ?, ?)" );
pstmt.setString(1, cliente.getNome());
pstmt.setString(2, cliente.getCpfCnpj());
pstmt.setString(3, cliente.getEndereco());
pstmt.setString(4, cliente.getMunicipio());
pstmt.setString(5, cliente.getUf());
pstmt.execute();
} finally {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
jdbc
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
142
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
jdbc
78
79
A listagem 13.6 apresenta a classe Agenda. Esta classe obtm as informaes com o
usurio do sistema armazena no Banco de Dados e apresenta a lista de clientes cadastrados.
Listagem 13.6: A Agenda
1
package capitulo13;
2
3
import java.util.List;
4
5
import javax.swing.JOptionPane;
6
7
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
13.6.
Exerccios
1. O que JDBC ?
http://solutioin.com
Francisco Calaa, Otvio Calaa
143
Verso 1.2-beta
jdbc
2. Descreva os passos necessrios para obter um conexao (Connection) Java com o Banco
de dados.
3. No exemplo da agenda implemente a funcionalidade que exclui clientes.
4. O que SQL? Quais os comandos bsicos e sua sintaxe?
5. Qual a diferena entre o Statement e o PreparedStatement?
6. Pesquise o motivo da execuo em lote ser mais rpida.
144
http://solutioin.com
Francisco Calaa, Otvio Calaa
14
J AVA P E R S I S T E N C E A P I C O M
H I B E R N AT E
14.1.
14.2.
Configuraes iniciais
Para que os exemplos deste captulo funcionem, necessrio realizar algumas configuraes prvias. Inicialmente, crie uma pasta, dentro do diretrio src do seu projeto, chamada
META-INF. Copie para esta pasta o arquivo persistence.xml. O contedo deste arquivo est
na Listagem 18.12. Este arquivo tambm est disponibilizado na pasta AmbienteTrabalho/Material/materialJpa/config. A Figura 14.1 ilustra este passo.
145
Verso 1.2-beta
O prximo passo a configurao das dependncias da JPA. Para isto, clique com o boto
direito do mouse sobre o projeto e v em Properties. Clique em Java Build Path. Adicione
os arquivos .jar que esto no diretrio AmbienteTrabalho/Material/materialJpa/libJpa. A Figura
14.2 ilustra este passo.
14.3.
Agora ser criado o modelo desenvolvido no capitulo de JDBC utilizando JPA. A classe
Cliente dever ser anotada com @Entity do pacote javax.persistence. A anotao @Entity
instrui ao provedor de persistncia de que a classe em questo dever ser mapeada para
um banco de dados e que tambm ser gerenciada pelo EntityManager. A listagem 14.1
apresenta as anotaes necessrias para utilizao da classe Cliente como entidade da JPA.
Listagem 14.1: Classe Cliente com as anotaes da JPA
1
package capitulo14;
2
3
4
5
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
6
7
8
@Entity
public class Cliente {
146
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
10
11
12
@Id
@GeneratedValue
private int id;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
http://solutioin.com
Francisco Calaa, Otvio Calaa
147
Verso 1.2-beta
62
63
64
65
66
67
68
69
70
71
14.4.
O arquivo persistence.xml
O arquivo persistence.xml o corao da JPA. nele que sero definidas as configuraes das conexes, entidades que sero persistidas e o comportamento do engine da JPA.
Este arquivo deve ficar dentro do diretrio META-INF do classpath da aplicao. As configuraes deste arquivo dependero da implementao JPA utilizada: Hibernate, TopLink,
KODO, etc.
A listagem 18.12 apresenta o exemplo do arquivo persistence.xml com a implementao
do Hibernate. As propriedades desse arquivo esto descritas na tabela 14.1.
hibernate.hbm2ddl.auto
hibernate.dialect
hibernate.connection.driver_class
hibernate.connection.username
hibernate.connection.password
hibernate.connection.url
hibernate.show_sql
6
7
8
9
10
148
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
11
12
13
14
15
16
17
18
Banco de Dados
Dialeto
DB2
org.hibernate.dialect.DB2Dialect
DB2 AS/400
org.hibernate.dialect.DB2400Dialect
DB2 OS390
org.hibernate.dialect.DB2390Dialect
PostgreSQL
org.hibernate.dialect.PostgreSQLDialect
MySQL
org.hibernate.dialect.MySQLDialect
org.hibernate.dialect.MySQLInnoDBDialect
org.hibernate.dialect.MySQLMyISAMDialect
org.hibernate.dialect.OracleDialect
Oracle 9i
org.hibernate.dialect.Oracle9iDialect
Oracle 10g
org.hibernate.dialect.Oracle10gDialect
Sybase
org.hibernate.dialect.SybaseDialect
Sybase Anywhere
org.hibernate.dialect.SybaseAnywhereDialect
org.hibernate.dialect.SQLServerDialect
SAP DB
org.hibernate.dialect.SAPDBDialect
Informix
org.hibernate.dialect.InformixDialect
HypersonicSQL
org.hibernate.dialect.HSQLDialect
Ingres
org.hibernate.dialect.IngresDialect
Progress
org.hibernate.dialect.ProgressDialect
Mckoi SQL
org.hibernate.dialect.MckoiDialect
Interbase
org.hibernate.dialect.InterbaseDialect
Pointbase
org.hibernate.dialect.PointbaseDialect
FrontBase
org.hibernate.dialect.FrontbaseDialect
Firebird
org.hibernate.dialect.FirebirdDialect
Tabela 14.2: Alguns dos dialetos do hibernate
http://solutioin.com
Francisco Calaa, Otvio Calaa
149
Verso 1.2-beta
14.5.
O EntityManager
package capitulo14;
2
3
import java.util.List;
4
5
6
7
8
import
import
import
import
javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
150
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
33
34
14.6.
package capitulo14;
2
3
import java.util.List;
4
5
import javax.swing.JOptionPane;
6
7
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
http://solutioin.com
Francisco Calaa, Otvio Calaa
151
Verso 1.2-beta
14.6.2
Localizando entidades
neste caso ser retornado o registro com id = 2 da tabela que persiste os objetos do tipo
Cliente.
14.7.
package capitulo14;
2
3
152
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
5
6
7
import java.util.ArrayList;
import java.util.List;
8
9
10
11
12
13
import
import
import
import
import
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.Id;
javax.persistence.JoinColumn;
javax.persistence.OneToMany;
14
15
16
@Entity
public class Curso {
17
@Id
@GeneratedValue
private int id;
18
19
20
21
22
23
@JoinColumn(name="curso _ id")
@OneToMany(cascade=ALL, fetch = EAGER)
private List<Disciplina> disciplinas = new ArrayList<Disciplina>();
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
http://solutioin.com
Francisco Calaa, Otvio Calaa
153
Verso 1.2-beta
package capitulo14;
2
3
4
5
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
6
7
8
@Entity
public class Disciplina {
@Id
@GeneratedValue
private int id;
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package capitulo14;
2
3
import java.util.List;
4
5
6
7
154
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
14.8.
http://solutioin.com
Francisco Calaa, Otvio Calaa
155
Verso 1.2-beta
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="produto_seq")
@SequenceGenerator(sequenceName="produto_seq", name="produto_seq",
allocationSize=1, initialValue=1)
14.9.
O Java Persistence Query Language (JPQL) uma linguagem de consulta orientada a objetos definidos como parte da especificao da Java Persistence API (JPA).
Para realizar consultas de objetos utilizada a JPQL, uma linguagem de consulta de
objetos que ser traduzida, pela JPA, na linguagem de consulta estruturada: SQL.
A classe da 14.5 apresenta um exemplo de JPQL.
JPQL usado para fazer consultas em entidades armazenadas em um banco de dados
relacional. Ela fortemente inspirada na linguagem SQL, e suas consultas assemelham
sintaxe das consultas SQL. A diferena que operam com objetos de entidade JPA ao
invs de diretamente operar com as tabelas de banco de dados. Alm de recuperar objetos
(consultas SELECT), JPQL compatvel com atualizaes (UPDATE e DELETE).
Por exemplo, para retornar os cursos (Listagem 14.5) ordenados pelo nome, bastaria
utilizar:
select c from Curso c order by c.nome
Outro exemplo, para retornar apenas os cursos que contenham a disciplica com nome
FSICA, basta utilizar:
select c from Curso c left join fetch c.disciplinas d where d.nome = FSICA
neste caso, sero retornados todos os registros que contm nome igual a Java.
156
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
14.10.
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
157
15
A P L I C AT I V O S W E B
Construir aplicativos WEB consiste em misturar muitas tecnologias como HTML, CSS e
JavaScript em um aplicativo. A grande vantagem dos aplicativos WEB o fato que a execuo deles est no servidor e que a conectividade mxima. possvel utilizar aplicativos
WEB em qualquer regio do mundo bastando apenas estar conectado com o sistema.
possvel construir aplicativos WEB com Java. O que consistem em apenas utilizar a
tecnologia Java para gerar CSS, HTML e JavaScript.
15.1.
XML
159
Verso 1.2-beta
aplicativos web
<dados>
<pessoa nome="Manoel">
<endereco rua="Rua 2" numero="30" />
<endereco rua="Av Goias" numero="2" />
</pessoa>
</dados>
15.2.
HTML
HTML (acrnimo para a expresso inglesa HyperText Markup Language, que significa Linguagem de Marcao de Hipertexto) uma linguagem de marcao utilizada para produzir
pginas na Web. Documentos HTML podem ser interpretados por navegadores.
160
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
<table>
aplicativos web
<tr>
<td>
<link>
<form>
Cria um formulrio
<input>
15.2.1.1 Cabealho
Dentro do cabealho existem os seguintes comandos:
< title >: define o ttulo da pgina, que exibido na barra de ttulo dos navegadores.
< style >: define formatao em CSS.
< script >: define programao de certas funes em pgina com scripts, podendo
adicionar funes de JavaScript.
< link >: define ligaes da pgina com outros arquivos como feeds, CSS, scripts,
etc.
< meta >: define propriedades da pgina, como codificao de caracteres, descrio
da pgina, autor, etc. So meta informaes sobre documento. Tais campos so muitos
usados por motores de busca para obterem mais informaes sobre o documento,
afim de classific-lo melhor. Por exemplo, pode-se adicionar o cdigo < meta name="description"
content="descrio da sua pgina" / > no documento HTML para indicar ao motor
de busca que texto de descrio apresentar junto com a ligao para o documento.
http://solutioin.com
Francisco Calaa, Otvio Calaa
161
Verso 1.2-beta
15.3.
aplicativos web
JavaScript
JavaScript uma linguagem de programao criada pela Netscape em 1995, que a princpio
se chamava LiveScript, para atender, principalmente, as seguintes necessidades:
Validao de formulrios no lado cliente (programa navegador);
Interao com a pgina. Assim, foi feita como uma linguagem de script. Javascript
tem sintaxe semelhante do Java, mas totalmente diferente no conceito e no uso.
Possui as seguintes caractersticas
Oferece tipagem dinmica - tipos de variveis no so definidos;
interpretada, ao invs de compilada;
Oferece bom suporte a expresses regulares (caracterstica tambm comum a linguagens de script).
Sua unio com o CSS conhecida como DHTML. Usando o Javascript, possvel modificar dinamicamente os estilos dos elementos da pgina em HTML.
Dada sua enorme versatilidade e utilidade ao lidar com ambientes em rvore (como
um documento HTML), foi criado a partir desta linguagem um padro ECMA, o ECMA262, tambm conhecido como ECMAScript. Este padro seguido, por exemplo, pela linguagem ActionScript da Adobe.
O uso de JavaScript em pginas HTML deve ser informado ao navegador da seguinte
forma:
<script type="text/javascript">
/* aqui fica o script */
</script>
Caso contrrio, o navegador ir interpretar o script como sendo cdigo HTML, escrevendoo na pgina.
Na listagem 15.2 apresentado um exemplo de JavaScript. Neste exemplo existem duas
funes: clicar e formatarData. A funo clicar incrementa o valor o boto a cada vez que
clicado no boto. A funo formatarData formata uma data com as barras quando o campo
de data perde o foco.
Listagem 15.2: Exemplo de JavaScript
1
2
3
4
<html>
<head>
<title>Exemplo de JavaScript</title>
</head>
5
6
7
<script type="text/javascript">
var qtdVezes = 0;
162
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
8
9
10
11
12
aplicativos web
function clicar(comp){
qtdVezes++;
complemento = qtdVezes > 1 ? "es" : "";
comp.value = qtdVezes + " vez" + complemento;
}
13
14
15
16
17
18
19
20
function formatarData(comp){
data = comp.value;
data = data.substring(0,2) + "/" + data.substring(2,4) + "/" +
data.substring(4,8);
comp.value = data;
}
</script>
21
22
23
24
25
26
27
28
<body>
Clique no boto:
<input type="button" value="Clique" onclick="javascript:clicar(this)"/>
<br/>
Data:<input type="text" onblur="javascript:formatarData(this)"/>
</body>
</html>
15.4.
CSS
Cascading Style Sheets, ou simplesmente CSS, uma linguagem de estilo utilizada para
definir a apresentao de documentos escritos em uma linguagem de marcao, como
HTML ou XML. Seu principal benefcio prover a separao entre o formato e o contedo
de um documento.
Ao invs de colocar a formatao dentro do documento, o desenvolvedor cria um link
(ligao) para uma pgina que contm os estilos, procedendo de forma idntica para todas
as pginas de um site. Quando quiser alterar a aparncia do site basta portanto modificar
apenas um arquivo, o arquivo de estilo.
As especificaes do CSS podem ser obtidas no site da W3C "Word Wide Web Consortium", um consrcio de diversas empresas que buscam estabelecer padres para a internet.
importante notar que nenhum browser suporta igualmente as definies do CSS. Desta
forma, o webdesigner deve sempre testar suas folhas de estilo em browsers de vrios fabricantes, e preferencialmente em mais de uma verso, para se certificar de que o que foi
codificado realmente seja apresentado da forma desejada.
Com a variao de atualizaes dos navegadores (browsers) como Internet Explorer que
ficou sem nova verso de 2001 a 2006, o suporte ao CSS pode variar. O Internet Explorer
6, por exemplo, tem suporte total a CSS1 e praticamente nulo a CSS2. Navegadores mais
modernos como Opera, Internet Explorer 7 e Mozilla Firefox tem suporte maior, inclusive
at a CSS 3, ainda em desenvolvimento.
O cdigo:
/* comentrio em css */
body
http://solutioin.com
Francisco Calaa, Otvio Calaa
163
Verso 1.2-beta
aplicativos web
{
font-family: Arial, Verdana, sans-serif;
background-color: #FFFFFF;
margin: 5px 10px;
}
define fonte padro Arial, caso no exista substitui por Verdana, caso no exista define
qualquer fonte sem serifa. Define tambm a cor de fundo do corpo da pgina.
Na listagem 15.3 apresentado um exemplo de uma pgina HTML. Note a tag link:
<link href="estilo.css" type="text/css" rel="stylesheet"/>
Esta tag faz ligao com o arquivo da listagem 15.4 que o arquivo CSS. Observe que no
estilo.css existem definies de formatao das tags da pgina da listagem 15.3.
Listagem 15.3: Exemplo de pgina HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<html>
<head>
<link href="estilo.css" type="text/css" rel="stylesheet"/>
<title>Primeira pgina HTML</title>
</head>
<body>
<h1>Tabela de Cursos</h1>
<table>
<tr>
<th>Curso</th>
<th>Carga Horria</th>
<th>Instrutor</th>
</tr>
<tr>
<td>Java</td>
<td>80 Horas</td>
<td>Francisco</td>
</tr>
<tr>
<td>Delphi</td>
<td>160 Horas</td>
<td>Danilo</td>
</tr>
<tr>
<td>Linux</td>
<td>160 Horas</td>
<td>Diogo</td>
</tr>
</table>
</body>
</html>
h1{
164
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
font-family: verdana;
font-size: 25pt;
color: #00aa22;
font-weight: bold;
2
3
4
5
6
aplicativos web
7
8
th{
font-family: verdana;
font-size: 15pt;
color: #0022aa;
9
10
11
12
13
}
td{
font-family: verdana;
font-size: 12pt;
color: #00aa22;
background-color: #ccccff;
14
15
16
17
18
15.5.
Para a construo de aplicativos WEB utilizando o Java ser necessrio todas as tecnologias
apresentadas:
Html, para construo do contedo
CSS, para construo da apresentao
JavaScript, para construo do dinamismo como as mscaras
A linguagem Java dever ser executada em um servidor e est auxiliar a criao de
contedo html, css e javascript. Existem vrios servidores WEB. Comumente chamado de
continer o servidor que executa o cdigo java.
Neste livro ser utilizado o continer WEB chamado tomcat na sua verso 5.5.
http://solutioin.com
Francisco Calaa, Otvio Calaa
165
Verso 1.2-beta
aplicativos web
15.6.
Exerccios
166
http://solutioin.com
Francisco Calaa, Otvio Calaa
16
S E RV L E T S
Servlet uma tecnologia que insere novos recursos a um servidor, a definio mais usada
que so consideradas extenses de servidores, essa tecnologia disponibiliza ao desenvolvedor do sistema uma interface para o servidor de aplicao, atravs de uma API. As
aplicaes baseadas em Servlet geram contedo dinmico e interagem com os clientes, utilizando o modelo request/response (requisio e resposta) do protocolo HTTP. Apesar de
normalmente utilizam o protocolo HTTP, os Servlets no so restritos a ele.
Um Servlet necessita de um continer Web para ser executado. Este continer Web pode
ser um servidor de aplicaes como o JBoss, GlassFish, Apache Gernimo, etc ou apenas
um continer como o Tomcat.
A estrutura de um Servlet simples, basicamente so classes Java que implementam a
interface Servlet. Os servlets que respondero ao protocolo HTTP (a maioria) deveom estender a classe HttpServlet, que implementa a interface Servlet. Alm disto necessrio
configurar o Servlet no descritor de implantao da aplicao. Este descritor de implantao o arquivo web.xml.
16.1.
As aplicaes Java WEB seguem a estrutura apresentada na figura 16.1. Nesta figura
possvel observar os seguintes elementos:
app1 - o contexto. o diretrio onde fica armazenada a aplicao
WEB-INF - o diretrio onde ficam as classes java, as bibliotecas e os arquivos de
configurao.
classes - o diretrio onde ficam as classes Java. Este diretrio opcional, precisa
existir apenas se existirem classes Java na aplicao.
lib - o diretrio onde ficam os arquivos .jar. Este diretrio opcional, precisa existir
apenas se existirem arquivos .jar.
web.xml - o descritor de implantao. Este arquivo possui as configuraes gerais
da aplicao. Este arquivo obrigatrio.
16.2.
167
Verso 1.2-beta
servlets
mtodo doGet o mtodo executado quando ocorre uma requisio a esse servlet. Note
que nesse mtodo gerada uma resposta html que ser apresentada no browser.
Para que tudo funcione corretamente necessrio montar a estrutura de um aplicativo
web apresentado na figura 16.1. Primeiramente crie o diretrio app1. Dentro do diretrio
app1 crie o diretrio WEB-INF. dentro do diretrio WEB-INF crie o diretrio classes. Compile a classe PrimeiroServlet e aps isto coloque o pacote capitulo16 gerado dentro do
diretrio classes. Note que para compilar essa classe necessrio ter o arquivo servlet.jar
configurado no classpath de compilao. Este arquivo pode ser encontrado dentro de common/lib do tomcat instalado. Crie o descritor de implantao apresentado na listagem
18.10 e coloque-o dentro do diretrio WEB-INF. Certifique-se de ter ficado como a figura
16.1.
Aps ter montado esta estrutura coloque-a dentro do diretrio webapps do tomcat instalado no captulo anterior. Certifique-se de que o tomcat esteje sendo executado. Acesse
o endereo: http://localhost:8080/app1/prim. Se aparecer a figura 16.2 tudo funcionou
corretamente.
Listagem 16.1: Classe PrimeiroServlet. Um exemplo de servlet
1
package capitulo16;
2
3
4
import java.io.IOException;
import java.io.PrintWriter;
5
6
7
8
9
10
import
import
import
import
import
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
11
12
13
@WebServlet("/PrimeiroServlet")
public class PrimeiroServlet extends HttpServlet {
14
15
16
17
18
19
168
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
out.println("<BODY >");
out.println("<H1>PRIMEIRO SERVLET FUNCIONANDO ...</H1>");
out.println("</BODY >");
out.println("</HTML >");
out.close();
20
21
22
23
24
25
26
27
<web-app>
<display-name>Exemplo de servlet</display-name>
3
4
5
6
7
<servlet>
<servlet-name>primeiro</servlet-name>
<servlet-class>capitulo16.PrimeiroServlet</servlet-class>
</servlet>
8
9
10
11
12
13
<servlet-mapping>
<servlet-name>primeiro</servlet-name>
<url-pattern>/prim</url-pattern>
</servlet-mapping>
</web-app>
16.3.
O eclipse nos ajuda a construir um projeto WEB de forma mais fcil. Isto no o isenta de
entender bem toda a estrutura de um aplicativo WEB.
http://solutioin.com
Francisco Calaa, Otvio Calaa
169
Verso 1.2-beta
servlets
V em File - New - Project. Escolha Dynamic Web Project, conforme ilustrado na figura
16.7.
Na tela seguinte possvel configurar o nome da aplicao e em qual servidor ser
executada. Escolha Apache Tomcat v5.5 conforme a figura 16.8. Se no aparecer esta opo
clique no boto New e configure.
Na tela seguinte possvel configurar os FrameWorks utilizados neste projeto. Deixe
como est. Esta tela est ilustrada na figura 16.9.
Por ltimo possvel configurar o nome do contexto. O diretrio onde ficar os arquivos
WEB e o diretrio onde ficaro os arquivos .java conforme mostra a figura 16.10.
16.4.
A listagem 16.3 apresenta a classe do servlet que receber as informaes atravs do mtodo
get. Note que todo o cdigo que atender a requisio fica dentro do mtodo doGet. Este
mtodo recebe dois parmetros um do tipo HttpServletRequest que possui as informaes
da requisio e um do tipo HttpServletResponse que possibilita a construo da resposta.
utilizado o mtodo getParameter:
String nascimento = request.getParameter("nascimento");
170
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
http://solutioin.com
Francisco Calaa, Otvio Calaa
171
Verso 1.2-beta
servlets
172
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
http://solutioin.com
Francisco Calaa, Otvio Calaa
173
Verso 1.2-beta
servlets
174
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
o atributo action descreve qual recurso ser invocado quando for clicado no botao submit
e o atributo method descreve qual mtodo ser utilizado, no caso GET.
Observe que os parmetros que voc digitou no formulrio aparecem na url enviada
pelo browser. Esta a caracterstica do mtodo get: envia os parmetros atravs da URL.
Listagem 16.3: Servlet do exemplo de passagem de parmetros com o mtodo get
1
package capitulo16;
2
3
4
import java.io.IOException;
import java.io.PrintWriter;
5
6
7
8
9
10
11
import
import
import
import
import
import
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
12
13
14
@WebServlet("/ExemploGet")
public class ExemploGet extends HttpServlet {
15
16
17
18
19
20
21
out.println("<html >");
out.println("<body >");
out.printf("%s nasceu em %s", nome, nascimento);
out.println("</body >");
out.println("</html >");
out.close();
22
23
24
25
26
27
28
29
Listagem 16.4: Pgina Html que enviar as informaes atravs do mtodo get
1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
<title>Exemplo Get</title>
</head>
<body>
<form action="ExemploGet" method="get">
Nome: <input type="text" name="nome" /><br/>
Data de nascimento: <input type="text" name="nascimento" /><br/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>
http://solutioin.com
Francisco Calaa, Otvio Calaa
175
Verso 1.2-beta
16.5.
servlets
Diferente do mtodo get o mtodo post envia as informaes para o servidor no corpo da
solicitao. As informaes no aparecero na URL como no mtodo GET.
A listagem 16.5 apresenta o servlet que atender s requisies post. Note que agora foi
implementado o mtodo doPost.
A listagem 16.6 apresenta a pgina que enviar as informaes atravs do mtodo post.
Note que a unica diferena com o envio com mtodo GET o atributo method da tag form
que agora POST.
Listagem 16.5: Servlet do exemplo de passagem de parmetros com o mtodo post
1
package capitulo16;
2
3
4
import java.io.IOException;
import java.io.PrintWriter;
5
6
7
8
9
10
11
import
import
import
import
import
import
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
12
13
14
@WebServlet("/ExemploPost")
public class ExemploPost extends HttpServlet {
15
16
17
18
19
20
21
22
23
out.println("<html >");
out.println("<body");
out.printf("Nome: %s <br/>", nome);
out.printf("Endereco: %s <br/>", endereco);
out.printf("Salario: %s <br/>", salario);
out.println("</body >");
out.println("</html >");
out.close();
24
25
26
27
28
29
30
31
32
33
Listagem 16.6: Pgina Html que enviar as informaes atravs do mtodo post
1
2
3
<html>
<head>
<title>Exemplo mtodo post</title>
176
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
4
5
6
7
8
9
10
11
12
13
14
15
servlets
</head>
<body>
<form action="ExemploPost" method="POST">
<pre>
Nome:
<input type="text" name="nome" />
Endereco: <input type="text" name="endereco" />
Salario: <input type="text" name="salario" />
<input type="submit" />
</pre>
</form>
</body>
</html>
16.6.
Redirect
Para exemplificar o redirect pense em um Call Center. Imagine voc ligando para um Call
Center para fazer uma reclamao de sua conta telefnica. Aps ser atendido pelo primeiro
atendente voc conta toda a histria que originou a ligao. O atentende espera at voc
terminar e diz: No comigo. Vou transfefir o senhor para o departamento responsvel.
Voc se irrita um pouco e diz: Tudo bem. Um novo antendente atente e solicita a voc
que conte o problema a ele. Voc conta o problema e ele o ouve at terminar. Quando
voc termina o novo atendente diz: Tambm no comigo. Vou transferir o senhor para o
departamento responsvel. A voc um pouco mais irritado espera. Na terceira vez conta,
novamente toda a histria e assim vai.
Neste caso ocorre um redirect. Quando feito um redirect entre recursos WEB com
o protocolo HTTP como se fosse necessrio contar novamente toda a histria ao novo
recurso e fica claro, para o solicitante, que houve mudana de servlet atendente.
As pginas das Listagens 16.9 e 16.10 apresentam o resultado.
Note o uso do mtodo sendRedirect:
response.sendRedirect(pagina);
para realizar o redirecionamento para a pgina de resultado. Com o redirect ser feita
uma nova requisio para as pginas e voc observar que, ao clicar no boto, automaticamente ser redirecionado para aprovado.html ou reprovado.html. Ficou claro que quem
originou a resposta foram as prprias pginas.
Listagem 16.7: Pgina inicial do exemplo com redirect
1
2
3
4
5
6
7
8
9
<html>
<head>
<title>Exemplo Redirect</title>
</head>
<body>
<form action="ExemploRedirect" method="post">
Salrio: <input type="text" name="salario"/>
<input type="submit" value="Enviar"/>
</form>
http://solutioin.com
Francisco Calaa, Otvio Calaa
177
Verso 1.2-beta
10
11
servlets
</body>
</html>
package capitulo16;
2
3
import java.io.IOException;
4
5
6
7
8
9
10
import
import
import
import
import
import
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
11
12
13
@WebServlet("/ExemploRedirect")
public class ExemploRedirect extends HttpServlet {
14
15
16
17
18
19
20
21
22
23
response.sendRedirect(pagina);
24
25
26
<html>
<head>
<title>Aprovado</title>
</head>
<body>
<h1 style="color: green;">LIMITE APROVADO</h1>
</body>
</html>
<html>
<head>
<title>Rerovado</title>
</head>
<body>
<h1 style="color: red;">LIMITE REPROVADO</h1>
</body>
178
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
</html>
16.7.
Forward
Diferente do redirect o forward esconde quem realizou a resposta. Seria como se voc
tivesse ligado para o Call Center e contado o seu problema. O atendente falasse: -Espera um
pouco. Neste momento ele pergunta para um colega que o especialista naquele problema
o que fazer. Aps ter a resposta ele volta ao telefone e te conta a resposta. Voc no teve que
contar novamente sua histria. Voc tambm no conheceu quem realmente solucionou seu
problema pois a nica pessoa que voc teve contato foi o atendente inicial. Isto forward.
O servlet da listagem 16.12 apresenta um exemplo de forward. Para a realizao do
forward foram utilizadas as seguintes instrues:
RequestDispatcher rd = request.getRequestDispatcher(pagina);
rd.forward(request, response);
Note que aps clicar no boto voc v a resposta mas no percebe que foi gerada pelas
pginas aprovado.html ou reprovado.html.
Listagem 16.11: Pgina inicial do exemplo com forward
1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>Exemplo Forward</title>
</head>
<body>
<form action="ExemploForward" method="post">
Salrio: <input type="text" name="salario"/>
<input type="submit" value="Enviar"/>
</form>
</body>
</html>
package capitulo16;
2
3
import java.io.IOException;
4
5
6
7
8
9
10
import
import
import
import
import
import
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
11
12
13
@WebServlet("/ExemploForward")
public class ExemploForward extends HttpServlet{
14
http://solutioin.com
Francisco Calaa, Otvio Calaa
179
Verso 1.2-beta
servlets
15
16
17
18
19
20
21
22
23
RequestDispatcher rd = request.getRequestDispatcher(pagina);
rd.forward(request, response);
24
25
26
27
28
16.8.
16.8.1
Request
Tudo que armazenado no escopo de request vlido apenas enquanto durar uma requisio. Se o usurio clicar em algum link ou algum servlet realizar um redirec as informaes
armazenadas neste escopo se perdem.
Para acessar este escopo utilize os mtodo:
request.getAttribute(bean); // para buscar informaes do escopo
request.setAttribute(bean, bean); // para colocar informaes no escopo.
180
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
servlets
16.8.2 Session
Tudo que armazenado no escopo de session vlido enquanto durar a sessao com o
usurio. Uma sesso normalmente representada com uma janela do browser aberta.
neste escopo que so armazenadas as informaes de login do usurio ou o carrinho de
compras em uma loja virtual.
Para acessar este escopo utilize o mtodo:
request.getSession().getAttribute(bean); //para buscar informaes do escopo
request.getSession().setAttribute(bean, bean); // para colocar informaes no escopo.
16.8.3 Application
Tudo que armazenado no escopo de application valido para todos os usurios mesmo
estando em browsers diferentes, mesmo estando em lugares diferentes. Em um chat seria
um bom local para armazenar as mensagens que devem ser vistas por todos.
Para acessar este escopo utilize o mtodo:
getServletContext().getAttribute(bean); //para buscar informaes do escopo
getServletContext().setAttribute(bean, bean); // para colocar informaes no escopo.
16.9.
No incio deste captulo foi apresentada a estrutura de um aplicativo web Java. Existem
uma srie de detalhes a serem seguidos e que dificultam a distribuio de aplicaes Java
uma vez que cada aplicativo consiste de vrios arquivos. Para solucionar este problema
possvel comprimir todos estes arquivos que esto no contexto utilizando o formato zip em
um arquivo com extenso .war.
http://solutioin.com
Francisco Calaa, Otvio Calaa
181
Verso 1.2-beta
servlets
16.10.
Exerccios
1. O que um servlet?
2. Explique a estrutura de um aplicao Java.
3. Quais so os passos para implementao de um servlet ?
4. Qual o diretrio do tomcat onde ficam armazenados as aplicaes?
5. Diferencie os mtodos get e post.
6. Qual a diferenca entre redirect e forward?
7. Quais os escopos de um aplicativo web?
8. O que so arquivos .war ?
182
http://solutioin.com
Francisco Calaa, Otvio Calaa
17
J AVA S E RV E R PA G E S
JavaServer Pages - JSP - uma tecnologia que simplifica o processo de desenvolvimento
de aplicaes web. Com JSP, os desenvolvedores podem rapidamente incorporar elementos dinmicos em pginas da web, utilizando Java embutido e algumas tags. Estas tags
fornecem ao desenvolvedor um meio de acessar dados e lgica de negcio armazenados
em objetos Java sem ter que dominar as complexidades do desenvolvimento de aplicaes.
O JSP tambm oferece a vantagem de ser facilmente codificado, facilitando assim a elaborao e manuteno de uma aplicao. Alm disso, essa tecnologia permite separar a
programao lgica (parte dinmica) da programao visual (parte esttica), facilitando o
desenvolvimento de aplicaes mais robustas, onde programador e designer podem trabalhar no mesmo projeto, mas de forma independente.
Os arquivos jsps so convertido em servlets (arquivos .java) e compilados para arquivos
.class. Normalmente a primeira execuo do jsp mais lenta que as demais pois o continer
est realizando essa operao.
17.1.
Elementos do Jsp
possvel inserir cdigo Java dentro do servlet a ser gerado a partir do JSP. Isto pode ser
feito de trs formas:
Scriptlets: que insere dentro do servlet cdigo Java
Expresses: que tem seu valor escrito na pgina;
Declaraes: utilizadas para criarem mtodos e classes dentro do JSP.
Cada um destes elementos ser descrito a seguir.
17.1.1 Scriptlet
Scriptlets so trechos de cdigo Java dentro de pgianas HTML. Um Scriptlet fica entre as
tags
<% -- cdigo java -- %>
O Trecho de cdigo abaixo um exemplo de pgina HTML, com scriptlets JSP que
escrevem na tela: Ol Mundo
<%
183
Verso 1.2-beta
Scriptlets tem acesso algumas variveis definidas como request, session, etc.:
<%
String dados = request.getQueryString();
out.println("Dados anexados: " + dados);
%>
<% if (Math.random() < 0.5) { %>
Voc est com <B>Sorte</B>!
<% } else { %>
Voc no est com tanta <B>Sorte</B> assim!
<% } %>
17.1.2 Expresses
Uma expresso JSP usada para escrever variveis Java direntamente na pgina. Veja o
exemplo a seguir:
<%= Expresso Java %>
A expresso Java ser convertida em uma String e escrita na pgina. Por exemplo, o
cdigo seguinte:
Data atual: <%= new java.util.Date() %>
<html>
<head>
<title>Exemplo de JSP</title>
</head>
<body>
<%for(int i = 0; i < 15; i++){ %>
7
8
9
10
<%} %>
11
12
13
</body>
</html>
184
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
17.1.3 Declaraes
Uma declarao JSP define mtodos, campos ou classes que sero inseridos no corpo do
Servlet gerado pela pgina. Portanto, o cdigo abaixo:
<%! void somar(int a, int b){ . . .} $ %> $
17.2.
Diretivas
Uma diretiva JSP afeta toda a estrutura da pgina. Este um exemplo de diretiva:
<%@ diretiva atributo=valor" %>
<a
<a
<a
<a
href="index.jsp">Incio</a>
href="exemploJsp.jsp">Primeiro Exemplo</a>
href="clientes.jsp">Lista de Clientes</a>
href="clientes -jstl.jsp">Lista de Clientes com JSTL</a>
<html>
<head>
<title>Pgina inicial</title>
</head>
<body>
4
5
6
7
<h1>Pgina inicial</h1>
</body>
9
10
</html>
http://solutioin.com
Francisco Calaa, Otvio Calaa
185
Verso 1.2-beta
no arquivo exemploJsp.jsp
Por possuir mltiplos atributos a linguagem JSP permite que se declare vrias diretivas
numa mesma pgina, porm a nico atributo que pode ser repetido o import.
Nas subsees seguir sero descritos os atributos desta diretiva.
17.2.2.1 ContentType
Este atributo indica qual o tipo MIME (Multipurpose Internet Mail Extensions) da resposta
est sendo gerada pela JSP. Os tipos mais comuns so: text/plain, text/html, text/xml. Logo abaixo segue o exemplo usado como padro para as JSPs.
<%@ page contentType="text/html" %>
17.2.2.2 pageEncoding
Define o caracter enconding da pgina.
<%@ page pageEncoding="UTF-8" %>
17.2.2.3 Extends
Serve para indicar a super classe que ser usada pelo container JSP no momento de
traduo da pgina em um Servlet Java. Exemplo:
<%@ page extends="com.solutioin.taglib.jsp.primeirapagina" %>
17.2.2.4 Import
Com o atribuo import, diferente do extends, capaz de estender um conjunto de classes
Java que podero ser usadas nas pginas JSPs. Exemplo:
<%@ page import="java.util.List" %>
17.2.2.5 Language
Usado, em geral, para especificar Java como a linguagem de criao de script para a pgina.
Exemplo:
<%@ page language="java" %>
186
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
17.2.2.6 Info
Usado para inserir informaes sumarizadas da pgina, no havendo restries ao seu
tamanho. Exemplo:
<%@ page info="Java Para Web" %>
17.2.2.7 Session
Session do tipo boolean, indica se a pgina est participando do gerenciamento de sesso.
Por exemplo, se quisermos dizer que uma pgina parte de uma sesso, utiliza-se a
seguinte sintaxe:
<%@ page session="true" %>
17.2.2.8 Buffer
Responsvel por controlar a sada bufferizada para uma pgina JSP. Se for ajustado para
none o contedo de uma JSP passado instantaneamente resposta HTTP. O tamanho
do buffer descrito em kilobytes. Exemplo:
<%@ page buffer="20kb" %> ou <%@ page buffer="none" %>
17.2.2.9 AutoFlush
Semelhante ao Buffer, tambm responsvel por controlar a sada buferizada, mais exatamente o comportamento do container JSP quando j esteja cheio o Buffer de sada. Neste
caso esvaziado automaticamente o Buffer de sada e o conted0o enviado para o servidor
HTTP que transmite para o Browser responsvel pela solicitao. Sendo do tipo boolean,
sua sintaxe dada abaixo:
<%@ page autoFlush="true" %>
17.2.2.10 isThreadSafe
Quando uma pgina JSP compilada em um Servlet, ela deve ser capaz de atender a
mltiplas solicitaes. Para isso devemos utilizar o atributo isThreadSafe, caso contrrio
necessrio defini-lo como false. Exemplo:
<%@ page isThreadSafe="false" %>
17.2.2.11 errorPage
ErrorPage indica uma pgina alternativa que ser exibida caso acontea um erro no previsto durante o processamento de uma pgina JSP no container. Exemplo:
<%@ page errorPage="/apostila/exemplos/erro.jsp" %>
http://solutioin.com
Francisco Calaa, Otvio Calaa
187
Verso 1.2-beta
jsp:include
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:forward
jsp:plugin
17.2.2.12 isErrorPage
Responsvel por define uma pgina JSP que servir como a pgina de erro padro para um
grupo de pginas JSP. Sendo do tipo boolean, sua sintaxe descrita abaixo:
<%@ page isErrorPage="true"%>
17.3.
Aes do JSP
17.4.
A JSTL (Standard Tag Library for JavaServer Pages) foi criada para organizar melhor o cdigo
de um JSP evitando a insero de cdigo Java dentro das mesmas. Normalmente quem
edita as pginas JSP so web designers que no sabem programar em Java.
JSTL consiste em uma coleo de bibliotecas, tendo cada uma um propsito bem definido,
que permitem escrever pginas JSPs sem cdigo Java, aumentando assim a legibilidade do
cdigo e a interao entre desenvolvedores e web designers. Cada tag realiza um determinado tipo de processamento (equivalente a cdigo Java dentro de JSP). Exemplo de uma
pgina JSTL
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<body bgcolor="#FFFFFF">
<jsp:useBean id="agora" class="java.util.Date"/>
188
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
<br>
Hoje: <fmt:formatDate value="${agora}" />
<br> Agora: <fmt:formatDate value="${agora}" pattern="dd/MM/yyyy"/>
</body>
</html>
A taglib mais utilizada a central. Normalmente prefixada com c. Possui tags para
trabalhar com condicionais, loops, condicionais, dentre outras. Sua declarao :
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
Uma tag muito utilizada a <c:forEach>. Esta tag permite percorrer uma lista de objetos
e apresenta-los na pgina.
Exemplo:
${cliente.nome}
ou ainda
<c:forEach items="${lista}" var="cliente">
http://solutioin.com
Francisco Calaa, Otvio Calaa
189
Verso 1.2-beta
17.5.
package capitulo17;
2
3
import java.io.IOException;
4
5
6
7
8
9
10
import
import
import
import
import
import
javax.servlet.RequestDispatcher;
javax.servlet.ServletException;
javax.servlet.annotation.WebServlet;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
11
12
13
import capitulo13.Cliente;
import capitulo13.ClienteDao;
190
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
14
15
16
@WebServlet("/ClienteControl")
public class ClienteControl extends HttpServlet {
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
<html>
<head>
<title>Cadastro de Clientes</title>
</head>
<body>
8
9
10
11
12
13
14
15
16
<form action="ClienteControl">
<pre>
<input type="hidden"
Nome:
<input type="text"
CPF/CNPJ:
<input type="text"
Endereo:
<input type="text"
http://solutioin.com
Francisco Calaa, Otvio Calaa
name="acao" value="confirmar"/>
name="nome"/>
name="cpfCnpj"/>
name="endereco"/>
191
Verso 1.2-beta
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</body>
</html>
17.6.
Exerccios
1. O o JSP?
2. Quais so os elementos de um JSP? Para que serve cada um deles?
3. Para que servem as diretivas ?
4. O que a Expresso de Linguagem?
5. Explique o MVC.
6. No exemplo da Agenda WEB crie a funcionalidade alterar contatos.
192
http://solutioin.com
Francisco Calaa, Otvio Calaa
18
I N T R O D U O A O J AVA S E RV E R F A C E S
JavaServer Faces um poderoso framework para desenvolvimento Java EE. Seus princpios
se baseiam no processamento de eventos gerados pelo usurio na pgina web como: um
clique no boto, alterao do contedo de um campo de texto.
O JSF usa o padro MVC como base de funcionamento. Para ser processada uma pgina
JSF ela deve passar por um controlador representado pelo Servlet FacesServlet.
A execuo de uma chamada JSF dada pela seguinte seqncia: o FacesServlet recebe a
chamada, cria o FacesContext, logo atribudo o controle ao ciclo de vida (LifeCycle) que
processa o contexto em 6 fases: reconstituio da view, aplicao dos valores da requisio,
validao dos dados, atualizao do modelo de dados, chamada ao aplicativo e gerao da
resposta.
18.1.
Para criar o primeiro projeto JavaServer Faces necessrio criar um projeto do tipo Dynamic
Web Project. Na tela onde voc coloca o nome do projeto, configure o framework JavaServer
Faces v2.0 Project conforme ilustrado na Figura 18.1.
Clique em next. . . next. . . at encontrar a tela apresentada na Figura 18.3. Nesta tela, escolha: Disable Library Configuration conforme apresentado na figura.
Por ltimo copie os arquivos .jar, disponibilizados na pasta Material para o diretrio lib
do projeto, conforme ilustrado na Figura 18.3.
18.2.
Managed bean
O Managed Bean uma classe onde so colocados os cdigos Java que so executados
partir dos componentes da tela. Nele possvel escrever cdigo Java para atenter a eventos
da tela, recebe dados, e executa tarefas. Trata-se e um classe que deve ter um construtor
default, getters e setters. Um Managed Bean no necessita herdar de nenhuma classe.
Um exemplo de Managed Bean pode ser visto na listagem 18.1.
O Managed Bean deve ser declarado no arquivo faces-config.xml da seguinte forma:
193
Verso 1.2-beta
194
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
http://solutioin.com
Francisco Calaa, Otvio Calaa
195
Verso 1.2-beta
<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>
package aulajsf;
2
3
import javax.faces.event.ActionEvent;
4
5
7
8
9
10
11
12
13
14
15
16
17
18
196
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
19
20
21
22
23
24
25
26
27
28
29
30
31
18.3.
Tags bsicas
As tags JSF HTML so utilizadas para construir componentes html na pgina como
tabelas, campos de entrada, etc. Existem projetos JSF como o Primefaces, Richfaces, Icefaces,
Myfaces que possuem mais componentes como calendrio, tabela ordenvel, menus, etc.
http://solutioin.com
Francisco Calaa, Otvio Calaa
197
Verso 1.2-beta
<h:head>
HTML head
<h:body>
HTML body
<h:form>
HTML form
<h:inputText>
<h:inputTextarea>
<h:inputSecret>
<h:inputHidden>
Campo escondido
<h:outputLabel>
<h:outputLink>
link HTML
<h:outputFormat>
<h:outputText>
Sada de texto
<h:commandButton>
<h:commandLink>
<h:message>
<h:messages>
<h:graphicImage>
<h:selectOneListbox>
<h:selectOneMenu>
ComboBox
<h:selectOneRadio>
<h:selectBooleanCheckbox>
Checkbox
<h:selectManyCheckbox>
Conjunto de checkboxes
<h:selectManyListbox>
<h:selectManyMenu>
Menu multiselecionavel
<h:panelGrid>
tabela HTML
<h:panelGroup>
<h:dataTable>
<h:column>
Coluna em um dataTable
Tabela 18.1: Tags JSF para renderizao de componentes HTML
<f:view>
. . .
</f:view>
A tag:
<h:inputText />
198
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
<f:view>
<f:facet>
<f:convertDateTime>
1
2
3
4
5
<h:head>
6
7
</h:head>
8
9
10
11
12
13
14
15
16
17
<h:body>
<h:form>
<h:inputText value="#{ exemploControl.entrada}" />
<h:commandButton ajax="false"
actionListener="#{ exemploControl.executar}" value="Executar" />
<h:outputText value="#{ exemploControl.saida}" />
</h:form>
</h:body>
</html>
Dica:
Para acessar a tela da listagem 18.2 no browser, digite a url:
http://localhost:8080/aulajsf/faces/exemplo.xhtml
Aps iniciar o servidor.
18.4.
Expresses de Ligao - EL
para ligar os componentes da pgina com o managed bean. Por exemplo, a expresso
#{exemploControl.entrada}
liga o campo de entrada de texto com o atributo nome da classe ExemploControl (ManagedBean). A expresso
#{exemploControl.executar}
http://solutioin.com
Francisco Calaa, Otvio Calaa
199
Verso 1.2-beta
para aces
actionListener
valueChangeListener
Observe que este deve retornar uma String que ser utilizada para a navegao.
As ligaes com eventos so utilizadas com eventos de cliques e mudana de valores. As
assinaturas dos mtodos devem ser:
200
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
18.5.
Configurar o Primefaces
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
22
23
24
25
26
27
28
29
30
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>
http://solutioin.com
Francisco Calaa, Otvio Calaa
201
Verso 1.2-beta
18.6.
Cadastro de Clientes
Nesta seo implementaremos a tela para cadastrar clientes. Sero utilizadas as classes
implementadas no Captulo 13. Portanto, necessrio configurar o projeto aulajsf para se
referenciar ao projeto criado naquele captulo.
A Listagem 18.4 apresenta o ManagedBean, que neste caso age como Controlador, do
cadastro de clientes. Aps a implementao desta classe necessrio adicionar a seguinte
configurao no arquivo faces-config.xml:
<managed-bean>
<managed-bean-name>clienteControl</managed-bean-name>
<managed-bean-class>aulajsf.ClienteControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
package aulajsf;
2
3
4
import java.util.ArrayList;
import java.util.List;
5
6
7
8
import javax.faces.component.UIParameter;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
9
10
import org.primefaces.event.RowEditEvent;
11
12
13
import capitulo13.Cliente;
import capitulo13.ClienteDao;
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
202
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
5
6
<h:head>
7
8
</h:head>
9
10
<h:body>
http://solutioin.com
Francisco Calaa, Otvio Calaa
203
Verso 1.2-beta
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<h:form>
<p:panel header="Manter Clientes">
<h:panelGrid columns="2">
<h:outputText value="Nome:" />
<p:inputText value="#{ clienteControl.cliente.nome}"></p:inputText>
<h:outputText value="CPF/CNPJ:" />
<p:inputText value="#{ clienteControl.cliente.cpfcnpj}"></p:inputText>
<h:outputText value="Endereo:" />
<p:inputText value="#{ clienteControl.cliente.endereco}"></p:inputText>
<h:outputText value=" M u n i c p i o :" />
<p:inputText value="#{ clienteControl.cliente.municipio}"></p:inputText>
<h:outputText value="UF:" />
<p:inputText value="#{ clienteControl.cliente.uf}"></p:inputText>
<p:commandButton ajax="false"
actionListener="#{ clienteControl.confirmar}" value="Confirmar"></p:commandButton>
<p:commandButton ajax="false"
actionListener="#{ clienteControl.listar}" value="Listar"></p:commandButton>
</h:panelGrid>
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
204
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
63
64
65
66
67
68
69
<p:selectOneMenu value="#{cli.uf}">
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{ clienteControl.ufs}"></f:selectItems>
</p:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
70
71
72
73
74
75
76
77
78
79
<p:column>
<p:commandButton actionListener="#{ clienteControl.excluirCliente}"
icon="ui-icon -trash">
<f:param id="cliExcluir" value="#{cli}"></f:param>
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
</h:form>
80
81
82
</h:body>
</html>
18.7.
package aulajsf;
2
3
4
5
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
6
7
8
@Entity
public class Produto {
9
10
11
12
@Id
@GeneratedValue
private int id;
13
14
15
16
17
18
19
20
21
22
23
24
25
http://solutioin.com
Francisco Calaa, Otvio Calaa
205
Verso 1.2-beta
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package aulajsf;
2
3
import java.util.List;
4
5
6
7
8
import
import
import
import
javax.persistence.EntityManager;
javax.persistence.EntityManagerFactory;
javax.persistence.Persistence;
javax.persistence.Query;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
206
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
em.getTransaction().begin();
em.merge(p);
em.getTransaction().commit();
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package aulajsf;
2
3
4
import java.util.ArrayList;
import java.util.List;
5
6
import javax.faces.event.ActionEvent;
7
8
import org.primefaces.event.RowEditEvent;
9
10
11
12
13
14
15
16
17
18
19
http://solutioin.com
Francisco Calaa, Otvio Calaa
207
Verso 1.2-beta
listar(evt);
produto = new Produto();
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
5
6
<h:head>
7
8
</h:head>
9
10
11
12
13
14
15
16
17
18
19
<h:body>
<h:form>
<p:panel header="Manter Produtos">
<h:panelGrid columns="2">
<h:outputText value="Descrio:" />
<p:inputText value="#{ produtoControl.produto.descricao}"></p:inputText>
<h:outputText value="Quantidade:" />
<p:inputText value="#{ produtoControl.produto.quantidade}"></p:inputText>
<h:outputText value="Valor:" />
<p:inputText value="#{ produtoControl.produto.valor}"></p:inputText>
20
<p:commandButton ajax="false"
actionListener="#{ produtoControl.confirmar}" value="Confirmar"></p:commandButton>
21
22
23
208
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
24
25
<p:commandButton ajax="false"
actionListener="#{ produtoControl.listar}" value="Listar"></p:commandButton>
26
27
</h:panelGrid>
28
29
30
31
32
33
34
35
<f:facet name="header">
<h:outputText value="Produtos" />
</f:facet>
<p:ajax event="rowEdit" listener="#{ produtoControl.gravar}"></p:ajax>
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<p:column>
<p:commandButton ajax="false" value="Selecionar">
<f:setPropertyActionListener target="#{ produtoControl.produto}"
value="#{prod}"></f:setPropertyActionListener>
</p:commandButton>
</p:column>
55
56
57
58
<p:column>
<p:rowEditor></p:rowEditor>
</p:column>
59
60
61
62
</p:dataTable>
</p:panel>
</h:form>
63
64
65
</h:body>
</html>
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/
javaee/web -app _ 3 _ 0.xsd"
http://solutioin.com
Francisco Calaa, Otvio Calaa
209
Verso 1.2-beta
5
6
version="3.0">
<display-name>capitulo18</display-name>
7
8
9
10
11
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name>
<param-value>*.xhtml</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
29
30
31
32
33
34
35
36
37
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>
38
39
40
41
42
43
44
45
46
47
48
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
</web-app>
>
210
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<managed-bean>
<managed-bean-name>exemploControl</managed-bean-name>
<managed-bean-class>aulajsf.ExemploControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>clienteControl</managed-bean-name>
<managed-bean-class>aulajsf.ClienteControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>produtoControl</managed-bean-name>
<managed-bean-class>aulajsf.ProdutoControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>produtoListControl</managed-bean-name>
<managed-bean-class>aulajsf.ProdutoListControl</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
5
6
7
8
9
10
11
12
13
14
15
16
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns
/persistence/persistence _ 1 _ 0.xsd" >
<persistence-unit name="aulajpa">
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show _ sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"
/>
<property name="hibernate.connection.url" value="jdbc:postgresql: // localhost/
treinamento" />
<property name="hibernate.connection.driver _ class" value="org.postgresql.Driver" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
</properties>
</persistence-unit>
</persistence>
Dica:
No esquea de adicionar as dependncias da JPA nas libs do projeto
de JSF.
http://solutioin.com
Francisco Calaa, Otvio Calaa
211
Verso 1.2-beta
18.8.
Conversores
Inicialmente vamos verificar a necessidade de utilizar conversores JSF. Imagine uma tela de
uma aplicao web onde o usurio entra com uma informao no formato String. Suponha
que esta informao deva ser convertida em um valor numrico como uma idade ou um
salrio. Esta converso deve ser feita de forma automtica para que, no Managed Bean a
varivel j possa ser declarada como inteira ou ponto flutuante. Um outro exemplo pode
acontecer com datas. Nestes casos utilizamos conversores.
Por exemplo, para converter nmeros, utize:
<h:inputText id="salary" value="#{PessoaControl.salario}">
<f:convertNumber pattern="###,##0.00"/>
</h:inputText>
package aulajsf;
2
3
4
import java.util.ArrayList;
import java.util.List;
5
6
import javax.faces.event.ActionEvent;
7
8
9
10
11
12
13
14
15
16
17
18
19
20
212
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package aulajsf;
2
3
4
import java.util.HashMap;
import java.util.Map;
5
6
7
8
9
import
import
import
import
javax.faces.component.UIComponent;
javax.faces.context.FacesContext;
javax.faces.convert.Converter;
javax.faces.convert.FacesConverter;
10
11
12
13
@FacesConverter("produtoConverter")
public class ProdutoConverter implements Converter{
14
15
16
@Override
public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
return mapa.get(value);
}
17
18
19
20
21
@Override
public String getAsString(FacesContext ctx, UIComponent comp, Object value) {
if(value instanceof Produto){
Produto p = (Produto) value;
mapa.put(String.valueOf(p.getId()), p);
return String.valueOf(p.getId());
}else{
return "";
}
}
22
23
24
25
26
27
28
29
30
31
32
33
http://solutioin.com
Francisco Calaa, Otvio Calaa
213
Verso 1.2-beta
5
6
<h:head>
7
8
</h:head>
9
10
11
12
13
<h:body>
<h:form enctype="multipart/form -data">
<p:panel header="Manter Produtos">
<p:autoComplete value="#{ produtoListControl.produto}" id="produto" completeMethod="
#{ produtoListControl.listarPorDescricao}"
14
15
16
17
18
19
20
21
<p:column>
<h:outputText value="#{prod.descricao}"></h:outputText>
</p:column>
22
23
24
25
<p:column>
<h:outputText value="#{prod.valor}"></h:outputText>
</p:column>
26
27
28
29
30
31
32
</p:dataTable>
</p:panel>
</h:form>
33
34
35
</h:body>
</html>
214
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
18.9.
Exerccios
http://solutioin.com
Francisco Calaa, Otvio Calaa
215
19
PA D R E S D E P R O J E T O
Um Padro de Projeto de Software, tambm muito conhecido pelo seu termo original em
ingls, Design Pattern, descreve uma soluo geral reutilizvel para um problema recorrente no desenvolvimento de sistemas de software orientados a objetos. No um cdigo
final, uma descrio ou modelo de como resolver o problema do qual trata, que pode
ser usada em muitas situaes diferentes. Os Padres de Projeto normalmente definem as
relaes e interaes entre as classes ou objetos, sem especificar os detalhes das classes ou
objetos envolvidos, ou seja, esto num nvel de generalidade mais alto.
Um padro de projeto define :
seu nome,
o problema,
a soluo,
quando aplicar esta soluo e
suas consequncias.
Os padres de projeto visam facilitar a reutilizao de solues de projeto e estabelecem
um vocabulrio comum para ser utilizado no projeto, facilitando comunicao, documentao e aprendizado dos sistemas de software.
19.1.
Padres GoF
217
Verso 1.2-beta
padres de projeto
Padres de criao:
Abstract Factory
Builder
Factory Method
Prototype
Singleton
Padres estruturais
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Padres comportamentais
Chain of Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor
19.2.
Abstract Factory
218
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
padres de projeto
19.2.1 Utilizao
O padro Abstract Factory pode ser utilizado na implementao de um toolkit que disponibilize controles que funcionem em diferentes interfaces grficas, tal como Motif, GTK+
(GNOME) ou Qt (KDE). Estas GUIs possuem diferentes padres de controles visuais e,
para facilitar a construo de aplicativos que interajam facilmente com diferentes interfaces
grficas, interessante que se defina interfaces comuns para acesso aos controles, independentemente da GUI utilizada. Este problema pode ser resolvido atravs de uma classe
abstrata que declara uma interface genrica para criao dos controles visuais e de uma
classe abstrata para criao de cada tipo de controle. O comportamento especfico, de cada
um dos padres tecnolgicos contemplados, implementado atravs de uma classe concreta. O aplicativo, ou "cliente", interage com o toolkit atravs das classes abstratas sem ter
conhecimento da implementao das classes concretas. Um exemplo bem simplista seria
um projeto com interface para Mobile e para Desktop, uma boa opo para reaproveitar os
mesmos controles de interface seria criar pacotes com classes abstratas e os pacotes com
as classes concretas implementando apenas as diferenas. Esse padro tambm se aplica
na padronizao de ambientes, por exemplo, tamanhos de botes, fontes, cores de fundo,
largura de bordas. Com isso e havendo uma poltica que exija que os desenvolvedores
usem essas classes em vez das nativas da linguagem, ajudar a padronizar a aparncia e
comportamento das aplicaes.
19.3.
Factory Method
19.3.1 Utilizao
Este padro muito utilizado em frameworks para definir e manter relacionamentos entre objetos. O framework Spring, dependendo da configurao, pode utilizar um Factory
Method para criar os seus beans. Este padro pode ser utilizado na construo de um
framework que suporta aplicaes que apresentam mltiplos documentos ao usurio. Normalmente este tipo de aplicao manipula um nmero varivel de formatos de documento
e, por isso, este framework deve ser flexvel o bastante para suportar qualquer formato.
Uma soluo para este problema poderia disponibilizar, no framework, o cdigo para alguns dos formatos mais utilizados. Mas, na prtica, esta soluo seria uma implementao
pouco flexvel, e at mesmo incompleta, j que custoso implementar os mais variados
formatos. O padro Factory Method prope uma soluo que deixa para o cliente (a implementao da aplicao) a tarefa de suportar os formatos necessrios e para o framework
o papel de definio de uma abstrao que oferece uma interface nica para criao de
documentos. Este framework seria baseado em duas classes abstratas, que representam
http://solutioin.com
Francisco Calaa, Otvio Calaa
219
Verso 1.2-beta
padres de projeto
19.3.2 Command
Encapsular uma solicitao como um objeto, desta forma permitindo que clientes parametrizem
diferentes solicitaes, enfileirem ou faam o registro (log) de solicitaes e suportem operaes que podem ser desfeitas.
19.3.3 Problema
Algumas vezes necessrio emitir solicitaes para objetos nada sabendo sobre a operao
que est sendo solicitada ou sobre o receptor da mesma.
Utilizar quando:
Parametrizar objetos por uma ao a ser executada. Voc pode expressar tal parametrizao numa linguagem procedural atravs de uma funo callback, ou seja, uma funo
que registrada em algum lugar para ser chamada em um momento mais adiante.
Os Commands so uma substituio orientada a objetos para callbacks;
Especificar, enfileirar e executar solicitaes em tempos diferentes. Um objeto Command pode ter um tempo de vida independente da solicitao original. Se o receptor
de uma solicitao pode ser representado de uma maneira independente do espao
de endereamento, ento voc pode transferir um objeto Command para a solicitao
para um processo diferente e l atender a solicitao;
Suportar desfazer operaes. A operao Execute, de Command, pode armazenar estados para reverter seus efeitos no prprio comando. A interface do Command deve
ter acrescentada uma operao Unexecute, que o reverte.efeitos de uma chamada anterior de Execute. Os comandos executados so armazenados em uma lista histrica.
O nvel ilimitado de desfazer e refazer operaes obtido percorrendo esta lista para
trs e para frente, chamando operaes Unexecute e Execute, respectivamente.
220
http://solutioin.com
Francisco Calaa, Otvio Calaa
Verso 1.2-beta
padres de projeto
19.3.4 Aplicao
A chave deste padro uma classe abstrata Command, a qual declara uma interface para
execuo de operaes. Na sua forma mais simples, esta interface inclui uma operao
abstrata Execute. As subclasses concretas de Command especificam um par receptor-ao
atravs do armazenamento do receptor como uma varivel de instncia e pela implementao de Execute para invocar a solicitao. O receptor tem o conhecimento necessrio para
poder executar a solicitao.
19.4.
Este no um padro de projeto GoF. Objeto de acesso a dados (ou simplesmente DAO,
acrnimo de Data Access Object), um padro para persistncia de dados que permite
separar regras de negcio das regras de acesso a banco de dados. Numa aplicao que
utilize a arquitetura MVC, todas as funcionalidades de bancos de dados, tais como obter as
conexes, mapear objetos Java para tipos de dados SQL ou executar comandos SQL, devem
ser feitas por classes de DAO.
19.4.1 Vantagens
A vantagem de usar objetos de acesso a dados a separao simples e rigorosa entre duas
partes importantes de uma aplicao que no devem e no podem conhecer quase que
nada uma da outra, e que podem evoluir frequentemente e independentemente. Alterar
a lgica de negcio podem esperar apenas a implementao de uma interface, enquanto
que modificaes na lgica de persistncia no alteram a lgica de negocio, desde que a
interface entre elas no seja modificada.
Pode ser usada em uma vasta porcentagem de aplicaes;
Esconde todos os detalhes relativos a armazenamento de dados do resto da aplicao;
Atua como um intermedirio entre a aplicao e o banco de dados;
Mitiga ou resolve problemas de comunicao entre a base de dados e a aplicao,
evitando estados inconsistentes de dados.
No contexto especfico da linguagem de programao Java, um objeto de acesso a dados como padro de projeto de software pode ser implementado de vrias maneiras. Pode
variar desde uma simples interface que separa partes de acesso a dados da lgica de negcio de uma aplicao at frameworks e produtos comerciais especficos. Os paradigmas
para programao usando DAOs demandam alguma proficincia. O uso de tecnologias
como Java persistence technologies e JDO garantem a implementao do padro de projeto
at certo ponto. Tecnologias como Enterprise JavaBeans trazem para a aplicao servidores
montados e que podem ser usados em aplicaes que usem um servidor de aplicao JEE.
http://solutioin.com
Francisco Calaa, Otvio Calaa
221
Verso 1.2-beta
padres de projeto
Produtos comerciais como o TopLink esto disponveis, baseados em mapeamento objetorelacional (ORM). Produtos ORM populares em cdigo aberto incluem Doctrine, Hibernate,
iBATIS e Apache OpenJPA.
19.5.
MVC
19.5.1 Componentes
O modelo (model) usado para definir e gerenciar o domnio da informao e notificar observadores sobre mudanas nos dados. Ele uma representao detalhada da informao
que a aplicao opera. A lgica de negcio adiciona valor semntico aos dados, e quando
h mudana de estado o modelo notifica seus observadores. Por exemplo, aluno, professor
e turma fazem parte do domnio de um sistema acadmico. Operaes como calcular a
mdia final do aluno ou o ndice de faltas da turma fazem parte da lgica de domnio. A
forma como o dado armazenado ou acessado no de interesse do MVC, assume-se que
de responsabilidade do modelo.
A viso (view) apresenta o modelo num formato adequado ao utilizador, na sada de dados, e diferentes vises podem existir para um mesmo modelo, para diferentes propsitos.
O controlador (controller) recebe a entrada de dados e inicia a resposta ao utilizador
ao invocar objetos do modelo, e por fim uma viso baseada na entrada. Ele tambm
responsvel pela validao e filtragem da entrada de dados.
Um caso prtico uma aplicao web em que a viso um documento HTML (ou
derivado) gerado pela aplicao. O controlador recebe uma entrada GET ou POST aps
um estmulo do utilizador e decide como process-la, invocando objetos do domnio para
tratar a lgica de negcio, e por fim invocando uma viso para apresentar a sada.
19.5.2 Justificativa
Com o aumento da complexidade das aplicaes desenvolvidas,sempre visando a programao orientada a objeto nao devemos esquecer que torna-se relevante a separao entre os
dados e a apresentao das aplicaes. Desta forma, alteraes feitas no layout no afetam
a manipulao de dados, e estes podero ser reorganizados sem alterar o layout.
Esse padro resolve este problema atravs da separao das tarefas de acesso aos dados
e lgica de negcio, lgica de apresentao e de interao com o utilizador, introduzindo
um componente entre os dois, o controlador.
222
http://solutioin.com
Francisco Calaa, Otvio Calaa
M O N TA G E M D O A M B I E N T E D E
TRABALHO
A.1.
O JDK deve ser obtido do site da Oracle1 . Quando voc acessar este site, notar a primeira
grande confuso enfrentada pelos iniciantes. O que baixar JDK ou JRE ? No nosso caso,
devemos baixar o Java SE 7 JDK, ou seja, clique no download do JDK.
Para instalar o JDK basta executar o instalador adequado obtido no site. Note que existem
opes de instalador para linux, windows e solaris para as arquiteturas 32 e 64 bits.
A diferena entre JDK e JRE que o JDK contm, alm da mquina virtual Java, vrias ferramentas para o desenvolvimento de um software Java. J o JRE contm apenas a mquina
virtual.
A.2.
Todo software Java necessita de uma mquina virtual para execut-lo. ela quem acessa
o hardware da mquina. Em java, todo o cdigo escrito deve ser compilado. Este arquivo
compilado chamado de bytecode e executado pela mquina virtual.
Hoje existem mquinas virtuais JIT que recompilam o bytecode para cdigo nativo (que
pode ser executado diretamente no computador) tornando a execuo do software mais
rpida. Este trabalho feito pela JVM transparente, ou seja, no h a necessidade de se
preocupar como e quando ser feito isto.
A.3.
1 http://www.oracle.com/technetwork/java/javase/downloads/index.html
223
E R R O S C O M U N S E N F R E N TA D O S P O R
INICIANTES
B.1.
B.1.1 ClassNotFoundException
B.1.2 NoSuchMethodError
B.1.3 LazyInitializationException
B.1.4 NoClassDefFoundError
B.1.5 NullPointerException
B.1.6 ClassCastException
B.2.
225