Você está na página 1de 118

DEPARTAMENTO DE ENGENHARIA DE COMPUTAO E AUTOMAO INDUSTRIAL

FACULDADE DE ENGENHARIA ELETRICA E DE COMPUTAO


UNIVERSIDADE ESTADUAL DE CAMPINAS
Programao Orientada a Objetos:
Uma Abordagem com 1ava
Ivan Lui: Marques Ricarte
2001
Sumrio
1 Fundamentos da programao orientada a objetos 3
1.1 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Polimorsmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Princpios da programao na linguagem 1ava 8
2.1 Tipos primitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Identicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.1 Expresses retornando valores numricos . . . . . . . . . . . . . . . . . . . 11
2.3.2 Expresses retornando valores booleanos . . . . . . . . . . . . . . . . . . . 12
2.3.3 Outros tipos de expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.4 Controle do uxo de execuo . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.5 Comentarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4 Operaes sobre objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.1 Arranjos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.2 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5 Classes em Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.1 Pacotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.2 Denio de classes em Java . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.5.3 O mtodo main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.4 Visibilidade da classe e seus membros . . . . . . . . . . . . . . . . . . . . . 25
2.5.5 Classes derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.6 Classes abstratas e nais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.5.7 InterIaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.6 Excees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.6.1 Tratamento de excees . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.6.2 Erros e excees de runtime . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.6.3 Propagando excees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.6.4 Denindo e gerando excees . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.7 O ambiente de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.7.1 Ferramentas do Java SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.7.2 Gerao de codigo portatil . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1
Sumario
2.7.3 Desenvolvimento de aplicaes . . . . . . . . . . . . . . . . . . . . . . . . 35
3 Uso das classes da API padro de 1ava 37
3.1 Funcionalidades basicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2 Entrada e saida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.2.1 TransIerncia de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.2 TransIerncia de bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.2.3 Manipulao de arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2.4 Serializao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3 Framework de colees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.4 Extenses padronizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Desenvolvimento de aplicaes grcas 46
4.1 Apresentao grca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.2 InterIaces grcas com usuarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2.1 Eventos da interIace grca . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2.2 Componentes grcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2.3 Containers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.4 Janelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2.5 Gerenciadores de lavout . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.3 Desenvolvimento de applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.3.1 Criao de applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.3.2 Execuo de applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3.3 Passagem de parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.4 Contexto de execuo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5 Desenvolvimento de aplicaes distribudas 72
5.1 Programao cliente-servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.1.1 Conceitos preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
5.1.2 Aplicaes TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.1.3 Aplicaes UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.1.4 Aplicaes HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.2 Acesso a bancos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.2.1 Bancos de dados relacionais . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.2.2 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.2.3 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.3 Servlets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.3.1 Ciclo de vida de um servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.3.2 Fundamentos da API de servlets . . . . . . . . . . . . . . . . . . . . . . . . 92
5.4 Programao com objetos distribuidos . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.4.1 Arquiteturas de objetos distribuidos . . . . . . . . . . . . . . . . . . . . . . 94
5.4.2 Java RMI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.4.3 Java IDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
A Palavras chaves de 1ava 117
c 2001 FEEC/UNICAMP 2
Captulo 1
Fundamentos da programao orientada
a objetos
Neste capitulo so apresentados os conceitos basicos que permeiam o uso das tcnicas de orien-
tao a objetos na programao, sempre utilizando a linguagem Java como motivador.
Objetos so instncias de classes, que determinam qual inIormao um objeto contm e como ele
pode manipula-la.
Um dos grandes diIerenciais da programao orientada a objetos em relao a outros paradigmas
de programao que tambm permitem a denio de estruturas e operaes sobre essas estruturas
esta no conceito de herana, mecanismo atravs do qual denies existentes podem ser Iacilmente
estendidas. Juntamente com a herana deve ser enIatizada a importncia do polimorsmo, que permi-
te selecionar Iuncionalidades que um programa ira utilizar de Iorma dinmica, durante sua execuo.
1.1 Classes
A denio de classes e seus inter-relacionamentos o principal resultado da etapa de projeto de
soItware. Em geral, esse resultado expresso em termos de alguma linguagem de modelagem, tal
como UML.
Uma classe um gabarito para a denio de objetos. Atravs da denio de uma classe,
descreve-se que propriedades ou atributos o objeto tera.
Alm da especicao de atributos, a denio de uma classe descreve tambm qual o compor-
tamento de objetos da classe, ou seja, que Iuncionalidades podem ser aplicadas a objetos da classe.
Essas Iuncionalidades so descritas atravs de mtodos. Um mtodo nada mais que o equivalente
a um procedimento ou Iuno, com a restrio que ele manipula apenas suas variaveis locais e os
atributos que Ioram denidos para a classe.
Uma vez que estejam denidas quais sero as classes que iro compor uma aplicao, assim
como qual deve ser sua estrutura interna e comportamento, possivel criar essas classes em Java.
Na Unied Moaeling Language (UML), a representao para uma classe no diagrama de classes
tipicamente expressa na Iorma grca, como mostrado na Figura 1.1.
Como se observa nessa gura, a especicao de uma classe composta por trs regies: o nome
da classe, o conjunto de atributos da classe e o conjunto de mtodos da classe.
3
1.2. Objetos
e e
R
R
Figura 1.1: Uma classe em UML.
O nome da classe um identicador para a classe, que permite reIerencia-la posteriormente
por exemplo, no momento da criao de um objeto.
O conjunto de atributos descreve as propriedades da classe. Cada atributo identicado por
um nome e tem um tipo associado. Em uma linguagem de programao orientada a objetos pura, o
tipo o nome de uma classe. Na pratica, a maior parte das linguagens de programao orientada a
objetos oIerecem um grupo de tipos primitivos, como inteiro, real e carater, que podem ser usados na
descrio de atributos. O atributo pode ainda ter um valor_default opcional, que especica um valor
inicial para o atributo.
Os mtodos denem as Iuncionalidades da classe, ou seja, o que sera possivel Iazer com objetos
dessa classe. Cada mtodo especicado por uma assinatura, composta por um identicador para
o mtodo (o nome do mtodo), o tipo para o valor de retorno e sua lista de argumentos, sendo cada
argumento identicado por seu tipo e nome.
Atravs do mecanismo de sobrecarga (overloaaing), dois mtodos de uma classe podem ter o
mesmo nome, desde que suas assinaturas sejam diIerentes. Tal situao no gera conito pois o
compilador capaz de detectar qual mtodo deve ser escolhido a partir da analise dos tipos dos
argumentos do mtodo. Nesse caso, diz-se que ocorre a ligao prematura (earlv binaing) para o
mtodo correto.
O modicador de visibilidade pode estar presente tanto para atributos como para mtodos. Em
principio, trs categorias de visibilidade podem ser denidas:
pblico, denotado em UML pelo simbolo +: nesse caso, o atributo ou mtodo de um objeto dessa
classe pode ser acessado por qualquer outro objeto (visibilidade externa total);
privativo, denotado em UML pelo simbolo -: nesse caso, o atributo ou mtodo de um objeto dessa
classe no pode ser acessado por nenhum outro objeto (nenhuma visibilidade externa);
protegido, denotado em UML pelo simbolo =: nesse caso, o atributo ou mtodo de um objeto dessa
classe podera ser acessado apenas por objetos de classes que sejam derivadas dessa atravs do
mecanismo de herana (ver Seo 1.3).
1.2 Objetos
Objetos so instncias de classes. E atravs deles que (praticamente) todo o processamento ocorre
em sistemas implementados com linguagens de programao orientadas a objetos. O uso racional de
c 2001 FEEC/UNICAMP 4
1.2. Objetos
objetos, obedecendo aos principios associados a sua denio conIorme estabelecido no paradigma
de desenvolvimento orientado a objetos, chave para o desenvolvimento de sistemas complexos e
ecientes.
Um objeto um elemento que representa, no dominio da soluo, alguma entidade (abstrata ou
concreta) do dominio de interesse do problema sob analise. Objetos similares so agrupados em
classes.
No paradigma de orientao a objetos, tudo pode ser potencialmente representado como um
objeto. Sob o ponto de vista da programao orientada a objetos, um objeto no muito diIerente de
uma variavel normal. Por exemplo, quando dene-se uma variavel do tipo int em uma linguagem
de programao como C ou Java, essa variavel tem:
um espao em memoria para registrar o seu estado (valor);
um conjunto de operaes que podem ser aplicadas a ela, atravs dos operadores denidos na
linguagem que podem ser aplicados a valores inteiros.
Da mesma Iorma, quando se cria um objeto, esse objeto adquire um espao em memoria para
armazenar seu estado (os valores de seu conjunto de atributos, denidos pela classe) e um conjunto
de operaes que podem ser aplicadas ao objeto (o conjunto de mtodos denidos pela classe).
Um programa orientado a objetos composto por um conjunto de objetos que interagem atravs
de 'trocas de mensagens. Na pratica, essa troca de mensagem traduz-se na aplicao de mtodos a
objetos.
As tcnicas de programao orientada a objetos recomendam que a estrutura de um objeto e a
implementao de seus mtodos devem ser to privativos como possivel. Normalmente, os atributos
de um objeto no devem ser visiveis externamente. Da mesma Iorma, de um mtodo deve ser suci-
ente conhecer apenas sua especicao, sem necessidade de saber detalhes de como a Iuncionalidade
que ele executa implementada.
Encapsulao o principio de projeto pelo qual cada componente de um programa deve agregar
toda a inIormao relevante para sua manipulao como uma unidade (uma capsula). Aliado ao
conceito de ocultamento de inIormao, um poderoso mecanismo da programao orientada a
objetos.
Ocultamento da informao o principio pelo qual cada componente deve manter oculta sob
sua guarda uma deciso de projeto unica. Para a utilizao desse componente, apenas o minimo
necessario para sua operao deve ser revelado (tornado publico).
Na orientao a objetos, o uso da encapsulao e ocultamento da inIormao recomenda que a
representao do estado de um objeto deve ser mantida oculta. Cada objeto deve ser manipulado ex-
clusivamente atravs dos mtodos publicos do objeto, dos quais apenas a assinatura deve ser revelada.
O conjunto de assinaturas dos mtodos publicos da classe constitui sua interIace operacional.
Dessa Iorma, detalhes internos sobre a operao do objeto no so conhecidos, permitindo que o
usuario do objeto trabalhe em um nivel mais alto de abstrao, sem preocupao com os detalhes in-
ternos da classe. Essa Iacilidade permite simplicar a construo de programas com Iuncionalidades
complexas, tais como interIaces grcas ou aplicaes distribuidas.
c 2001 FEEC/UNICAMP 5
1.3. Herana
1.3 Herana
O conceito de encapsular estrutura e comportamento em um tipo no exclusivo da orientao a
objetos; particularmente, a programao por tipos abstratos de dados segue esse mesmo conceito. O
que torna a orientao a objetos unica o conceito de herana.
Herana um mecanismo que permite que caracteristicas comuns a diversas classes sejam Ia-
toradas em uma classe base, ou superclasse. A partir de uma classe base, outras classes podem ser
especicadas. Cada classe derivada ou subclasse apresenta as caracteristicas (estrutura e mtodos) da
classe base e acrescenta a elas o que Ior denido de particularidade para ela.
Ha varias Iormas de relacionamentos em herana:
Extenso: a subclasse estende a superclasse, acrescentando novos membros (atributos e/ou mto-
dos). A superclasse permanece inalterada, motivo pelo qual este tipo de relacionamento
normalmente reIerenciado como herana estrita.
Especicao: a superclasse especica o que uma subclasse deve oIerecer, mas no implementa ne-
nhuma Iuncionalidade. Diz-se que apenas a interIace (conjunto de especicao dos mtodos
publicos) da superclasse herdada pela subclasse.
Combinao de extenso e especicao: a subclasse herda a interIace e uma implementao pa-
dro de (pelo menos alguns de) mtodos da superclasse. A subclasse pode ento redenir
mtodos para especializar o comportamento em relao ao que oIerecido pela superclasse,
ou ter que oIerecer alguma implementao para mtodos que a superclasse tenha declarado
mas no implementado. Normalmente, este tipo de relacionamento denominado herana
polimrca.
A ultima Iorma , sem duvida, a que mais ocorre na programao orientada a objetos.
Algumas modelagens introduzem uma Iorma de herana conhecida como contrao. Contrao
uma uma variante de herana onde a subclasse elimina mtodos da superclasse com o objetivo de
criar uma 'classe mais simples. A eliminao pode ocorrer pela redenio de mtodos com corpo
vazio. O problema com este mecanismo que ele viola o princpio da substituio, segundo o qual
uma subclasse deve poder ser utilizada em todos os pontos onde a superclasse poderia ser utilizada.
Se a contrao parece ser uma soluo adequada em uma hierarquia de classes, provavelmente a
hierarquia deve ser re-analisada para deteco de inconsistncias (problema passaros-pinguins). De
modo geral, o mecanismo de contrao deve ser evitado.
1.4 Polimorsmo
Polimorsmo o principio pelo qual duas ou mais classes derivadas de uma mesma superclasse
podem invocar mtodos que tm a mesma identicao (assinatura) mas comportamentos distintos,
especializados para cada classe derivada, usando para tanto uma reIerncia a um objeto do tipo da
superclasse. Esse mecanismo Iundamental na programao orientada a objetos, permitindo denir
Iuncionalidades que operem genericamente com objetos, abstraindo-se de seus detalhes particulares
quando esses no Iorem necessarios.
c 2001 FEEC/UNICAMP 6
1.4. Polimorsmo
Para que o polimorsmo possa ser utilizado, necessario que os mtodos que estejam sendo
denidos nas classes derivadas tenham exatamente a mesma assinatura do mtodo denido na super-
classe; nesse caso, esta sendo utilizado o mecanismo de redenio de mtodos (overriaing). Esse
mecanismo de redenio muito diIerente do mecanismo de sobrecarga de mtodos, onde as listas
de argumentos so diIerentes.
No caso do polimorsmo, o compilador no tem como decidir qual o mtodo que sera utilizado
se o mtodo Ioi redenido em outras classes anal, pelo principio da substituio um objeto de
uma classe derivada pode estar sendo reIerenciado como sendo um objeto da superclasse. Se esse Ior
o caso, o mtodo que deve ser selecionado o da classe derivada e no o da superclasse.
Dessa Iorma, a deciso sobre qual dos mtodos mtodo que deve ser selecionado, de acordo com
o tipo do objeto, pode ser tomada apenas em tempo de execuo, atravs do mecanismo de ligao
tardia. O mecanismo de ligao tardia tambm conhecido pelos termos em ingls late binaing,
avnamic binaing ou ainda run-time binaing.
c 2001 FEEC/UNICAMP 7
Captulo 2
Princpios da programao na linguagem
1ava
No restante deste texto, os principios da programao orientada a objetos so exercitados atravs
de exemplos na linguagem de programao Java. Como qualquer linguagem de programao, Java
tem regras estritas indicando como programas devem ser escritos. E bom ter Iamiliaridade com
essa sintaxe da linguagem, aprendendo a reconhecer e denir os tipos primitivos, identicadores e
expresses em Java.
Merece ateno a parte, para quem no tem Iamiliaridade com o conceito de excees, o estudo
deste mecanismo oIerecido por Java para detectar e tratar situaes de erro segundo os principios da
orientao a objetos.
2.1 Tipos primitivos
Em Java, so oIerecidos tipos literais primitivos (no objetos) para representar valores booleanos,
caracteres, numricos inteiros e numricos em ponto utuante.
Variaveis do tipo boolean podem assumir os valores true ou false. O valor aefault para um
atributo booleano de uma classe, se no especicado, false. Uma variavel do tipo boolean
ocupa 1 bit de armazenamento.
Variaveis booleanas e variaveis inteiras, ao contrario do que ocorre em C e C, no so compa-
tiveis em Java. Assim, no Iaz sentido atribuir uma variavel booleana a uma variavel inteira ou usar
um valor inteiro no contexto de uma condio de teste.
Exemplo de declarao e uso:
boolean deuCerto,
deuCerto true,
Combinando denio e inicializao,
boolean deuCerto true,
Uma variavel do tipo char contm um carater Unicode
1
, ocupando 16 bits de armazenamento
1
Unicode um padro internacional para a representao unicada de caracteres de diversas linguagens; para maiores
inIormaes, http.//www.unicode.org/.
8
2.1. Tipos primitivos
em memoria. O valor aefault de um atributo de classe do tipo char, se no especicado, o carater
NUL (codigo hexadecimal 0000).
Um valor literal do tipo carater representado entre aspas simples (apostroIes), como em:
char umCaracter A,
Nesse caso, a variavel ou atributo umCaracter recebe o carater A, correspondente ao codigo
hexadecimal 0041 ou valor decimal 65.
Valores literais de caracteres podem tambm ser representados por seqncias de escape, como
em \n (o carater newline). A lista de seqncias de escape reconhecidas em Java apresentada
na Tabela 2.1.
\b backspace
\t tabulao horizontal
\n newline
\f Iorm Ieed
\r carriage return
\" aspas
\ aspas simples
\\ contrabarra
\xxx o carater com codigo de valor octal xxx, que pode assumir valo-
res entre 000 e 377 na representao octal
\uxxxx o carater Unicode com codigo de valor hexadecimal xxxx, onde
xxxx pode assumir valores entre 0000 e IIII na representao
hexadecimal.
Tabela 2.1: Caracteres representados por seqncias de escape.
Seqncias de escape Unicode (precedidas por \u) so processadas antes das anteriores, podendo
aparecer no apenas em variaveis caracteres ou strings (como as outras seqncias) mas tambm em
identicadores da linguagem Java.
Valores numricos inteiros em Java podem ser representados por variaveis do tipo byte, short,
int ou long. Todos os tipos contm valores inteiros com sinal, com representao interna em com-
plemento de dois. O valor aefault para atributos desses tipos 0.
Cada um desses tipos de dados tem seu espao de armazenamento denido na especicao da
linguagem, no sendo dependente de diIerentes implementaes. Variaveis do tipo byte ocupam 8
bits de armazenamento interno. Com esse numero de bits, possivel representar valores na Iaixa de -
128 a 127. Variaveis do tipo short ocupam 16 bits, podendo assumir valores na Iaixa de -32.768 a
32.767. Variaveis do tipo int ocupam 32 bits, podendo assumir valores na Iaixa de -2.147.483.648
a 2.147.483.647. Finalmente, variaveis do tipo long ocupam 64 bits, podendo assumir valores na
Iaixa de -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Constantes literais do tipo long podem ser identicadas em codigo Java atravs do suxo l ou L,
como em
long valorQuePodeCrescer I00L,
c 2001 FEEC/UNICAMP 9
2.2. Identicadores
Ao contrario do que ocorre em C, no ha valores inteiros sem sinal (unsigned) em Java. Adicio-
nalmente, as combinaes da Iorma long int ou short int so invalidas em Java.
Valores reais, com representao em ponto utuante, podem ser representados por variaveis de
tipo oat ou double. Em qualquer situao, a representao interna desses valores segue o padro de
representao IEEE 754, sendo 0.0 o valor aefault para tais atributos.
Como para valores inteiros, o espao de armazenamento e conseqentemente a preciso de valo-
res associados a esses tipos de dados so denidos na especicao da linguagem. Variaveis do tipo
float ocupam 32 bits, podendo assumir valores na Iaixa de a
, com nove digitos signicativos de preciso. Variaveis do tipo double ocupam 64 bits, po-
dendo assumir valores de a ,
com 18 digitos signicativos de preciso.
Constantes literais do tipo oat podem ser identicadas no codigo Java pelo suxo I ou F; do tipo
double, pelo suxo d ou D.
2.2 Identicadores
Identicadores so seqncias de caracteres Unicode, que devem obedecer as seguintes regras:
Um nome pode ser composto por letras, por digitos e pelos simbolos _ e $.
Um nome no pode ser iniciado por um digito (0 a 9).
Letras maiusculas so diIerenciadas de letras minusculas.
Uma palavra-chave da linguagem Java (veja Apndice A) no pode ser um identicador.
Java diIerencia as letras minusculas da maiusculas. Assim, as duas variaveis
int socorro,
int soCorro,
so variaveis diIerentes.
Alm dessas regras obrigatorias, o uso da conveno padro para identicadores Java torna a
codicao mais uniIorme e pode Iacilitar o entendimento de um codigo. Embora no seja obrigato-
rio, o conhecimento e uso da seguinte conveno padro para atribuir nomes em Java pode Iacilitar
bastante a manuteno de um programa:
Nomes de classes so iniciados por letras maiusculas.
Nomes de mtodos, atributos e variaveis so iniciados por letras minusculas.
Em nomes compostos, cada palavra do nome iniciada por letra maiuscula as palavras no
so separadas por nenhum simbolo.
Detalhes sobre as convenes de codicao sugeridas pelos projetistas da linguagemJava podem
ser encontrados no documento Coae Conventions for the JavaTM Programming Language
2
.
2
http.//www.dca.fee.unicamp.br/projects/sapiens/calm/References/Java/codeconv/
CodeConventions.doc8.html
c 2001 FEEC/UNICAMP 10
2.3. Expresses
2.3 Expresses
Expresses so sentenas da linguagem Java terminadas pelo simbolo ;`. Essas sentenas podem
denotar expresses envolvendo uma operao aritmtica, uma operao logica inteira, uma operao
logica booleana, uma avaliao de condies, uma atribuio, um retorno de mtodo, ou ainda ope-
raes sobre objetos.
2.3.1 Expresses retornando valores numricos
Expresses aritmticas envolvem atributos, variaveis e/ou constantes numricas (inteiras ou re-
ais). Os operadores aritmticos denidos em Java incluem:
soma, operador binario inxo denotado pelo simbolo +;
subtrao, operador binario inxo denotado pelo simbolo -. O mesmo simbolo pode ser utilizado
como operador unario prexo, denotando a complementao (subtrao de 0) do valor;
multiplicao, operador binario inxo denotado pelo simbolo *;
diviso, operador binario inxo denotado pelo simbolo /;
resto da diviso, operador binario inxo denotado pelo simbolo % e que pode ser aplicado apenas
para operandos inteiros;
incremento, operador unario denotado pelo simbolo ++ que denido apenas para operandos intei-
ros, podendo ocorrer na Iorma prexa (pr-incremento) ou posxa (pos-incremento); e
decremento, operador unario denotado pelo simbolo -- que tambm denido apenas para operan-
dos inteiros, podendo ocorrer na Iorma prexa (pr-decremento) ou posxa (pos-decremento).
Operaes logicas sobre valores inteiros atuam sobre a representao binaria do valor armazena-
do, operando internamente bit a bit. Operadores desse tipo so:
complemento, operador unario prexo denotado pelo simbolo - que complementa cada bit na re-
presentao interna do valor;
OR bit-a-bit, operador binario inxo denotado pelo simbolo | que resulta no bit 1 se pelo menos
um dos bits na posio correspondente na representao interna dos operandos era 1;
AND bit-a-bit, operador binario inxo denotado pelo simbolo & que resulta no bit 0 se pelo menos
um dos bits na posio correspondente na representao interna dos operandos era 0;
XOR bit-a-bit, operador binario inxo denotado pelo simbolo que resulta no bit 1 se os bits na
posio correspondente na representao interna dos operandos eram diIerentes;
deslocamento esquerda, operador binario inxo denotado pelo simbolo << que desloca a repre-
sentao interna do primeiro operando para a esquerda pelo numero de posies indicado pelo
segundo operando;
c 2001 FEEC/UNICAMP 11
2.3. Expresses
deslocamento direita, operador binario inxo denotado pelo simbolo >> que desloca a repre-
sentao interna do primeiro operando para a direita pelo numero de posies indicado pelo
segundo operando. Os bits inseridos a esquerda tero o mesmo valor do bit mais signicativo
da representao interna;
deslocamento direita com extenso 0, operador binario inxo denotado pelo simbolo >>> que
desloca a representao interna do primeiro operando para a direita pelo numero de posies
indicado pelo segundo operando. Os bits inseridos a esquerda tero o valor 0.
2.3.2 Expresses retornando valores booleanos
As operaes logicas booleanas operam sobre valores booleanos. Operadores booleanos incluem:
complemento lgico, operador unario prexo denotado pelo simbolo ! que retorna true se o argu-
mento Ialse ou retorna Ialse se o argumento true;
OR lgico booleano, operador binario inxo denotado pelo simbolo | que retorna true se pelo me-
nos um dos dois argumentos true;
OR lgico condicional, operador binario inxo denotado pelo simbolo || que opera como o cor-
respondente booleano; porm, se o primeiro argumento ja true, o segundo argumento no
nem avaliado;
AND lgico booleano, operador binario inxo denotado pelo simbolo & que retorna Ialse se pelo
menos um dos dois argumentos Ialse;
AND lgico condicional, operador binario inxo denotado pelo simbolo && que opera como o cor-
respondente booleano; porm, se o primeiro argumento ja Ialse, o segundo argumento no
nem avaliado;
XOR booleano, operador binario inxo denotado pelo simbolo que retorna true quando os dois
argumentos tm valores logicos distintos.
Condies permitem realizar testes baseados nas comparaes entre valores numricos. Opera-
dores condicionais incluem:
maior, operador binario inxo denotado pelo simbolo > que retorna true se o primeiro valor Ior
exclusivamente maior que o segundo;
maior ou igual, operador binario inxo denotado pelo simbolo > que retorna true se o primeiro
valor Ior maior que ou igual ao segundo;
menor, operador binario inxo denotado pelo simbolo < que retorna true se o primeiro valor Ior
exclusivamente menor que o segundo;
menor ou igual, operador binario inxo denotado pelo simbolo < que retorna true se o primeiro
valor Ior menor que ou igual ao segundo;
igual, operador binario inxo denotado pelo simbolo que retorna true se o primeiro valor Ior
igual ao segundo;
c 2001 FEEC/UNICAMP 12
2.3. Expresses
diferente, operador binario inxo denotado pelo simbolo ! que retorna true se o primeiro valor
no Ior igual ao segundo.
2.3.3 Outros tipos de expresses
Assim como C e C, Java oIerece o operador condicional ternario denotado pelos simbolos
? . . Na expresso b ? sI . s?, b uma expresso que resulta em um valor booleano (va-
riavel ou expresso). O resultado da expresso sera o resultado da expresso (ou variavel) sI se b
Ior verdadeiro, ou o resultado da expresso (ou variavel) s? se b Ior Ialso.
O operador binario atribui o valor da expresso do lado direito a variavel a esquerda do opera-
dor. Os tipos da expresso e da variavel devem ser compativeis. O operador de atribuio pode ser
combinado com operadores aritmticos e logicos, como em C e C. Assim, a expresso
a + b
equivale a
a a + b
Mtodos em Java tm sua execuo encerrada de duas maneiras possiveis. A primeira valida
quando um mtodo no tem um valor de retorno (o tipo de retorno void): a execuo encerrada
quando o bloco do corpo do mtodo chega ao nal. A segunda alternativa encerra a execuo do
mtodo atravs do comando return. Se o mtodo tem tipo de retorno void, ento o comando
usado sem argumentos:
return,
Caso o mtodo tenha um valor de retorno especicado, ento a expresso assume a Iorma
return expresso,
onde o valor de retorno o resultado da expresso, que deve ser compativel com o tipo de retorno
especicado para o mtodo.
2.3.4 Controle do uxo de execuo
A ordem de execuo normal de comandos em um mtodo Java seqencial. Comandos de uxo
de controle permitem modicar essa ordem natural de execuo atravs dos mecanismos de escolha
ou de iterao.
A estrutura if permite especicar um comando (ou bloco de comandos, uma seqncia de expres-
ses delimitada por chaves, e }) que deve apenas ser executado quando uma determinada condio
Ior satisIeita:
if (condio)
bloco_comandos

Quando o bloco de comandos composto por uma unica expresso, as chaves que delimitam o
corpo do bloco podem ser omitidas:
c 2001 FEEC/UNICAMP 13
2.3. Expresses
if (condio)
expresso,
Embora a indentao do codigo no seja mandatoria, uma recomendao de boa pratica de
programao que o bloco subordinado a uma expresso de controle de uxo seja representada com
maior indentao que aquela usada no nivel da propria expresso.
A Iorma if. . . else permite expressar duas alternativas de execuo, uma para o caso da condio
ser verdadeira e outra para o caso da condio ser Ialsa:
if (condio)
bloco_comandos_caso_verdade

else
bloco_comandos_caso_falso

O comando switch. . . case tambm expressa alternativas de execuo, mas nesse caso as condi-
es esto restritas a comparao de uma variavel inteira com valores constantes:
switch (varivel)
case valorI.
bloco_comandos
break,
case valor?.
bloco_comandos
break,
...
case valorn.
bloco_comandos
break,
default.
bloco_comandos

O comando while permite expressar iteraes que devem ser executadas se e enquanto uma con-
dio Ior verdadeira:
while (condio)
bloco_comandos

O comando do. . . while tambm permite expressar iteraes, mas neste caso pelo menos uma
execuo do bloco de comandos garantida:
do
bloco_comandos
while (condio),
c 2001 FEEC/UNICAMP 14
2.3. Expresses
O comando for permite expressar iteraes combinando uma expresso de inicializao, um teste
de condio e uma expresso de incremento:
for (inicializao, condio, incremento)
bloco_comandos

Embora Java no suporte o operador , (virgula) presente em C e C, no comando for multiplas


expresses de inicializao e de incremento podem ser separadas por virgulas.
Os comandos continue e break permitem expressar a quebra de um uxo de execuo. O
uso de break ja Ioi utilizado juntamente com switch para delimitar bloco de comandos de cada
case. No corpo de uma iterao, a ocorrncia do comando break interrompe a iterao, passando
o controle para o proximo comando apos o comando de iterao. O comando continue tambm
interrompe a execuo da iterao, mas apenas da iterao corrente. Como eIeito da execuo de
continue, a condio de iterao reavaliada e, se Ior verdadeira, o comando de iterao continua
executando.
Em situaes onde ha diversos comandos de iterao aninhados, os comandos break e conti-
nue transIerem o comando de execuo para o ponto imediatamente apos o bloco onde ocorrem. Se
Ior necessario especicar transIerncia para o m de outro bloco de iterao, os comandos break e
continue rotulados podem ser utilizados:
label.
for (..., ..., ...)
...
while (...)
...
if (...)
break label,
...

...

...

2.3.5 Comentrios
Comentarios em Java podem ser expressos em trs Iormatos distintos. Na primeira Iorma, uma
'barra dupla // marca o inicio do comentario, que se estende at o m da linha. A segunda Iorma
o comentario no estilo C tradicional, onde o par de simbolos /* marca o inicio de comentario,
que pode se estender por diversas linhas at encontrar o par de simbolos */, que delimita o m do
comentario.
O outro estilo de comentario especco de Java e esta associado a gerao automatica de docu-
mentao do software desenvolvido. Nesse caso, o inicio de comentario delimitado pelas seqn-
cias de inicio /** e de trmino */. O texto entre essas seqncias sera utilizado pela Ierramenta
javadoc (ver Seo 2.7.1) para gerar a documentao do codigo em Iormato hipertexto.
c 2001 FEEC/UNICAMP 15
2.4. Operaes sobre objetos
Para gerar esse tipo de documentao, os comentarios devem estar localizados imediatamente
antes da denio da classe ou membro (atributo ou mtodo) documentado. Cada comentario pode
conter uma descrio textual sobre a classe ou membro, possivelmente incluindo tags HTML, e
diretrizes para o programa javadoc. As diretrizes para javadoc so sempre precedidas por O,
como em
Osee nomeClasseOuMembro
que gera na documentao um link para a classe ou membro especicado, precedido pela Irase 'See
also .
A documentao de uma classe pode incluir as diretrizes Oauthor, que inclui o texto na seqn-
cia como inIormao sobre o autor do codigo na documentao; e Oversion, que inclui na docu-
mentao inIormao sobre a verso do codigo.
A documentao de um mtodo pode incluir as diretrizes Oparam, que apresenta o nome e uma
descrio de cada argumento do mtodo; Oreturn, que apresenta uma descrio sobre o valor de
retorno; e Oexception, que indica que excees podem ser lanadas pelo mtodo (ver Seo 2.6.1).
Para maiores inIormaes, veja o texto How to Write Doc Comments for Javaaoc
3
.
2.4 Operaes sobre objetos
A criao de um objeto da-se atravs da aplicao do operador new. Dada uma classe Cls,
possivel (em principio) criar um objeto dessa classe usando esse operador:
Cls obj new Cls(),
O 'mtodo a direita do operador new um construtor da classe Cls. Um construtor um
(pseudo-)mtodo especial, denido para cada classe. O corpo desse mtodo determina as atividades
associadas a inicializao de cada objeto criado. Assim, o construtor apenas invocado no momento
da criao do objeto atravs do operador new.
A assinatura de um construtor diIerencia-se das assinaturas dos outros mtodos por no ter ne-
nhum tipo de retorno nem mesmo void. Alm disto, o nome do construtor deve ser o proprio
nome da classe.
O construtor pode receber argumentos, como qualquer mtodo. Usando o mecanismo de sobre-
carga, mais de um construtor pode ser denido para uma classe.
Toda classe tem pelo menos um construtor sempre denido. Se nenhum construtor Ior explici-
tamente denido pelo programador da classe, um construtor aefault, que no recebe argumentos,
criado pelo compilador Java. No entanto, se o programador da classe criar pelo menos um mtodo
construtor, o construtor aefault no sera criado automaticamente se ele o desejar, devera criar um
construtor sem argumentos explicitamente.
No momento em que um construtor invocado, a seguinte seqncia de aes executada para a
criao de um objeto:
1. O espao para o objeto alocado e seu conteudo inicializado (bitwise) com zeros.
2. O construtor da classe base invocado.
3
urlhttp://java.sun.com/products/jdk/javadoc/writingdoccomments.html
c 2001 FEEC/UNICAMP 16
2.4. Operaes sobre objetos
3. Os membros da classe so inicializados para o objeto, seguindo a ordem em que Ioram decla-
rados na classe.
4. O restante do corpo do construtor executado.
Seguir essa seqncia uma necessidade de Iorma a garantir que, quando o corpo de um cons-
trutor esteja sendo executado, o objeto ja tera a disposio as Iuncionalidades minimas necessarias,
quais sejam aquelas denidas por seus ancestrais. O primeiro passo garante que nenhum campo do
objeto tera um valor arbitrario, que possa tornar erros de no inicializao diIiceis de detectar. Esse
passo que determina os valores aefault para atributos de tipos primitivos, descritos na Seo 2.1.
Uma vez que um objeto tenha sido criado e haja uma reIerncia valida para ele, possivel solicitar
que ele execute mtodos que Ioram denidos para objetos dessa classe. A aplicao de um mtodo
meth(int), denido em uma classe Cls, a um objeto obj, construido a partir da especicao de
Cls, se da atravs da construo
obj.meth(varint),
onde varint uma expresso ou variavel inteira anteriormente denida.
Em uma linguagem tradicional, a Iorma correspondente seria invocar uma Iuno ou procedi-
mento passando como argumento a estrutura de dados sobre a qual as operaes teriam eIeito:
meth(obj, varint),
Esse 'atributo implicito a reIerncia para o proprio objeto que esta ativando o mtodo
pode ser utilizado no corpo dos mtodos quando Ior necessario Iaz-lo explicitamente. Para tanto, a
palavra-chave this utilizada.
Quando se declara uma variavel cujo tipo o nome de uma classe, como em
String nome,
no esta se criando um objeto dessa classe, mas simplesmente uma reIerncia para um objeto da
classe String, a qual inicialmente no Iaz reIerncia a nenhum objeto valido.
Quando um objeto dessa classe criado, obtm-se uma reIerncia valida, que armazenada na
variavel cujo tipo o nome da classe do objeto. Por exemplo, quando cria-se uma string como em
nome new String("POO/Java"),
nome uma variavel que armazena uma reIerncia valida para um objeto especco da classe
String o objeto cujo conteudo a string POO/Java. E importante ressaltar que a variavel
nome mantm apenas a reIerncia para o objeto e no o objeto em si. Assim, uma atribuio como
String outroNome nome,
no cria outro objeto, mas simplesmente uma outra reIerncia para o mesmo objeto.
A linguagem Java permite que o programador crie e manipule objetos explicitamente. Porm, a
remoo de objetos em Java manipulada automaticamente pelo sistema, usando um mecanismo de
coleta de lixo (garbage collector). O coletor de lixo um processo de baixa prioridade que permanece
vericando quais objetos no tm nenhuma reIerncia valida, retomando o espao despendido para
c 2001 FEEC/UNICAMP 17
2.4. Operaes sobre objetos
cada um desses objetos. Dessa Iorma, o programador no precisa se preocupar com a remoo
explicita de objetos.
Outra operao que pode envolver um objeto sua vericao de tipo. Dado um objeto obj
e uma classe Cls, possivel vericar dinamicamente (durante a execuo do mtodo) se o objeto
pertence ou no a classe usando o operador instanceof. Este retorna true se o objeto a esquerda
do operador da classe especicada a direita do operador. Assim,
obj instanceof Cls
retornaria true se obj Iosse da classe Cls.
2.4.1 Arranjos
Arranjos so agregados homogneos de valores que podem agrupar literais ou objetos.
A declarao de um arranjo, como
int arrayI],
apenas cria uma reIerncia para um arranjo de inteiros porm o arranjo no Ioi criado. Assim
como objetos, arranjos so criados com o operador new:
arrayI new int]I00,
Essa expresso cria espao para armazenar 100 inteiros no arranjo arrayI.
As duas expresses poderiam ter sido combinadas em uma sentena incluindo a declarao e a
criao de espao:
int arrayI] new int]I00,
Arranjos podem ser alternativamente criados com a especicao de algum conteudo:
int array?] ?, 4, S, I, 9, II, I,
O acesso a elementos individuais de um arranjo especicado atravs de um indice inteiro. O
elemento inicial, assim como em C e C, tem indice 0. Assim, do exemplo acima, a expresso
int x array?],
Iaz com que a variavel x receba o valor 7, o conteudo da quarta posio.
O acesso a elementos do arranjo alm do ultimo indice permitido por exemplo, a array?]I
gera um erro em tempo de execuo, ou uma exceo (ver Seo 2.6.1).
A dimenso de um arranjo pode ser obtida atravs da propriedade length presente em todos os
arranjos. Assim, a expresso
int y array?.length,
Iaz com que y receba o valor 7, o numero de elementos no arranjo array?.
c 2001 FEEC/UNICAMP 18
2.4. Operaes sobre objetos
2.4.2 Strings
Ao contrario do que ocorre em C e C, strings em Java no so tratadas como seqncias de
caracteres terminadas por NUL. So objetos, instncias da classe java.lang.String.
Uma string pode ser criada como em:
String s "abc",
O operador + pode ser utilizado concatenar strings:
System.out.println("String s. " + s),
Se, em uma mesma expresso, o operador + combinar valores numricos e strings, os valores num-
ricos sero convertidos para strings e ento concatenados.
A classe String dene um conjunto de Iuncionalidades para manipular strings atravs de seus
mtodos.
Para obter o numero de caracteres em uma string, o mtodo int length() usado. Assim, a
expresso
s.length(),
retornaria o valor 3.
Para criar uma nova string a partir da concatenar duas strings, o mtodo String concat(String
outro) pode ser usado. Por exemplo,
String t s.concat(".java"),
Iaria com que a string t tivesse o conteudo 'abc.java.
Para comparar o conteudo de duas strings ha trs Iormas basicas. O mtodo equals(String
outro) compara as duas strings, retornando verdadeiro se seus conteudos Iorem exatamente iguais.
Assim,
t.equals(s),
retornaria Ialso, mas
s.equals("abc"),
retornaria verdadeiro. O mtodo equalsIgnoreCase(String outro) tem a mesma Iuncio-
nalidade mas ignora se as letras so maiusculas ou minusculas. Assim,
s.equalsIgnoreCase("ABC"),
tambm retornaria verdadeiro. A terceira Iorma atravs do mtodo compareTo(String ou-
tro), que retorna um valor inteiro igual a zero se as duas strings Iorem iguais, negativo se a string a
qual o mtodo Ior aplicado preceder lexicogracamente a string do argumento (baseado nos valores
Unicode dos caracteres) ou positivo, caso contrario. Ha tambm um mtodo compareToIgnore-
Case(String str).
Para extrair caracteres individuais de uma string, pode-se utilizar o mtodo charAt(int pos),
que retorna o carater na posio especicada no argumento (0 a primeira posio). Para obter subs-
trings de uma string, o mtodo substring() pode ser utilizado. Esse mtodo tem duas assinaturas:
c 2001 FEEC/UNICAMP 19
2.5. Classes em Java
String substring(int pos_inicial),
String substring(int pos_inicial, int pos_final),
A localizao de uma substring dentro de uma string pode ocorrer de diversas Iormas. O mtodo
indexOf(), com quatro assinaturas distintas, retorna a primeira posio na string onde o carater
ou substring especicada no argumento ocorre. E possivel tambm especicar uma posio diIerente
da inicial a partir de onde a busca deve ocorrer. Similarmente, lastIndexOf() busca pela ultima
ocorrncia do carater ou substring a partir do nal ou da posio especicada.
E possivel tambm vericar se uma string comea com um determinado prexo ou termina com
um suxo atravs respectivamente dos mtodos startsWith() e endsWith(). Ambos recebem
como argumento uma string e retornam um valor booleano.
2.5 Classes em 1ava
Como descrito na Seo 1.1, a denio de classes a base da programao orientada a objetos.
Em Java, classes so denidas em arquivos Ionte (extenso .java) e compiladas para arquivos de
classes (extenso .class). Classes so organizadas em pacotes.
2.5.1 Pacotes
No desenvolvimento de pequenas atividades ou aplicaes, viavel manter o codigo da aplicao
e suas classes associadas em um mesmo diretorio detrabalho em geral, o diretorio corrente. No
entanto, para grandes aplicaes preciso organizar as classes de maneira a evitar problemas com
nomes duplicados de classes e permitir a localizao do codigo da classe de Iorma eciente.
Em Java, a soluo para esse problema esta na organizao de classes e interIaces em pacotes.
Um pacote uma unidade de organizao de codigo que congrega classes, interIaces e excees
relacionadas. O codigo-base de Java esta todo estruturado em pacotes e as aplicaes desenvolvidas
em Java tambm devem ser assim organizadas.
Essencialmente, uma classe Xyz que pertence a um pacote nome.do.pacote tem um 'nome
completo que nome.do.pacote.Xyz. Assim, se outra aplicao tiver uma classe de mesmo
nome no havera conitos de resoluo, pois classes em pacotes diIerentes tm nomes completos
distintos.
A organizao das classes em pacotes tambm serve como indicao para o compilador Java
para encontrar o arquivo que contm o codigo da classe. O ambiente Java normalmente utiliza a
especicao de uma variavel de ambiente CLASSPATH, a qual dene uma lista de diretorios que
contm os arquivos de classes Java. No entanto, para no ter listas demasiadamente longas, os nomes
dos pacotes denem subdiretorios de busca a partir dos diretorios em CLASSPATH.
No mesmo exemplo, ao encontrar no codigo uma reIerncia para a classe Xyz, o compila-
dor devera procurar o arquivo com o nome Xyz.class; como essa classe Iaz parte do pacote
nome.do.pacote, ele ira procurar em algum subdiretorio nome/do/pacote. Se o arquivo
Xyz.class estiver no diretorio /home/java/nome/do/pacote, ento o diretorio /home/
java deve estar incluido no caminho de busca de classes denido por CLASSPATH.
Para indicar que as denies de um arquivo Ionte Java Iazem parte de um determinado pacote,
a primeira linha de codigo deve ser a declarao de pacote:
c 2001 FEEC/UNICAMP 20
2.5. Classes em Java
package nome.do.pacote,
Caso tal declarao no esteja presente, as classes Iaro parte do 'pacote aefault, que esta mapeado
para o diretorio corrente.
Para reIerenciar uma classe de um pacote no codigo Ionte, possivel sempre usar o 'nome com-
pleto da classe; no entanto, possivel tambm usar a declarao import. Por exemplo, se no inicio
do codigo estiver presente a declarao
import nome.do.pacote.Xyz,
ento a classe Xyz pode ser reIerenciada sem o prexo nome.do.pacote no restante do codigo.
Alternativamente, a declarao
import nome.do.pacote.*,
indica que quaisquer classes do pacote especicado podem ser reIerenciadas apenas pelo nome no
restante do codigo Ionte.
A unica exceo para essa regra reIere-se as classes do pacote java.lang essas classes
so consideradas essenciais para a interpretao de qualquer programa Java e, por este motivo, o
correspondente import implicito na denio de qualquer classe Java.
2.5.2 Denio de classes em 1ava
Em Java, classes so denidas atravs do uso da palavra-chave class. Para denir uma classe,
utiliza-se a construo:
]moaif class NomeDaClasse
// corpo da classe...

A primeira linha um comando que inicia a declarao da classe. Apos a palavra-chave class,
segue-se o nome da classe, que deve ser um identicador valido para a linguagem (ver Seo 2.2). O
modicador moaif opcional; se presente, pode ser uma combinao de public e abstract ou nal.
A denio da classe propriamente dita esta entre as chaves e ], que delimitam blocos na
linguagem Java. Este corpo da classe usualmente obedece a seguinte seqncia de denio:
1. As variaveis de classe (denidas como static), ordenadas segundo sua visibilidade: inici-
ando pelas public, seguidos pelas protected, pelas com visibilidade padro (sem modicador)
e nalmente pelas private.
2. Os atributos (ou variaveis de instncia) dos objetos dessa classe, seguindo a mesma ordenao
segundo a visibilidade denida para as variaveis de classe.
3. Os construtores de objetos dessa classe.
4. Os mtodos da classe, geralmente agrupados por Iuncionalidade.
A denio de atributos de uma classe Java reete de Iorma quase direta a inIormao que estaria
contida na representao da classe em um diagrama UML. Para tanto, a sintaxe utilizada para denir
um atributo de um objeto :
c 2001 FEEC/UNICAMP 21
2.5. Classes em Java
]modificador tipo nome ] default,
onde
o modicador opcional, especicando a visibilidade diIerente da padro (public, pro-
tected ou private), alterao da modicabilidade (final) e se o atributo esta associado
a classe (static).
o tipo deve ser um dos tipos primitivos da linguagem Java ou o nome de uma classe;
o nome deve ser um identicador valido da linguagem Java;
o valor aefault opcional; se presente, especica um valor inicial para a variavel.
Mtodos so essencialmente procedimentos que podem manipular atributos de objetos para os
quais o mtodo Ioi denido. Alm dos atributos de objetos, mtodos podem denir e manipular
variaveis locais; tambm podem receber parmetros por valor atravs da lista de argumentos. A
Iorma genrica para a denio de um mtodo em uma classe
]modificador tipo nome(argumentos)
corpo do mtodo

onde
o modicador (opcional) uma combinao de: public, protected ou private; abs-
tract ou final; e static.
o tipo um indicador do valor de retorno, sendo void se o mtodo no tiver um valor de
retorno;
o nome do mtodo deve ser um identicador valido na linguagem Java;
os argumentos so representados por uma lista de parmetros separados por virgulas, onde para
cada parmetro indicado primeiro o tipo e depois (separado por espao) o nome.
Uma boa pratica de programao manter a Iuncionalidade de um mtodo simples, desempe-
nhando uma unica tareIa. O nome do mtodo deve reetir de modo adequado a tareIa realizada. Se a
Iuncionalidade do mtodo Ior simples, sera Iacil encontrar um nome adequado para o mtodo.
Como ocorre para a denio de atributos, a denio de mtodos reete de Iorma quase direta a
inIormao que estaria presente em um diagrama de classes UML, a no ser por uma diIerena vital:
o corpo do mtodo.
Mtodos de mesmo nome podem co-existir em uma mesma classe desde que a lista de argumentos
seja distinta, usando o mecanismo de sobrecarga.
O exemplo a seguir ilustra a denio de uma classe de nome Ponto?D:
public class Ponto?D
private int x,
private int y,
c 2001 FEEC/UNICAMP 22
2.5. Classes em Java
public Ponto?D(int x, int y)
this.x x,
this.y y,

public Ponto?D( )
this(0,0),

public double distancia(Ponto?D p)


double distX p.x - x,
double distY p.y - y,
return Math.sqrt(distX*distX + distY*distY),

Um objeto dessa classe tem dois atributos privativos que denem as coordenadas do ponto bidi-
mensional, x e y nesse caso, as coordenadas so valores inteiros.
A classe tem dois construtores. O primeiro deles recebe dois argumentos, tambm de nome x e y,
que denem as coordenadas do ponto criado. Para diIerenciar no corpo do construtor os parmetros
dos atributos, estes tm seu nome prexado pela palavra-chave this.
O segundo construtor ilustra outro uso da palavra-chave this. Esse construtor no recebe argu-
mentos e assume portanto o ponto tem como cordenadas a origem, ou seja, o ponto (0,0). O corpo
desse construtor poderia ser simplesmente
x 0,
y 0,
A alternativa apresentada usa a Iorma
this(0,0),
que equivale a 'use o construtor desta mesma classe que recebe dois argumentos inteiros, passando
os valores aqui especicados.
Finalmente, a classe dene um mtodo publico para calcular a distncia entre o ponto que invocou
o mtodo (this) e outro ponto especicado como o argumento p. Nesse caso, como no ha risco
de conIuso, no preciso usar a palavra-chave this antes dos atributos da coordenada do objeto.
Assim, as expresses que calculam distX e distY equivalem a
double distX p.x - this.x,
double distY p.y - this.y,
A expresso de retorno ilustra ainda a utilizao de um mtodo estatico da classe Math do pa-
cote java.lang para o cmputo da raiz quadrada. Usualmente, mtodos denidos em uma so
aplicados a objetos daquela classe. Ha no entanto situaes nas quais um mtodo pode Iazer uso
dos recursos de uma classe para realizar sua tareIa sem necessariamente ter de estar associado a um
objeto individualmente.
c 2001 FEEC/UNICAMP 23
2.5. Classes em Java
Para lidar com tais situaes, Java dene os mtodos da classe, cuja declarao deve conter o
modicador static. Um mtodo estatico pode ser aplicado a classe e no necessariamente a um
objeto.
Exemplos de mtodos estaticos em Java incluem os mtodos para manipulao de tipos primitivos
denidos nas classes Character, Integer e Double, todas elas do pacote java.lang, assim
como todos os mtodos denidos para a classe Math.
2.5.3 O mtodo main
Toda classe pode tambm ter um mtodo main associado, que sera utilizado pelo interpretador
Java para dar inicio a execuo de uma aplicao. Ao contrario do que acontece em C e C, onde
apenas uma Iuno main deve ser denida para a aplicao como um todo, toda e qualquer classe
Java pode ter um mtodo main denido. Apenas no momento da interpretao o main a ser executado
denido atravs do primeiro argumento (o nome da classe) para o programa interpretador.
O mtodo main um mtodo associado a classe e no a um objeto especco da classe
assim, ele denido como um mtodo estatico. Adicionalmente, deve ser um mtodo publico para
permitir sua execuo a partir da maquina virtual Java. No tem valor de retorno, mas recebe como
argumento um arranjo de strings que corresponde aos parmetros que podem ser passados para a
aplicao a partir da linha de comando. Essas caracteristicas determinam a assinatura do mtodo:
public static void main(String] args)
ou
static public void main(String] args)
Mesmo que no seja utilizado, o argumento de main deve ser especicado. Por exemplo, a
denio da classe Ponto?D poderia ser complementada com a incluso de um mtodo para testar
sua Iuncionalidade:
public class Ponto?D
...
public static void main(String] args)
Ponto?D ref? new Ponto?D(),
Ponto?D p? new Ponto?D(I,I),
System.out.println("Distancia. " + p?.distancia(ref?)),

O nome do parmetro (args) obviamente poderia ser diIerente, mas os demais termos da assi-
natura devem obedecer ao Iormato especicado. Esse argumento um parmetro do tipo arranjo de
objetos da classe String. Cada elemento desse arranjo corresponde a um argumento passado para
o interpretador Java na linha de comando que o invocou. Por exemplo, se a linha de comando Ior
java Xyz abc I? def
o mtodo main(String] args) da classe Xyz vai receber, nessa execuo, um arranjo de
trs elementos na variavel args com os seguintes conteudos:
c 2001 FEEC/UNICAMP 24
2.5. Classes em Java
em args|0|, o objeto String com conteudo "abc";
em args|1|, o objeto String com conteudo "123";
em args|2|, o objeto String com conteudo "deI".
Como o mtodo main do tipo void, ele no tem valor de retorno. No entanto, assim como
programas desenvolvidos em outras linguagens, preciso algumas vezes obter uma indicao se o
programa executou com sucesso ou no. Isto principalmente util quando o programa invocado no
contexto de um script do sistema operacional.
Em Java, o mecanismo para Iornecer essa indicao o mtodo System.exit(int). A
invocao desse mtodo provoca o m imediato da execuo do interpretador Java. Tipicamente, o
argumento de exit() obedece a conveno de que `0` indica execuo com sucesso, enquanto um
valor diIerente de 0 indica a ocorrncia de algum problema.
2.5.4 Visibilidade da classe e seus membros
Em Java, a visibilidade padro de classes, atributos e mtodos esta restrita a todos os membros
que Iazem parte de um mesmo pacote. A palavra-chave public modica essa visibilidade de Iorma a
amplia-la, deixando-a sem restries.
Uma classe denida como publica pode ser utilizada por qualquer objeto de qualquer pacote.
Em Java, uma unidade de compilao (um arquivo Ionte com extenso .java) pode ter no maximo
uma classe publica, cujo nome deve ser o mesmo do arquivo (sem a extenso). As demais classes na
unidade de compilao, no publicas, so consideradas classes de suporte para a classe publica e tm
a visibilidade padro.
Um atributo publico de uma classe pode ser diretamente acessado e manipulado por objetos de
outras classes.
Um mtodo publico de uma classe pode ser aplicado a um objeto dessa classe a partir de qualquer
outro objeto de outra classe. O conjunto de mtodos publicos de uma classe determina o que pode
ser Ieito com objetos da classe, ou seja, determina o seu comportamento.
A palavra-chave protected restringe a visibilidade do membro modicado, atributo ou mto-
do, apenas a propria classe e aquelas derivada desta.
A palavra-chave private restringe a visibilidade do membro modicado, mtodo ou atributo,
exclusivamente a objetos da propria classe que contm sua denio.
2.5.5 Classes derivadas
Sendo uma linguagem de programao orientada a objetos, Java oIerece mecanismos para denir
classes derivadas a partir de classes existentes. E Iundamental que se tenha uma boa compreenso
sobre como objetos de classes derivadas so criados e manipulados, assim como das restries de
acesso que podem se aplicar a membros de classes derivadas. Tambm importante para uma completa
compreenso da utilizao desse mecanismo em Java entender como relacionam-se interIaces e
herana (Seo 2.5.7).
A Iorma basica de herana em Java a extenso simples entre uma superclasse e sua classe
derivada. Para tanto, utiliza-se na denio da classe derivada a palavra-chave extends seguida pelo
nome da superclasse.
c 2001 FEEC/UNICAMP 25
2.5. Classes em Java
A hierarquia de classes de Java tem como raiz uma classe basica, Object. Quando no Ior
especicada uma superclasse na denio de uma classe, o compilador assume que a superclasse
Object. Assim, denir a classe Ponto?D como em
class Ponto?D
// ...

equivalente a deni-la como


class Ponto?D extends Object
// ...

E por esse motivo que todos os objetos podem invocar os mtodos da classe Object, tais como
equals() e toString(). O mtodo equals permite comparar objetos por seus conteudos. A
implementao padro desse mtodo realiza uma comparao de conteudo bit a bit; se um comporta-
mento distinto Ior desejado para uma classe denida pelo programador, o mtodo deve ser redenido.
O mtodo toString() permite converter uma representao interna do objeto em uma string que
pode ser apresentada ao usuario.
Outros mtodos da classe Object incluem clone(), um mtodo protegido que permite criar
uma duplicata de um objeto, e getClass(), que retorna um objeto que representa a classe a qual o
objeto pertence. Esse objeto sera da classe Class; para obter o nome da classe, pode-se usar o seu
mtodo estatico getName(), que retorna uma string.
Para criar uma classe PontoD a partir da denio da classe que representa um ponto em duas
dimenses, a nova classe deve incluir um atributo adicional para representar a terceira coordenada:
public class PontoD extends Ponto?D
private int z,
public PontoD(int x, int y, int z)
super(x, y),
this.z z,

public PontoD( )
z 0,

public static void main(String] args)


Ponto?D ref? new Ponto?D(),
PontoD p new PontoD(I,?,),
System.out.println("Distancia. " + p.distancia(ref?)),

c 2001 FEEC/UNICAMP 26
2.5. Classes em Java
Nesse exemplo, o mtodo distancia que utilizado em main aquele que Ioi denido para
a classe Ponto?D que, por herana, um mtodo da classe PontoD.
Esse exemplo ilustra, na denio do primeiro construtor, o uso da palavra-chave super para
invocar um construtor especco da superclasse. Se presente, essa expresso deve ser a primeira
do construtor, pois o inicio da construo do objeto a construo da parte da superclasse. Caso
no esteja presente, esta implicita uma invocao para o construtor padro, sem argumentos, da
superclasse, equivalente a Iorma super().
2.5.6 Classes abstratas e nais
Uma classe abstrata no pode ser instanciada, ou seja, no ha objetos que possam ser construidos
diretamente de sua denio. Por exemplo, a compilao do seguinte trecho de codigo
abstract class AbsClass
public static void main(String] args)
AbsClass obj new AbsClass(),

geraria a seguinte mensagem de erro:


AbsClass.java.. class AbsClass is an abstract class.
It cant be instantiated.
AbsClass obj new AbsClass(),

I error
Em geral, classes abstratas denem um conjunto de Iuncionalidades das quais pelo menos uma
esta especicada mas no esta denida ou seja, contm pelo menos um mtodo abstrato, como em
abstract class AbsClass
public abstract int umMetodo(),

Um mtodo abstrato no cria uma denio, mas apenas uma declarao de um mtodo que devera
ser implementado em uma classe derivada. Se esse mtodo no Ior implementado na classe derivada,
esta permanece como uma classe abstrata mesmo que no tenha sido assim declarada explicitamente.
Assim, para que uma classe derivada de uma classe abstrata possa gerar objetos, os mtodos
abstratos devem ser denidos em classes derivadas:
class ConcClass extends AbsClass
public int umMetodo()
return 0,

Uma classe nal, por outro lado, indica uma classe que no pode ser estendida. Assim, a compi-
lao do arquivo Reeleicao.java com o seguinte conteudo:
c 2001 FEEC/UNICAMP 27
2.5. Classes em Java
final class Mandato

public class Reeleicao extends Mandato

ocasionaria um erro de compilao:


caolho.Exemplos]9 javac Reeleicao.java
Reeleicao.java.4. Cant subclass final classes. class Mandato
public class Reeleicao extends Mandato

I error
A palavra-chave nal pode tambm ser aplicada a mtodos e a atributos de uma classe. Um
mtodo nal no pode ser redenido em classes derivadas.
Um atributo nal no pode ter seu valor modicado, ou seja, dene valores constantes. Apenas
valores de tipos primitivos podem ser utilizados para denir constantes. O valor do atributo deve ser
denido no momento da declarao, pois no permitida nenhuma atribuio em outro momento.
A utilizao de nal para uma reIerncia a objetos permitida. Como no caso de constantes,
a denio do valor (ou seja, a criao do objeto) tambm deve ser especicada no momento da
declarao. No entanto, preciso ressaltar que o conteudo do objeto em geral pode ser modicado
apenas a reIerncia xa. O mesmo valido para arranjos.
A partir de Java 1.1, possivel ter atributos de uma classe que sejam nal mas no recebem
valor na declarao, mas sim nos construtores da classe. (A inicializao deve obrigatoriamente
ocorrer em uma das duas Iormas.) So os chamados blank nals, que introduzem um maior grau
de exibilidade na denio de constantes para objetos de uma classe, uma vez que essas podem
depender de parmetros passados para o construtor.
Argumentos de um mtodo que no devem ser modicados podem ser declarados como nal,
tambm, na propria lista de parmetros.
2.5.7 Interfaces
Java tambm oIerece outra estrutura, denominada interIace, com sintaxe similar a de classes mas
contendo apenas a especicao da Iuncionalidade que uma classe deve conter, sem determinar como
essa Iuncionalidade deve ser implementada. Uma interIace Java uma classe abstrata para a qual
todos os mtodos so implicitamente abstract e public, e todos os atributos so implicitamente
static e final. Em outros termos, uma interIace Java implementa uma 'classe abstrata pura.
A sintaxe para a declarao de uma interIace similar aquela para a denio de classes, porm
seu corpo dene apenas assinaturas de mtodos e constantes. Por exemplo, para denir uma interIace
InterfaceI que declara um mtodo metI sem argumentos e sem valor de retorno, a sintaxe :
interface InterfaceI
void metI(),

c 2001 FEEC/UNICAMP 28
2.6. Excees
A diIerena entre uma classe abstrata e uma interIace Java que a interIace obrigatoriamente no
tem um 'corpo associado. Para que uma classe seja abstrata basta que ela seja assim declarada, mas a
classe pode incluir atributos de objetos e denio de mtodos, publicos ou no. Na interIace, apenas
mtodos publicos podem ser declarados mas no denidos. Da mesma Iorma, no possivel
denir atributos apenas constantes publicas.
Enquanto uma classe abstrata 'estendida (palavra chave extends) por classes derivadas, uma
interIace Java 'implementada (palavra chave implements) por outras classes.
Uma interIace estabelece uma espcie de contrato que obedecido por uma classe. Quando uma
classe implementa uma interIace, garante-se que todas as Iuncionalidades especicadas pela interIace
sero oIerecidas pela classe.
Outro uso de interIaces Java para a denio de constantes que devem ser compartilhadas por
diversas classes. Neste caso, a recomendao implementar interIaces sem mtodos, pois as classes
que implementarem tais interIaces no precisam tipicamente redenir nenhum mtodo:
interface Coins
int
PENNY I,
NICKEL S,
DIME I0,
QUARTER ?S,
DOLAR I00,

class SodaMachine implements Coins


int price *QUARTER,
// ...

2.6 Excees
Uma exceo um sinal que indica que algum tipo de condio excepcional ocorreu durante a
execuo do programa. Assim, excees esto associadas a condies de erro que no tinham como
ser vericadas durante a compilao do programa.
As duas atividades associadas a manipulao de uma exceo so:
gerao: a sinalizao de que uma condio excepcional (por exemplo, um erro) ocorreu, e
captura: a manipulao (tratamento) da situao excepcional, onde as aes necessarias para a re-
cuperao da situao de erro so denidas.
Para cada exceo que pode ocorrer durante a execuo do codigo, um bloco de aes de trata-
mento (um exception hanaler) deve ser especicado. O compilador Java verica e enIora que toda
exceo 'no-trivial tenha um bloco de tratamento associado.
O mecanismo de manipulao de excees em Java, embora apresente suas particularidades, teve
seu projeto inspirado no mecanismo equivalente de C, que por sua vez Ioi inspirado em Ada. E
c 2001 FEEC/UNICAMP 29
2.6. Excees
um mecanismo adequado a manipulao de erros sincronos, para situaes onde a recuperao do
erro possivel.
A sinalizao da exceo propagada a partir do bloco de codigo onde ela ocorreu atravs de
toda a pilha de invocaes de mtodos at que a exceo seja capturada por um bloco manipulador
de exceo. Eventualmente, se tal bloco no existir em nenhum ponto da pilha de invocaes de
mtodos, a sinalizao da exceo atinge o mtodo main(), Iazendo com que o interpretador Java
apresente uma mensagem de erro e aborte sua execuo.
2.6.1 Tratamento de excees
A captura e o tratamento de excees em Java se da atravs da especicao de blocos try,
catch e finally, denidos atravs destas mesmas palavras reservadas da linguagem.
A estruturao desses blocos obedece a seguinte sintaxe:
try
// cdigo que inclui comandos/invocaes de mtodos
// que podem gerar uma situao de exceo.

catch (XException ex)


// bloco de tratamento associado condio de
// exceo XException ou a qualquer uma de suas
// subclasses, identificada aqui pelo objeto
// com referncia ex

catch (YException ey)


// bloco de tratamento para a situao de exceo
// YException ou a qualquer uma de suas subclasses

finally
// bloco de cdigo que sempre ser executado aps
// o bloco try, independentemente de sua concluso
// ter ocorrido normalmente ou ter sido interrompida

onde XException e YException deveriam ser substituidos pelo nome do tipo de exceo. Os
blocos no podem ser separados por outros comandos um erro de sintaxe seria detectado pelo
compilador Java neste caso. Cada bloco try pode ser seguido por zero ou mais blocos catch, onde
cada bloco catch reIere-se a uma unica exceo.
O bloco finally, quando presente, sempre executado. Em geral, ele inclui comandos que
liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try
e que podem ser liberados, independentemente de a execuo ter encerrado com sucesso ou ter sido
interrompida por uma condio de exceo. A presena desse bloco opcional.
Alguns exemplos de excees ja denidas no pacote java.lang incluem:
ArithmeticException: indica situaes de erros em processamento aritmtico, tal como uma diviso
inteira por 0. A diviso de um valor real por 0 no gera uma exceo (o resultado o valor
innito);
c 2001 FEEC/UNICAMP 30
2.6. Excees
NumberFormatException: indica que tentou-se a converso de uma string para um Iormato num-
rico, mas seu conteudo no representava adequadamente um numero para aquele Iormato. E
uma subclasse de IllegalArgumentException;
IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado aqum ou alm dos
limites validos. E a superclasse de ArrayIndexOutOfBoundsException, para arranjos,
e de StringIndexOutOfBounds, para strings;
NullPointerException: indica que a aplicao tentou usar uma reIerncia a um objeto que no Ioi
ainda denida;
ClassNotFoundException: indica que a maquina virtual Java tentou carregar uma classe mas no
Ioi possivel encontra-la durante a execuo da aplicao.
Alm disso, outros pacotes especicam suas excees, reIerentes as suas Iuncionalidades. Por
exemplo, no pacote java.io dene-se IOException, que indica a ocorrncia de algum tipo de
erro em operaes de entrada e saida. E a superclasse para condies de exceo mais especcas des-
se pacote, tais como EOFException (m de arquivo ou stream), FileNotFoundException
(arquivo especicado no Ioi encontrado) e InterruptedIOException (operao de entrada
ou saida Ioi interrompida).
Uma exceo contm pelo menos uma string que a descreve, que pode ser obtida pela aplica-
o do mtodo getMessage(), mas pode eventualmente conter outras inIormaes. Por exemplo,
InterruptedIOException inclui um atributo publico do tipo inteiro, bytesTransferred,
para indicar quantos bytes Ioram transIeridos antes da interrupo da operao ocorrer. Outra in-
Iormao que pode sempre ser obtida de uma exceo a seqncia de mtodos no momento da
exceo, obtenivel a partir do mtodo printStackTrace().
Como excees Iazem parte de uma hierarquia de classes, excees mais genricas (mais proxi-
mas do topo da hierarquia) englobam aquelas que so mais especcas. Assim, a Iorma mais genrica
de um bloco try-catch
try ...
catch (Exception e) ...
pois todas as excees so derivadas de Exception. Se dois blocos catch especicam excees
em um mesmo ramo da hierarquia, a especicao do tratamento da exceo derivada deve preceder
aquela da mais genrica.
2.6.2 Erros e excees de runtime
Excees consistem de um caso particular de um objeto da classe Throwable. Apenas objetos
dessa classe ou de suas classes derivadas podem ser gerados, propagados e capturados atravs do
mecanismo de tratamento de excees.
Alm de Exception, outra classe derivada de Throwable a classe Error, que a raiz
das classes que indicam situaes que a aplicao no tem como ou no deve tentar tratar. Usual-
mente indica situaes anormais, que no deveriam ocorrer. Entre os erros denidos em Java, no
pacote java.lang, esto StackOverflowError e OutOfMemoryError. So situaes on-
de no possivel uma correo a partir de um tratamento realizado pelo proprio programa que esta
executando.
c 2001 FEEC/UNICAMP 31
2.6. Excees
Ha tambm excees que no precisam ser explicitamente capturadas e tratadas. So aquelas
derivadas de RuntimeException, uma classe derivada diretamente de Exception. So exce-
es que podem ser geradas durante a operao normal de uma aplicao para as quais o compilador
Java no ira exigir que o programador proceda a algum tratamento (ou que propague a exceo, como
descrito na Seo 2.6.3). Entre essas incluem-se ArithmeticException, IllegalArgumen-
tException, IndexOutOfBoundsException e NullPointerException.
2.6.3 Propagando excees
Embora toda exceo que no seja derivada de RuntimeException deva ser tratada, nem
sempre possivel tratar uma exceo no mesmo escopo do mtodo cuja invocao gerou a exceo.
Nessas situaes, possivel propagar a exceo para um nivel acima na pilha de invocaes.
Para tanto, o mtodo que esta deixando de capturar e tratar a exceo Iaz uso da clausula throws
na sua declarao:
void mtodoQueNoTrataExceo() throws Exception
invoca.mtodoQuePodeGerarExceo(),

Nesse caso, mtodoQueNoTrataExceo() reconhece que em seu corpo ha a possibili-


dade de haver a gerao de uma exceo mas no se preocupa em realizar o tratamento dessa exceo
em seu escopo. Ao contrario, ele repassa essa responsabilidade para o mtodo anterior na pilha de
chamadas.
Eventualmente, tambm o outro mtodo pode repassar a exceo adiante. Porm, pelo menos no
mtodo main() as excees devero ser tratadas ou o programa pode ter sua interpretao inter-
rompida.
2.6.4 Denindo e gerando excees
Excees so classes. Assim, possivel que uma aplicao dena suas proprias excees atravs
do mecanismo de denio de classes.
Por exemplo, considere que Iosse importante para uma aplicao diIerenciar a condio de divi-
so por zero de outras condies de excees artimticas. Neste caso, uma classe DivideByZe-
roException poderia ser criada:
public class DivideByZeroException
extends ArithmeticException
public DivideByZeroException()
super("O denominador na diviso inteira tem valor zero"),

Neste caso, o argumento para o construtor da superclasse especica a mensagem que seria im-
pressa quando o mtodo getMessage() Iosse invocado para essa exceo. Essa a mesma men-
sagem que apresentada para um RuntimeException que no capturado e tratado.
c 2001 FEEC/UNICAMP 32
2.7. O ambiente de Java
Para gerar uma condio de exceo durante a execuo de um mtodo, um objeto dessa classe
deve ser criado e, atravs do comando throw, propagado para os mtodos anteriores na pilha de
execuo:
public double calculaDivisao (double numerador, int denominador)
throws DivideByZeroException
if (denominador 0)
throw new DivideByZeroException(),
return numerador / denominador,

O mesmo comando throw pode ser utilizado para repassar uma exceo apos sua captura por
exemplo, apos um tratamento parcial da condio de exceo:
public void usaDivisao()
throws DivideByZeroException
...
try
d calculaDivisao(x, y),

catch (DivideByZeroException dbze)


...
throw dbze,

...

Nesse caso, a inIormao associada a exceo (como o seu ponto de origem, registrado internamente
no atributo do objeto que contm a pilha de invocaes) preservada. Caso Iosse desejado mudar
essa inIormao, uma nova exceo poderia ser gerada ou, caso a exceo seja a mesma, o mtodo
fillInStackTrace() poderia ser utilizado, como em
throw dbze.fillInStackTrace(),
2.7 O ambiente de 1ava
O ambiente de desenvolvimento de soItware Java, Java SDK (Software Development Kit an-
tigamente, denominado JDK), Iormado essencialmente pelas classes Iundamentais da linguagem
Java e por um conjunto de aplicativos que permite, entre outras tareIas, realizar a compilao e a exe-
cuo de programas escritos na linguagem Java. No um ambiente integrado de desenvolvimento,
no oIerecendo editores ou ambientes de programao visual. No entanto, so suas Iuncionalidades
que permitem a operao desses ambientes.
O Java SDK contm um amplo conjunto de APIs que compem o nucleo de Iuncionalidades
da linguagem Java. Uma API (Application Programming InterIace) uma biblioteca Iormada por
codigo pr-compilado, pronto para ser utilizado no desenvolvimento de suas aplicaes.
c 2001 FEEC/UNICAMP 33
2.7. O ambiente de Java
2.7.1 Ferramentas do 1ava SDK
As Ierramentas essenciais do ambiente de desenvolvimento de sofware Java so: o compilador
Java, javac; o interpretador de aplicaes Java, java; e o interpretador de applets Java, appletviewer.
Um programa Ionte em Java pode ser desenvolvido usando qualquer editor que permita gravar
textos sem caracteres de Iormatao. Um arquivo contendo codigo Java constitui uma unidade de
compilao, podendo incluir comentarios, declarao relacionadas a pacotes e pelo menos uma de-
nio de classe ou interIace.
O resultado dessa execuo, se o programa Ionte estiver sem erros, sera a criao de um arquivo
Hello.class contendo o bytecode que podera ser executado em qualquer maquina.
Alm das Ierramentas essenciais, o Java SDK oIerece os aplicativos de desenvolvimento javadoc,
um gerador de documentao para programas Java; jar, um manipulador de arquivos comprimidos no
Iormato Java Archive, que opera juntamente com extcheck, o vericador de arquivos nesse Iormato;
jdb, um depurador de programas Java; javap, um disassembler de classes Java; e javah, um gerador
de arquivos header para integrao a codigo nativo em C.
Java oIerece tambm aplicativos para o desenvolvimento e execuo de aplicaes Java em pla-
taIormas de objetos distribuidos (ver Capitulo 5). Ha tambm Ierramentas para permitir o desen-
volvimento de aplicaes distribuidas, incorporando tambm o conceito de assinaturas digitais. A
Ierramenta keytool gerencia chaves e certicados; jarsigner gera e verica assinaturas associadas a
arquivos Java; e policytool uma interIace grca para gerenciar arquivos que determinam a politica
de segurana do ambiente de execuo.
2.7.2 Gerao de cdigo porttil
Um dos grandes atrativos da plataIorma tecnologica Java a portabilidade do codigo gerado.
Esta portabilidade atingida atravs da utilizao de bvtecoaes. Bytecode um Iormato de codigo
intermediario entre o codigo Ionte, o texto que o programador consegue manipular, e o codigo de
maquina, que o computador consegue executar.
Na plataIorma Java, o bvtecoae interpretado por uma maquina virtual Java. A portabilidade
do codigo Java obtida a medida que maquinas virtuais Java esto disponiveis para diIerentes plata-
Iormas. Assim, o codigo Java que Ioi compilado em uma maquina pode ser executado em qualquer
maquina virtual Java, independentemente de qual seja o sistema operacional ou o processador que
executa o codigo.
A Maquina Virtual Java (JVM) , alm de um ambiente de execuo independente de plataIorma,
uma maquina de computao abstrata. Programas escritos em Java e que utilizem as Iuncionalidades
denidas pelas APIs dos pacotes da plataIorma Java executam nessa maquina virtual.
Uma das preocupaes associadas a execues nessas maquinas virtuais oIerecer uma arquitetu-
ra de segurana para prevenir que applets e aplicaes distribuidas executem Iora de seu ambiente se-
guro (sanabox) a no ser quando assim habilitados. Um framework de segurana estabelecido atra-
vs de Iuncionalidades dos pacotes java.security e seus subpacotes java.security.acl,
java.security.cert, java.security.interfaces e java.security.spec.
A maquina virtual Java opera com o carregamento dinmico de classes, ou seja, bvtecoaes so
carregados pela maquina virtual Java a medida que so solicitados pela aplicao.
Em uma aplicao operando localmente, o carregador de classes da maquina virtual procura
por essas classes nos (sub-)diretorios especicados a partir da variavel do sistema CLASSPATH. Se
c 2001 FEEC/UNICAMP 34
2.7. O ambiente de Java
encontrada, a classe carregada para a maquina virtual e a operao continua. Caso contrario, a
exceo ClassNotFoundException gerada.
O carregamento do codigo de uma classe para a JVM realizado pelo class loaaer da maquina
virtual. O class loaaer, em si uma classe Java que prov essa Iuncionalidade, deve obedecer a uma
politica de segurana estabelecida para aquela maquina virtual.
O estabelecimento de uma politica de segurana deve obedecer a um modelo de segurana espe-
cco. No modelo de segurana estabelecido a partir do JDK 1.2 (JDK securitv specication), todo
codigo sendo carregado para uma maquina virtual Java requer o estabelecimento de uma politica de
segurana, visando evitar que algum objeto realize operaes no-autorizadas na maquina local. Com
a incluso do conceito de politica de segurana, possivel estabelecer permisses diIerenciadas para
as aplicaes.
A politica de segurana padro estabelecida em um arquivo do sistema, java.policy,
localizado no diretorio <java_home>/lib/security/. Cada usuario pode estabelecer adi-
es a essa politica atravs da criao de um arquivo particular de estabelecimento de politica,
.java.policy, em seu diretorio home. Por exemplo, para permitir conexes soquete de qualquer
maquina com origem no dominio unicamp.br a portas no-notaveis, o arquivo .java.policy
deveria incluir
grant
permission java.net.SocketPermission
"*.unicamp.br.I0?4-", "accept,connect",
,
A sintaxe para o arquivo de politicas (Policv les svntax) permite estabelecer dominios de per-
misso com base na origem do codigo ou na sua assinatura. A Ierramenta policytool permite
criar um arquivo de politicas atravs de uma interIace grca.
Para enIorar essas politicas alternativas de segurana, um SecurityManager deve ser cri-
ado. Applets, por aefault, utilizam um SecurityManager estabelecido pelo navegador em cujo
contexto esto executando. Outras aplicaes devem criar explicitamente esse objeto. Por exemplo,
para criar um SecurityManager padro para aplicaes usando RMI (Seo 5.4.2), a seguinte
linha de codigo deveria ser incluida antes de executar qualquer operao envolvendo classes remotas:
System.setSecurityManager(new RMISecurityManager()),
Se o cliente RMI estiver em um applet, ento no necessario criar um SecurityManager,
uma vez que o proprio navegador estabelece a politica de segurana para applets remotos.
2.7.3 Desenvolvimento de aplicaes
Aplicaes Java so programas autnomos, cujo codigo gerado a partir de um programa Ionte
pode ser interpretado diretamente pela Maquina Virtual Java. Como tudo em Java esta estruturado
atravs de classes e objetos, para desenvolver uma aplicao preciso desenvolver pelo menos uma
classe que contenha um mtodo denominado main.
Assim, uma classe que va estabelecer o ponto de partida para a execuo de uma aplicao
na JVM deve conter pelo menos esse mtodo. Esse exemplo classico dene uma aplicao que
simplesmente envia uma string para a saida padro, identicada pelo objeto publico System.out:
c 2001 FEEC/UNICAMP 35
2.7. O ambiente de Java
1 public class Hello
2 public static void main(String] args)
3 System.out.println("Oi!"),
4 System.exit(0),
5
6
Uma vez que o programa tenha sido salvo em um arquivo com extenso .java, preciso
compila-lo. Para compilar um programa Java, a Ierramenta oIerecida pelo kit de desenvolvimento
Java o compilador Java, javac. Na Iorma mais basica de execuo, o javac invocado da linha
de comando tendo por argumento o nome do arquivo com o codigo Java a ser compilado:
> javac Hello.java
A unidade de compilao o arquivo com extenso .java; esse arquivo pode conter a denio
de varias classes, mas apenas uma delas pode ser publica. A classe publica em um arquivo Ionte
dene o nome desse arquivo, que obrigatoriamente deve ter o mesmo nome dessa classe.
Para cada denio de classe na unidade de compilao, o compilador Java ira gerar um arquivo
com bvtecoaes com a extenso .class, tendo como nome o proprio nome da classe.
Uma vez que um programa Java tenha sido compilado e esteja pronto para ser executado, isto
se da atravs do comando java o interpretador Java, que ativa a maquina virtual Java, carrega a
classe especicada e ativa seu mtodo main.
Por exemplo, para interpretar o arquivo Hello.class contendo o bvtecoae correspondente ao
codigo Ionte do arquivo Hello.java, utiliza-se a linha de comando
> java Hello
Observe que a extenso .class no incluida nessa linha de comando se o Ior, uma mensa-
gem de erro sera gerada, pois para a maquina virtual Java o carater `.` esta associado a denio de
uma hierarquia de pacotes.
Se a maquina virtual Java do interpretador no encontrar um mtodo de nome main com a
assinatura correta (public, static, void e com um argumento do tipo String]) na classe
especicada, uma exceo sera gerada em tempo de execuo:
Exception in thread "main" java.lang.NoSuchMethodError. main
Essa mensagem pode ser emitida pela ausncia completa de um mtodo main na classe ou por uma
declarao incorreta para o mtodo.
Se um programa Java Ior desenvolvido como applet (ver Seo 4.3), ele no podera ser executado
diretamente atravs do interpretador Java mas sim atravs da ativao de uma pagina HTML. Para
executar esse tipo de aplicao pode-se utilizar umnavegador; porm, o ambiente de desenvolvimento
Java oIerece a aplicao appletviewer que extrai da pagina HTML apenas o espao de exibio
do applet e permite controlar sua execuo atravs de comandos em sua interIace grca.
c 2001 FEEC/UNICAMP 36
Captulo 3
Uso das classes da API padro de 1ava
Um dos grandes atrativos da programao orientada a objetos a possibilidade de adaptar Iuncio-
nalidades oIerecidas em classes existentes as necessidades de cada aplicao. Java, no diIerentemen-
te, oIerece essa Iacilidade, aliando-a ao oIerecimento de um amplo conjunto de classes organizadas
nos pacotes da API padro.
As classes que compem o nucleo de Iuncionalidades Java esto organizadas em pacotes, grupos
de classes, interIaces e excees ans ou de uma mesma aplicao. Entre os principais pacotes
oIerecidos como parte do nucleo Java esto: java.lang, java.util, java.io, java.awt,
java.applet e java.net.
Observe que esses nomes seguem a conveno Java, pela qual nomes de pacotes (assim como
nomes de mtodos) so graIados em letras minusculas, enquanto nomes de classes tm a primeira
letra (de cada palavra, no caso de nomes compostos) graIada com letra maiuscula.
3.1 Funcionalidades bsicas
O pacote java.lang contm as classes que constituem recursos basicos da linguagem, necessarios
a execuo de qualquer programa Java.
A classe Object expressa o conjunto de Iuncionalidades comuns a todos os objetos Java, sendo
a raiz da hierarquia de classes Java.
As classes Class e ClassLoader representam, respectivamente classes Java e o mecanismo
para carrega-las dinamicamente para a Maquina Virtual Java.
A classe String permite a representao e a manipulao de strings cujo conteudo no pode ser
modicado. Para manipular string modicveis por exemplo, atravs da insero de um carater
na string a classe StringBuffer oIerecida.
A classe Math contm a denio de mtodos para calculo de Iunes matematicas (trigono-
mtricas, logaritimicas, exponenciais, etc.) e de constantes, tais como E e PI. Todos os mtodos
e constantes denidos nessa classe so estaticos, ou seja, para utiliza-los basta usar como prexo o
nome da classe.
O pacote oIerece tambm um conjunto de classes wrappers. Um objeto de uma classe wrapper
contm um unico valor de um tipo primitivo da linguagem, permitindo assim estabelecer uma ponte
entre valores literais e objetos. Essas classes so Boolean, Character, Byte, Short, Inte-
ger, Long, Float e Double. Alm dos mtodos para obter o valor associado ao objeto de cada
37
3.2. Entrada e saida
uma dessas classes, mtodos auxiliares como a converso de e para strings so suportados.
As classes System, Runtime e Process permitem interao da aplicao Java com o ambi-
ente de execuo. Por exemplo, a classe System tem trs atributos publicos e estaticos associados
aos arquivos padro de um sistema operacional: System.in, para a entrada padro; System.out,
para a saida padro; e System.err, para a saida padro de erros. Adicionalmente, as classes Th-
read e ThreadGroup, assim como a interIace Runnable, do suporte a execuo de multiplas
linhas de execuo que podem ser associadas a um processo.
As classes que denem erros e excees, respectivamente Error e Exception, so tambm
denidas nesse pacote. A classe Error a raiz para condies de erro no-trataveis, tais como Ou-
tOfMemoryError. Ja a classe Exception esta associada a hierarquia de condies que podem
ser detectados e tratados pelo programa, como ArithmeticException (diviso inteira por zero)
e ArrayIndexOutOfBoundsException(acesso a elemento de arranjo alm da ultima posio
ou antes da primeira posio). Ambas as classes so derivadas de Throwable, tambm denida
nesse pacote.
Sub-pacotes relacionados a java.lang incluem java.lang.ref, de reIerncias a objetos,
e o pacote java.lang.reflect, que incorpora Iuncionalidades para permitir a manipulao do
conteudo de classes, ou seja, identicao de seus mtodos e campos.
Deve-se ressaltar ainda que Iunes matematicas so denidas em java.lang.Math. Outro
pacote, java.math, contm Iuncionalidades para manipular numeros inteiros e reais de preciso
arbitraria.
3.2 Entrada e sada
Por entrada e saida subentende-se o conjunto de mecanismos oIerecidos para que um programa
executando em um computador consiga respectivamente obter e Iornecer inIormao de dispositivos
externos ao ambiente de execuo, composto pelo processador e memoria principal.
De Iorma genrica, havendo um dispositivo de entrada de dados habilitado, o programa obtm
dados deste dispositivo atravs de uma operao read(). Similarmente, um dado pode ser enviado
para um dispositivo de saida habilitado atravs de uma operao write().
A manipulao de entrada e saida de dados em Java suportada atravs de classes do paco-
te java.io. Essas classes oIerecem as Iuncionalidades para manipular a entrada e saida de bytes,
adequadas para a transIerncia de dados binarios, e para manipular a entrada e saida de caracteres,
adequadas para a transIerncia de textos.
Fontes de dados manipuladas como seqncias de bytes so tratadas em Java pela classe In-
putStream e suas classes derivadas. Similarmente, saidas de seqncias de bytes so tratadas por
OutputStream e suas classes derivadas.
Aplicaes tipicas de entrada e saida envolvem a manipulao de arquivos contendo caracteres.
Em Java, a especicao de Iuncionalidades para manipular esse tipo de arquivo esto contidas nas
classes abstratas Reader (e suas classes derivadas) e Writer (e suas classes derivadas), respecti-
vamente para leitura e para escrita de caracteres.
c 2001 FEEC/UNICAMP 38
3.2. Entrada e saida
3.2.1 Transferncia de texto
A classe Reader oIerece as Iuncionalidades para obter caracteres de alguma Ionte de dados
que Ionte de dados essa vai depender de qual classe concreta, derivada de Reader, esta sendo
utilizada. A classe Reader apenas discrimina Iuncionalidades genricas, como o mtodo read(),
que retorna um int representando o carater lido, e ready(), que retorna um boolean indicando,
se verdadeiro, que o dispositivo esta pronto para disponibilizar o proximo carater.
Como Reader uma classe abstrata, no possivel criar diretamente objetos dessa classe. E
preciso criar objetos de uma de suas subclasses concretas para ter acesso a Iuncionalidade especi-
cada por Reader.
BufferedReader incorpora um buIIer a um objeto Reader. Como a velocidade de ope-
rao de dispositivos de entrada e saida varias ordens de grandeza mais lenta que a velocidade
de processamento, buffers so tipicamente utilizados para melhorar a ecincia dessas operaes de
leitura e escrita. Adicionalmente, na leitura de texto a classe BufferedReader adiciona um m-
todo readLine() para ler uma linha completa. LineNumberReader estende essa classe para
adicionalmente manter um registro do numero de linhas processadas.
CharArrayReader e StringReader permitem Iazer a leitura de caracteres a partir de ar-
ranjos de caracteres e de objetos String, respectivamente. Assim, possivel usar a memoria prin-
cipal como uma Ionte de caracteres da mesma Iorma que se usa um arquivo.
FilterReader uma classe abstrata para representar classes que implementam algum tipo de
ltragem sobre o dado lido. Sua classe derivada, PushbackReader, incorpora a possibilidade de
retornar um carater lido de volta a sua Ionte.
InputStreamReader implementa a capacidade de leitura a partir de uma Ionte que Iornece
bytes, traduzindo-os adequadamente para caracteres. Sua classe derivada, FileReader, permite
associar essa Ionte de dados a um arquivo.
PipedReader Iaz a leitura a partir de um objeto PipedWriter, estabelecendo um meca-
nismo de comunicao inter-processos no caso de Java, entre threaas de uma mesma maquina
virtual.
As Iuncionalidades de escrita de texto esto associadas a classe abstrata Writer e suas classes
derivadas. Entre as Iuncionalidades genricas denidas em Writer esto o mtodo write(int),
onde o argumento representa um carater, sua variante write(String) e o mtodo flush(), que
Iora a saida de dados pendentes para o dispositivo sendo acessado para escrita.
Assim como para a classe Reader, as Iuncionalidades da classe Writer so implementadas
atravs de suas subclasses concretas.
BufferedWriter incorpora um buIIer a um objeto Writer, permitindo uma melhoria de
ecincia de escrita ao combinar varias solicitaes de escrita de pequenos blocos em uma solicitao
de escrita de um bloco maior.
CharArrayWriter e StringWriter permitem Iazer a escrita em arranjos de caracteres e
em objetos StringBuffer, respectivamente.
FilterWriter uma classe abstrata para representar classes que implementam algum tipo de
ltragem sobre o dado escrito.
OutputStreamWriter implementa a capacidade de escrita tendo como destino uma seqn-
cia de bytes, traduzindo-os adequadamente desde os caracteres de entrada. Sua classe derivada,
FileWriter, permite associar esse destino de dados a um arquivo.
c 2001 FEEC/UNICAMP 39
3.2. Entrada e saida
3.2.2 Transferncia de bytes
A classe abstrata InputStream oIerece a Iuncionalidade basica para a leitura de um byte ou
de uma seqncia de bytes a partir de alguma Ionte. Os principais mtodos dessa classe incluem
available(), que retorna o numero de bytes disponiveis para leitura, e read(), que retorna o
proximo byte do dispositivo de entrada.
Como para a leitura de texto, InputStream usado de Iato atravs de uma de suas classes
derivadas. ByteArrayInputStream permite ler valores originarios de um arranjo de bytes, per-
mitindo assim tratar uma area de memoria como uma Ionte de dados.
Outra Iuncionalidade associada a transIerncia de dados esta relacionada a converso de Iorma-
tos, tipicamente entre texto e o Iormato interno de dados binarios. Essa e outras Iuncionalidades
so suportadas atravs do oIerecimento de ltros, classes derivadas de FilterInputStream, que
podem ser agregados aos objetos que correspondem aos mecanismos elementares de entrada e saida.
FileInputStream l bytes que so originarios de um arquivo em disco. Usualmente, um
objeto dessa classe usado em combinao com os ltros BufferedInputStream e DataIn-
putStream. Outro exemplo de ltro PushbackInputStream, que oIerece mtodos unre-
ad() que permitem repor um ou mais bytes de volta a sua Ionte, como se eles no tivessem sido
lidos.
A classe BufferedInputStreaml mais dados que aqueles solicitados no momento da ope-
rao read() para um buIIer interno, melhorando a ecincia das operaes subseqentes para essa
mesma Ionte de dados.
DataInputStream permite a leitura de representaes binarias dos tipos primitivos de Ja-
va, oIerecendo mtodos tais como readBoolean(), readChar(), readDouble() e rea-
dInt(). E uma implementao da interIace DataInput. Essa interIace, tambm implementa-
da pela classe RandomAccessFile, especica mtodos que possibilitam a interpretao de uma
seqncia de bytes como um tipo primitivo da linguagem Java. Adicionalmente, tambm possivel
interpretar a seqncia de bytes como um objeto String. Em geral, mtodos dessa interIace ge-
ram uma exceo EOFException se Ior solicitada a leitura alm do nal do arquivo. Em outras
situaes de erro de leitura, a exceo IOException gerada.
A classe SequenceInputStream oIerece a Iuncionalidade para concatenar dois ou mais ob-
jetos InputStream; o construtor especica os objetos que sero concatenados e, automaticamente,
quando o m do primeiro objeto alcanado os bytes passam a ser obtidos do segundo objeto.
A classe abstrata OutputStream oIerece a Iuncionalidade basica para a transIerncia seqen-
cial de bytes para algum destino. Os mtodos desta classe incluem write(int) e flush(),
suportados por todas suas classes derivadas.
ByteArrayOutputStream oIerece Iacilidades para escrever para um arranjo de bytes inter-
no, que cresce de acordo com a necessidade e pode ser acessado posteriormente atravs dos mtodos
toByteArray() ou toString().
FileOutputStreamoIerece Iacilidades para escrever em arquivos, usualmente utilizadas em
conjuno com as classes BufferedOutputStream e DataOutputStream.
FilterOutputStream dene Iuncionalidades basicas para a ltragem de saida de dados,
implementadas em alguma de suas classes derivadas: BufferedOutputStream armazena bytes
em um buffer interno at que este esteja cheio ou at que o mtodo flush() seja invocado. Da-
taOutputStream uma implementao da interIace DataOutput que permite escrever valores
de variaveis de tipos primitivos de Java em um Iormato binario portatil. A classe PrintStream
c 2001 FEEC/UNICAMP 40
3.2. Entrada e saida
oIerece mtodos para apresentar representaes textuais dos valores de tipos primitivos Java, atravs
das varias assinaturas dos mtodos print() (impresso sem mudana de linha) e println()
(impresso com mudana de linha).
A classe ObjectInputStream oIerece o mtodo readObject() para a leitura de objetos
que Ioram serializados para umObjectOutputStream. Atravs desse mecanismo de serializao
possivel gravar e recuperar objetos de Iorma transparente.
PipedInputStreamoIerece a Iuncionalidade de leitura de um pipe de bytes cuja origem esta
associada a um objeto PipedOutputStream. Ja PipedOutputStream implementa a origem
de um pipe de bytes, que sero lidos a partir de um objeto PipedInputStream. Juntos, obje-
tos dessas classes oIerecem um mecanismo de comunicao de bytes entre threaas de uma mesma
maquina virtual.
3.2.3 Manipulao de arquivos
Outro dispositivo de entrada e saida de vital importncia disco, manipulado pelo sistema opera-
cional e por linguagens de programao atravs do conceito de arquivos. Um arquivo uma abstrao
utilizada por sistemas operacionais para uniIormizar a interao entre o ambiente de execuo e os
dispositivos externos a ele em um computador. Tipicamente, a interao de um programa com um
dispositivo atravs de arquivos passa por trs etapas: abertura ou criao de um arquivo; transIerncia
de dados; e Iechamento do arquivo.
Em Java, a classe File permite representar arquivos nesse nivel de abstrao. Um dos construto-
res desta classe recebe como argumento uma string que pode identicar, por exemplo, o nome de um
arquivo em disco. Os mtodos desta classe permitem obter inIormaes sobre o arquivo. Por exem-
plo, exists() permite vericar se o arquivo especicado existe ou no; os mtodos canRead()
e canWrite() vericam se o arquivo concede a permisso para leitura e escrita, respectivamente;
length() retorna o tamanho do arquivo e lastModified(), o tempo em que ocorreu a ultima
modicao (em milissegundos desde primeiro de janeiro de 1970). Outros mtodos permitem ainda
realizar operaes sobre o arquivo como um todo, tais como delete() e deleteOnExit().
Observe que as Iuncionalidades de transIerncia seqencial de dados a partir de ou para um
arquivo no suportada pela classe File, mas sim pelas classes FileInputStream, File-
OutputStream, FileReader e FileWriter. Todas estas classes oIerecem pelo menos um
construtor que recebe como argumento um objeto da classe File e implementam os mtodos ba-
sicos de transIerncia de dados suportados respectivamente por InputStream, OutputStream,
Reader e Writer.
Para aplicaes que necessitam manipular arquivos de Iorma no seqencial (ou 'direta), envol-
vendo avanos ou retrocessos arbitrarios na posio do arquivo onde ocorrera a transIerncia, Java
oIerece a classe RandomAccessFile. Esta no derivada de File, mas oIerece um construtor
que aceita como argumento de especicao do arquivo um objeto dessa classe. Outro construtor
recebe a especicao do arquivo na Iorma de uma string. Para ambos construtores, um segundo
argumento uma string que especica o modo de operao, 'r para leitura apenas ou 'rw para
leitura e escrita.
Os mtodos para a manipulao da posio corrente do ponteiro no arquivo so seek(long
pos), que seleciona a posio em relao ao inicio do arquivo para a proxima operao de leitura ou
escrita, e getFilePointer(), que retorna a posio atual do ponteiro do arquivo. Alm disso, o
mtodo length() retorna o tamanho do arquivo em bytes.
c 2001 FEEC/UNICAMP 41
3.2. Entrada e saida
Para a manipulao de conteudo do arquivo, todos os mtodos especicados pelas interIaces
DataInput e DataOutput so implementados por essa classe. Assim, possivel por exemplo
usar os mtodos readInt() e writeInt() para ler e escrever valores do tipo primitivo int,
respectivamente.
3.2.4 Serializao
Sendo Java uma linguagem de programao orientada a objetos, seria de se esperar que, alm
das Iuncionalidades usuais de entrada e saida, ela oIerecesse tambm alguma Iuncionalidade para
transIerncia de objetos. O mecanismo de serializao suporta essa Iuncionalidade.
O processo de serializao de objetos permite converter a representao de um objeto em memo-
ria para uma seqncia de bytes que pode ento ser enviada para um ObjectOutputStream, que
por sua vez pode estar associado a um arquivo em disco ou a uma conexo de rede, por exemplo.
Por exemplo, para serializar um objeto da classe Hashtable, denida no pacote java.util,
armazenando seu contudo em um arquivo em disco, a seqncia de passos :
// criar/manipular o objeto
Hashtable dados new Hashtable(),
...
// definir o nome do arquivo
String filename ...,
// abrir o arquivo de saida
File file new File(filename),
if(!file.exists())
file.createNewFile(),

FileOutputStream out new FileOutputStream(file),


// associar ao arquivo o ObjectOutputStream
ObjectOutputStream s new ObjectOutputStream(out),
// serializar o objeto
s.writeObject(dados),
O processo inverso, a desserializao, permite ler essa representao de um objeto a partir de um
ObjectInputStream usando o mtodo readObject():
FileInputStream in new FileInputStream(file),
ObjectInputStream s new ObjectInputStream(in),
dados (Hashtable) s.readObject(),
Objetos de classes para os quais so previstas serializaes e desserializaes devem implementar
a interIace Serializable, do pacote java.io. Essa interIace no especica nenhum mtodo
ou campo um exemplo de uma interIace marker, servindo apenas para registrar a semntica de
serializao.
Serializao um processo transitivo, ou seja, subclasses serializaveis de classes serializaveis
so automaticamente incorporadas a representao serializada do objeto raiz. Para que o processo
de desserializao possa operar corretamente, todas as classes envolvidas no processo devem ter um
construtor aefault (sem argumentos).
c 2001 FEEC/UNICAMP 42
3.3. Framework de colees
3.3 Framework de colees
Estruturas de dados so mecanismos para manipular colees de elementos em um programa.
O pacote java.util oIerece algumas classes denidas na API padro de Java que implementam
Iuncionalidades associadas a estruturas de dados.
As classes de colees da API Java compem o chamado framework de colees, que Ioi comple-
tamente redenido a partir da verso 1.2 de Java. As classes at ento existentes para a manipulao
de conjuntos de objetos Vector, Stack e Hashtable, atualmente denominadas 'as classes de
coleo historicas Ioram totalmente reprojetadas para se adequar ao novo framework. Elas Ioram
mantidas por motivos de compatibilidade, embora a recomendao seja utilizar as novas classes de
colees.
Todas essas estruturas manipulam colees de objetos, ou seja, qualquer objeto de qualquer classe
de Java pode ser elemento de uma dessas colees. No entanto, no possivel criar diretamente uma
coleo de tipos primitivos, como int ou double. Para manipular colees de tipos primitivos
necessario utilizar as classes wrappers (Seo 3.1).
O framework de colees tem por raiz duas interIaces basicas, Map e Collection.
A interIace Map especica as Iuncionalidades necessarias para manipular um grupo de objetos
mapeando chaves a valores. Entre outros, os seguintes mtodos so especicados nessa interIace:
Object put(Object key, Object value): associa um novo valor associado a cha-
ve especicada, retornando o valor antigo (ou null se no havia valor associado a chave).
Object get(Object key): retorna o valor associado a chave especicada.
boolean containsKey(Object key): indica se a chave especicada esta presente na
coleo.
int size(): retorna a quantidade de elementos na coleo.
Se adicionalmente deseja-se que esse grupo de objetos seja manipulado de acordo com alguma
ordem especca, a interIace derivada SortedMap pode ser utilizada. Assim, alm das Iuncionali-
dades acima, esta interIace especica mtodos tais como:
Object firstKey() para retornar o elemento da coleo com a chave de menor valor.
Object lastKey() para retornar o elemento da coleo com a chave de maior valor.
SortedMap subMap(Object fromKey, Object toKey) para obter o subconjunto
dos elementos compreendidos entre as chaves especicadas.
Para essas interIaces, duas implementaes basicas so tambm oIerecidas nesse mesmo pacote
java.util. A classe HashMap implementa o mecanismo basico de mapeamento entre chaves e
valores. A classe TreeMap oIerece a Iuncionalidade adicional de associar uma ordem aos elementos
da coleo. Para alguns tipos de objetos, tais como Integer, Double ou String, uma ordem
'natural ja pr-estabelecida. Para objetos de classes da aplicao, a classe devera implementar a
interIace Comparable.
Um objeto que implementa a interIace Collection representa um grupo de objetos genrico,
onde duplicaes so permitidas. Entre os mtodos basicos especicados nessa interIace esto:
c 2001 FEEC/UNICAMP 43
3.3. Framework de colees
boolean add(Object element) para adicionar o elemento especicado a coleo.
boolean remove(Object element) para remover o elemento especicado da cole-
o.
boolean contains(object element) para vericar se a coleo contm o elemento
especicado.
int size() para obter a quantidade de elementos na coleo.
Iterator iterator() para obter um objeto que permite varrer todos os elementos da
coleo.
Duas outras interIaces, Set e List, so derivadas diretamente de Collection.
Set uma extenso de Collection que no permite duplicaes de objetos nenhum mto-
do novo introduzido, mas apenas a necessidade de garantir essa restrio. A interIace SortedSet
uma extenso de Set que agrega o conceito de ordenao ao conjunto, introduzindo a especicao
de mtodos tais como first(), para obter o primeiro elemento do conjunto; last(), para obter
o ultimo elemento do conjunto; e subSet(), para obter o subconjunto com todos os elementos
contidos entre os dois elementos especicados como argumentos do mtodo.
A interIace Set tem duas implementaes ja oIerecidas no pacote java.util. A classe
HashSet uma implementao padro que utiliza o valor de codigo hash para detectar e impe-
dir duplicaes. A classe TreeSet uma implementao de SortedSet que usa uma estrutura
de dados em arvore para manter ordenados os elementos do conjunto.
A interIace List uma extenso de Collection que introduz mecanismos de indexao.
Alm dos mtodos basicos de colees, adiciona mtodos tais como get() para obter o elemento
armazenado na posio especicada como argumento; indexOf() para obter a posio da primeira
ocorrncia do objeto especicado como argumento; e subList() para obter uma sublista contendo
os elementos compreendidos entre as duas posies especicadas, incluindo o elemento da primeira
posio mas no o da segunda.
Da mesma Iorma que para Set, ha duas implementaes padronizadas para a interIace List
ja denidas em java.util. A classe ArrayList oIerece uma implementao basica da inter-
Iace, enquanto que a classe LinkedList oIerece uma implementao otimizada para manipular
listas dinmicas, introduzindo os mtodos addFirst(), getFirst(), removeFirst(), ad-
dLast(), getLast() e removeLast().
Para percorrer os elementos de uma coleo no novo framework, um objeto que implementa a
interIace Iterator utilizado. Essa interIace especica os mtodos hasNext(), que retorna um
valor booleano verdadeiro para indicar que ha mais elementos na coleo, e next(), que retorna o
objeto que o proximo elemento da coleo. Adicionalmente, um mtodo void remove() pode
ser utilizado para retirar um elemento da coleo atravs da reIerncia a um Iterator.
A interIace ListIterator uma extenso de Iterator que permite a varredura da coleo
nas duas direes, especicando novos mtodos tais como boolean hasPrevious() e Object
previous().
c 2001 FEEC/UNICAMP 44
3.4. Extenses padronizadas
3.4 Extenses padronizadas
Alm das Iuncionalidades basicas oIerecidas por esses pacotes, ha tambm APIs denidas para
propositos mais especcos compondo a extenso padronizada ao nucleo Java. Por exemplo, o Input
Method Framework esta associado ao pacote java.awt.im e contempla Iuncionalidades para
manipular textos no-ocidentais usando teclados convencionais.
Funcionalidades para denir e utilizar componentes de software em Java so oIerecidas atravs
de 1ava Beans, um conjunto de APIs denidas atravs do pacote java.beans e seu subpacote
java.beans.context para suportar os modelos de instrospeco, customizao, eventos, pro-
priedades e persistncia desses componentes.
Uma das extenses mais signicativas denida pelo conjunto da 1ava Foundation Classes,
extenso de AWT que oIerece um conjunto de componentes de interIace grca com usuario com-
pletamente portatil. Trs pacotes compem JFC: Swing, Drag and Drop e Java 2D. Swing dene
uma Iamilia de pacotes com o prexo javax.swing com componentes e servios GUI de aparn-
cia independente de plataIorma. Drag ana Drop, associado ao pacote java.awt.dnd, suporta o
compartilhamento de dados baseado no padro MIME, Multipurpose Internet Mail Extension. Java
2D acrescenta novas classes aos pacotes java.awt e java.awt.image para estender as Iun-
cionalidades associadas a manipulao de imagens bidimensionais e acrescenta novos pacotes ja-
va.awt.color, java.awt.font, java.awt.geom, java.awt.image.renderable e
java.awt.print. As Iuncionalidades para a construo de interIaces grcas com usuarios so
apresentadas na Seo 4.
Outra Iuncionalidade acrescentada a Java Ioi a capacidade de acesso a bancos de dados relaci-
onais usando a linguagem de consulta SQL. Atravs da API denida em 1DBC, atravs do pacote
java.sql, possivel enviar comandos SQL para um servidor de banco de dados e processar o
retorno obtido nessa consulta. A utilizao de JDBC descrita na Seo 5.2.3.
1ava IDL integra a Iuncionalidade da arquitetura CORBA a aplicaes Java, permitindo obter
inter-operabilidade e conectividade baseadas nesse padro do OMG (Obfect Management Group).
Alm das classes presentes nos pacotes org.omg.CORBA e org.omg.CosNaming, alguns apli-
cativos so acrescidos ao ambiente de desenvolvimento e execuo de Java, como o compilador de
Java para IDL e um aplicativo que oIerece o servio de nomes. O desenvolvimento de aplicaes
usando Java IDL descrito na Seo 5.4.3.
c 2001 FEEC/UNICAMP 45
Captulo 4
Desenvolvimento de aplicaes grcas
A linguagem Java oIerece, dentre as Iuncionalidades incorporadas a sua API padro, um extenso
conjunto de classes e interIaces para o desenvolvimento de aplicaes grcas. Esse conjunto Iacilita
a criao de saidas na Iorma grca e de interIaces grcas com usuarios (GUIs), tanto na Iorma de
aplicaes autnomas como na Iorma de applets.
Aplicaes grcas so criadas atravs da utilizao de componentes grcos, que esto agrupa-
dos em dois grandes pacotes: java.awt e javax.swing.
AWT o Abstract Winaowing Toolkit, sendo denido atravs das classes do pacote java.awt e
seus subpacotes, tais como java.awt.event. Essas classes agrupam as Iuncionalidades grcas
que esto presentes desde a primeira verso de Java, que operam tendo por base as Iuncionalidades
de alguma biblioteca grca do sistema onde a aplicao executada.
Ja o pacote javax.swing dene uma extenso padronizada a partir de AWT que congrega
componentes grcos que utilizam exclusivamente Java (lightweight components), com Iuncionali-
dades e aparncia independentes do sistema onde a aplicao executada.
4.1 Apresentao grca
A base para tudo que desenhado na tela de uma aplicao grca o contexto grco, em Java
um objeto da classe Graphics do pacote java.awt. So nesses objetos que linhas, retngulos,
circulos, strings, etc. so desenhados, compondo a apresentao visual da aplicao grca.
Todo componente grco tem associado a si um contexto grco e alguns mtodos chaves para
manipula-lo. A um objeto da classe Component pode-se aplicar os mtodos getGraphics(),
que permite obter uma reIerncia para um objeto da classe Graphics; paint(Graphics), que
determina o que Ieito no contexto grco; e repaint(), que solicita uma atualizao no contexto
grco.
Para determinar o conteudo grco do contexto, os mtodos da classe Graphics so utilizados.
Esses mtodos incluem Iacilidades para denio de cores, Iontes e denio de guras geomtricas.
O sistema de coordenadas para denir a posio do desenho no contexto tem origem no canto superior
esquerdo da area grca, tomando valores inteiros para e representando quantidades de pixels na
horizontal e na vertical, respectivamente.
A cor corrente para o contexto grco pode ser obtida e denida pelos mtodos getColor()
e setColor(), respectivamente. Esses mtodos usam cores representadas por objetos da classe
46
4.2. InterIaces grcas com usuarios
Color, que oIerece constantes para usar cores pr-denidas, mtodos para denir cores especican-
do niveis RGB (rea, green, blue) ou HSB (hue, saturation, brightness) e mtodos para manipular as
cores existentes.
Similarmente, a Ionte usada para a apresentao de strings no contexto pode ser obtida e denida
atravs de mtodos getFont() e setFont(). Fontes so representadas por objetos da classe
Font.
Entre os diversos mtodos usados para desenhar no contexto, ha mtodos para desenhar texto
usando a Ionte de texto e a cor corrente, drawString(); desenhar linhas retas, drawLine(); e
desenhar diversas Iormas geomtricas, tais como arcos, drawArc(); retngulos, drawRect(),
drawRoundRect(), drawDRect(); poligonos, drawPolygon(); ovais, drawOval();
e suas correspondentes verses preenchidas, fillArc(), fillRect(), fillRoundRect(),
fillDRect(), fillPolygon() e fillOval().
4.2 Interfaces grcas com usurios
Criar uma interIace grca com usuarios em Java envolve tipicamente a criao de um container,
um componente que pode receber outros. Em uma aplicao grca autnoma, tipicamente o con-
tainer usado como base um frame (uma janela com bordas e barra de titulo), enquanto que em um
applet o container base um panel (uma area grca inserida em outra). Em aplicaes complexas,
qualquer tipo de combinao desses e de outros tipos de componentes utilizado.
Apos sua criao, os containers da aplicao recebem componentes de interIace com usuarios,
que permitiro apresentar e receber dados aos e dos usuarios. Embora seja possivel posicionar esses
componentes atravs de coordenadas absolutas em cada container, recomendavel que o projetista
utilize sempre um gerenciador de lavout para realizar essa tareIa. Deste modo, garante-se que a apli-
cao possa ser executada independentemente das caracteristicas da plataIorma onde sera executada.
Finalmente, preciso especicar quais devem ser os eIeitos das aes dos usuarios tais como
um "clique"do mouse ou uma entrada de texto quando realizadas sobre cada um desses compo-
nentes. Isto se da atravs da especicao de classes manipuladoras de eventos, projetadas para a
aplicao. Ao associar objetos dessas classes aos componentes grcos, o projetista determina o
comportamento da aplicao.
4.2.1 Eventos da interface grca
No modelo de eventos suportado a partir da verso 1.1 de Java, um componente grco qual-
quer pode reconhecer alguma ao do usuario e a partir dela disparar um evento indicando, por
exemplo, que o boto do mouse Ioi pressionado ou que um texto Ioi modicado que sera captu-
rado por um objeto registrado especicamente para registrar aquele tipo de evento ocorrido naquele
componente.
O pacote java.awt.event dene as diversas classes de eventos que podem ocorrer atravs
das interIaces grcas. Eventos grcos so objetos derivados da classe AWTEvent, que por sua
vez so derivados de objetos de evento genricos denidos pela classe EventObject. Desta, even-
tos grcos herdam o mtodo getSource(), que permite identicar o objeto que deu origem ao
evento.
c 2001 FEEC/UNICAMP 47
4.2. InterIaces grcas com usuarios
Eventos grcos genricos so especializados de acordo com o tipo de evento sob considerao
por exemplo, pressionar um boto do mouse gera um objeto da classe MouseEvent. A mesma
ao sobre um boto, no entanto, gera tambm um ActionEvent, enquanto que sobre o boto de
minimizar na barra de titulo de um frame um WindowEvent seria ao invs adicionalmente gerado.
Outros eventos de interesse denidos em java.awt.event incluem ItemEvent, indican-
do que um item de uma lista de opes Ioi selecionado; TextEvent, quando o conteudo de um
componente de texto Ioi modicado; e KeyEvent, quando alguma tecla Ioi pressionada no teclado.
A resposta que uma aplicao da a qualquer evento que ocorre em algum componente grco
determinada por mtodos especcos, registrados para responder a cada evento. O nome e a assina-
tura de cada um desses mtodos determinado por uma interIace Java do tipo listener. Assim, para
responder a um ActionEvent sera utilizado o mtodo denido na interIace ActionListener;
para responder a umWindowEvent, os mtodos de WindowListener. Similarmente, ha interIa-
ces ItemListener, TextListener e KeyListener. Os eventos do mouse so manipulados
atravs de mtodos especicados em duas interIaces, MouseListener (para aes sobre o mouse)
e MouseMotionListener (para tratar movimentos realizados com o mouse).
Apesar de existir um grande numero de eventos e possibilidades de resposta que a aplicao
poderia dar a cada um deles, cada aplicao pode especicar apenas aqueles para os quais ha interesse
que sejam tratados. Para os eventos que o projetista da aplicao tem interesse de oIerecer uma
reao, ele deve denir classes manipuladoras de eventos (hanalers), implementaes de cada listener
correspondente ao tipo de evento de interesse.
Para interIaces listener que especicam diversos mtodos, classes adaptadoras so denidas.
Essas classes adaptadoras so classes abstratas denidas no pacote de eventos AWT, com nome XX-
XAdapter, onde XXX seria o prexo correspondente ao tipo de evento de interesse. Assim, para
que a aplicao use uma classe adaptadora para tratar os eventos do tipo WindowEvent, por exem-
plo, uma classe que estende a classe WindowAdapter pode ser denida. Nessa classe derivada, os
mtodos relacionados aos eventos de interesse so redenidos (pelo mecanismo de overriaing). Co-
mo a classe adaptadora implementa a interIace correspondente WindowListener, assim o Iara a
classe derivada. Os mtodos no redenidos herdaro a denio original, que simplesmente ignora
os demais eventos.
A API de eventos AWT de Java dene, alm de WindowAdapter, as classes adaptadoras Mou-
seAdapter, MouseMotionAdapter e KeyAdapter.
Uma vez que uma classe hanaler tenha sido criada para responder aos eventos de um compo-
nente, preciso associar esse componente ao objeto hanaler. Para tanto, cada tipo de componente
grco oIerece mtodos na Iorma addXXXListener(XXXListener l) e removeXXXLis-
tener(XXXListener l), onde XXX esta associado a algum evento do tipo XXXEvent. Por
exemplo, para o componente Window (e por herana para todas os componentes derivados des-
se) so denidos os mtodos public void addWindowListener(WindowListener l)
e public void removeWindowListener(WindowListener l), uma vez que nesse ti-
po de componente possivel ocorrer um WindowEvent.
Manipuladores de eventos de baixo nvel
Eventos de mouse so tratados pelos mtodos denidos em dois listeners distintos denidos em
java.awt.event. A interIace MouseListener especica os mtodos para os eventos de maior
c 2001 FEEC/UNICAMP 48
4.2. InterIaces grcas com usuarios
destaque na interao do usuario com o mouse. A classe abstrata MouseAdapter oIerece imple-
mentaes vazias para todos esses mtodos.
Um objeto associado a um evento do mouse descreve eventos notaveis ocorridos com o mouse,
como o Iato de ter entrado ou saido na area de interesse (uma janela, tipicamente), um 'clique
ocorrido, se alguma tecla de modicao (ALT, SHIFT ou CONTROL) estava pressionada e a posio
na qual o evento ocorreu.
A interIace MouseMotionListener especica mtodos para manipular eventos de movi-
mentao do mouse. A classe abstrata MouseMotionAdapter uma adaptadora para esse liste-
ner. Nesse caso, qualquer movimentao do mouse relatada, diIerenciando entre eventos da Iorma
MOUSE_MOVED, para movimentos com o mouse livre, e MOUSE_DRAGGED, para movimentos do
mouse com algum boto pressionado.
A interIace KeyListener especica os mtodos necessarios para detectar e tratar eventos de
teclado. So eles: keyPressed(), para indicar que a tecla Ioi pressionada; keyReleased(),
para indicar que a tecla Ioi solta; e keyTyped(), para indicar que uma tecla que no de controle Ioi
pressionada e solta. Todos os mtodos recebem um objeto KeyEvent como parmetro. Esse objeto
indica o tipo de evento ocorrido (KEY_PRESSED, KEY_TYPED ou KEY_RELEASED), o codigo
da tecla e se havia modicadores associados. Como essa interIace listener especica mais de um
mtodo, uma classe adaptadora, KeyAdapter, oIerecida.
Manipuladores de eventos de alto nvel
Raramente uma aplicao esta preocupada em tratar eventos no nivel to basico como qualquer
movimento do mouse ou tecla pressionada. Java oIerece um conjunto de Iuncionalidades que ltram
esses eventos para outros mais proximos da viso da aplicao, como o pressionar de um boto ou
entrar texto em um campo.
A interIace ActionListener especica o mtodo actionPerformed() para tratar even-
tos do tipo ao. Objetos da classe ActionEvent representam eventos associados a uma ao
aplicada a algum componente AWT.
Uma descrio (na Iorma de uma string) da ao pode ser obtida atravs do mtodo getAc-
tionCommand(). Dessa Iorma, se mais de um componente compartilha um mesmo listener, esse
mtodo permite diIerenciar qual componente Ioi o gerador da ao.
Outro atributo que esta representado em um objeto evento diz respeito aos modicadores, teclas
que podem estar apertadas simultaneamente a ocorrncia do evento para requisitar um tratamento
alternativo. A classe ActionEvent dene o mtodo getModifiers(), que retorna um valor
inteiro que pode ser analisado em relao a quatro constantes da classe, ALT_MASK, CTRL_MASK,
META_MASK e SHIFT_MASK.
Um objeto de uma classe que implemente ActionListener deve ser associado a um com-
ponente atravs do mtodo addActionListener(), que denido para componentes do tipo
boto, listas e campos de texto.
Quando um evento desse tipo ocorre, o objeto registrado noticado. O mtodo actionPer-
formed() ento invocado, recebendo como argumento o objeto que representa o evento.
Eventos associados a manipulao de janelas so denidos na interIace WindowListener.
Essa interIace especica os seguintes mtodos:
windowOpened() trata evento que apenas gerado quando a janela criada e aberta pela primeira
c 2001 FEEC/UNICAMP 49
4.2. InterIaces grcas com usuarios
vez
windowClosing() usuario solicitou que a janela Iosse Iechada, seja atravs de um menu do sistema
ou atravs de um boto da barra de titulos ou atravs de uma sequncia de teclas do sistema.
windowClosed() trata evento que indica que a janela Ioi Iechada.
windowIconied() trata evento que indica que janela Ioi iconicada.
windowDeiconied() trata evento indicando que o icone da janela Ioi aberto.
windowActivated() trata evento que indica que a janela ganhou o Ioco do teclado e tornou-se a
janela ativa.
windowDeactivated() trata evento que indica que a janela deixou de ser a janela ativa, provavel-
mente porque outra janela Ioi ativada.
Todos esses mtodos tm como argumento um objeto da classe WindowEvent, que representa
um evento de janela.
Como a interIace WindowListener especica diversos mtodos, uma classe adaptadora abs-
trata, WindowAdapter, Iornecida com implementaes vazias de todos os mtodos.
Para implementar a interIace ItemListener preciso denir a implementao do mtodo
itemStateChanged(), que recebe como argumento um objeto evento do tipo ItemEvent.
Um ItemEvent sinaliza que um elemento de algum tipo de lista de opes Ioi selecionado ou
desselecionado. Componentes que emitem esse tipo de evento implementam a interIace ItemSe-
lectable.
A interIace TextListener especica o mtodo que trata eventos do tipo texto. Um obje-
to da classe TextEvent esta relacionado a um evento indicando que o usuario modicou o valor
de texto que aparece em um TextComponent qualquer modicao no texto apresentado no
componente gera esse evento. Um mtodo apenas especicado na interIace, textValueChan-
ged(TextEvent e). O corpo desse mtodo determina o que deve ser executado quando o texto
em algum componente de texto alterado.
4.2.2 Componentes grcos
A criao de uma interIace grca com usuarios utiliza tipicamente uma srie de componentes
pr-estabelecidos para tal m, tais como rotulos (labels, textos que so apresentados mas no altera-
veis) e botes, um componente que pode ser ativado pelo usuario atravs do mouse.
Java oIerece um amplo conjunto de classes pr-denidas e re-utilizaveis que simplicam o desen-
volvimento de aplicaes grcas. A raiz desse conjunto de classes grcas no pacote java.awt
a classe abstrata Component, que representa qualquer objeto que pode ser apresentado na tela e
ter interao com usuarios. Similarmente, o pacote Swing tem por raiz a classe JComponent, que
(indiretamente) em si uma extenso de Component.
Os mtodos da classe Component denem Iuncionalidades que dizem respeito a manipulao
de qualquer componente grco em Java. O mtodo getSize() permite obter a dimenso do
componente, expressa na Iorma de um objeto da classe Dimension um objeto dessa classe tem
c 2001 FEEC/UNICAMP 50
4.2. InterIaces grcas com usuarios
campos publicos width e height que indicam respectivamente as dimenses horizontais e verti-
cais do componente em pixels. Ja o mtodo setSize() permite denir a dimenso do componente.
Outro grupo de mtodos importantes dessa classe composto pelos mtodos que permitem deter-
minar os manipuladores de eventos que so relevantes para qualquer tipo de objeto grco, como os
eventos de mouse (addMouseListener(), addMouseMotionListener(), removeMou-
seListener(), removeMouseMotionListener()) e de teclado (addKeyListener(),
removeKeyListener()).
Subclasses de Component que so amplamente utilizadas no desenvolvimento de aplicaes
grcas incluem os containers, um objeto grco que pode conter outros componentes, e os compo-
nentes de interIace grca com usuarios.
Para manipular texto em uma interIace grca ha componentes dos tipos campos de texto e areas
de texto, que permitem a entrada e/ou apresentao de texto em uma janela grca, respectivamente
para uma unica linha ou para diversas linhas de texto.
Quando a aplicao oIerece ao usuario uma srie de opes pr-estabelecidas, os componentes
tipicamente utilizados em interIaces grcas so de escolha, que pode ser unica, quando a seleo de
uma opo exclui as demais, ou multipla, quando varias opes podem ser selecionadas simultanea-
mente.
Rtulos
Rotulos so campos de texto incluidos em uma janela grca com o unico objetivo de apresenta-
o. Dessa Iorma, rotulos no reagem a interaes com usuarios.
A classe Label dene um componente de AWT que apresenta uma unica linha de texto no-
alteravel. Um dos atributos associados a um Label o texto a ser apresentado, que pode ser especi-
cado em um dos construtores ou atravs do mtodo setText(). O mtodo getText() retorna
o valor desse atributo. Outro atributo de Label o alinhamento, que pode ser Label.CENTER,
Label.LEFT ou Label.RIGHT. O alinhamento pode ser denido em um dos construtores (jun-
tamente com o texto) ou atravs do mtodo setAlignment(). O mtodo getAlignment()
retorna o valor desse atributo.
A classe JLabel dene o componente Swing para implementar rotulos. Alm de oIerecer Ia-
cilidades equivalentes aquelas de Label, JLabel oIerece a possibilidade de denir o alinhamento
vertical (o padro centralizado) e de usar um icone grco como rotulo, em adio ou em substitui-
o a um texto.
Botes
Um boto corresponde a um componente grco que pode ser 'pressionado atravs de um 'cli-
que do mouse, podendo assim responder a ativao por parte de um usuario.
A classe Button implementa um boto no AWT. Para criar um boto com algum rotulo, basta
usar o construtor que recebe como argumento uma string com o texto do rotulo. Alternativamen-
te, pode-se usar o construtor padro (sem argumentos) e denir o rotulo do boto com o mtodo
setLabel(). O rotulo que Ioi denido para o boto pode ser obtido do mtodo getLabel().
Em Swing, o componente que dene um boto JButton. Alm de poder ser denido com
rotulos de texto, um boto Swing pode conter tambm icones.
c 2001 FEEC/UNICAMP 51
4.2. InterIaces grcas com usuarios
Para manipular o evento associado a seleo de um boto, preciso denir uma classe que realize
o tratamento de um evento do tipo ao implementando um ActionListener.
Campos de texto
Um campo de texto uma area retangular, de tamanho correspondente a uma linha, que pode ser
utilizada para apresentar ou adquirir strings do usuario.
A classe TextField uma extenso da classe TextComponent que implementa um campo
de texto no toolkit AWT. Os construtores dessa classe permitem a criao de um campo de texto
que pode estar vazio ou conter algum texto inicial. O numero de colunas no campo tambm pode ser
especicado atravs dos construtores.
O componente correspondente a esse em Swing JTextField. Alm de Iuncionalidades
associadas a TextField, esse componente oIerece outras que permitem denir campos de texto
customizados.
Quando o usuario entra um texto em um campo de texto e tecla ENTER, gerado um evento do
tipo ao. Para indicar o objeto manipulador para esse evento, os mtodos addActionListe-
ner() e removeActionListener() so utilizados. Ambos tm como argumento um objeto
ActionListener. Eventos relativos a modicao de um valor em um campo de texto (sem pres-
sionar a tecla ENTER) esto associados a eventos do tipo texto. Desse modo, possivel monitorar se
alguma modicao ocorreu no campo de texto.
E possivel no ecoar a apresentao dos caracteres de entrada para a tela denindo um carater
alternativo que deve ser apresentado. Em AWT, utiliza-se o mtodo setEchoChar() da classe
TextField. Em Swing, para tal m deve ser utilizado o componente JPasswordField.
reas de texto
Uma area de texto permite apresentar e opcionalmente editar textos de multiplas linhas. E pos-
sivel adicionar texto a uma area atravs do mtodo append(), que recebe uma string como argu-
mento.
Em AWT, a classe TextArea oIerece essa Iuncionalidade, sendo tambm uma extenso da
classe TextComponent. Assim como para um campo de texto de uma linha, o texto apresenta-
do inicialmente e o numero de colunas visiveis pode ser denido em construtores. Adicionalmente,
o numero de linhas visiveis pode ser denido no momento da construo do objeto. Para a apre-
sentao de textos que ocupam uma area maior que a visivel, um construtor tem um argumento
que indica se e quantas barras de rolagem estaro presentes na area de texto. Os valores possi-
veis, denidos como constantes estaticas dessa classe, so SCROLLBARS_BOTH (barras de rolagem
nas direes vertical e horizontal), SCROLLBARS_HORIZONTAL_ONLY (apenas na horizontal),
SCROLLBARS_VERTICAL_ONLY (apenas na vertical) e SCROLLBARS_NONE (sem barras de ro-
lagem).
O componente correspondente a esse em Swing o JTextArea. Em Swing, o comportamento
aefault para a area de texto no ter barras de rolagem se isso Ior necessario, a aplicao deve
usar um componente decorador JScrollPane. Outras diIerenas dizem respeito a habilidade de
mudar de linha (automatico em AWT) e a gerao de eventos do tipo texto (no presente em Swing).
O framework Swing oIerece, no entanto, outros componentes mais elaborados que tambm ma-
nipulam areas de texto. Componentes das classes JEditorPane e JTextPane conseguem mani-
c 2001 FEEC/UNICAMP 52
4.2. InterIaces grcas com usuarios
pular varios tipos de conteudo, como por exemplo texto em HTML.
Componentes de seleo
Java apresenta trs mecanismos basicos para denir um componente que permite ao usuario a
seleo de opes apresentadas: arop-aown, lista ou caixa de seleo.
Um componente de interao em drop-down aquele que deixa visivel uma unica opo (aquela
que esta selecionada) ao usuario, mas que permite que esse visualize e selecione as outras opes
atravs da ativao de um mini-boto associado ao componente. Quando esse tipo de componente
permite tambm a entrada de valores em um campo de texto combinado a lista, usualmente chamado
de combo box. Em componentes do tipo combo box, a seleo restrita a uma unica opo, com uma
lista de itens em apresentao arop-aown onde apenas o elemento selecionado visivel. Os demais
itens podem ser apresentados para seleo atravs de interao com o mouse.
Em AWT, a Iuncionalidade de lista em arop-aown suportada atravs da classe Choice, que
permite denir uma lista de itens no-editaveis. Para essa classe, apenas o construtor padro oIe-
recido. Os principais mtodos para manipular objetos dessa classe so: add(String s), que
permite adicionar itens a lista; getSelectedIndex(), que retorna a posio numrica do item
selecionado na lista (o primeiro elemento tem indice 0); getSelectedItem(), que retorna o ro-
tulo do item selecionado na lista; e getItem(int index), retorna o rotulo do item cujo indice
Ioi especicado.
A classe Choice implementa a interIace ItemSelectable, o que permite associar objetos
dessa classe a um manipulador de eventos do tipo item, ItemListener.
Em Swing, o mecanismo de lista em arop-aown suportado pela classe JComboBox, que pode
ser congurado para ser editavel ou no.
A segunda opo para seleo de itens oIerecida atravs de listas, onde varios itens so apre-
sentados simultaneamente em uma janela. Na construo desse tipo de componente, o programador
pode estabelecer se a seleo sera exclusiva ou multipla. Um componente do tipo lista oIerece a Iun-
cionalidade de apresentar uma lista de opes dos quais um ou varios itens podem ser selecionados.
Em AWT, a classe List oIerece essa Iuncionalidade. Alm do construtor padro, essa classe
oIerece um construtor que permite especicar quantas linhas da lista sero visiveis. Um terceiro
construtor permite especicar um valor booleano indicando se o modo de seleo de varios itens esta
habilitado (true) ou no. Se no especicado, apenas um item pode ser selecionado da lista.
Os principais mtodos dessa classe incluem: add(String item), que acrescenta o item a lis-
ta; add(String item, int index), que acrescenta um item a lista na posio especicada;
getSelectedIndex(), que retorna a posio numrica do item selecionado na lista, sendo que o
primeiro item esta na posio 0; getSelectedItem(), que retorna o rotulo do item selecionado
na lista; e getItem(int index), que retorna o rotulo do item cujo indice Ioi especicado. Ha
ainda mtodos para a manipulao de selees multiplas: getSelectedIndexes(), que retorna
um arranjo de inteiros correspondendo as posies selecionadas, e getSelectedItems(), que
retorna um arranjo de String correspondente aos rotulos dos itens selecionados.
Assim como a classe Choice, a classe List implementa a interIace ItemSelectable, que
permite associar um objeto dessa classe a um manipulador de eventos do tipo item, ou seja, a um
objeto ItemListener. Esse tipo de evento gerado quando o item alvo de um unico toque do
mouse. Alm disso, um item da lista pode reagir a um toque duplo do mouse atravs da gerao
de um evento do tipo ao, usando para o tratamento do evento nesse caso um manipulador do
c 2001 FEEC/UNICAMP 53
4.2. InterIaces grcas com usuarios
tipo ActionListener. O tratamento de multiplas selees atravs de eventos de itens no
amigavel atravs dessa interIace, pois a cada seleo um novo evento gerado. Por esse motivo,
a documentao da API Java recomenda que esse tipo de seleo multipla em AWT seja eIetivada
atravs de algum controle externo, como um boto.
Em Swing, Iuncionalidade similar a apresentada por List oIerecida pela classe JList, em-
bora algumas diIerenas devam ser observadas. Por exemplo, ao contrario de List, um JList
no suporta barras de rolagem diretamente, o que deve ser acrescido atravs de um objeto decorador
JScrollPane.
A terceira opo para selecionar itens em uma interIace grca utilizar componentes do tipo
caixas de seleo, que podem ser independentemente selecionadas ou organizadas em grupos de
caixas de seleo das quais apenas uma pode estar selecionada. Uma caixa de seleo oIerece um
mecanismo de seleo em que uma opo pode assumir um de dois valores, selecionada ou no-
selecionada. Diz-se que tais componentes tm comportamento booleano.
Em AWT, essa Iuncionalidade suportada pela classe Checkbox. Alm do construtor padro,
essa classe oIerece construtores que permitem expressar um rotulo (String) para o boto e o es-
tado inicial (boolean). O mtodo getState() permite obter o estado da seleo; o mtodo
getLabel(), o rotulo associado a caixa de seleo. Checkbox implementa a interIace Item-
Selectable, permitindo tratar reaes a eventos do tipo item atravs de um ItemListener.
Em Swing, essa Iuncionalidade suportada de Iorma similar pela classe JCheckBox.
E tambm possivel denir grupos de caixas de seleo das quais apenas uma pode estar seleci-
onada em um dado instante, constituindo assim opes exclusivas entre si. Em AWT, esse tipo de
Iuncionalidade oIerecido atravs do conceito de um grupo de checkboxes, suportado atravs da clas-
se CheckboxGroup. Um CheckboxGroup no um componente grco, como um container,
mas sim um agrupamento logico entre os componentes grcos do tipo Checkbox, que devem es-
pecicar na sua construo ou atravs do mtodo setCheckboxGroup()a qual grupo pertencem,
se Ior o caso de pertencer a algum.
Funcionalidade similar a essa oIerecida em Swing atravs das classes JRadioButton e But-
tonGroup.
4.2.3 Containers
Dicilmente uma aplicao grca composta por um unico componente, mas sim por varios
componentes inter-relacionados. Para este tipo de aplicao, um componente Iundamental a area
onde os demais componentes da aplicao estaro dispostos. Um componente que pode conter outros
componentes denominado um container.
Em Java, a classe Container a classe abstrata que dene as Iuncionalidades basicas asso-
ciadas a um container, tais como adicionar e remover componentes, o que possivel atravs dos
mtodos add() e remove(), respectivamente. E possivel tambm estabelecer qual a estratgia de
disposio de componentes no container, ou seja, qual o mtodo de gerncia de lavout, atravs do
mtodo setLayout().
Window uma classe derivada de Container cujos objetos esto associados a janelas. Cada
objeto Window uma janela independente em uma aplicao, embora a essa janela no estejam
associadas as Iuncionalidades usualmente oIerecidas por gerenciadores de janela. Raramente um
objeto desse usado diretamente, mas objetos dessa classe so muito utilizados atravs de suas
subclasses, tais como Frame.
c 2001 FEEC/UNICAMP 54
4.2. InterIaces grcas com usuarios
Outra classe derivada de Container de extensa aplicao Panel, que dene uma area de
composio de componentes contida em alguma janela. A classe Applet uma extenso de Panel
que permite criar applets (Seo 4.3).
Embora a classe JComponent, raiz da hierarquia para todos os componentes do novo framework
para interIaces grcas de Java, seja derivada da classe Container, no se pode acrescentar di-
retamente um componente grco a qualquer componente Swing. Para as classes de Swing que
correspondem a containers no sentido denido em AWT, ou seja, as quais podem ser acrescenta-
dos outros componentes, deve-se obter uma reIerncia ao objeto Container atravs do mtodo
getContentPane().
4.2.4 1anelas
Janelas so areas retangulares que podem ser exibidas em qualquer parte da tela grca de um
usuario. Em AWT, objetos da classe Window esto associados a essa Iuncionalidade, sendo que
nessa classe so denidos os mtodos aplicaveis a qualquer tipo de janela. O framework Swing
oIerece a classe JWindow, derivada da classe Window, com esse mesmo tipo de Iuncionalidade
porm adaptada ao novo framework.
Um objeto Window, no entanto, corresponde a uma janela sem nenhum tipo de 'decorao. E
mais comum que aplicaes grcas criem janelas atravs de uma das classes derivadas de Window,
tais como um frame ou uma janela de dialogo. Convm destacar da classe Window os mtodos
show(), para trazer a janela para a Irente da tela; dispose(), para eliminar uma janela e liberar
os recursos usados por ela usados; e addWindowListener()e removeWindowListener()
para associar ou remover objetos manipuladores de eventos de janelas.
Um frame agrega a uma janela as Iuncionalidades minimas para que ela possa ser identicada e
manipulada pelo usuario da aplicao, tais como uma borda e a barra de titulos com botes de controle
da janela. Um frame uma janela com propriedades adicionais que a habilitam a ter uma 'vida
independente no ambiente de janelas grcas. Para que um frame seja apresentado pela aplicao,
um objeto desse tipo de classe deve ser criado e algumas de suas propriedades basicas tais como
sua dimenso e o Iato de estar visivel ou no devem ser estabelecidas.
Em AWT, frames esto associados a objetos da classe Frame. Esse exemplo ilustra as operaes
essenciais para que um frame AWT seja criado e exibido em um ambiente grco. O resultado da
execuo desse codigo a criao e exibio de uma janela grca com conteudo vazio:
1 import java.awt.*,
2 import java.awt.event.*,
3 public class Janela extends Frame
4 class WindowHandler extends WindowAdapter
5 public void windowClosing(WindowEvent we)
6 dispose(),
7 System.exit(0),
8
9 public void windowActivated(WindowEvent we)
10 we.getWindow().validate(),
11
12
c 2001 FEEC/UNICAMP 55
4.2. InterIaces grcas com usuarios
13 public Janela()
14 this("Janela"),
15
16 public Janela(String titulo)
17 setTitle(titulo),
18 setSize(?0,?00),
19 addWindowListener(new WindowHandler()),
20
21 public static void main(String] args)
22 Janela j new Janela(),
23 j.setVisible(true),
24
25
Se o tamanho da janela (em pixels, horizontal e vertical) no Ior denido (mtodo setSize()),
ento o aefault (x0, y0) assumido, criando uma janela de dimenses nulas. Mesmo que o tama-
nho seja denido, a janela quando criada por padro invisivel para exibi-la preciso invocar o
mtodo setVisible().
Frame uma extenso da classe Window que, por sua vez, uma concretizao de Contai-
ner, que uma extenso de Component. Assim, importante tomar contato com os diversos
mtodos denidos ao longo dessa hierarquia para ter uma noo mais precisa sobre o que possivel
realizar com um objeto Frame. Por exemplo, para tratar eventos relativos a janelas preciso asso-
ciar ao frame um WindowListener atravs do mtodo addWindowListener(), denido na
classe Window.
A classe Frame propriamente dita dene os mtodos que dizem respeito ao que um frame tem
de especco que uma janela (objeto da classe Window) no tem por exemplo, setTitle()
para denir um titulo para a barra da janela, setMenuBar() para incluir uma barra de menus e
setCursor() para determinar o tipo de cursor a ser utilizado. O tipo de cursor denido por
uma das alternativas especicadas como constantes da classe Cursor, tais como HAND_CURSOR
ou Cursor.TEXT_CURSOR.
O pacote Swing tambm oIerece a sua verso de um frame atravs da classe JFrame, que uma
extenso da classe Frame. Esse codigo ilustra a criao de uma janela vazia, como acima, usando
JFrame:
1 import javax.swing.*,
2 import java.awt.event.*,
3 public class SJanela extends JFrame
4 class WindowHandler extends WindowAdapter
5 public void windowClosing(WindowEvent we)
6 dispose(),
7 System.exit(0),
8
9
10 public SJanela()
11 this("Janela"),
c 2001 FEEC/UNICAMP 56
4.2. InterIaces grcas com usuarios
12
13 public SJanela(String title)
14 setSize(?00,I?0),
15 setTitle(title),
16 addWindowListener(new WindowHandler()),
17
18 public static void main(String] args)
19 SJanela je new SJanela(),
20 je.show(),
21
22
4.2.5 Gerenciadores de layout
Quando um container tem mais de um componente, preciso especicar como esses componen-
tes devem ser dispostos na apresentao. Em Java, um objeto que implemente a interIace Layout-
Manager responsavel por esse gerenciamento de disposio. A interIace LayoutManager?
uma extenso de LayoutManager que incorpora o conceito de restries de posicionamento de
componentes em um container.
Os principais mtodos da classe Container relacionados ao lavout de componentes so se-
tLayout(), que recebe como argumento o objeto que implementa LayoutManager e que deter-
mina qual a politica de gerncia de disposio de componentes adotada; e validate(), usado para
rearranjar os componentes em um container se o gerenciador de lavout soIreu alguma modicao
ou novos componentes Ioram adicionados.
O pacote java.awt apresenta varios gerenciadores de lavout pr-denidos. As classes Flo-
wLayout e GridLayout so implementaes de LayoutManager; as classes BorderLayout,
CardLayout e GridBagLayout so implementaes de LayoutManager?. Swing acrescenta
ainda um gerenciador de lavout atravs da classe BoxLayout.
Para determinar que o gerenciador de lavout em um container c seja do tipo XXXLayout,
preciso invocar setLayout() passando como argumento um objeto gerenciador:
c.setLayout(new XXXLayout()),
Containers derivados da classe Window tm como padro um gerenciador de lavout do tipo
BorderLayout, enquanto aqueles derivados de Panel usam como padro FlowLayout.
FlowLayout
FlowLayout uma classe gerenciadora de lavout que arranja os componentes seqencialmente
na janela, da esquerda para a direita, do topo para baixo, a medida que os componentes so adiciona-
dos ao container.
Os componentes so adicionados ao container da Iorma similar a um texto em um paragraIo,
permitindo que cada componente mantenha seu tamanho natural. Como padro, os componentes so
horizontalmente centralizados no container. E possivel mudar esse padro de alinhamento especi-
cando um valor alternativo como parmetro para um dos construtores da classe ou para o mtodo
c 2001 FEEC/UNICAMP 57
4.2. InterIaces grcas com usuarios
setAlignment(). Esse parmetro pode assumir um dos valores constantes denidos na classe,
tais como LEFT ou RIGHT.
E possivel tambm modicar a distncia em pixels entre os componentes arranjados atravs desse
tipo de gerenciador com os mtodos setHgap() e setVgap(); alternativamente, esses valores
podem tambm ser especicados atravs de construtores da classe FlowLayout. Para obter os
valores utilizados, ha mtodos getHgap() e getVgap().
Esse o gerenciador de lavout padro para containers derivados de Panel, tais como Applet.
Esse exemplo ilustra o uso desse tipo de gerenciador de lavout para dispor um conjunto de botes
em um frame:
1 import java.awt.*,
2 public class JanelaFlow extends Frame
3 public JanelaFlow()
4 setTitle("FlowLayout"),
5 setSize(?40,I00),
6 setLayout(new FlowLayout()),
7
8 public void addButton(int count)
9 for(int iI, i < count, ++i)
10 add(new Button("B"+i)),
11
12 public static void main(String] args)
13 JanelaFlow j new JanelaFlow(),
14 int qtde I0,
15 try
16 if (args.length > 0)
17 qtde Integer.parseInt(args]0),
18
19 catch (Exception e)
20
21
22 j.addButton(qtde),
23 j.validate(),
24 j.setVisible(true),
25
26
GridLayout
GridLayout uma implementao de LayoutManager que permite distribuir componentes
ao longo de linhas e colunas. A distribuio da-se na ordem de adio do componente ao container,
da esquerda para a direita e de cima para baixo.
Essa classe oIerece um construtor que permite especicar o numero de linhas e colunas desejado
para o gria para o construtor padro, um gria de uma unica coluna usado. Adicionalmente, ha
c 2001 FEEC/UNICAMP 58
4.2. InterIaces grcas com usuarios
outro construtor que permite especicar, alm da quantidade de linhas e colunas, o espao em pixels
entre esses componentes nas direes horizontal e vertical.
Deve-se observar que, nesse tipo de lavout, as dimenses dos componentes so ajustadas para
ocupar o espao completo de uma posio no gria.
Esse exemplo mostra como GridLayout dispe um conjunto de dez botes em um gria de trs
linhas e quatro colunas:
1 import java.awt.*,
2
3 public class JanelaGrid extends Frame
4 private final int rows, cols4,
5 public JanelaGrid()
6 setTitle("GridLayout"),
7 setSize(?40,I00),
8 setLayout(new GridLayout(rows, cols)),
9
10
11 public void addButton(int count)
12 int max rows*cols,
13 if (count < max)
14 max count,
15 for(int iI, i < max, ++i)
16 add(new Button("B"+i)),
17
18
19 public static void main(String] args)
20 JanelaGrid j new JanelaGrid(),
21 int qtde I0,
22 try
23 if (args.length > 0)
24 qtde Integer.parseInt(args]0),
25
26 catch (Exception e)
27
28
29 j.addButton(qtde),
30 j.validate(),
31 j.setVisible(true),
32
33
BorderLayout
BorderLayout uma implementao de LayoutManager? adequado para janelas com at
cinco componentes. Ele permite arranjar os componentes de um container em cinco regies, cujo
c 2001 FEEC/UNICAMP 59
4.2. InterIaces grcas com usuarios
posicionamento representado pelas constantes BorderLayout.NORTH, SOUTH, EAST, WEST e
CENTER:
1 import java.awt.*,
2 public class JanelaBorder extends Frame
3 public JanelaBorder()
4 setTitle("BorderLayout"),
5 setSize(?40,I00),
6 add(new Button("North"), BorderLayout.NORTH),
7 add(new Button("South"), BorderLayout.SOUTH),
8 add(new Button("East"), BorderLayout.EAST),
9 add(new Button("West"), BorderLayout.WEST),
10 add(new Button("Center"), BorderLayout.CENTER),
11
12 public static void main(String] args)
13 JanelaBorder j new JanelaBorder(),
14 j.validate(),
15 j.setVisible(true),
16
Observe a utilizao do mtodo add(Component c, Object o) da classe Container,
que incorpora a especicao das restries de posicionamento.
Alm do construtor padro, outro construtor permite especicar o gap horizontal e vertical (em
pixels) entre os componentes.
Esse tipo de lavout o padro para containers do tipo Frame. Para utilizar esse tipo de geren-
ciador para janelas com mais de cinco componentes, basta denir que o componente inserido em
um BorderLayout seja um Panel, que um container que pode ter seu proprio gerenciador de
lavout.
CardLayout
Um gerenciador do tipo CardLayout empilha os componentes de um container de tal Iorma que
apenas o componente que esta no topo permanece visivel. Esse gerenciador implementa a interIace
LayoutManager?.
Os mtodos do gerenciador estabelecem Iuncionalidades que permitem 'navegar entre os com-
ponentes empilhados, determinando qual item deve estar visivel em um dado momento. Os mto-
dos de navegao first(), next(), previous() e last() permitem realizar uma varredura
seqencial pelos componentes de container especicado, cujo gerenciador de lavout deve ser do tipo
CardLayout.
O mtodo show() permite selecionar um componente para exposio diretamente atravs de
uma string, que especicada como uma restrio quando da adio do componente ao container,
como no seguinte Iragmento:
Panel p new Panel(),
cm new CardLayout(),
c 2001 FEEC/UNICAMP 60
4.2. InterIaces grcas com usuarios
p.setLayout(cm),
Button b new Button("Teste"),
p.add(b, b.getLabel()),
que permitiria a exibio desse boto com a invocao
cm.show(p, b.getLabel()),
Tipicamente, os componentes manipulados por um gerenciador do tipo CardLayout so con-
tainers, os quais por sua vez utilizam qualquer outro tipo de gerenciador de lavout.
Esse exemplo ilustra o uso de CardLayout para organizar cinco rotulos distintos em um contai-
ner alocado ao elemento central de umIrame comBorderLayout. Os quatro elementos periIricos
do BorderLayout so usados para navegar entre os rotulos do CardLayout central:
1 import java.awt.*,
2 import java.awt.event.*,
3 public class JanelaCard extends Frame
4 Panel central new Panel(),
5 CardLayout cl new CardLayout(),
6 class FirstHandler implements ActionListener
7 public void actionPerformed(ActionEvent ae)
8 cl.first(central),
9
10
11 class LastHandler implements ActionListener
12 public void actionPerformed(ActionEvent ae)
13 cl.last(central),
14
15
16 class NextHandler implements ActionListener
17 public void actionPerformed(ActionEvent ae)
18 cl.next(central),
19
20
21 class PreviousHandler implements ActionListener
22 public void actionPerformed(ActionEvent ae)
23 cl.previous(central),
24
25
26 public JanelaCard()
27 setTitle("CardLayout"),
28 setSize(?40,?00),
29 Button next new Button("Proximo"),
30 next.addActionListener(new NextHandler()),
31 Button previous new Button("Anterior"),
32 previous.addActionListener(new PreviousHandler()),
c 2001 FEEC/UNICAMP 61
4.2. InterIaces grcas com usuarios
33 Button first new Button("Primeiro"),
34 first.addActionListener(new FirstHandler()),
35 Button last new Button("Ultimo"),
36 last.addActionListener(new LastHandler()),
37 add(first, BorderLayout.NORTH),
38 add(last, BorderLayout.SOUTH),
39 add(previous, BorderLayout.WEST),
40 add(next, BorderLayout.EAST),
41 add(central, BorderLayout.CENTER),
42 central.setLayout(cl),
43 central.add(new Label("Primeiro painel"), "Primeiro"),
44 central.add(new Label("Segundo painel"), "Segundo"),
45 central.add(new Label("Terceiro painel"), "Terceiro"),
46 central.add(new Label("Quarto painel"), "Quarto"),
47 central.add(new Label("Quinto painel"), "Quinto"),
48
49 public static void main(String] args)
50 JanelaCard jc new JanelaCard(),
51 jc.setVisible(true),
52
53
Nesse exemplo, o rotulo 'Primeiro painel inicialmente exibido por estar no topo da pilha do
objeto Panel com gerenciador do tipo CardLayout. Se o boto 'Proximo Ior pressionado, o
rotulo 'Segundo painel sera exibido.
GridBagLayout
GridBagLayout o gerenciador de lavout mais exivel dentre aqueles pr-denidos em ja-
va.awt; tambm, em decorrncia dessa exibilidade, o mais complexo. E uma implementao
de LayoutManager? que permite, como GridLayout, arranjar componentes ao longo de uma
matriz de linhas e colunas. No entanto, componentes podem ser acrescentados em qualquer ordem e
podem tambm variar em tamanho, podendo ocupar mais de uma linha ou coluna.
Uma vez que o desenho da interIace tenha sido especicado, a chave para a utilizao desse
gerenciador a criao de um objeto de restrio de posicionamento. Esse objeto da classe Grid-
BagConstraints. Objetos da classe GridBagConstraints determinam como um gerencia-
dor do tipo GridBagLayout deve posicionar um dado componente em seu container.
Uma vez que esse objeto tenha sido criado e suas restries especicadas, basta associar essas
restries ao componente usando o mtodo setConstraints()e adiciona-lo ao container com o
mtodo add() com o segundo parmetro de restries. A especicao das restries de posiciona-
mento, tamanho e propriedades de um componente nesse tipo de gerenciador determinada atravs
da atribuio de valores a campos publicos do objeto da classe GridBagConstraints.
O posicionamento especicado pelas variaveis gridx e gridy, respectivamente para indicar
a coluna e a linha onde o componente deve ser posicionado. Para gridx, o valor 0 indica a coluna
mais a esquerda. Do mesmo modo, para gridy o valor 0 indica a linha mais ao topo. Alm de
c 2001 FEEC/UNICAMP 62
4.2. InterIaces grcas com usuarios
valores absolutos de posicionamento, essa classe dene a constante RELATIVE para posicionamento
relativo, apos o ultimo componente incluido, sendo esse o valor padro para esses campos.
O numero de clulas que o componente ocupa no gria indicado pelas variaveis gridwidth e
gridheight, relacionadas respectivamente ao numero de colunas e ao numero de linhas que sera
ocupado pelo componente. O valor REMAINDER para esses campos indica que o componente sera
o ultimo dessa linha ou coluna, devendo ocupar a largura ou altura restante. O valor padro desses
campos 1.
Outras variaveis de restrio denidas nessa classe incluem weightx, weighty, fill e an-
chor. Os atributos weightx e weighty indicam o peso, ou a prioridade, que o componente tera
para receber pores de espao extra horizontalmente ou verticalmente, respectivamente, quando o
container redimensionado e espao adicional torna-se disponivel. O padro um componente no
receber espao extra (valor 0).
O atributo fill utilizado quando a area para a apresentao do componente maior que
o tamanho natural do componente. Indica como a apresentao do componente ira ocupar a area
disponivel, podendo assumir os valores denidos em constantes da classe: NONE, no modica o
tamanho do componente (o padro); VERTICAL, ocupa o espao vertical mas no altera a largura
do componente; HORIZONTAL, ocupa o espao disponivel na horizontal mas no altera a altura do
componente; e BOTH, ocupa os espao disponivel nas duas dimenses.
O atributo anchor utilizado quando o tamanho do componente menor que a area da clula a
qual ele Ioi alocado para indicar a posio do componente na clula. O padro CENTER, mas outros
valores possiveis so NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST,
NORTHWEST.
Esse exemplo de codigo ilustra a criao de uma janela com trs regies, sendo que a primeira
regio contm uma lista, a segunda um grupo de trs botes e a terceira uma area de texto:
1 import java.awt.*,
2 import java.awt.event.*,
3 public class JanelaGridBag extends Frame
4 GridBagLayout gb new GridBagLayout(),
5 private final int noLinhas ,
6 public JanelaGridBag()
7 setTitle("GridBagLayout"),
8 setSize(?0,?00),
9 setLayout(gb),
10 List lEsq new List(noLinhas, true),
11 lEsq.add("Um"),
12 lEsq.add("Dois"),
13 lEsq.add("Tres"),
14 lEsq.add("Quatro"),
15 lEsq.add("Cinco"),
16 lEsq.add("Seis"),
17 lEsq.add("Sete"),
18 Button add new Button(">>"),
19 Button clear new Button("Clear"),
20 Button close new Button("Close"),
c 2001 FEEC/UNICAMP 63
4.2. InterIaces grcas com usuarios
21 TextArea tDir new TextArea("", noLinhas,
22 I0, TextArea.SCROLLBARS_NONE),
23 GridBagConstraints gc new GridBagConstraints(),
24 gc.gridx 0,
25 gc.gridy 0,
26 gc.gridwidth I,
27 gc.gridheight ,
28 gc.fill GridBagConstraints.VERTICAL,
29 add(lEsq, gc),
30 gc.gridx ?,
31 add(tDir, gc),
32 Insets margens new Insets(4, , 4, ),
33 gc.gridx I,
34 gc.gridy 0,
35 gc.gridwidth I,
36 gc.gridheight I,
37 gc.fill GridBagConstraints.BOTH,
38 gc.ipadx 4,
39 gc.ipady 4,
40 gc.insets margens,
41 add(add, gc),
42 gc.gridy I,
43 add(clear, gc),
44 gc.gridy ?,
45 add(close, gc),
46
47 public static void main(String] args)
48 JanelaGridBag jgb new JanelaGridBag(),
49 jgb.setVisible(true),
50
51
BoxLayout
Swing oIerece um gerenciador de lavout simples, com alto grau de exibilidade, que o Box-
Layout. Nesse tipo de lavout, componentes podem ser dispostos em uma unica linha ou em uma
unica coluna, porm arranjos de componentes bem complexos podem ser obtidos atravs da combi-
nao desses mecanismos.
Em BoxLayout os componentes mantm sua dimenso natural, como em FlowLayout. A
direo na qual os componentes sero dispostos se da esquerda para a direita ou se de cima
para baixo pode ser especicada no construtor da classe, atravs respectivamente das constantes
X_AXIS ou Y_AXIS.
Tipicamente, esse tipo de lavout no utilizado diretamente, mas sim atravs de um container
do tipo Box, que adota BoxLayout como padro unico de gerenciamento de lavout.
c 2001 FEEC/UNICAMP 64
4.3. Desenvolvimento de applets
Esse codigo ilustra a construo de uma interIace similar aquela usando GridBagLayout,
porm construida usando caixas aninhadas:
1 import javax.swing.*,
2 public class JanelaBox extends JFrame
3 public JanelaBox()
4 setTitle("BoxLayout"),
5 setSize(?40,I?0),
6 Box h Box.createHorizontalBox(),
7 Box v Box.createVerticalBox(),
8 String] lista "Um", "Dois", "Tres", "Quatro",
9 "Cinco", "Seis", "Sete",
10 JList jl new JList(lista),
11 jl.setFixedCellWidth(I0),
12 int mis ListSelectionModel.MULTIPLE_INTERVAL_SELECTION,
13 jl.setSelectionMode(mis),
14 JScrollPane lEsq new JScrollPane(jl),
15 lEsq.setMinimumSize(new java.awt.Dimension(I00,I00)),
16 JButton add new JButton(">>"),
17 JButton clear new JButton("Clear"),
18 JButton close new JButton("Close"),
19 JTextArea tDir new JTextArea(),
20 v.add(add),
21 v.add(clear),
22 v.add(close),
23 h.add(lEsq),
24 h.add(v),
25 h.add(tDir),
26 getContentPane().add(h),
27
28 public static void main(String] args)
29 JanelaBox jb new JanelaBox(),
30 jb.setVisible(true),
31 jb.validate(),
32
33
4.3 Desenvolvimento de applets
Applets so programas projetados para ter uma execuo independente dentro de alguma outra
aplicao, eventualmente interagindo com esta tipicamente, um browser (navegador) Web. Assim,
applets executam no contexto de um outro programa, o qual interage com o applet e determina
assim sua seqncia de execuo. Funcionalidades associadas a applets Java so agregadas no pacote
java.applet.
c 2001 FEEC/UNICAMP 65
4.3. Desenvolvimento de applets
O processo de criao de um applet similar ao processo de criao de uma aplicao o pro-
grama deve ser criado por um editor de programas e o arquivo de bvtecoaes (com extenso .class)
deve ser gerado a partir da compilao do arquivo Ionte.
Uma vez criado ou disponibilizado o bvtecoae, preciso incluir uma reIerncia a ele em alguma
pagina Web. Essa pagina Web, uma vez carregada em algum navegador, ira reconhecer o elemento
que Iaz a reIerncia ao applet, transIerir seu bvtecoae para a maquina local e dar inicio a sua execuo.
4.3.1 Criao de applet
Para criar um applet, preciso desenvolver uma classe que estenda a classe Applet:
import java.applet.*,
public class MeuApplet extends Applet
...

A classe Applet uma extenso de uma classe container do tipo Panel. Assim, o desenvol-
vimento de um applet segue as estratgias de desenvolvimento de qualquer aplicao grca.
Um applet deve ser reIerenciado a partir de uma pagina Web. Tipicamente, para reIerenciar um
applet cujo bvtecoae esteja em um arquivo MeuApplet.class a partir de uma pagina usando
HTML na verso 3.2, o seguinte elemento deve ser incluido na pagina:
<applet code"MeuApplet.class"
width?00 heightIS0>
</applet>
Atributos opcionais para o elemento APPLET incluem, entre outros, CODEBASE, que indica o
diretorio (na Iorma de um URL) onde esta localizado o codigo do applet, e NAME, uma string para
identicar o applet.
Para navegadores compativeis com HTML na verso 4.01 ou superiores ou ainda que usem
XHTML, a Iorma de reIerenciar um applet na pagina seria atravs da tag OBJECT:
<object codetype"application/java"
classid"java.MeuApplet.class"
width"?00" height"IS0">
</object>
O navegador ira ento criar um espao grco de 200 pixels de largura por 150 pixels de altura
na pagina apresentada, ira transIerir o codigo do applet do mesmo local de onde a pagina se originou
para a maquina local e dara inicio a execuo do applet dentro deste espao usando a maquina virtual
Java associada ao navegador.
E possivel tambm passar argumentos para o codigo do applet a partir da pagina HTML que o
reIerencia. Para tanto, o tag PARAM utilizado no interior do elemento APPLET, ocorrendo tantas
vezes quantos Iorem os argumentos para o applet. Cada ocorrncia de PARAM tem dois atributos,
name e value, que permitiro a identicao do argumento no codigo do applet:
<applet ...>
<param name"background" value"white">
</applet>
c 2001 FEEC/UNICAMP 66
4.3. Desenvolvimento de applets
4.3.2 Execuo de applets
Ao contrario das aplicaes Java, a execuo de um applet em uma pagina no iniciada pelo m-
todo main(). Um applet executado como uma threaa subordinada ao navegador (ou a aplicao
appletviewer, presente no ambiente de desenvolvimento Java). O navegador sera responsavel
por invocar os mtodos da classe Applet que controlam a execuo de um applet.
Quando o applet carregado pela primeira vez pelo navegador, o mtodo init() invocado
pelo navegador. Esse mtodo pode ser considerado Iuncionalmente equivalente ao mtodo construtor
em aplicaes, pois sera apenas executado no momento em que o codigo Ior carregado.
Apos o carregamento do applet para a maquina local e a execuo do mtodo init(), o mtodo
start() invocado. Esse mtodo sera invocado tambm a cada vez que a area do applet torna-se
visivel no navegador, dando reinicio a operaes que eventualmente tenham sido paralisadas pelo
mtodo stop().
O mtodo stop() invocado cada vez que o applet torna-se temporariamente invisivel, ou seja,
que sua area no esteja visivel no navegador. E uma Iorma de evitar que operaes que demandem
muitos ciclos de CPU continuem a executar desnecessariamente. Tambm invocado imediatamente
antes de destroy(), que invocado quando o applet esta para ser eliminado do navegador. Este
mtodo serve para liberar recursos alm de memoria que o applet tenha eventualmente alocado
para sua execuo.
Esse exemplo ilustra a denio de um applet que implementa apenas esses quatro mtodos.
Quando carregada em um navegador Web, a pagina que reIerencia esse codigo apresenta apenas uma
area vazia; porm, se o console Java do navegador Ior aberto, sera possivel visualizar as mensagens:
1 import java.applet.*,
2 public class MeuApplet extends Applet
3 public void init()
4 System.out.println("MeuApplet inicializado com dimensao "
5 + getSize()),
6
7 public void start()
8 System.out.println("MeuApplet deve executar"),
9
10 public void stop()
11 System.out.println("MeuApplet deve parar"),
12
13 public void destroy()
14 System.out.println("Adeus, MeuApplet"),
15
Sendo Applet um componente grco do tipo container, todas as Iuncionalidades descritas
para o desenvolvimento de aplicaes grcas aplicam-se a applets. Por exemplo, possivel que um
applet apresente Iormas geomtricas em seu contexto grco usando o mtodo paint() ou incluir
componentes de interIace com usuario e tratar a manipulao de eventos.
Alguns mtodos da classe Applet permitem a comunicao do applet com o navegador no qual
ele esta inserido. O mtodo getParameter() permite a obteno dos parmetros passados pelo
navegador para o applet. O mtodo showStatus() exibe uma mensagem na linha de status do
c 2001 FEEC/UNICAMP 67
4.3. Desenvolvimento de applets
navegador (na barra inIerior da janela) que executa o applet. O mtodo getAppletContext()
permite obter o contexto de execuo do applet, o que permite por exemplo estabelecer a comunica-
o entre dois applets de uma mesma pagina.
Como o codigo de um applet geralmente obtido atravs de uma conexo remota, sua execuo
esta restrita aos principios de segurana impostos por Java para a execuo de codigo em ambientes
distribuidos. Tipicamente, um applet no pode acessar arquivos e inIormaes do ambiente onde esta
executando nem pode estabelecer conexes remotas com outras maquinas, a no ser aquela de onde
o proprio codigo Ioi obtido.
4.3.3 Passagem de parmetros
O mtodo getParameter() da classe Applet permite obter parmetros passados para o
applet atravs do elemento PARAM em uma pagina HTML. O argumento para esse mtodo o nome
do parmetro, estabelecido no atributo name da tag PARAM, e o retorno uma string com o valor do
argumento ou seja, o conteudo do atributo value de PARAM.
Esse applet recebe como parmetro a cor de Iundo, que pode ser branca, amarela ou cinza (o
padro):
1 import java.applet.*,
2 import java.awt.*,
3 public class AppletParameter extends Applet
4 private int altura,
5 private int largura,
6 private int incremento,
7 public void init()
8 Dimension d getSize(),
9 altura d.height - ?,
10 largura d.width,
11 incremento altura/,
12 Color c Color.gray,
13 String cor getParameter("background"),
14 try
15 if (cor.equalsIgnoreCase("yellow"))
16 c Color.yellow,
17 else if (cor.equalsIgnoreCase("white"))
18 c Color.white,
19
20 catch (Exception e)
21
22
23 setBackground(c),
24
25 public void paint(Graphics g)
26 int xI,
27 int yI,
c 2001 FEEC/UNICAMP 68
4.3. Desenvolvimento de applets
28 int finalPos largura - altura,
29 while (x < finalPos)
30 g.setColor(new Color((float)Math.random(),
31 (float)Math.random(),
32 (float)Math.random())),
33 g.drawRect(x, y, altura, altura),
34 x + incremento,
35
36
37
Se na pagina HTML o elemento especicado Ior
<p>
<APPLET code"AppletParameter.class" width"840" height"?0">
<PARAM name"background" value"White">
</APPLET>
o applet sera apresentado com Iundo branco; com
<p>
<APPLET code"AppletParameter.class" width"840" height"?0">
<PARAM name"background" value"yellow">
</APPLET>
sera apresentado com Iundo amarelo. Se Ior invocado sem argumento, tendo na pagina HTML o
elemento
<p>
<APPLET code"AppletParameter.class" width"840" height"?0">
</APPLET>
os retngulos sero desenhados sobre um Iundo cinza.
4.3.4 Contexto de execuo
Em algumas situaes pode ser de interesse Iazer com que o applet interaja com o contexto no
qual ele esta executando (usualmente, o navegador Web). A interIace AppletContext especica
algumas Iuncionalidades que permitem essa interao.
Para obter o contexto no qual o applet esta executando, o mtodo getAppletContext() da
classe Applet utilizado. Esse mtodo retorna um objeto AppletContext, a partir do qual
possivel obter reIerncias a outros applets no mesmo contexto atravs de uma enumerao, usando o
mtodo getApplets(). Alternativamente, se ao applet Ioi atribuido um nome usando o atributo
name na tag APPLET, uma reIerncia a esse applet pode ser obtida atravs do mtodo getAp-
plet().
Como exemplo, considere a execuo de dois applets em uma pagina, onde um applet tem um
campo de texto para obter uma entrada do usuario e o outro tem uma area de texto para exibir as
c 2001 FEEC/UNICAMP 69
4.3. Desenvolvimento de applets
entradas que o usuario digitou na outra janela. O primeiro applet denido em uma classe Entrada,
enquanto que o segundo denido em uma classe TextAreaApplet. A incluso em uma pagina
HTML da-se atravs de dois elementos APPLET:
<p>
<applet code"Entrada.class"
width"?00" height"I00"
name"entra">
</applet>
<applet code"TextAreaApplet.class"
width"?00" height"I00"
name"mostra">
</applet>
</p>
O applet TextAreaApplet tem simplesmente uma area para exibio de texto:
1 import java.awt.*,
2 import java.applet.*,
3 public class TextAreaApplet extends Applet
4 TextArea ta new TextArea(S, 0),
5 public void init()
6 add(ta),
7
8 public void append(String s)
9 ta.append("\n" + s),
10
11
O applet Entrada dene um campo para entrada de texto e estabelece a conexo entre os
contextos em seu mtodo de inicializao:
1 import java.applet.*,
2 import java.awt.*,
3 import java.awt.event.*,
4 public class Entrada extends Applet
5 TextField tf new TextField(0),
6 TextAreaApplet ta,
7 public void init()
8 add(tf),
9 ta (TextAreaApplet) getAppletContext().getApplet("mostra"),
10 tf.addActionListener(new ActionListener()
11 public void actionPerformed(ActionEvent ae)
12 ta.append(tf.getText()),
13
14 ),
c 2001 FEEC/UNICAMP 70
4.3. Desenvolvimento de applets
15
16
E possivel tambm determinar que o navegador deve carregar um novo documento a partir de
um applet, usando o mtodo showDocument() de AppletContext. O argumento para esse
mtodo um objeto localizador uniIorme de recursos, do tipo java.net.URL.
c 2001 FEEC/UNICAMP 71
Captulo 5
Desenvolvimento de aplicaes
distribudas
Entre os atrativos de Java esta a Iacilidade que essa linguagem oIerece para desenvolver aplica-
es para execuo em sistemas distribuidos. Ja em sua primeira verso, Java oIerecia Iacilidades
para o desenvolvimento de aplicaes cliente-servidor usando os mecanismos da Internet, tais como
os protocolos TCP/IP e UDP.
Se o cliente na aplicao distribuida precisa acessar um servidor de banco de dados relacional,
Java oIerece uma API especca para tal m, JDBC. Atravs das classes e interIaces desse pacote
possivel realizar consultas expressas em SQL a um servidor de banco de dados e manipular as tabelas
obtidas como resultado dessas consultas.
Em termos de desenvolvimento voltado para a World-Wide Web, Java oIerece o ja classico me-
canismo de applets, codigo Java que executa em uma maquina virtual no lado do cliente Web, como
descrito na Seo 4.3. O mecanismo de servlets permite associar o potencial de processamento da
plataIorma Java a servidores Web, permitindo construir assim uma camada miaaleware baseada no
protocolo HTTP e em servios implementados em Java.
Aplicaes distribuidas mais elaboradas podem ser desenvolvidas usando uma arquitetura de ob-
jetos distribuidos, onde aplicaes orientadas a objetos lidam diretamente com reIerncias a objetos
em processos remotos. Java oIerece duas alternativas nessa direo, RMI (Remote Methoa Invocati-
on), uma soluo 100 Java, e Java IDL, uma soluo integrada a arquitetura padro CORBA. Um
passo adiante na evoluo desse tipo de sistema a utilizao do conceito de agentes moveis, onde
no apenas reIerncias a objetos so manipuladas remotamente mas os proprios objetos codigo e
estado movem-se pela rede.
5.1 Programao cliente-servidor
O paradigma de programao distribuida atravs da separao das aplicaes entre servidores
(aplicaes que disponibilizam algum servio) e clientes (aplicaes que usam esses servios) Ioi
a arquitetura de distribuio predominante nos anos 1990. Um dos seus atrativos o aumento da
conabilidade (a Ialha de uma maquina no necessariamente inviabiliza a operao do sistema como
um todo) e reduo de custo (maquinas mais simples podem executar os servios isoladamente, ao
invs de ter uma grande maquina Iazendo todos os servios).
72
5.1. Programao cliente-servidor
As aplicaes clientes e servidoras so programas executando em maquinas distintas, trocando
inIormao atravs de uma rede de computadores. Para que os servios possam ser solicitados, a
aplicao cliente deve conhecer quem Iornece o servio (o endereo da aplicao servidora) e qual o
protocolo pr-estabelecido para realizar a solicitao.
Entre as vantagens citadas para o modelo de programao cliente-servidor destacam-se:
Relaciona a execuo de processos distintos.
OIerece uma estruturao do processamento distribuido baseado no conceito de servios, tendo
um servidor, o provedor de servios, e um cliente, o consumidor de servios oIerecidos.
Permite compartilhamento de recursos, com o servidor atendendo a varios clientes.
OIerece transparncia de localizao, com tratamento uniIorme independentemente de proces-
sos estarem na mesma maquina ou em maquinas distintas.
Permite a comunicao atravs da troca de mensagens, oIerecendo uma arquitetura Iracamente
acoplada atravs das mensagens para solicitaes (cliente para servidor) e respostas (servidor
para cliente).
Encapsula servios, pois o cliente no precisa saber como servidor implementa o servio, mas
apenas a interIace para solicitao e resposta.
Estaremos estudando aqui como Java oIerece e simplica o suporte a esse tipo de programao
atravs das Iuncionalidades do pacote java.net. A partir da apresentao de alguns conceitos pre-
liminares, apresenta-se os Iundamentos Java para criar aplicaes distribuidas usando os mecanismos
de TCP/IP, UDP e HTTP.
5.1.1 Conceitos preliminares
A programao em redes de computadores atualmente a regra, no a exceo. A principal
vantagem nesse modelo de programao a possibilidade de distribuir tareIas computacionalmente
pesadas e conjuntos extensos de dados e inIormaes entre diversas maquinas.
No entanto, ha um custo associado a essa distribuio. Ha necessidade de trocar mensagens entre
as maquinas envolvidas no processamento, com um custo (tempo) adicional necessario para eIetivar
essa troca.
E importante tambm que os dispositivos envolvidos na troca de mensagens comuniquem-se
usando uma mesma linguagem, ou protocolo. Protocolos so organizados em camadas (ou pilhas)
de diIerentes niveis de abstrao. O conjunto de protocolos mais comuns na programao em rede
aquele estabelecido pela arquitetura TCP/IP, que opera com um software de suporte oIerecido pelo
sistema operacional de uma maquina ligada em rede.
A arquitetura TCP/IP organiza uma rede de computadores em quatro camadas:
Interface de rede: dene padres de conexo a rede Iisica, seja local (Ethernet-CSMA/CD, Token
Ring, FDDI, ATM) ou de longa distncia (HDLC, X.25, ATM). Opera com endereos Iisicos,
realizando a converso entre endereos Iisicos e logicos atravs dos protocolos ARP (Aaaress
Resolution Protocol) e RARP (Reverse ARP).
c 2001 FEEC/UNICAMP 73
5.1. Programao cliente-servidor
Inter-redes: protocolos para transporte no-convel de mensagens (IP Internet Protocol), para
controle da comunicao e inIorme de erros (ICMP Internet Control Message Protocol) e
para roteamento de mensagens (EGP Exterior Gatewav Protocol, RIP Routing Informa-
tion Protocol). Endereos para comunicao host a host so logicos (endereos IP).
Transporte: protocolos para transporte convel de dados por conexo (TCP/IP Transfer Control
Protocol/IP) e para transporte de datagramas, sem conexo (UDP User Datagram Protocol).
Introduz o conceito de porta (endereo que identica a aplicao na maquina). Endereos nesse
nivel so descritos por um par (host, port).
Aplicao: dene conjunto de servios manipulados por usuarios. Servios utilizam losoa cliente-
servidor, com os servidores estabelecendo portas para disponibilizao do servio. Algumas
portas de servios TCP/IP ja so pr-denidas, sendo denominadas de portas notaveis. Exem-
plos de portas notaveis incluem: 7, echo (reenvia o que recebe); 21, Itp (transIerncia de
arquivos); 23, telnet (terminal virtual); 25, smtp (correio eletrnico); e 37, time (envia hora e
data local da maquina).
Na verso corrente do protocolo, endereos IP ocupam 32 bits e so divididos em cinco classes.
As classes A, B e C tm seus endereos estruturados em um prexo de identicao de classe (bina-
rios 0, 10 e 110, respectivamente), identicador de subrede (7, 14 e 21 bits) e identicador de host.
A classe D (prexo 1110) utilizada para multicast, enquanto que endereos da classe E (11110) so
reservados para uso Iuturo. Usualmente, endereos IP so representados por uma quadrupla de valo-
res decimais correspondente aos quatro grupos de 8 bits do endereo. Nessa Iorma de representao,
endereos iniciados por valores entre 0 e 127 so da classe A; entre 128 e 191, classe B; entre 192 e
223, classe C; entre 224 e 239, classe D; e entre 240 e 247, classe E.
Existe tambm uma Iorma de representao simbolica de endereos IP baseada em nomes de
dominios. Dominios so parties da rede Internet organizados hierarquicamente em estruturas de
dominios e sub-dominios. Existe um mapeamento entre endereos IP representados simbolicamente
e numericamente, o qual realizado por servidores de nome distribuidos pela Internet atravs do
Sistemas de Nomes de Dominio (DNS).
O desenvolvimento de software na arquitetura TCP/IP segue a losoa de particionamento em
multiplos processos concorrentes. Isso permite a simplicao de projeto, implementao e mani-
pulao de software para ambientes distribuidos, assim como a gerncia independente de protocolos
em diversos niveis.
O software organizado na Iorma de processos independentes. No nivel mais proximo da ma-
quina, isso permite o isolamento dos dispositivos Iisicos atravs da utilizao de aevice arivers.
No nivel da camada de transporte, dois tipos de processos so suportados. A inIormao em pro-
cessos TCP (entrada ou saida) manipulada atravs do conceito de streams (arquivos seqenciais).
Ja a inIormao em processos UDP manipulada atravs do conteudo de pacotes datagramas, envia-
dos sem vericao de conteudo ou garantia de recebimento. O processo IP atua como chaveador de
datagramas.
As portas estabelecem a ligao entre o processo da aplicao e os processos IP, estando associ-
adas a buffers nitos com acesso controlado. O acesso a portas pode soIrer bloqueio devido a uma
tentativa de ler de uma porta com buffer vazio ou de escrever para porta com buffer cheio.
c 2001 FEEC/UNICAMP 74
5.1. Programao cliente-servidor
5.1.2 Aplicaes TCP/IP
Para estabelecer a conexo TCP, preciso identicar as extremidades dessa conexo tanto no
processo cliente como no processo servidor. Essas extremidades so soquetes, identicados por um
endereo de rede e um numero de porta. A conexo pode ser interpretada como uma ligao direta
entre os dois processos, atravs da qual os bytes podem uir nos dois sentidos.
Um soquete TCP estabelece uma conexo stream bidirecional entre os endereos (hostC,portC)
e (hostS,portS), ou seja, entre uma aplicao cliente em execuo na maquina hostC controlando a
porta portC e outra aplicao servidora em execuo na maquina hostS monitorando a porta portS de
hostS. A aplicao cliente utiliza a porta portC da maquina hostC para enviar solicitaes de servios
e para receber retornos a suas solicitaes. A aplicao servidora monitora constantemente a porta
portS da maquina hostS aguardando a chegada de solicitaes de servio. Quando alguma solicitao
recebida, a aplicao servidora executa o servio e utiliza a conexo para enviar o retorno com os
resultados do servio.
Java suporta a troca de bytes entre um cliente e um servidor TCP atravs do estabelecimento
de uma conexo entre eles. Todas as Iuncionalidades de Java reIerentes ao estabelecimento de uma
conexo TCP esto agregadas no pacote java.net.
Clientes TCP em 1ava
Em Java, a classe que permite o estabelecimento de uma conexo pelo lado do cliente Socket.
Para criar um soquete, o construtor da classe tipicamente utilizado :
public Socket(InetAddress address, int port) throws IOException
Uma vez que a conexo entre cliente e servidor tenha sido estabelecida pela criao dos correspon-
dentes soquetes, os dados da aplicao podem uir atravs dos streams a ela associados.
Os argumentos do construtor estabelecem o endereo IP da maquina remota na conexo. A classe
InetAddress de java.net permite representar endereos IP como objetos Java. Uma vez que
um objeto Java esteja representando um endereo IP, ele pode ser utilizado como parmetro para
mtodos de outras classes que manipulam transIerncias de dados atravs dos protocolos TCP/IP.
Os mtodos estaticos dessa classe permitem denir tais objetos associados a representao sim-
bolica ou numrica de endereos IP InetAddress.getByName(String host) ou as-
sociados a maquina local InetAddress.getLocalHost().
Este exemplo ilustra a manipulao de endereos IP atravs dos mtodos dessa classe:
1 import java.net.*,
2 public class WhoIs
3 public static void main(String] args)
4 try
5 InetAddress myself InetAddress.getLocalHost(),
6 System.out.println("Local host is " +
7 myself.getHostName() +
8 " at IP address " +
9 myself.getHostAddress()),
10
c 2001 FEEC/UNICAMP 75
5.1. Programao cliente-servidor
11 catch (UnknownHostException uhe)
12 System.err.println(uhe),
13
14 // Processamento dos argumentos na linha de comando
15 int count 0,
16 InetAddress otherHost,
17 while (count > args.length)
18 try
19 otherHost InetAddress.getByName(args]count),
20 System.out.println("Host " + otherHost.getHostName() +
21 " is at IP address " +
22 otherHost.getHostAddress()),
23
24 catch (UnknownHostException uhe)
25 System.err.println(uhe),
26
27 ++count,
28
29
30
A classe Socket oIerece tambm mtodos para obter inIormaes sobre os endereos (maquina
e porta) envolvidos na conexo e para estabelecer timeouts associados a conexo.
Quando um soquete criado, automaticamente so estabelecidos streams de entrada e de saida
para a transIerncia de dados pela conexo. Os mtodos getInputStream() e getOutputS-
tream() da classe Socket permitem identicar os objetos associados a esses streams.
Streams implementam o conceito de cadeias unidirecionais de dados (FIFO, First-In, First-Out)
apenas de escrita ou apenas de leitura. Assim, uma aplicao pode obter dados do inicio de um stream
de entrada e pode enviar dados para o nal de um stream de saida de dados, sempre seqencialmente.
Streams em Java so suportados por classes do pacote java.io (Seo 3.2). Para leitura seqen-
cial de bytes utiliza-se um objeto da classe InputStream; para enviar bytes para um stream utiliza-
se um objeto OutputStream e seus mtodos write(), para agregar bytes ao stream, e flush(),
para assegurar que os bytes inseridos sejam eIetivamente encaminhados a seu destino.
Servidores TCP em 1ava
O processo servidor na arquitetura TCP deve estar preparado para responder a solicitaes de
conexes por parte dos clientes, permanecendo em estado de espera entre solicitaes. Assim, um
servidor TCP/IP deve realizar duas tareIas basicas: permanecer em execuo aguardando (listening)
a chegada de requisies em alguma porta pr-especicada; e responder a solicitao atravs de uma
conexo estabelecida com o cliente em Iuno da requisio recebida.
Em Java, a classe que permite a criao de servidores com essa Iuncionalidade ServerSoc-
ket, tambm do pacote java.net. O principal mtodo desta classe accept(), que implementa
a espera bloqueada por uma solicitao no endereo de porta especicado na construo do objeto.
c 2001 FEEC/UNICAMP 76
5.1. Programao cliente-servidor
O retorno desse mtodo um objeto da classe Socket que estabelece a conexo com a aplicao
cliente.
Esse exemplo mostra o codigo para um servidor que responde a qualquer solicitao com uma
mensagem xa, cujo conteudo a seqncia de bytes que compe um endereo URL:
1 import java.io.*,
2 import java.net.*,
3 import java.util.*,
4 public class TCPServerI
5 public static void main(String] args)
6 ServerSocket ss null,
7 Socket cliente null,
8 OutputStream os null,
9 try
10 ss new ServerSocket(0),
11 System.out.println("Server. Aguardando na porta " +
12 ss.getLocalPort()),
13 while (true)
14 cliente ss.accept(),
15 os cliente.getOutputStream(),
16 System.out.println("Server. " +
17 "Processando solicitacao de " +
18 cliente.getInetAddress().getHostName()),
19 String data
20 "http.//www.dca.fee.unicamp.br/cursos/PooJava/",
21 byte] buffer data.getBytes(),
22 System.out.println("Server. Enviando \"" +
23 new String(buffer) + "\""),
24 os.write(buffer),
25 os.flush(),
26
27
28 catch (Exception e)
29 System.err.println(e),
30
31 finally
32 try
33 os.close(),
34 cliente.close(),
35 ss.close(),
36
37 catch (Exception e)
38 e.printStackTrace(),
39
40
c 2001 FEEC/UNICAMP 77
5.1. Programao cliente-servidor
41
42
Uso de mltiplas threads
Tipicamente, por razes de ecincia, um servidor TCP implementado como um processo
multithreaaea. Um dos possiveis problemas na execuo de aplicaes segundo o modelo cliente-
servidor esta associado com o tempo de atendimento a uma solicitao pelo servidor. Se o servidor
Ior um processo monolitico, ele estara indisponivel para receber novas requisies enquanto a soli-
citao no Ior completamente atendida. A soluo para este problema depende da possibilidade de
se estabelecer um processamento independente para o atendimento de cada solicitao ao servidor,
liberando to cedo quanto possivel o servidor para receber novas solicitaes.
O conceito de processamento independente parte integrante da linguagem Java, atravs de mul-
tithreaaing. Todo processamento em Java esta associado a alguma threaa, sendo que novas threaas
de execuo podem ser criadas a partir de qualquer threaa. A criao de novas threaas em geral
associada a classes que implementam a interIace Runnable do pacote java.lang. Essa inter-
Iace especica o mtodo run(), os quais so utlizados para criar objetos da classe Thread, com
mtodos start() e stop(), entre outros.
Com as Iacilidades suportadas pela linguagem, torna-se atrativo implementar servidores multith-
reaaea, cujo corpo principal de processamento resume-se a um lao eterno para aceitar solicitaes
na porta especicada e criar um objeto threaa para atender a solicitao recebida. A Iuncionalidade
do servio que sera executado pela threaa denida no corpo do mtodo run() que implementa a
interIace Runnable associada a threaa criada. Cada threaa criada existe exclusivamente durante o
tempo necessario para atender a solicitao.
O seguinte exemplo revisita o servidor TCP anteriormente apresentado usando o mecanismo de
multiplas threaas de execuo:
1 import java.io.*,
2 import java.net.*,
3 import java.util.*,
4 class DataProvider implements Runnable
5 Socket client,
6 OutputStream os null,
7 public DataProvider(Socket s) throws IOException
8 client s,
9 os client.getOutputStream(),
10
11 public void run()
12 String data
13 "http.//www.dca.fee.unicamp.br/courses/PooJava/",
14 byte] buffer data.getBytes(),
15 try
16 os.write(buffer),
17 os.flush(),
18 os.close(),
c 2001 FEEC/UNICAMP 78
5.1. Programao cliente-servidor
19 client.close(),
20
21 catch (Exception e)
22 System.err.println(e),
23
24
25
26 public class TCPServer?
27 public static void main(String] args)
28 ServerSocket ss null,
29 Socket cliente null,
30 try
31 ss new ServerSocket(0),
32 System.out.println("Server. Aguardando na porta " +
33 ss.getLocalPort()),
34 while (true)
35 cliente ss.accept(),
36 System.out.println("Server. " +
37 "Processando solicitacao de " +
38 cliente.getInetAddress().getHostName()),
39 DataProvider dp new DataProvider(cliente),
40 new Thread(dp).start(),
41
42
43 catch (Exception e)
44 System.err.println(e),
45
46 finally
47 try
48 ss.close(),
49
50 catch (Exception e)
51 System.err.println(e),
52
53
54
55
5.1.3 Aplicaes UDP
Aqui sero apresentadas as Iuncionalidades que Java oIerece para a programao cliente-servidor
usando o protocolo de transporte UDP.
A principal diIerena em relao a programao cliente-servidor em TCP que o protocolo UDP
no suporta o conceito da transIerncia por streams de dados. UDP trabalha diretamente com o con-
ceito de pacotes (datagramas). Assim, UDP no oIerece a garantia de envio ou recepo e nem de
c 2001 FEEC/UNICAMP 79
5.1. Programao cliente-servidor
ordenao correta dos pacotes. Por outro lado, a ausncia desses mecanismos permite uma transIe-
rncia mais rapida.
O endereamento em UDP da-se como para a programao TCP, usando a classe Java InetAd-
dress.
Soquetes UDP
Assim como para o protocolo TCP, UDP estabelece uma conexo entre o processo da aplicao
e a rede atravs de um soquete.
Em Java, soquetes UDP so manipulados atravs de objetos da classe DatagramSocket. O
construtor padro para essa classe cria um soquete local na primeira porta disponivel. Alternativa-
mente, outro construtor permite especicar o numero da porta desejado.
Ao contrario da classe Socket, um DatagramSocket no estabelece uma conexo com uma
maquina remota, mas simplesmente um acesso local para a rede que pode ser utilizada para enviar e
receber pacotes, atravs dos mtodos send() e receive(), respectivamente.
Ha um mtodo connect() associado a objetos da classe DatagramSocket; no entanto, esse
mtodo atua como um ltro, so permitindo enviar ou receber pacotes para ou de um endereo IP ao
qual o soquete Ioi conectado. O mtodo disconnect() permite desconectar um soquete de um
destino pr-especicado.
Datagramas
Os pacotes enviados e recebidos atravs dos soquetes UDP so objetos Java da classe Data-
gramPacket. Objetos dessa classe podem ser construidos de duas maneiras, dependendo se sero
enviados ou recebidos atravs do soquete UDP:
Pacotes a enviar. Nesse caso, deve ser utilizado o construtor que incorpora em seus argumentos o
arranjo de bytes a enviar, seu tamanho, e o endereo de destino (maquina, especicada pelo
seu endereo IP, e porta).
Pacotes a receber. Nesse caso, os argumentos especicam apenas o arranjo de bytes para onde o
conteudo do pacote sera transIerido e o limite no tamanho do pacote que sera recebido nesse
arranjo.
Uma vez que um pacote tenha sido recebido, a inIormao sobre sua origem pode ser obtida
atravs dos mtodos getAddress() e getPort(). Os dados eIetivamente recebidos podem ser
extraidos do pacote usando o mtodo getData(); o mtodo getLength() permite determinar a
dimenso dos dados.
Multicast
Um MulticastSocket uma especializao de um DatagramSocket que permite que
uma aplicao receba pacotes datagramas associados a um endereo multicast (classe D, endereos
entre 224.0.0.1 e 239.255.255.255). No preciso nenhuma Iuncionalidade especial para apenas
enviar datagramas para um endereo multicast.
c 2001 FEEC/UNICAMP 80
5.1. Programao cliente-servidor
Todos os soquetes multicast que estejam inscritos em um endereo multicast recebem o datagra-
ma que Ioi enviado para esse endereo e porta. Para gerenciar a inscrio de um soquete em um
endereo multicast, dois mtodos so oIerecidos na classe MulticastSocket.
O primeiro, joinGroup(InetAddress m), permite a aplicao juntar-se a um grupo mul-
ticast. E o mtodo que inscreve o soquete no grupo associado ao endereo multicast especicado
como argumento.
O outro mtodo, para desligar-se de um grupo multicast, leaveGroup(InetAddress m),
que desconecta o soquete do grupo multicast especicado.
5.1.4 Aplicaes HTTP
A Worla Wiae Web (WWW ou simplesmente Web) a primeira concretizao de uma rede mun-
dial de inIormao atravs de computadores. Proposta em 1989 no CERN (Suia) por Tim-Berners
Lee, ela interconecta principalmente documentos hipertexto (expressos em HTML HvperText
Markup Language) usando a inIra-estrutura da Internet para a transIerncia de inIormao. Sua
diIuso expandiu-se principalmente apos a popularizao de interIaces grcas com o usuario para
navegao em hipertexto, iniciada a partir do lanamento do aplicativo Mosaic no NCSA (EUA).
A Web pode ser vista como um servio de aplicao da arquitetura TCP/IP. Como tal, a arquitetu-
ra da Web dene um esquema de endereamento (URL) no nivel da aplicao; estabelece protocolos
de sesso (soquetes TCP/IP) e apresentao (HTML e auxiliares); dene um protocolo (HTTP) no
nivel da aplicao; e segue o modelo cliente-servidor.
As aplicaes clientes na Web so usualmente navegadores (browsers) responsaveis pela apresen-
tao de documentos HTML e pela solicitao de um recurso a servidores Web. O recurso pode ser
um documento HTML ou um arquivo contendo inIormao texto ou binaria (imagem, audio, video,
applet Java, etc), conIorme estabelecido pelo elemento que originou a solicitao.
No necessariamente o software navegador precisa saber manipular todos os tipos de recursos,
podendo ele ativar rotinas auxiliares de exibio para tipos no reconhecidos. As rotinas auxiliares
podem ser ativadas sob a Iorma de programas executaveis externos ao navegador ou atravs de plug-
ins. O conceito de plug-in Ioi desenvolvido pela Nestcape, sendo constituido por uma interIace de
programao (API) padronizada para ativar Iuncionalidades carregadas dinamicamente.
Servidores Web so responsaveis por atender a solicitaes de clientes, por deIault operando
na porta notavel 80. As Iuncionalidades basicas de servidores Web incluem: organizar e gerenciar
os recursos HTTP; prover acesso seguro a esses recursos; e processar scripts (extenses CGI, por
exemplo ver Seo 5.3).
Java tambm oIerece suporte ao desenvolvimento de aplicaes sobre a Web usando recursos do
pacote java.net. Dentre os conceitos oIerecidos pela linguagem Java para a programao distri-
buida ha uma grande nIase na programao direcionada para a Web, com suporte para a manipulao
de recursos Web atravs de URL, a manipulao de conexes HTTP, a converso de strings para o
Iormato de codicao www-urlencoaea e suporte a manipulao de conteudos de diIerentes tipos
MIME.
Endereamento por URL
Um endereo localizador uniIorme de recursos (URL) denido por uma seqncia de caracteres
que identica de Iorma global e precisa um recurso na Web. A Iorma genrica de um URL
c 2001 FEEC/UNICAMP 81
5.1. Programao cliente-servidor
esquema.parte_especifica
onde o esquema identica o protocolo utilizado para manipular o recurso, tais como http, Itp,
mailto, telnet e nntp. A parte especca descreve o endereo do recurso de acordo com a inIra-
estrutura e o tipo de recurso.
Na Internet, a parte especca de um URL toma a Iorma genrica
//user.passwordOhost.port/url-path
onde nem todos os campos devem necessariamente estar presentes para todos os recursos enderea-
dos. Quando port omitido, a porta notavel para o esquema especicado utilizada (21 para Itp,
23 para telnet, 25 para mailto, 80 para http). O campo url-path dependente do esquema.
A classe java.net.URL oIerece a Iuncionalidade de nivel mais alto (menor detalhamento)
para a especicao de recursos Web. Cada recurso esta associado a um objeto dessa classe, sendo
que o localizador (URL) do recurso especicado na construo do objeto.
Uma vez que o objeto URL esteja instanciado, ha trs maneiras de realizar a transIerncia do
conteudo do recurso para a aplicao local.
Na primeira Iorma, atravs do mtodo openStream(), obtm-se um uxo de leitura de bytes
que permite transIerir o conteudo do recurso. Outra possibilidade usar o mtodo openConnecti-
on(), que retorna um objeto da classe (abstrata) URLConnection. Esta classe permite manipular
um maior numero de detalhes reIerentes a conexo URL, tais como obter dimenso, tipo e codica-
o do conteudo, manipulao do conteudo associado a um stream de entrada, obteno do cabealho
e outras. Finalmente, possivel usar o mtodo getContent(), que obtm o conteudo do recurso
diretamente. Nesse caso, um objeto ContentHandler especco para o tipo de recurso recebido
sera ativado.
Conexes HTTP
O protocolo no nivel da aplicao para a transIerncia de hipertexto (HTTP, HvperText Transfer
Protocol) opera sobre o protocolo TCP/IP para estabelecer um mecanismo de servio com estrutura
requisio-resposta. Uma das caracteristicas peculiares de HTTP a composio exivel do cabea-
lho, composto por diversas linhas, o que permite sua utilizao como integrador de diversos Iormatos
e no apenas de documentos HTML.
Essa exibilidade reete-se tambm na maior complexidade desse protocolo. No entanto, pos-
sivel estabelecer servidores HTTP operando com conguraes simplicadas, onde nem todos os
servios previstos no protocolo so implementados.
Os principais servios de HTTP incluem:
GET: solicita ao servidor o envio de um recurso; o servio essencial para o protocolo.
HEAD: variante de GET que solicita ao servidor o envio apenas de inIormaes sobre o recurso.
PUT: permite que o cliente autorizado armazene ou altere o conteudo de um recurso mantido pelo
servidor.
POST: permite que o cliente envie mensagens e conteudo de Iormularios para servidores que iro
manipular a inIormao de maneira adequada.
c 2001 FEEC/UNICAMP 82
5.2. Acesso a bancos de dados
DELETE: permite que o cliente autorizado remova um recurso mantido pelo servidor.
Um cabealho HTTP composto por uma linha contendo a especicao do servio e recurso
associado, seguida por linhas contendo parmetros. Um exemplo de requisio gerada por um cliente
HTTP :
GET http.//www.dca.fee.unicamp.br/
Accept. text/html, image/gif, image/jpeg
User-Agent. Mozilla/.0
para a qual o cabealho da resposta poderia ser:
HTTP/I.I ?00 OK
Date. Wed, ?4 Mar I999 ?.?.4S GMT
Server. Apache/I.?b8
Connection. close
Content-Type. text/html
Content-length. 848
A indicao do tipo de conteudo do recurso (usada nos parmetros Accept e Content-Type)
seguem a especicao no padro MIME (Multipurpose Internet Mail Extensions).
A classe HttpURLConnection uma especializao da classe URLConnection. Quando
um objeto da classe URL invoca openConnection() esse o tipo de conexo retornada quando
o protocolo HTTP.
Alm das Iuncionalidades de conexes URL, essa classe dene varias constantes associadas espe-
cicamente ao protocolo HTTP (tais como os codigos de erros) e alguns poucos mtodos especcos
de conexo HTTP.
Codicao e decodicao de dados
A traduo de strings para o Iormato esperado por um servidor Web a partir de um Iormulario,
x-www-form-urlencoaea, suportada atravs da classe URLEncoder. Essa classe oIerece o mtodo
estatico encode(String s), retornando uma string com o conteudo codicado do argumento.
O Iormato www-urlencoaea agrega em uma unica string uma srie de pares na Iorma atribu-
tovalor separados pelo simbolo `&`. Nesse Iormato, espaos so convertidos para o simbolo ``
e caracteres com conotao especial tais como , e & so representados por seqncia de
escape `xx` para a representao hexadecimal do valor ASCII do carater. Assim, o carater `` que
Iaa parte do nome de um atributo ou parte do conteudo de um valor sera codicado na string na
Iorma `3d`.
O processo de traduo a partir de uma string nesse Iormato, que seria o necessario para imple-
mentar um servio em Java que recebesse dados de um Iormulario, oIerecido pela classe URLDe-
coder, atravs do mtodo estatico decode(String).
5.2 Acesso a bancos de dados
A linguagem Java vem se destacando como uma alternativa viavel para a integrao de apli-
caes novas e legadas na Internet. Essa inIra-estrutura de integrao no estaria completa se no
contemplasse o acesso a sistemas de bancos de dados.
c 2001 FEEC/UNICAMP 83
5.2. Acesso a bancos de dados
Um sistema de banco de dados constituido por uma coleo organizada de dados (a base de
dados) e pelo software que coordena o acesso a esses dados (o sistema gerenciador de banco de dados,
ou SGBD). Utilizar um sistema de banco de dados ao invs de simples arquivos para armazenar de
Iorma persistente os dados de uma aplicao apresenta diversas vantagens, das quais se destacam:
o desenvolvedor da aplicao no precisa se preocupar com os detalhes do armazenamento,
trabalhando com especicaes mais abstratas para a denio e manipulao dos dados;
tipicamente, um SGBD incorpora mecanismos para controle de acesso concorrente por multi-
plos usuarios e controle de transaes;
possivel compartilhar dados comuns entre mais de uma aplicao mesmo que a viso dos
dados de cada aplicao seja distinta.
Existem solues para integrar aplicaes Java a bancos de dados orientados a objetos e a bancos
de dados relacionais. Neste caso, a soluo padronizada atravs da especicao JDBC.
5.2.1 Bancos de dados relacionais
Um banco de dados relacional organiza seus dados em relaes. Cada relao pode ser vista
como uma tabela, onde cada coluna corresponde a atributos da relao e as linhas correspondem as
tuplas ou elementos da relao. Em uma nomenclatura mais proximas aquela de sistemas de arquivos,
muitas vezes as tuplas so denominadas registros e os atributos, campos.
Um conceito importante em um banco de dados relacional o conceito de atributo chave, que
permite identicar e diIerenciar uma tupla de outra. Atravs do uso de chaves possivel acelerar o
acesso a elementos (usando indices) e estabelecer relacionamentos entre as multiplas tabelas de um
sistema de banco de dados relacional.
Essa viso de dados organizados em tabelas oIerece um conceito simples e Iamiliar para a estru-
turao dos dados, sendo um dos motivos do sucesso de sistemas relacionais de dados. Certamente,
outros motivos para esse sucesso incluem o Iorte embasamento matematico por tras dos conceitos uti-
lizados em bancos de dados relacionais e a uniIormizao na linguagem de manipulao de sistemas
de bancos de dados relacionais atravs da linguagem SQL.
Sob o ponto de vista matematico, uma relao o subconjunto do produto cartesiano dos domi-
nios da relao. Sendo um conjunto, possivel realizar operaes de conjuntos tais como unio,
interseo e diIerena envolvendo duas relaes de mesma estrutura.
No entanto, um dos pontos mais Iortes do modelo relacional esta nos mecanismos de manipula-
o estabelecidos pela Algebra Relacional. Os trs principais operadores da algebra relacional so
seleo, projeo e juno.
A operao de seleo tem como argumento uma relao e uma condio (um predicado) envol-
vendo atributos da relao e/ou valores. O resultado uma outra relao contemplando apenas as
tuplas para as quais a condio Ioi verdadeira.
A operao de projeo tem como argumento uma relao e uma lista com um subconjunto dos
atributos da relao. O resultado outra relao contendo todas as tuplas da relao mas apenas com
os atributos especicados.
Observe que se a lista de atributos no englobar a chave da relao, o resultado dessa operao
poderia gerar tuplas iguais. Sob o ponto de vista estritamente matematico, os elementos duplicados
devem ser eliminados, pois no Iazem sentido para um conjunto.
c 2001 FEEC/UNICAMP 84
5.2. Acesso a bancos de dados
A operao de juno recebe como argumentos duas relaes e uma condio (um predicado)
envolvendo atributos das duas relaes. O resultado uma relao com os atributos das duas relaes
contendo as tuplas que satiszeram o predicado especicado. A operao de juno no uma
operao primitiva, pois pode ser expressa em termos da operao de produto cartesiano e da seleo,
mas uma das operaes mais poderosas da algebra relacional.
A Iorma mais usual de juno aquela na qual a condio de juno a igualdade entre valores
de dois atributos das relaes argumentos. Essa Iorma to usual que recebe o nome de juno
natural. Nesse caso, o atributo comum aparece apenas uma vez na relao resultado, ja que ele teria
para todas as tuplas o mesmo valor nas duas colunas.
5.2.2 SQL
SQL uma linguagem padronizada para a denio e manipulao de bancos de dados relaci-
onais. Tipicamente, um SGBD oIerece um interpretador SQL que permite isolar a aplicao dos
detalhes de armazenamento dos dados. Se o projetista da aplicao tiver o cuidado de usar apenas
as construes padronizadas de SQL, ele podera desenvolver a aplicao sem se preocupar com o
produto SGBD que estara sendo utilizado depois.
As trs componentes de SQL so:
1. uma linguagem de denio de dados (DDL) para denir e revisar a estrutura de bancos de
dados relacionais;
2. uma linguagem de controle de dados (DCL) para especicar mecanismos de segurana e inte-
gridade dos dados; e
3. uma linguagem de manipulao de dados (DML) para ler e escrever os dados.
A DDL supre as Iacilidades para a criao e manipulao de esquemas relacionais. Uma das
necessidades de uma aplicao que ira armazenar seus dados em um sistema de banco de dados
relacional como criar uma identidade para o conjunto de tabelas de sua aplicao. Esse mecanismo
no padronizado em SQL, podendo variar de Iornecedor a Iornecedor de banco de dados. Algumas
possibilidades incluem
CREATE SCHEMA name ]AUTHORIZATION user | group
ou
CREATE DATABASE name ]On default | device
]Log On device ] size
Para criar uma tabela, o comando CREATE TABLE utilizado:
CREATE TABLE name ( ATTRIBUTE DOMAIN ]UNIQUE ]NULL | NOT NULL)
Alguns Iabricantes adotam, ao invs da Iorma UNIQUE para indicao de chave da relao, um
comando Primary Key apos a criao da tabela para indicar qual atributo Iormara ou quais atri-
butos comporo a chave primaria da relao.
Ocampo ATTRIBUTE especica o nome para a aplicao da coluna da tabela, enquanto DOMAIN
especica o tipo de dado para a coluna. Alguns tipos de dados usuais em SQL so INTEGER,
c 2001 FEEC/UNICAMP 85
5.2. Acesso a bancos de dados
DECIMAL(p,q) dos digitos so casas decimais, FLOAT(p) a preciso, CHARACTER(n)
string de caracteres, BIT(n) arranjo de valores booleanos, DATE, TIME e TIMESTAMP.
Alm desses comandos, ALTER TABLE permite modicar a estrutura de uma tabela existente e
DROP TABLE permite remover uma tabela.
O principal comando da DML de SQL SELECT. Por exemplo, para obter todos os dados de
uma relao utiliza-se a Iorma basica:
SELECT * FROM table
Atravs do mesmo comando, possivel especicar projees e selees de uma tabela:
SELECT columns FROM table WHERE condition
A condio pode envolver comparaes entre atributos e/ou valores constantes, podendo para
tanto utilizar comparadores tais como igual (), maior que (~), menor que (), maior ou igual que
(~), menor ou igual que (), diIerente (! ou ~) e comparadores de strings (LIKE string`, onde
string` pode usar os caracteres ` e `` para indicar um carater qualquer os uma seqncia qual-
quer de caracteres, respectivamente). As comparaes podem ser combinadas atravs dos conectivos
logicos And, Or e Not.
E possivel expressar as quatro operaes aritmticas (, -, *, /), tanto para a condio como para
a especicao de recuperao dos dados.
E possivel tambm especicar a ordem desejada de apresentao dos dados, usando para tal a Ior-
ma SELECT...ORDER BY.... Uma alternativa a esse comando SELECT...GROUP BY...,
que ordena os dados e no apresenta elementos que tenham o mesmo valor para a clausula de agru-
pamento.
Uma importante categoria de Iunes de SQL incluem as Iunes de agregao, que permitem
computar a mdia (Avg), a quantidade (Count), o maior ou menor valor (Max ou Min) e o total
(Sum) das expresses especicadas.
Atravs do mesmo comando Select, possivel especicar consultas envolvendo multiplas
tabelas, como em
SELECT nome, data FROM Pedidos, Clientes
WHERE Pedidos.NumCliente Clientes.NumCliente
Nesse caso, a juno das duas tabelas Pedidos e Clientes realizada tendo como Num-
Cliente como atributo de juno.
E possivel especicar consultas internas a uma consulta, como em
SELECT NumProduto From Produtos
WHERE PrecoUnit > (SELECT Avg(PrecoUnit) FROM Produtos)
Para qualicar os resultados de uma subconsulta, podem ser utilizadas as Iunes All (a con-
dio Ioi verdadeira para todos os elementos resultantes da subconsulta), Any (verdade para pelo
menos um elemento), Exists (verdade se resultado da consulta tem pelo menos um elemento), In
(verdade se o valor especicado Iaz parte do resultado), Not Exists (verdade se subconsulta teve
resultado vazio) e Not In (verdade se valor especicado no Iaz parte do resultado da subconsulta).
SQL oIerece ainda mecanismos para inserir elementos em uma tabela,
c 2001 FEEC/UNICAMP 86
5.2. Acesso a bancos de dados
INSERT INTO table (columns) VALUES (values)
para modicar valores de colunas de um elemento,
UPDATE table SET column value ], column value*
WHERE condition
e para remover elementos de uma tabela,
DELETE FROM table
WHERE condition
SQL pode ser utilizado diretamente pelo usuario, quando o SGBD oIerece um interpretador SQL
interativo, ou atravs de comandos embutidos em uma aplicao desenvolvida em uma linguagem
de programao. No caso dessa linguagem ser Java, a Iorma de interagir com o banco de dados
especicado por JDBC.
5.2.3 1DBC
Java permite o acesso a bancos de dados relacionais atravs das Iuncionalidades denidas no
pacote java.sql, que dene o 'produto JDBC.
JDBC uma API para execuo e manipulao de resultados a consultas SQL atravs de Java.
Para desenvolver uma aplicao com Java e bancos de dados relacionais, preciso ter disponivel:
O pacote JDBC (padro na distribuio da plataIorma de desenvolvimento Java desde sua
verso 1.1);
Acesso ao servidor, o sistema gerenciador de banco de dados que entende SQL; e
O ariver JDBC adequado ao tipo de SGBD acessado.
Uma vez que esses recursos estejam disponiveis, a aplicao Java tem acesso ao banco de dados
relacional atravs da execuo dos seguintes passos:
1. Habilitar o ariver;
2. Estabelecer uma conexo com o banco de dados;
3. Executar consulta SQL; e
4. Apresentar resultados da consulta.
Driver 1DBC
Do ponto de vista da aplicao Java, um ariver nada mais do que uma classe cuja Iuncionalidade
precisa ser disponibilizada para a aplicao. A Iuncionalidade basica que um ariver deve oIerecer
especicada atravs da interIace Driver.
A classe DriverManager estabelece um conjunto basico de servios para a manipulao de
arivers JDBC. Como parte de sua inicializao, essa classe tentara obter o valor da propriedade
c 2001 FEEC/UNICAMP 87
5.2. Acesso a bancos de dados
jdbc.drivers de um arquivo de denio de propriedades e carregar os arivers especicados
pelos nomes das classes.
Alternativamente, um ariver pode ser carregado explicitamente para a JVM; a Iorma usual para
executar essa tareIa atravs do mtodo forName() da classe Class, como em
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"),
Conexo com banco de dados
Uma vez que o ariver esteja carregado, a aplicao Java pode estabelecer uma conexo com o ge-
renciador de banco de dados. Para especicar com qual banco de dados deseja-se estabelecer a cone-
xo, utilizada uma string na Iorma de um URL na qual o protocolo jdbc. e o restante da string
dependente do ariver. Por exemplo, o ariver jdbc.odbc especica o Iormato jdbc.odbc.dsn,
onde dsn o aata source name que identica o banco de dados.
Identicado o banco de dados, a sesso a ser estabelecida para o acesso ao banco de dados sera
controlada por um objeto de uma classe que implementa a interIace Connection. O DriverMa-
nager oIerece o mtodo getConnection() para executar essa tareIa.
O encerramento de uma sesso sinalizado pelo mtodo close() da conexo:
import java.sql.*,
...
String DB "jdbc....",
...
Connection c DriverManager.getConnection(DB),
...
c.close(), // encerra a sesso
Execuo da consulta
Estabelecida a conexo ao banco de dados, possivel criar uma consulta e executa-la a partir
da aplicao Java. Para representar uma consulta, o JDBC utiliza um objeto de uma classe que
implementa a interIace Statement. Um objeto dessa classe pode ser obtido atravs do mtodo
createStatement() da classe Connection.
Uma vez que um objeto Statement esteja disponivel, possivel aplicar a ele o mtodo exe-
cuteQuery(), que recebe como argumento uma string representando uma consulta SQL.
O resultado da execuo da consulta disponibilizado atravs de um objeto ResultSet.
import java.sql.*,
...
Connection c,
c ...,
Statement s c.createStatement(),
String query,
query ...,
ResultSet r s.executeQuery(query),
...
s.close(),
c 2001 FEEC/UNICAMP 88
5.2. Acesso a bancos de dados
Os mtodos da interIace ResultSet permitem a manipulao dos resultados individuais de uma
tabela de resultados. Mtodos como getDouble(), getInt(), getString() e getTime(),
que recebem como argumento a especicao de uma coluna da tabela, permitem acessar o valor da
coluna especicada na tupla corrente para os diversos tipos de dados suportados.
Para varrer a tabela, um cursor mantido. Inicialmente, ele esta posicionado antes do inicio da
tabela, mas pode ser manipulado pelos mtodos first(), next(), previous(), last() e
absolute(int row).
Por exemplo,
ResultSet r s.executeQuery("Select * from Clientes"),
System.out.println("ID NOME"),
while (r.next())
System.out.println(r.getString("ClienteID")+
" " + r.getString("Nome")),
r.close(),
Para lidar com atributos que podem assumir valores nulos, o mtodo wasNull() oIerecido.
Ele retorna verdadeiro quando o valor obtido pelo mtodo getXXX() Ior nulo, onde XXX um dos
tipos SQL.
A interIace ResultSetMetadata permite obter inIormao sobre a tabela com o resultado da
consulta. Um objeto desse tipo pode ser obtido atravs da aplicao do mtodo getMetaData()
ao ResultSet:
ResultSetMetaData m r.getMetaData(),
Uma vez obtido esse objeto, a inIormao desejada pode ser obtida atravs de mtodos tais como
getColumnCount(), getColumnLabel(), getColumnTypeName() e getColumnTy-
pe(). O ultimo mtodo retorna tipos que podem ser identicados a partir de constantes denidas
para a classe java.sql.Types.
Alm da Iorma Statement, JDBC oIerece duas Iormas alternativas que permitem respecti-
vamente ter acesso a comandos SQL pr-compilados (PreparedStatement) e a procedimentos
armazenados no banco de dados (CallableStatement).
Exemplo completo
Este exemplo ilustra o mecanismo basico para uma aplicao Java acessar um banco de dados. O
objetivo apresentar o conteudo da seguinte relao, a tabela 'notas do banco de dados 'poojava:
> java PoojavaDB
fname lname activ grd
Joao Silva I 8
Joao Silva ? I
Pedro Souza I 8
Pedro Souza ? S
Maria Santos I I
Maria Santos ? 8
c 2001 FEEC/UNICAMP 89
5.3. Servlets
O resultado acima Ioi obtido a partir da execuo da seguinte aplicao, acessando um gerencia-
dor de banco de dados PostgreSQL:
1 import java.sql.*,
2 public class PoojavaDB
3 public static void main(String] args)
4 try
5 // carrega driver
6 Class.forName("postgresql.Driver"),
7 // estabelece conexao com banco de dados
8 Connection c
9 DriverManager.getConnection("jdbc.postgresql.poojava",
10 "ricarte",""),
11 // monta e executa consulta
12 Statement s c.createStatement(),
13 ResultSet r s.executeQuery("Select * from notas"),
14 // apresenta estrutura da tabela
15 ResultSetMetaData m r.getMetaData(),
16 int colCount m.getColumnCount(),
17 for (int iI, i<colCount, ++i)
18 System.out.print(m.getColumnName(i) + "\t\t"),
19 System.out.println(),
20 // apresenta resultados da consulta
21 while (r.next())
22 System.out.println(r.getString(I) + " " +
23 r.getString(?) + " " +
24 r.getInt() + "\t\t" +
25 r.getInt(4)),
26 r.close(),
27 // fecha conexao com banco de dados
28 c.close(),
29
30 catch (Exception e)
31 System.err.println(e),
32
33
34
5.3 Servlets
Servlets oIerecem uma maneira alternativa a CGI para estender as Iuncionalidades de um servidor
Web. Na verdade, a API de servlet de Java oIerece mecanismos adequados a adaptao qualquer
servidor baseado em requisies e respostas, mas em aplicaes Web que servlets tm sido mais
utilizados.
c 2001 FEEC/UNICAMP 90
5.3. Servlets
CGI (Common Gatewav Interface) a especicao de uma interIace que permite que servidores
Web tenham acesso a Iuncionalidades oIerecidas por programas executando no ambiente da maquina
servidora. Atravs de programas conectados a essa interIace possivel por exemplo conectar uma
base de dados a Web ou gerar dinamicamente o conteudo de uma pagina HTML.
O servidor Web reconhece uma requisio CGI quando o URL especicado na solicitao iden-
tica um arquivo executavel (programa ou script) localizado em um diretorio especco dentro do
espao Web de recursos disponibilizados aos clientes. Parmetros podem ser repassados ao programa
CGI especicando-os no URL, separados do nome do recurso pelo carater ?.
Tipicamente um programa CGI pode ser desenvolvido em qualquer linguagem de programao
que tenha acesso a leitura de variaveis de ambiente e a manipulao dos streams padres de entrada
e saida de dados do sistema operacional (stain, System.in; staout, System.out).
Com o uso de servlets, a arquitetura da Web torna-se um base atrativa para o desenvolvimento de
aplicaes distribuidas em Java. A utilizao de browsers HTML simplica o desenvolvimento das
aplicaes cliente. Servidores Web suportam os mecanismos basicos de conexo ao cliente. Assim,
o desenvolvimento ira se concentrar na extenso dos servios atravs dos servlets.
5.3.1 Ciclo de vida de um servlet
A execuo de um servlet no diIere muito de uma aplicao CGI em sua Iorma de interao com
o servidor. As quatro principais etapas nessa interao so:
1. cliente envia solicitao ao servidor;
2. servidor invoca servlet para a execuo do servio solicitado;
3. servlet gera o conteudo em resposta a solicitao do cliente; e
4. servidor envia resultado do servlet ao cliente.
Quando um servlet carregado pela primeira vez para a maquina virtual Java do servidor, o
seu mtodo init() invocado. Esse mtodo tipicamente prepara recursos para a execuo do
servio (por exemplo, abrir arquivos ou ler o valor anterior de um contador de numero de acessos)
ou estabelece conexo com outros servios (por exemplo, com um servidor de banco de dados). O
mtodo destroy() permite liberar esses recursos (Iechar arquivos, escrever o valor nal nessa
sesso do contador de acessos), sendo invocado quando o servidor estiver concluindo sua atividade.
Uma diIerena Iundamental entre um servlet e uma aplicao CGI que a classe que implementa
o servlet permanece carregada na maquina virtual Java apos concluir sua execuo. Um programa
CGI, ao contrario, inicia um novo processo a cada invocao por este motivo, CGI deve utilizar
mecanismos adicionais para manter o estado entre execues, sendo a Iorma mais comum a utilizao
de arquivos em disco. Com um servlet, tais mecanismos so necessarios apenas na primeira vez que
carregado e ao m da execuo do servidor, ou eventualmente como um mecanismo de checkpoint.
Servlets tambm oIerecem como vantagem o Iato de serem programas Java. Assim, eles permitem
a utilizao de toda a API Java para a implementao de seus servios e oIerecem adicionalmente
portabilidade de plataIorma.
c 2001 FEEC/UNICAMP 91
5.3. Servlets
5.3.2 Fundamentos da API de servlets
O suporte a servlets uma extenso padronizada ao pacote Java, no sendo parte da distribuio
basica do Java SDK. Assim, quem quiser desenvolver servlets deve obter o JSDK, o Java Servlet
Development Kit. Adicionalmente, o servidor Web deve suportar o acesso a servlets, o que pode
ocorrer de Iorma nativa (como no caso do Java Web Server) ou atravs de modulos aaa-on (como no
caso de apache).
O JSDK inclui as classes que implementam a API de servlets organizadas em pacotes, dos quais
os principais so javax.servlet e javax.servlet.http. Adicionalmente, uma aplicao
servletrunner permite desenvolver e testar servlets antes de integra-los a servidores.
Os trs mecanismos alternativos basicos para criar um servlet so:
1. Estender a classe javax.servlet.GenericServlet, quando o servlet no Ior imple-
mentar nenhum protocolo especco de comunicao;
2. Estender a classe javax.servlet.HttpServlet, para servlets que manipulam dados
especcos do protocolo HTTP; ou
3. Implementar a interIace javax.servlet.Servlet.
Na primeira Iorma basica de implementar um servlet, estendendo a classe GenericServlet,
o mtodo service() deve ser denido. Esse mtodo descreve o servio que o servlet estara oIere-
cendo.
Esse exemplo ilustra o codigo de um servlet que responde a solicitao de servio com uma
mensagem xa:
1 import javax.servlet.*,
2 import java.io.*,
3 public class OiServlet extends GenericServlet
4 public void service(ServletRequest solicitacao,
5 ServletResponse resposta)
6 throws ServletException, IOException
7 resposta.setContentType("text/plain"),
8 PrintWriter saida resposta.getWriter(),
9 saida.println("Oi!"),
10
11
Nesse exemplo, o mtodo getWriter() utilizado para estabelecer o canal de envio de dados
desde o servlet no caso, um objeto PrintWriter, permitindo o envio de textos. Alternati-
vamente, dados binarios poderiam ser enviados atravs de um OutputStream, obtido atravs do
mtodo getOutputStream().
A classe HttpServlet uma extenso de GenericServlet especicamente projetada para
a conexo de servlets a servidores HTTP. Assim, mtodos dedicados a lidar com solicitaes HTTP,
tais como doGet(), doPost() e doPut(), so denidos. A implementao padro do mtodo
service() reconhece qual o tipo de solicitao recebida e invoca o mtodo correspondente.
c 2001 FEEC/UNICAMP 92
5.3. Servlets
Este exemplo ilustra a utilizao de um servlet que envia uma mensagem xa no corpo de uma
pagina HTML em resposta a uma requisio GET ao servidor Web, usando para tal o mtodo do-
Get():
1 import javax.servlet.*,
2 import javax.servlet.http.*,
3 import java.io.*,
4 public class OiHttpServlet extends HttpServlet
5 public void doGet(HttpServletRequest solicitacao,
6 HttpServletResponse resposta)
7 throws ServletException, IOException
8 resposta.setContentType("text/html"),
9 PrintWriter saida resposta.getWriter(),
10 saida.println("<HTML>"),
11 saida.print("<HEAD><TITLE>"),
12 saida.print("Resposta do servlet"),
13 saida.println("</TITLE></HEAD>"),
14 saida.println("<BODY><P>Oi!</P></BODY>"),
15 saida.println("</HTML>"),
16
17
Outros mtodos que suportam a interao do servlet atravs de solicitaes HTTP incluem ge-
tLastModified(), que invocado pelo servidor para obter a data da ultima modicao do 'do-
cumento (um numero negativo se no houver inIormao ou long com o numero de segundos desde
1 de janeiro de 1970 GMT); e getServletInfo(), que retorna uma string de documentao
sobre o servlet, tal como nome, autor e verso.
A passagem de dados de um Iormulario do cliente para o servlet pode se dar atravs do mtodo
getParameter(), que permite obter uma string com o valor do campo especicado. Por exemplo,
se um Iormulario HTML especicasse um campo de texto para entrada do nome do usuario, como
em
<INPUT type"text" name"username" size?0>
esse valor poderia ser obtido no codigo do servlet do exemplo anterior atravs da invocao
String nome solicitacao.getParameter("username"),
Alm de getParameter(), o mtodo getParameterValues() retorna um arranjo de
strings com todos os valores de um determinado parmetro. Outros mtodos so oIerecidos para ob-
ter inIormao das aplicaes que esto invocando o servlet, tais como getRemoteHost(), get-
ServerName(), getServerPort() e, especicamente para HTTP, getHeaderNames() e
getHeader().
A Iorma de integrar o servlet ao servidor Web dependente da implementao; por exemplo,
alguns servidores especicam um diretorio (tal como servlet) onde as classes servlets so con-
centradas e a invocao da-se pela invocao direta da URL, como em
http.//site/servlet/OiHttpServlet
c 2001 FEEC/UNICAMP 93
5.4. Programao com objetos distribuidos
5.4 Programao com objetos distribudos
Na programao distribuida usando a arquitetura cliente-servidor, clientes e servidores podem
ser implementados usando qualquer paradigma de programao. Assim, possivel que um servio
especco seja executado por um mtodo de algum objeto. No entanto, mesmo que o cliente tam-
bm tenha sido desenvolvido orientao a objetos, na comunicao entre o cliente e o servidor esse
paradigma deve ser esquecido, devendo ser utilizado algum protocolo pr-estabelecido de troca de
mensagens para a solicitao e resposta ao servio.
Um sistema de objetos distribuidos aquele que permite a operao com objetos remotos. Dessa
Iorma possivel, a partir de uma aplicao cliente orientada a objetos, obter uma reIerncia para um
objeto que oIerece o servio desejado e, atravs dessa reIerncia, invocar mtodos desse objeto
mesmo que a instncia desse objeto esteja em uma maquina diIerente daquela do objeto cliente.
O conceito basico que suporta plataIormas de objetos distribuidos o conceito de arquiteturas
de objetos. Essencialmente, uma arquitetura orientada a objetos estabelece as regras, diretrizes e
convenes denindo como as aplicaes podem se comunicar e inter-operar. Dessa Iorma, o Ioco
da arquitetura no em como a implementao realizada, mas sim na inIra-estrutura e na interIace
entre os componentes da arquitetura.
Na plataIorma Java, dois mecanismos so oIerecidos para o desenvolvimento de aplicaes usan-
do o conceito de objetos distribuidos: Java RMI e Java IDL. RMI (invocao remota de mtodos)
um mecanismo para desenvolver aplicaes com objetos distribuidos que opera exclusivamente com
objetos Java. Java IDL utiliza a arquitetura padro CORBA para integrao de aplicaes Java a
aplicaes desenvolvidas em outras linguagens.
5.4.1 Arquiteturas de objetos distribudos
No paradigma de arquiteturas de objetos, ha trs elementos principais. A arquitetura OO Iorne-
ce uma descrio abstrata do software que categorias de objetos sero utilizadas, como estaro
particionados e como interagiro. As interIaces distribuidas so as descries detalhadas das Iun-
cionalidades do software. Finalmente, a implementao composta por modulos de software que
suportam as Iuncionalidades especicadas nas interIaces distribuidas.
O uso de interIaces distribuidas permite isolar a arquitetura de um sistema de sua implementa-
o. Dessa Iorma, o sistema pode ser construido com um alto grau de independncia em relao as
implementaes especcas de suas Iuncionalidades, ou seja, possivel substituir implementaes
especcas com pequeno impacto sobre o sistema como um todo.
A adoo do paradigma de arquitetura de objetos permite tambm atingir um alto grau de inter-
operabilidade atravs da adoo de uma inIra-estrutura padronizada de comunicao entre objetos
atravs das interIaces. Assim, cada componente da arquitetura deve se preocupar apenas em como
se dara sua comunicao com a inIra-estrutura de comunicao, estabelecida atravs de um objeto
wrapper. Sem essa padronizao, seria necessario estabelecer os mecanismos de comunicao com
todos os demais componentes do sistema.
Em uma arquitetura de objetos, alguma Iorma deve ser estabelecida para que clientes possam
localizar servios que esto sendo oIerecidos. Isso usualmente oIerecido na Iorma de um servio
basico da plataIorma de objetos distribuidos. Do ponto de vista de quem oIerece o servio, preciso
habilitar o objeto para que seus mtodos possam ser invocados remotamente. Isto realizado atravs
das seguintes atividades:
c 2001 FEEC/UNICAMP 94
5.4. Programao com objetos distribuidos
Descrever o servio. Na arquitetura de objetos, a descrio ou especicao de servios determi-
nada atravs das interIaces. Em Java, isto realizado atravs da especicao oIerecida por
uma interIace.
Implementar o servio. Isto realizado atravs do desenvolvimento de uma classe Java que imple-
mente a interIace especicada.
Anunciar o servio. Quando um objeto que implementa o servio torna-se ativo, preciso que ele
seja registrado em um 'diretorio de servios de Iorma que potenciais clientes possam localiza-
lo.
Sob o ponto de vista do objeto cliente, que vai usar o servio do objeto remoto, preciso localizar
o servio, o que Ieito acessando o registro de servios. Portanto, necessario que servidores e
clientes estejam de acordo com o local (a maquina) onde o registro realizado. Como resultado
dessa tareIa, obtm-se uma reIerncia ao objeto remoto que pode ser utilizada como se Iosse uma
reIerncia para o objeto local.
A utilizao desse mecanismo de localizar o servio atravs de um diretorio ou registro permite
que as maquinas clientes ignorem totalmente em que maquinas os servios solicitados esto operando
uma Iacilidade conhecida como transparncia de localizao.
Um dos principais objetivos em uma plataIorma de objetos distribuidos atingir transparncia de
localizao, tornando uniIorme a Iorma de utilizao de objetos independentemente desses objetos
estarem na maquina local da aplicao ou em maquinas distintas.
A m de que se atinja transparncia de localizao, as seguintes Iuncionalidades devem ser oIe-
recidas:
1. Localizar e carregar classes remotas;
2. Localizar e obter reIerncias a objetos remotos; e
3. Habilitar a invocao de mtodos de objetos remotos.
A primeira Iuncionalidade, no muito diIerente do que ocorre em sistemas com objetos locais,
necessaria para que a aplicao conhea as Iacilidades oIerecidas pelo objeto remoto.
ReIerncias a objetos tambm so utilizadas em sistemas com objetos locais, porm com diIeren-
as signicativas. Em um sistema local, as reIerncias a objetos so tipicamente manipuladores com
especicao de endereos de memoria. No caso de objetos remotos, esses endereos da memoria
de outra maquina no tm validade na maquina local. Assim, preciso oIerecer mecanismos que
traduzam essas reIerncias entre maquinas de Iorma transparente para o programador.
Para a invocao de mtodos de um objeto remoto, alm da necessidade de se localizar a reIe-
rncia ao mtodo preciso oIerecer mecanismos para tornar transparente a passagem de argumentos
para e o retorno de valores desde o mtodo.
Alm dessas Iuncionalidades, a comunicao de Ialhas no oIerecimento da transparncia de loca-
lizao ao programador essencial. Assim, Iuncionalidades para comunicar excees entre maquinas
tambm dever ser suportadas pela plataIorma de objetos distribuidos.
c 2001 FEEC/UNICAMP 95
5.4. Programao com objetos distribuidos
5.4.2 1ava RMI
RMI (Remote Methoa Invocation) uma das abordagens da tecnologia Java para prover as Iunci-
onalidades de uma plataIorma de objetos distribuidos. Esse sistema de objetos distribuidos Iaz parte
do nucleo basico de Java desde a verso JDK 1.1, com sua API sendo especicada atravs do pacote
java.rmi e seus subpacotes.
Atravs da utilizao da arquitetura RMI, possivel que um objeto ativo em uma maquina virtual
Java possa interagir com objetos de outras maquinas virtuais Java, independentemente da localizao
dessas maquinas virtuais.
A arquitetura RMI oIerece a transparncia de localizao atravs da organizao de trs camadas
entre os objetos cliente e servidor:
1. A camada de stub/skeleton oIerece as interIaces que os objetos da aplicao usam para interagir
entre si;
2. A camada de reIerncia remota o miaaleware entre a camada de stub/skeleton e o protocolo
de transporte. E nesta camada que so criadas e gerenciadas as reIerncias remotas aos objetos;
3. A camada do protocolo de transporte oIerece o protocolo de dados binarios que envia as soli-
citaes aos objetos remotos pela rede.
Desenvolvimento da aplicao RMI
No desenvolvimento de uma aplicao cliente-servidor usando Java RMI, como para qualquer
plataIorma de objetos distribuidos, essencial que seja denida a interIace de servios que sero
oIerecidos pelo objeto servidor.
A especicao de uma interIace remota equivalente a denio de qualquer interIace em Java,
a no ser pelos seguintes detalhes: a interIace devera, direta ou indiretamente, estender a interIace
Remote; e todo mtodo da interIace devera declarar que a exceo RemoteException (ou uma
de suas superclasses) pode ser gerada na execuo do mtodo.
Esse exemplo ilustra a denio de uma interIace remota para um objeto que contm um contador
inteiro:
1 import java.rmi.*,
2 public interface Count extends Remote
3 void set(int val) throws RemoteException,
4 void reset() throws RemoteException,
5 int get() throws RemoteException,
6 int increment() throws RemoteException,
7
Esse contador manipulado por quatro mtodos: set(), para denir um valor inicial para o conta-
dor; reset(), para reiniciar o contador com o valor 0; get(), para consultar o valor do contador
sem altera-lo; e increment(), que l o valor atual do contador e incrementa-o.
Os servios especicados pela interIace RMI devero ser implementados atravs de uma clas-
se Java. Nessa implementao dos servios preciso indicar que objetos dessa classe podero ser
acessados remotamente.
c 2001 FEEC/UNICAMP 96
5.4. Programao com objetos distribuidos
A implementao do servio se da atravs da denio de uma classe que implementa a inter-
Iace especicada. No entanto, alm de implementar a interIace especicada, preciso incluir as
Iuncionalidades para que um objeto dessa classe possa ser acessado remotamente como um servidor.
A implementao da interIace remota se da da mesma Iorma que para qualquer classe imple-
mentando uma interIace Java, ou seja, a classe Iornece implementao para cada um dos mtodos
especicados na interIace.
As Iuncionalidades de um servidor remoto so especicadas na classe abstrata RemoteServer,
do pacote java.rmi.server. Um objeto servidor RMI devera estender essa classe ou, mais
especicamente, uma de suas subclasses. Uma subclasse concreta de RemoteServer oIerecida
no mesmo pacote UnicastRemoteObject, que permite representar um objeto que tem uma
unica implementao em um servidor (ou seja, no replicado em varios servidores) e mantm uma
conexo ponto-a-ponto com cada cliente que o reIerencia.
Tipicamente, a declarao de uma classe que implementa um servidor remoto RMI tera a Iorma
public class ... extends UnicastRemoteObject implements ...
...

Esse exemplo oIerece uma possivel implementao para a interIace remota previamente especi-
cada:
1 import java.rmi.*,
2 import java.rmi.server.UnicastRemoteObject,
3 public class CountImpl extends UnicastRemoteObject
4 implements Count
5 private int sum,
6 public CountImpl() throws RemoteException
7
8 public void set(int val) throws RemoteException
9 sum val,
10
11 public void reset() throws RemoteException
12 sum 0,
13
14 public int get() throws RemoteException
15 return sum,
16
17 public int increment() throws RemoteException
18 return sum++,
19
20
Clientes e servidores RMI
Uma vez que a interIace remota esteja denida e a classe que implementa o servio remoto tenha
sido criada, o proximo passo no desenvolvimento da aplicao distribuida desenvolver o servidor
c 2001 FEEC/UNICAMP 97
5.4. Programao com objetos distribuidos
RMI, uma classe que crie o objeto que implementa o servio e cadastre esse servio na plataIorma
de objetos distribuidos.
Um objeto servidor RMI simples deve realizar as seguintes tareIas: criar uma instncia do objeto
que implementa o servio; e disponibilizar o servio atravs do mecanismo de registro.
O desenvolvimento de um cliente RMI requer essencialmente a obteno de uma reIerncia remo-
ta para o objeto que implementa o servio, o que ocorre atravs do cadastro realizado pelo servidor.
Uma vez obtida essa reIerncia, a operao com o objeto remoto indistingivel da operao com
um objeto local.
Usando o servio de nomes
O aplicativo rmiregistry Iaz parte da distribuio basica de Java. Tipicamente, esse aplica-
tivo executado como um processo de Iundo (em backgrouna) que ca aguardando solicitaes em
uma porta, que pode ser especicada como argumento na linha de comando. Se nenhum argumento
Ior especicado, a porta 1099 usada como padro.
O aplicativo rmiregistry uma implementao de um servio de nomes para RMI. O servio
de nomes uma espcie de diretorio, onde cada servio disponibilizado na plataIorma registrado
atravs de um nome do servio, uma string unica para cada objeto que implementa servios em RMI.
Para ter acesso ao servio de nomes a partir de uma classe Java, so oIerecidos dois mecanismos
basicos. O primeiro utiliza a classe Naming, do pacote java.rmi. O segundo mecanismo utiliza
as Iacilidades oIerecidas atravs das classes no pacote java.rmi.registry.
A classe Naming permite a realizao da busca de um servio pelo nome (lookup) usando o
mtodo estatico lookup(String nome), que retorna uma reIerncia para o objeto remoto. O
servio de registro aonde a busca se realiza especicado pela string usando uma sintaxe similar a
URL:
rmi.//objreg.host.port/objname
O protocolo padro rmi, sendo no momento o unico suportado atravs desse mtodo. Se no
especicado, o host a maquina local e a porta 1099. O nome de registro do objeto a unica parte
obrigatoria desse argumento.
Alm de lookup() os mtodos bind(), rebind(), unbind() e list(), descritos na
seqncia, so tambm suportados.
Outra alternativa para ter acesso ao servio de nomes a partir da aplicao Java utilizar as
Iuncionalidades do pacote java.rmi.registry, que oIerece uma classe e uma interIace para
que classes Java tenham acesso ao servio de nomes RMI.
A interIace Registry representa uma interIace para o registro de objetos RMI operando em
uma maquina especca. Atravs de um objeto dessa classe, possivel invocar o mtodo bind()
que associa um nome de servio (um String) ao objeto que o implementa.
Para obter uma reIerncia para um objeto Registry so utilizados os mtodos da classe Lo-
cateRegistry, todos estaticos, tais como getRegistry(). Ha quatro verses basicas desse
mtodo:
1. getRegistry(): obtm reIerncia para o registro local operando na porta deIault;
2. getRegistry(int port): obtm reIerncia para o registro local operando na porta es-
pecicada;
c 2001 FEEC/UNICAMP 98
5.4. Programao com objetos distribuidos
3. getRegistry(String host): obtm reIerncia para o registro remoto operando na por-
ta deIault;
4. getRegistry(String host, int port): obtm reIerncia para o registro remoto
operando na porta especicada.
O mtodo estatico createRegistry(int port) pode ser utilizado para iniciar um servi-
o de registro na maquina virtual Java corrente na porta especicada como argumento, retornando
tambm um objeto da classe Registry.
Inicialmente, preciso obter uma reIerncia para o servio de registro, atravs da invocao do
mtodo:
Registry r LocateRegistry.getRegistry(),
Observe que a reIerncia para Registry em si uma reIerncia para um objeto remoto, uma
vez que a interIace Registry uma extenso da interIace Remote.
Uma vez que a reIerncia para o servio de registro tenha sido obtida, possivel acessar as
Iuncionalidades desse servio atravs dos mtodos da interIace Registry. Particularmente, para
registrar um novo servio utiliza-se o mtodo bind():
r.bind(serviceName, myCount),
O objeto que esta sendo registrado deve implementar tambm a interIace Remote, que identica
todos os objetos que podem ser acesados remotamente.
Outros servios disponiveis atravs dos mtodos de Registry incluem atualizao, remoo
e busca dos servios la registrados. Para atualizar um registro ja existente, o mtodo rebind()
pode ser utilizado. Para eliminar um registro, utiliza-se o mtodo unbind(). Dado o nome de um
servio, o objeto Remote que o implementa pode ser obtido pelo mtodo lookup(). O mtodo
list() retorna um arranjo de String com os nomes de todos os servios registrados.
Implementao do servidor RMI
Como observado, um objeto servidor RMI simples deve realizar as seguintes tareIas:
1. Criar uma instncia do objeto que implementa o servio; e
2. Disponibilizar o servio atravs do mecanismo de registro.
Esse exemplo de servidor RMI para o contador remoto cria uma instncia da implementao do
servio e coloca-a a disposio de potenciais clientes, registrando-o no registrv RMI:
1 import java.rmi.registry.*,
2 public class CountServer
3 public static void main(String] args)
4 try
5 String serviceName "Count00I",
6 CountImpl myCount new CountImpl(),
7 Registry r LocateRegistry.getRegistry(),
c 2001 FEEC/UNICAMP 99
5.4. Programao com objetos distribuidos
8 r.bind(serviceName, myCount),
9 System.out.println("Count Server ready."),
10
11 catch (Exception e)
12 System.out.println("Exception. " + e.getMessage()),
13 e.printStackTrace(),
14
15
16
Cliente RMI
A principal etapa no desenvolvimento de uma aplicao cliente RMI a obteno da reIerncia
remota para o objeto (remoto) que implementa o servio desejado. Para tanto, o cliente RMI usa o
servio padro oIerecido pelo mecanismo de registro de nomes de servios.
Uma vez que a reIerncia remota seja obtida, ela pode ser convertida (aowncast) para uma reIe-
rncia para a interIace que especica o servio. A partir de ento, os mtodos oIerecidos pelo servio
remoto so invocados da mesma Iorma que ocorre para objetos locais.
Esses exemplos ilustram o desenvolvimento de codigo cliente em RMI. No primeiro exemplo
desenvolve-se um cliente RMI que simplesmente invoca o mtodo reset() atravs de uma reIe-
rncia remota para o objeto servidor:
1 import java.rmi.registry.*,
2 public class CountReset
3 public static void main(String args])
4 try
5 Registry r LocateRegistry.getRegistry(),
6 Count myCount (Count) r.lookup("Count00I"),
7 myCount.reset(),
8
9 catch(Exception e)
10 e.printStackTrace(),
11
12 System.exit(0),
13
14
Nesse outro exemplo, o cliente utiliza os mtodos para modicar e obter o valor do contador
remoto. Ele tambm ilustra a interao de um codigo com o registro RMI atravs da classe Naming:
1 import java.rmi.*,
2 public class CountClient
3 public static void main(String args])
4 try
5 Remote remRef Naming.lookup("Count00I"),
6 Count myCount (Count) remRef,
c 2001 FEEC/UNICAMP 100
5.4. Programao com objetos distribuidos
7 int initValue myCount.get(),
8 System.out.print("De " + initValue + " para "),
9 long startTime System.currentTimeMillis(),
10 for (int i 0 , i < I000 , i++ )
11 myCount.increment(),
12 long stopTime System.currentTimeMillis(),
13 System.out.println(myCount.get()),
14 System.out.println("Avg Ping "
15 + ((stopTime - startTime)/I000f)
16 + " msecs"),
17
18 catch(Exception e)
19 e.printStackTrace(),
20
21 System.exit(0),
22
23
Esse terceiro exemplo ilustra a utilizao de RMI a partir de um cliente desenvolvido como um
applet. Nesse applet, um campo de texto mostra o valor do contador no objeto servidor. Dois botes
so Iornecidos, um para incrementar o valor mil vezes Start) e outro para obter o valor atual do
contador Get):
1 import java.rmi.*,
2 import java.awt.*,
3 import java.awt.event.*,
4 import java.applet.*,
5 public class AppletClient extends Applet
6 implements ActionListener
7 Count remCount,
8 TextField tfCnt,
9 Button bStart, bGet,
10 String bslabel "Start",
11 String bglabel "Get",
12 public void init()
13 try
14 setLayout(new GridLayout(?,?)),
15 add(new Label("Count.")),
16 tfCnt new TextField(I),
17 tfCnt.setEditable(false),
18 add(tfCnt),
19 bStart new Button(bslabel),
20 bStart.addActionListener(this),
21 bGet new Button(bglabel),
22 bGet.addActionListener(this),
c 2001 FEEC/UNICAMP 101
5.4. Programao com objetos distribuidos
23 add(bStart),
24 add(bGet),
25 showStatus("Binding remote object"),
26 remCount (Count) Naming.lookup("Count00I"),
27 tfCnt.setText(Integer.toString(remCount.get())),
28
29 catch (Exception e)
30 e.printStackTrace(),
31
32
33 public void paint()
34 try
35 tfCnt.setText(Integer.toString(remCount.get())),
36
37 catch (Exception e)
38 e.printStackTrace(),
39
40
41 public void actionPerformed (ActionEvent ev)
42 try
43 String botao ev.getActionCommand(),
44 if (botao.equals(bslabel))
45 showStatus("Incrementing..."),
46 for (int i 0 , i < I000 , i++ )
47 remCount.increment(),
48 showStatus("Done"),
49
50 else
51 showStatus("Current count"),
52 paint(),
53
54
55 catch (Exception e)
56 e.printStackTrace(),
57
58
59
Denindo stubs e skeletons
Para que um servio oIerecido por um objeto possa ser acessado remotamente atravs de RMI,
preciso tambm as classes auxiliares internas de stubs e skeletons, responsaveis pela comunicao
entre o objeto cliente e o objeto que implementa o servio, conIorme descrito na apresentao da
arquitetura RMI.
Uma vez que a interIace e a classe do servio tenham sido criadas e compiladas para bvteco-
c 2001 FEEC/UNICAMP 102
5.4. Programao com objetos distribuidos
aes usando um compilador Java convencional, possivel criar os correspondentes stubs e skeletons.
Para tanto, utiliza-se o aplicativo compilador RMI, rmic, disponibilizado juntamente com o kit de
desenvolvimento Java.
Um exemplo ilustra o processo de compilao RMI para o servio do contador remoto. Considere
a implementao do servio que Ioi previamente denida. O primeiro passo para a criao do stub
e do skeleton para esse servio obter a classe compilada, que por sua vez precisa da classe da
interIace:
> javac Count.java
> javac CountImpl.java
Com a classe CountImpl.class disponivel, a execuo do comando
> rmic CountImpl
gera as classes CountImpl_Stub.class e CountImpl_Skel.class, correspondendo res-
pectivamente ao stub e ao skeleton para o servio. O stub devera ser disponibilizado junto ao codigo
do cliente RMI, enquanto que o skeleton devera estar disponivel junto ao codigo do servidor.
Uma classe stub oIerece implementaes dos mtodos do servio remoto que so invocadas no
lado do cliente. Internamente, esses mtodos empacotam marshall) os argumentos para o mtodo e
os envia ao servidor. A implementao correspondente no lado servidor, no skeleton, desempacota
(unmarshall) os dados e invoca o mtodo do servio. Obtido o valor de retorno do servio, o mtodo
no skeleton empacota e envia esse valor para o mtodo no stub, que ainda estava aguardando esse
retorno. Obtido o valor de retorno no stub, esse desempacotado e retornado a aplicao cliente
como resultado da invocao remota.
Internamente, o processo de marshalling utiliza o mecanismo de serializao de Java. Assim,
argumentos e valores de retorno de mtodos remotos invocados atravs de RMI esto restritos a tipos
primitivos de Java e a objetos de classes que implementam Serializable.
Usando fbricas de objetos remotos
Pode haver situaes em que no seja interessante registrar cada implementao de um servio
no registrv por exemplo, quando o servidor no sabe quantos objetos criar de antemo ou quando
a quantidade de pequenos servios registrados e to grande que pode tornar a busca por um servio
ineciente.
Nessas situaes, pode ser interessante utilizar uma Iabrica de objetos remotos. Nesse caso, o
servidor que esta registrado em rmiregistry no uma implementao individual do servio,
mas sim um gerenciador de instncias de implementao do servio. Esse gerenciador deve imple-
mentar uma interIace remota que permita que o cliente obtenha uma reIerncia remota para o servio
desejado em duas etapas:
1. obtendo a reIerncia para o gerenciador atravs da invocao do mtodo lookup(); e
2. obtendo a reIerncia para o servio propriamente dito atravs da invocao do mtodo do
gerenciador que retorna a reIerncia.
c 2001 FEEC/UNICAMP 103
5.4. Programao com objetos distribuidos
Esses exemplos usando contadores inteiros ilustram a utilizao do conceito de Iabrica de objetos
remotos. Alm da implementao do servio e da sua correspondente interIace, preciso inicialmente
denir uma interIace para a Iabrica. Nesse exemplo, essa interIace especica a Iuncionalidade de um
'gerenciador de contadores, que recebe o nome do contador e retorna uma reIerncia remota para
um objeto contador:
1 import java.rmi.*,
2 public interface CountManager extends Remote
3 Count getCount(String nome) throws RemoteException,
4
No lado servidor, o que muda em relao ao exemplo anterior que agora no mais o objeto
que implementa o contador que deve ser cadastrado no registrv, mas sim o objeto Iabrica, uma im-
plementao da interIace especicada para o 'gerenciador de contadores. Essa Iabrica, por sua vez,
mantm um registro interno dos objetos criados para poder retornar as reIerncias solicitadas pelos
clientes remotos. Essa classe combina as Iuncionalidades da implementao de uma interIace remota
com aquelas de um servidor RMI:
1 import java.rmi.*,
2 import java.rmi.registry.*,
3 import java.rmi.server.*,
4 import java.util.*,
5 public class CManagerImpl extends UnicastRemoteObject
6 implements CountManager
7 private Hashtable counters new Hashtable(),
8 public CManagerImpl() throws RemoteException
9
10 public Count getCount(String nome) throws RemoteException
11 Count rem null,
12 if (counters.containsKey(nome))
13 rem (Count) counters.get(nome),
14 else
15 rem new CountImpl(),
16 counters.put(nome,rem),
17 System.out.println("New counter. " + nome),
18
19 return rem,
20
21 public static void main(String] args)
22 try
23 String serviceName "CountFactory",
24 CManagerImpl myCM new CManagerImpl(),
25 Registry r LocateRegistry.getRegistry(),
26 r.bind(serviceName, myCM),
27 System.out.println("CountFactory ready."),
28
c 2001 FEEC/UNICAMP 104
5.4. Programao com objetos distribuidos
29 catch (Exception e)
30 e.printStackTrace(),
31
32
33
No lado do cliente ha reIerncias agora a duas interIaces remotas, uma para o 'gerenciador de
contadores e outra para o contador. A primeira delas resolvida atravs do servio de registro do
RMI, enquanto que a reIerncia para o objeto do segundo tipo de interIace obtido a partir dessa
reIerncia para o gerenciador que Ioi obtida:
1 import java.rmi.*,
2 public class CountClient
3 public static void main(String args])
4 String nome "Count00I",
5 try
6 CountManager cm
7 (CountManager) Naming.lookup("CountFactory"),
8 if (args.length > 0)
9 nome args]0,
10 Count myCount cm.getCount(nome),
11 int initValue myCount.get(),
12 System.out.print("De " + initValue + " para "),
13 long startTime System.currentTimeMillis(),
14 for (int i 0 , i < I000 , i++ )
15 myCount.increment(),
16 long stopTime System.currentTimeMillis(),
17 System.out.println(myCount.get()),
18 System.out.println("Avg Ping "
19 + ((stopTime - startTime)/I000f)
20 + " msecs"),
21
22 catch(Exception e)
23 e.printStackTrace(),
24
25 System.exit(0),
26
27
Execuo com RMI
A execuo da aplicao cliente-servidor em RMI requer, alm da execuo da aplicao cliente
e da execuo da aplicao servidor, a execuo do servio de registro de RMI. Alm do principio
basico de execuo de aplicaes RMI, a arquitetura RMI oIerece Iacilidades para operao com
codigo disponibilizado de Iorma distribuida e ativao dinmica, alm de outros servios distribuidos.
c 2001 FEEC/UNICAMP 105
5.4. Programao com objetos distribuidos
O registro RMI (rmiregistry) executa isoladamente em uma maquina virtual Java. O ser-
vidor da aplicao, assim como a implementao do servio, esto executando em outra maquina
virtual Java; sua interao com o registro (ao invocar o mtodo bind()) se da atravs de uma reIe-
rncia remota. Da mesma Iorma, cada aplicao cliente pode ser executada em sua propria maquina
virtual Java; suas interaes com o registro (mtodo lookup()) e com a implementao do servio
(usando os correspondentes stub e skeleton) do-se tambm atravs de reIerncias remotas.
Portanto, para executar uma aplicao RMI preciso inicialmente disponibilizar o servio de
registro RMI. Para tanto, o aplicativo rmiregistry deve ser executado.
Com o rmiregistry disponivel, o servidor pode ser executado. Para tanto, essa maquina
virtual Java devera ser capaz de localizar e carregar as classes do servidor, da implementao do
servio e do skeleton.
Apos a execuo do comando que ativa a aplicao servidor, a mensagem 'Count Server ready.
devera surgir na tela, indicando que o servidor obteve sucesso na criao e registro do servio e
portanto esta apto a responder as solicitaes de clientes.
Finalmente, com o servidor ja habilitado para responder as solicitaes, o codigo cliente pode ser
executado. Essa maquina virtual devera ser capaz de localizar e carregar as classes com a aplicao
cliente, a interIace do servio e o stub para a implementao do servio. Seria possivel tambm ter
varias ativaes simultneas de CountClient em diIerentes maquinas virtuais Java.
No caso mais simples de execuo, as diversas maquinas virtuais Java estaro executando em
uma mesma maquina, compartilhando um CLASSPATH comum. No entanto, ha mecanismos para
permitir o carregamento de classes em uma aplicao RMI envolvendo classes remotas.
Operao com objetos em mquinas remotas
Na descrio da operao de aplicaes distribuidas usando RMI, assumiu-se que as aplicaes
clientes, servidor e de registro eram processos distintos; porm considerou-se que todas as classes
necessarias para a operao das aplicaes estavam localizadas em algum diretorio do CLASSPATH
local.
No caso de execuo em maquinas separadas, ha duas Iormas de Iazer a distribuio das classes
de modo que clientes e servidores possam executar corretamente. Na primeira Iorma, a estratgia
distribuir explicitamente as classes necessarias e inclui-las em diretorios onde elas possam ser
localizadas quando necessario. No lado cliente, essas classes complementares seriam a interIace
do servio e o stub para a implementao do servio. No lado servidor, seriam essas as classes de
implementao do servio e o correspondente skeleton.
A outra Iorma utilizar os mecanismos de carregamento dinmico de classes distribuidas, em
alternativa ao class loaaer padro da maquina virtual Java. Por exemplo, se a execuo do cliente
se da atravs de um applet, o AppletClassLoader oIerece as Iuncionalidades necessarias para
localizar uma classe que esta localizada no mesmo diretorio de onde Ioi carregada a classe original.
Em RMI, ha uma alternativa adicional de se utilizar o RMIClassLoader, que permite o carre-
gamento de stubs e skeletons a partir de um URL (especicado atravs da propriedade java.rmi.
server.codebase). Essa propriedade deve ser estabelecida para a maquina virtual Java que ira
executar o servidor, como em
>java -Djava.rmi.server.codebasehttp.//mhost/mdir/ CountServer
c 2001 FEEC/UNICAMP 106
5.4. Programao com objetos distribuidos
Deste modo, quando o servidor realizar o cadastro do servio no registrv, esse coaebase sera
embutido na reIerncia do objeto. Quando o cliente obtiver a reIerncia ao objeto remoto do registrv
e seu class loaaer Ialhar em localizar a classe stub no CLASSPATH local, sua maquina virtual Java
Iara uma conexo HTTP commhost para obter a classe correspondente assim como outras classes
eventualmente necessarias para execuo do servio no lado cliente.
De Iorma similar, caso o rmiregistry estivesse operando em outra maquina, distinta daquela
onde as aplicaes clientes e servidor estivessem executando, seria necessario especicar no codigo
das aplicaes a maquina que executa rmiregistry, seja atravs do mtodo getRegistry()
da classe LocateRegistry ou atravs da especicao de URL no protocolo RMI nos mtodos
da classe Naming.
Como para qualquer situao na qual a maquina virtual Java ira carregar classes localizadas de
Iorma distribuida, preciso adicionalmente estabelecer qual a politica de segurana para operar com
codigo proveniente das outras maquinas. Essa politica sera enIorada pelo gerenciador de seguran-
a, que pode ser denido pela invocao do mtodo correspondente antes de qualquer invocao a
mtodos de RMI:
System.setSecurityManager(new RMISecurityManager()),
O uso dessas Iacilidades pode ser apreciado nos exemplos modicados para o codigo do servidor
e cliente da aplicao do contador distribuido. No caso do servidor:
1 import java.rmi.*,
2 import java.rmi.server.*,
3 import java.rmi.registry.*,
4 import java.net.SocketPermission,
5 public class CountServer
6 public static void main(String] args)
7 // Create and install the security manager
8 System.setSecurityManager(new RMISecurityManager()),
9 catch (Exception e)
10 e.printStackTrace(),
11
12 try
13 String serviceName "Count00I",
14 // Create CountImpl
15 CountImpl myCount new CountImpl(),
16 Registry r LocateRegistry.getRegistry(args]0),
17 r.rebind(serviceName, myCount),
18 System.out.println("Count Server ready."),
19
20 catch (Exception e)
21 System.out.println("Exception. " + e.getMessage()),
22 e.printStackTrace(),
23
24
25
c 2001 FEEC/UNICAMP 107
5.4. Programao com objetos distribuidos
No caso da aplicao cliente, o codigo modicado apresentado abaixo:
1 import java.rmi.*,
2 import java.rmi.registry.*,
3 public class CountClient
4 public static void main(String args])
5 // Create and install the security manager
6 System.setSecurityManager(new RMISecurityManager()),
7 try
8 Count myCount (Count)Naming.lookup("rmi.//" +
9 args]0 + "/Count00I"),
10 // Calculate Start time
11 long startTime System.currentTimeMillis(),
12 // Increment I000 times
13 System.out.print("Incrementing... "),
14 for (int i 0 , i < I000 , i++ )
15 myCount.increment(),
16 System.out.println(myCount.get()),
17 // Calculate stop time, print out statistics
18 long stopTime System.currentTimeMillis(),
19 System.out.println("Avg Ping "
20 + ((stopTime - startTime)/I000f)
21 + " msecs"),
22
23 catch(Exception e)
24 System.err.println("System Exception" + e),
25
26 System.exit(0),
27
28
A especicao da interIace e a implementao do servio permanecem inalteradas para esses
exemplos.
Ativao dinmica
Na primeira especicao de RMI (JDK 1.1), era necessario que um servio oIerecido por um
objeto Iosse explicitamente ativado em alguma maquina virtual Java e ento Iosse cadastrado em um
servio de registro.
O problema com essa abordagem ocorre principalmente quando, por algum motivo no previsto,
o servio torna-se indisponivel no ha como sinalizar o cliente ou o registro sobre esse Iato. O
servio de ativao, oIerecido a partir de JDK 1.2, permite contornar essa limitao. As principais
Iacilidades oIerecidas pelo mecanismo de ativao remota incluem:
a possibilidade de criar automaticamente um objeto remoto devido a solicitaes de obteno
de reIerncias ao objeto;
c 2001 FEEC/UNICAMP 108
5.4. Programao com objetos distribuidos
o suporte a grupos de ativao, permitindo a ativao de varios objetos remotos executando em
uma mesma maquina virtual;
a possibilidade de reiniciar a execuo de objetos remotos que tenham encerrado sua execuo
em decorrncia de alguma Ialha do sistema.
Para tornar um objeto que implementa um servio como remotamente ativavel, preciso satis-
Iazer trs requisitos. Primeiro, preciso implementar o servio como uma subclasse de Activa-
table, do pacote java.rmi.activation. Segundo, preciso criar construtores de ativao
na implementao do servio. Finalmente, preciso registrar o objeto e seu mtodo de ativao no
servio de ativao.
A classe Activatable oIerece construtores com argumentos especcos para o registro (no
servio de ativao) e a ativao de objetos (incluindo o URL onde o bvtecoae para o objeto pode
ser localizado, um objeto da classe MarshalledObject representando os argumentos de inici-
alizao do objeto e um ag booleano indicando se o objeto deve ser reiniciado com seu grupo) e
para a reativao de objetos (incluindo como argumento um objeto ActivationID, previamente
designado pelo servio de ativao). Esses construtores devero ser invocados nos construtores do
objeto que implementam o servio. Particularmente, o servio de ativao busca um construtor com
dois argumentos dos tipos ActivationID e MarshalledObject.
A classe ActivationDesc permite registrar a inIormao de ativao de um objeto sem criar
uma instncia deste objeto, usando para tanto o mtodo estatico register() da classe Activa-
table.
Antes de criar um servio ativavel, preciso criar ou especicar o grupo de ativao ao qual ele
pertence. Isto realizado atravs dos mtodos das classes ActivationGroup, Activation-
GroupID e ActivationGroupDesc, todas do pacote java.rmi.activation. Um grupo
dene um conjunto de objetos ativaveis que devem compartilhar o mesmo espao de endereamento,
executando na mesma maquina virtual.
O servio de ativao implementado em uma maquina virtual com um objeto da classe Ac-
tivator do pacote java.rmi.activation. A aplicao rimd, distribuida juntamente com o
pacote basico do JDK 1.2, um aaemon que implementa esse servio.
Coleta de lixo distribuda
O processo de remoo de objetos remotamente no-reIerenciados ocorre de maneira automatica.
Cada servidor com objetos exportados mantm uma lista de reIerncias remotas aos objetos que ele
oIerece. Atravs de comunicao com o cliente, ele noticado quando a reIerncia liberada na
aplicao remota.
Cada reIerncia remota recebe tambm um periodo de validade; quando esse periodo expira,
a reIerncia eliminada e o cliente noticado. Esse mecanismo oIerece uma alternativa para a
liberao de objetos que tenham sido reIerenciados por clientes que eventualmente tenham Ialhado,
cando impedidos de sinalizar que a reIerncia havia sido liberada.
Embora no sejam utilizadas normalmente por programadores, as Iuncionalidades do aistributea
garbage collector esto especicadas atravs das classes do pacote java.rmi.dgc.
c 2001 FEEC/UNICAMP 109
5.4. Programao com objetos distribuidos
Callback
Nas aplicaes em uma arquitetura de objetos distribuidos, nem sempre a comunicao no estilo
cliente-servidor suciente para atender aos requisitos da aplicao. E usual que o servidor RMI aja
algumas vezes como cliente, invertendo os papis com o cliente RMI original.
Considere o exemplo do applet cliente RMI. Nesse applet, no ha como saber se outro cliente
do mesmo objeto remoto realizou alguma atualizao no valor do contador a no ser pressionando o
boto Get e vericando se houve mudana. Essa uma situao tipica em muitas aplicaes, sendo
clara a necessidade de realizar tais noticaes de Iorma automatica.
O mecanismo para atingir esse objetivo utilizar a estratgia de callback. Esta tcnica tipica-
mente utilizada quando a aplicao cliente requer um retorno do servidor mas no quer permanecer
bloqueado aguardando a resposta. Atravs dessa tcnica, o servidor obtm uma reIerncia para o
cliente de Iorma que pode invocar remotamente um mtodo do objeto cliente. Assim, quando a exe-
cuo do servio solicitado concluida, o servidor pode noticar o cliente atravs da invocao do
mtodo disponibilizado pelo cliente para uso remoto.
Basicamente, assim como para o objeto de servio RMI, deve-se oIerecer uma interIace remota
para o cliente a m de permitir que o servidor tenha acesso ao 'servio de atualizao do cliente.
Esse exemplo ilustra tal situao, com um mtodo que sera invocado pelo servidor quando seu valor
Ior alterado, quando passara um valor inteiro para o cliente com a valor atualizado:
1 import java.rmi.*,
2 public interface CountClientInterface extends Remote
3 void update(int val) throws RemoteException,
4
Observe que neste exemplo a interIace remota do servio tambm Ioi atualizada de Iorma a
permitir o cadastro dos clientes interessados na atualizao:
1 import java.rmi.*,
2 public interface Count extends Remote
3 void set(int val) throws RemoteException,
4 void reset() throws RemoteException,
5 int get() throws RemoteException,
6 int increment() throws RemoteException,
7 void addClient(CountClientInterface c) throws RemoteException,
8 void remClient(CountClientInterface c) throws RemoteException,
9
Com callback, ambos cliente e servidor devero implementar o servio remoto especicado.
Considere o codigo para o servidor:
1 import java.util.*,
2 import java.rmi.*,
3 import java.rmi.server.UnicastRemoteObject,
4 public class CountImpl extends UnicastRemoteObject
5 implements Count
6 private int sum,
c 2001 FEEC/UNICAMP 110
5.4. Programao com objetos distribuidos
7 // Lista de clientes registrados
8 private Vector clientes new Vector(),
9 public CountImpl() throws RemoteException
10
11 public void set(int val) throws RemoteException
12 sum val,
13
14 public void reset() throws RemoteException
15 sum 0,
16
17 public int get() throws RemoteException
18 return sum,
19
20 public int increment() throws RemoteException
21 sum++,
22 if (sum%I00 0)
23 update(),
24 return sum,
25
26 public void addClient(CountClientInterface client)
27 throws RemoteException
28 clientes.add(client),
29
30 public void remClient(CountClientInterface client)
31 throws RemoteException
32 clientes.remove(client),
33
34 public void update() throws RemoteException
35 CountClientInterface cci,
36 for (int i0, i<clientes.size(), ++i)
37 cci (CountClientInterface) clientes.elementAt(i),
38 cci.update(sum),
39
40
41
Similarmente, para o codigo do cliente:
1 import java.rmi.*,
2 import java.awt.*,
3 import java.awt.event.*,
4 import java.applet.*,
5 import java.rmi.server.*,
6 public class AppletClient extends Applet
7 implements ActionListener, CountClientInterface
c 2001 FEEC/UNICAMP 111
5.4. Programao com objetos distribuidos
8 Count remCount,
9 TextField tfCnt,
10 Button bStart,
11 String bslabel "Start",
12 public void init()
13 try
14 setLayout(new GridLayout(,I)),
15 add(new Label("Count.")),
16 tfCnt new TextField(I),
17 tfCnt.setEditable(false),
18 add(tfCnt),
19 bStart new Button(bslabel),
20 bStart.addActionListener(this),
21 add(bStart),
22 UnicastRemoteObject.exportObject(this),
23 showStatus("Binding remote object"),
24 remCount (Count) Naming.lookup("Count00I"),
25 showStatus("Registering with remote object"),
26 remCount.addClient(this),
27 tfCnt.setText(Integer.toString(remCount.get())),
28
29 catch (Exception e)
30 e.printStackTrace(),
31
32
33 public void paint()
34 try
35 tfCnt.setText(Integer.toString(remCount.get())),
36
37 catch (Exception e)
38 e.printStackTrace(),
39
40
41 public void actionPerformed (ActionEvent ev)
42 try
43 showStatus("Incrementing..."),
44 for (int i 0 , i < I000 , i++ )
45 remCount.increment(),
46 showStatus("Done"),
47
48 catch (Exception e)
49 e.printStackTrace(),
50
51
c 2001 FEEC/UNICAMP 112
5.4. Programao com objetos distribuidos
52 public void update(int val) throws RemoteException
53 showStatus("Update"),
54 tfCnt.setText(Integer.toString(val)),
55
56
Como anteriormente, devem ser criados os stubs e skeletons para ambos os servios. O codigo
do servidor no soIre alterao em relao ao exemplo anterior, assim como a Iorma de execuo da
aplicao.
5.4.3 1ava IDL
A API Java IDL, presente na plataIorma Java desde a verso 1.2, permite a integrao entre
objetos Java e outros objetos, eventualmente desenvolvidos em outras linguagens de programao,
atravs da arquitetura CORBA. Os principais pacotes que compem essa API so org.omg.CORBA
e org.omg.CosNaming.
A partir da verso 1.3 da plataIorma Java, possivel gerar interIaces IDL para classes Java usan-
do o compilador rmic com a opo -idl". Outra opo, -iiop", indica que o protocolo de
comunicao de CORBA, IIOP, sera utilizado em stubs e ties (correspondentes aos skeletons) de
RMI.
Arquitetura CORBA
CORBA (Common Obfect Request Broker Architecture) um padro denido pelo consorcio
OMG Obfect Management Group) que dene uma arquitetura de objetos, com uma linguagem para
descrio de interIaces com mapeamentos padronizados para diversas linguagens e um conjunto de
servios basicos.
Como o padro CORBA visa atender a diversas linguagens de programao, sua especicao
ampla e relativamente complexa. De Iorma extremamente simplicada, os componentes basicos
dessa arquitetura so:
a linguagem de descrio de interIaces;
o intermediario para repassar requisies a objetos remotos;
o servio para localizar objetos remotos; e
o protocolo de comunicao.
IDL a Interface Description Language, uma linguagem que permite especicar interIaces de
Iorma independente da linguagem de programao na qual a especicao implementada. CORBA
determina uma srie de mapeamentos padronizados entre IDL e outras linguagens, tais como C, C,
COBOL e Java.
ORB o Obfect Request Broker, o nucleo da arquitetura CORBA. E um programa que deve
estar executando em cada maquina envolvida em uma aplicao CORBA, sendo o responsavel pela
conexo entre clientes e servios atravs dos correspondentes stubs e skeletons.
c 2001 FEEC/UNICAMP 113
5.4. Programao com objetos distribuidos
O Servio de Nomes de CORBA dene uma estrutura para associar nomes a objetos remotos
denidos na arquitetura. A estrutura denida uma hierarquia (ou arvore), onde cada ramo dene
um contexto distinto e cujas Iolhas so os nomes dos servios disponibilizados. Assim, a reIerncia
completa para o nome de um servio dada pelo contexto (os nomes dos nos intermediarios) e pelo
nome do servio.
O protocolo de comunicao de CORBA especica o padro para que as requisies de objetos
transmitidas entre ORBs, independentemente de como ou em qual linguagem esses ORBs Ioram
implementados, possam ser reconhecidas. O protocolo de comunicao CORBA mais comum o
IIOP, o Internet Inter-ORB Protocol, em Iuno da disseminao da Internet, mas outros protocolos
podem ser obtidos para outras plataIormas.
CORBA e 1ava
Uma vez denida ou obtida a interIace IDL para um servio, as classes auxiliares para acessar o
objeto remoto que implementa o servio so obtidas pela compilao da interIace, usando o aplicativo
idlj (ou idltojava ou ainda idl?java em verses anteriores a Java 1.3). Alm de classes para
stubs e skeletons, so geradas classes auxiliares (helpers e holaers) para permitir a comunicao entre
objetos Java e dados estabelecidos em outras linguagens.
Na plataIorma Java ha uma implementao para o servio de nomes de CORBA, oIerecida pelo
aplicativo tnameserv. Esse servio esta mapeado por deIault para a porta 900, podendo esta ser
modicada pela opo -ORBInitialPort".
A interao entre um ORB e um programa Java da-se atravs de mtodos da classe ORB. Para
inicializar a reIerncia ao ORB, utiliza-se o mtodo estatico init() dessa classe. Para obter uma
reIerncia para o servio de nomes utiliza-se o mtodo resolve_initial_references(),
tendo a NameService como argumento.
O exemplo a seguir a implementao usando CORBA do classico programa 'Hello, world. E
composto por trs arquivos: a interIace IDL, o cliente e o servidor.
A InterIace IDL descreve um servio com um unico mtodo, sendo aqui denida usando as
construes da linguagem IDL:
1 module HelloApp
2 interface Hello
3 string sayHello(),
4
5
Usando-se o aplicativo idlj, gera-se a interIace Java correspondente, com a traduo das cons-
trues IDL para as primitivas Java segundo o padro estabelecido em CORBA, alm de outros
arquivos auxiliares (stub, skeleton, helper, holaer), no apresentados aqui:
1 package HelloApp,
2 public interface Hello
3 extends org.omg.CORBA.Object
4 String sayHello(),
5
c 2001 FEEC/UNICAMP 114
5.4. Programao com objetos distribuidos
O codigo cliente ativa o ORB, obtm uma reIerncia para o servio de nomes e, a partir deste
servio, obtm uma reIerncia remota para o objeto com o servio Hello. Obtida a reIerncia, o
mtodo invocado normalmente:
1 import HelloApp.*,
2 import org.omg.CosNaming.*,
3 import org.omg.CORBA.*,
4 public class HelloClient
5 public static void main (String args])
6 try
7 ORB meuOrb ORB.init(args,null),
8 org.omg.CORBA.Object objRef
9 meuOrb.resolve_initial_references("NameService"),
10 NamingContext ncRef NamingContextHelper.narrow(objRef),
11 NameComponent nc new NameComponent("Hello",""),
12 NameComponent path] nc,
13 Hello helloRef HelloHelper.narrow(ncRef.resolve(path)),
14 String hi helloRef.sayHello(),
15 System.out.println(hi),
16
17 catch(Exception e)
18 System.out.println(e),
19 e.printStackTrace(System.out),
20
21
22
Nesse exemplo, combina-se a implementao do servio e o correspondente servidor. A classe
HelloServer um servidor que ativa o ORB, cria o objeto que implementa o servio, obtm uma
reIerncia para o servio de nomes e registra o objeto neste diretorio associado ao nome Hello. A
classe HelloServant uma implementao do servio especicado; observe que essa classe
uma extenso de _HelloImplBase, o skeleton denido pelo aplicativo idlj:
1 import HelloApp.*,
2 import org.omg.CosNaming.*,
3 import org.omg.CosNaming.NamingContextPackage.*,
4 import org.omg.CORBA.*,
5 public class HelloServer
6 public static void main(string args])
7 try
8 // Create the ORB
9 ORB orb ORB.init(args,null),
10 // Instantiate the servant object
11 HelloServant helloRef new HelloServant(),
12 // Connect servant to the ORB
13 orb.connect(helloRef),
c 2001 FEEC/UNICAMP 115
5.4. Programao com objetos distribuidos
14 //Registering the servant
15 org.omg.CORBA.Object objRef
16 orb.resolve_initial_references("NameService"),
17 NamingContext ncRef NamingContextHelper.narrow(objRef),
18 NameComponent nc new NameComponent("Hello",""),
19 NameComponent path] nc,
20 ncRef.rebind(path, helloRef),
21 // Wait for invocation
22 java.lang.Object sync new java.Lang.Object(),
23 synchronized(sync)
24 sync.wait(),
25
26
27 catch(Exception e)
28 System.out.println(e),
29 e.printStackTrace(System.out),
30
31
32
33 class HelloServant extends _HelloImplBase
34 public String sayHello()
35 return "\nHelloWorld!\n",
36
37
c 2001 FEEC/UNICAMP 116
Apndice A
Palavras chaves de 1ava
As palavras a seguir so de uso reservado em Java e no podem ser utilizadas como nomes de
identicadores:
abstract double int static
boolean else interface super
break extends long switch
byte final native synchronized
case finally new this
catch float null throw
char for package throws
class goto private transient
const if protected try
continue implements public void
default import return volatile
do instanceof short while
117

Você também pode gostar