Beruflich Dokumente
Kultur Dokumente
Tpicos Avanados
JDBC Threads Redes RMI CORBA Servlets JSP
8 de Novembro de 2003
Direitos Autorais
Todos os direitos sobre esta obra esto reservados para os autores do livro. Texto registrado na Biblioteca Nacional: registro
297.373, livro 540, folha 33.
O48J
OLIVEIRA, Alcione de Paiva
Java na prtica, tpicos avanados: RMI CORBA
JDBC threads redes servlets JSP / Alcione de Paiva Oliveira,
Vincius Valente Maciel. - Viosa : Fbrica de Livros Ed.,
2003.
225 p. il.
1. Linguagem de programao. 2. Java. I. MACIEL,
Vincius Valente. II. Ttulo.
CDD: 005.133
CDU: 519.682
Sobre os Autores
Alcione de Paiva Oliveira Doutor em Informtica pela
PUC-Rio, Mestre em Cincias pelo Instituto Militar de Engenharia e Bacharel em Oceanograa pela UERJ. Ex-diretor tcnico
da INFAX Tecnologia e Sistemas e ex-coordenador do curso de
Engenharia de Computao do Instituto Militar de Engenharia.
Atualmente exerce o cargo de professor Adjunto do Departamento
de Informtica da Universidade Federal de Viosa. Suas reas de
interesse so Inteligncia Articial, Linguagens de Programao e
Engenharia de Software.
Vincius Valente Maciel Mestrando em Cincia da Computao pela Universidade Federal Fluminense e Bacharel em Cincia da Computao pela Universidade Federal de Viosa. Atualmente exerce o cargo de Analista de Sistemas da INFAX Tecnologia e Sistemas Ltda. Suas reas de interesse so Especicao Formal de Sistemas, Linguagens de Programao, Sistemas de
Tempo-Real e Engenharia de Software.
AGRADECIMENTOS
A elaborao do presente trabalho contou com a colaborao direta e indireta de diversas pessoas. Primeiramente gostaramos de
agradecer nossas mulheres e companheiras Alexandra e Andria
que nos apoiaram (e nos toleraram) em todos os momentos. Da
mesma forma gostaramos de agradecer a nossos pais que sempre esto ao nosso lado. No podemos esquecer tambm todos os
nossos alunos que ajudaram com sugestes quando este material
ainda era uma apostila. Finalmente, gostaramos de agradecer a
todos que direta e indiretamente ajudaram na concretizao deste
sonho.
PREFCIO
LISTA DE SIGLAS
ASP
AWT
CGI
GUI
CORBA
CPU
DMZ
FAPESP
HTML
HTTP
IP
JDBC
JDK
JSP
MIME
MVC
ODBC
ORB
PHP
RMI
TCP
UDP
URI
URL
ActiveServer Pages
Abstract Window Toolkit
Common Gateway Interface
graphical user interface
Common Object Request Broker Architecture
Central Processing Unit
Demilitarized Zone
Fundao de Amparo Pesquisa do Estado de
So Paulo
Hypertext Markup Language
Hypertext Transfer Protocol
Internet Protocol
Java Database Connectivity
Java Development Toolkit
Java Server Pages
Multipurpose Internet Mail Extensions
modelo-viso-controle
Open Database Connectivity
Object Request Broker
Personal Home Pages
Remote Method Invocation
Transmission Control Protocol
User Datagram Protocol
Uniform Resource Identier
Uniform Resource Locator
Contedo
1 Introduo
1.1
Convenes . . . . . . . . . . . . . . . . . . . . . .
2 Concorrncia
2.1
2.2
2.3
2.4
2.5
2.6
3 Programao em rede
3.1
1
6
10
13
14
17
18
19
23
25
26
27
28
32
39
55
55
57
3.2
3.1.2 UDP . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Identicao de Hosts (Nmero IP) . . . . .
3.1.4 Identicao de Processos (Portas) . . . . .
Programao em Rede com Java . . . . . . . . . .
3.2.1 Comunicao Bsica Entre Aplicaes . . .
3.2.2 Comunicao orientada a conexo (cliente)
3.2.3 Comunicao orientada conexo (servidor)
3.2.4 Comunicao Sem Conexo (UDP) . . . . .
3.2.5 Comunicao por meio de URL . . . . . . .
3.2.6 Manipulando URLs em Java . . . . . . . .
3.2.7 Comunicando por meio de URLConnection
5 RMI
5.1
5.2
Arquitetura RMI . . . . . . . . . .
Criando nossa agenda distribuda .
5.2.1 Passo a Passo . . . . . . . .
5.2.2 Implementando interface do
5.2.3 Escrevendo objeto remoto .
. . . .
. . . .
. . . .
objeto
. . . .
58
58
59
60
61
61
63
66
69
70
72
75
. 76
. 77
. 79
. 79
. 84
. 85
. 85
. 86
. 87
. 89
. 91
. 92
. 92
. 94
. 97
. 98
. 100
. 107
. . . . .
. . . . .
. . . . .
remoto
. . . . .
111
112
112
112
113
114
5.2.4
5.2.5
5.3
Gerando Stub . . . . . . . .
Desenvolvendo o cdigo que
objeto . . . . . . . . . . . .
5.2.6 Escrevendo o cliente . . . .
Testando tudo . . . . . . . . . . . .
5.3.1 No Windows . . . . . . . .
5.3.2 No Linux . . . . . . . . . .
6 CORBA
6.1
6.2
6.3
O que CORBA? . . . . . . . . . . . . .
Exemplo CORBA em Java . . . . . . . . .
6.2.1 Escrevendo a IDL . . . . . . . . .
6.2.2 Compilando a IDL . . . . . . . . .
6.2.3 Implementando nosso Objeto . . .
6.2.4 Escrevendo o servidor . . . . . . .
6.2.5 Escrevendo o cliente . . . . . . . .
6.2.6 Rodando o exemplo . . . . . . . .
Exemplo CORBA (Java + C) . . . . . . .
6.3.1 Compilando a IDL . . . . . . . . .
6.3.2 Implementando nosso Objeto . . .
6.3.3 Escrevendo o Servidor . . . . . . .
6.3.4 Escrevendo o Cliente . . . . . . . .
6.3.5 Compilando e Rodando o Exemplo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Servlets . . . . . . . . . . . . . . . . . . . . . .
7.1.1 Applets X Servlets . . . . . . . . . . . .
7.1.2 CGI X Servlets . . . . . . . . . . . . . .
A API Servlet . . . . . . . . . . . . . . . . . . .
7.2.1 Exemplo de Servlet . . . . . . . . . . . .
Compilando o Servlet . . . . . . . . . . . . . .
7.3.1 Instalando o Tomcat . . . . . . . . . . .
Preparando para executar o Servlet . . . . . . .
7.4.1 Compilando o Servlet . . . . . . . . . .
7.4.2 Criando uma aplicao no Tomcat . . .
Executando o Servlet . . . . . . . . . . . . . . .
7.5.1 Invocando diretamente pelo Navegador .
7.5.2 Invocando em uma pgina HTML . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7 Servlets e JSP
7.1
7.2
7.3
7.4
7.5
. . . . . . . . .
disponibiliza o
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
116
117
117
118
119
119
126
126
127
127
128
129
130
130
131
132
132
134
135
137
137
139
139
139
142
143
143
148
148
148
149
149
150
Captulo 1
Introduo
Java uma linguagem de programao desenvolvida pela Sun Microsystems e lanada em verso beta em 1995. O seu desenvolvimento foi iniciado em 1991 pela equipe liderada por James Gosling visando o mercado de bens eletrnicos de consumo. Por isso
foi projetada desde o incio para ser independente de hardware,
uma vez que as caractersticas dos equipamentos variam amplamente neste nicho de desenvolvimento. Outro objetivo estabelecido desde sua concepo foi o de ser uma linguagem segura. Segura tanto no sentido de evitar algumas falhas comuns que os programadores costumam cometer durante o desenvolvimento, como
no sentido de evitar ataques externos. Isto importante no mercado de bens eletrnicos de consumo porque ningum gostaria de
adquirir um produto que necessitasse desligar e religar para que
voltasse a funcionar corretamente. Estas caractersticas despertaram o interesse para utilizao de Java em outro ambiente que
tambm necessitava de uma linguagem com este perl: a Internet.
A Internet tambm um ambiente constitudo por equipamentos de diferentes arquiteturas e necessita muito de uma linguagem
que permita a construo de aplicativos seguros. Muitas pessoas
argumentaro que estas caractersticas podem ser encontradas em
outras linguagens e portanto isto no explica o sbito sucesso da
linguagem. Podemos arriscar alguns palpites apesar de este ser
um terreno um pouco pantanoso para se aventurar, at porque
1
Java na prtica
Orientao a objetos. Java no uma linguagem totalmente orientada a objetos como Smalltalk, onde tudo
objeto ou mtodos de objetos. Por questes de ecincia foram mantidos alguns tipos primitivos e suas operaes. No
entanto Java possui um grau de orientao a objetos bem
maior que C/C++, o que a torna bem mais harmoniosa e
fcil de assimilar, uma vez que o programador tenha compreendido esta forma de desenvolvimento.
Compilao do cdigo fonte para cdigo de uma mquina virtual (Bytecodes). Esta caracterstica visa tornar a linguagem independente de plataforma de Hardware
e Sistema Operacional. Obviamente necessrio que exista
um programa capaz de interpretar o cdigo em Bytecodes
para cada Sistema Operacional, denominado de Mquina
Tpicos Avanados
Virtual. Porm, nada impede que o cdigo fonte seja traduzido diretamente para o cdigo executvel na mquina
de destino. J existem ambientes de desenvolvimento que
apresentam este tipo de opo. Alternativamente possvel
projetar equipamentos que processem em hardware os Bytecodes. O diagrama da gura 1.1 ilustra as etapas envolvidas
na execuo de um cdigo Java.
Java na prtica
realizar alocao dinmica de memria. Todo objeto criado
alocado na rea de heap (memria de alocao dinmica),
mas o usurio no pode manipular a referncia ao objeto
explicitamente.
Tpicos Avanados
Java na prtica
1.1 Convenes
As seguintes convenes so usadas neste livro.
1. Fontes com larguras constantes so usadas em:
exemplos de cdigo
public c l a s s Ponto
{
}
private int x , y ;
em termos estrangeiros;
na primeira vez que for usado um termo cujo signicado
no for conhecimento generalizado.
Captulo 2
Concorrncia
Um sistema operacional dito concorrente se permite que mais de
uma tarefa seja executada ao mesmo tempo. Na prtica a concorrncia real ou paralelismo s possvel se o hardware subjacente
possui mais de um processador. No entanto, mesmo em computadores com apenas um processador possvel obter um certo tipo
de concorrncia fazendo com que o processador central execute
um pouco de cada tarefa por vez, dando a impresso de que as
tarefas esto sendo executadas simultaneamente.
Dentro da nomenclatura empregada, uma instncia de um programa em execuo chamada de processo. Um processo ocupa
um espao em memria principal para o cdigo e para as variveis
transientes (variveis que so eliminadas ao trmino do processo).
Cada processo possui pelo menos uma linha de execuo (Thread ).
Para ilustrarmos o que uma linha de execuo suponha um determinado programa prog1. Ao ser posto em execuo criado
um processo, digamos A, com uma rea de cdigo e uma rea de
dados e iniciada a execuo do processo a partir do ponto de
entrada. A instruo inicial assim como as instrues subsequentes formam uma linha de execuo do processo A. Portanto, um
thread nada mais que uma sequncia de instrues que est em
execuo de acordo com que foi determinado pelo programa. O
estado corrente da linha de execuo representada pela instruo que est sendo executada. A gura 2.1 mostra a relao entre
7
Java na prtica
estes elementos.
Tpicos Avanados
Sistemas monotarefas e monothreads como o MS-DOS possuem apenas um processo em execuo em um determinado instante e apenas um thread no processo. Sistemas multitarefas e
monothreads como o Windows 3.1 permitem vrios processos em
execuo e apenas um thread por processo. Sistemas multitarefas e multithread como o Solaris, OS/2, Linux, QNX e Windows
98/NT/XP/2000 permitem vrios processos em execuo e vrios
threads por processo.
Como os threads em um mesmo processo possuem uma rea de
dados em comum, surge a necessidade de controlar o acesso a essa
rea de dados, de modo que cada thread no leia ou altere dados no
momento que esto sendo alterados por outro thread. A incluso
de instrues para controlar o acesso a reas compartilhadas torna
o cdigo mais complexo do que o cdigo de processos monothreads.
Uma pergunta pode surgir na mente do leitor: se a incluso
de mais de um thread torna o cdigo mais complexo, ento porque razo algum projetaria cdigo multithread ? A resposta :
processos com vrios threads podem realizar mais de uma tarefa
simultaneamente e, por isso, so teis na criao de processos
servidores, criao de animaes e no projeto de interfaces com
o usurio que no cam travadas durante a execuo de alguma
funo. Por exemplo, imagine um processo servidor a espera de
requisies de servios. Podemos projet-lo de modo que, ao surgir uma solicitao de um servio por um processo cliente, ele crie
um thread para atender a solicitao enquanto volta a esperar a
requisio de novos servios. Com isto os processos clientes no
precisam esperar o trmino do atendimento de alguma solicitao
para ter sua requisio atendida.
O mesmo pode ser dito em relao ao projeto de interfaces com
o usurio. O processo pode criar threads para executar as funes
solicitadas pelo usurio, enquanto aguarda novas interaes. Caso
contrrio, a interface caria impedida de receber novas solicitaes
enquanto processa a solicitao corrente, o que poderia causar
uma sensao de travamento ao usurio.
Outra aplicao para processos multithread a animao de
interfaces. Nesse caso cria-se um ou mais threads para gerenciar
as animaes enquanto outros threads cuidam das outras tarefas,
como por exemplo, a entrada de dados.
10
Java na prtica
{
}
...
Tpicos Avanados
11
String s ;
public MeuThread ( S t r i n g a s )
{
}
super ( ) ;
s = new S t r i n g ( a s ) ;
{
}
12
Java na prtica
No exemplo anterior apenas um thread, alm do principal criado. Nada impede que sejam criados mais objetos da mesma classe
para disparar um nmero maior de threads. O exemplo 2.3 mostra a execuo de dois threads sobre dois objetos de uma mesma
classe.
public c l a s s TesteThread2
Tpicos Avanados
13
private S t r i n g men ;
public s t a t i c void main ( S t r i n g a r g s [ ] )
{
}
14
Java na prtica
o mesmo objeto:
Thread t 1 = new Thread ( ob1 ) ;
Thread t 2 = new Thread ( ob1 ) ;
Neste caso alguns cuidados devem ser tomados, uma vez que
existe o compartilhamento das variveis do objeto por dois threads.
Os problemas que podem advir de uma situao como esta sero
tratados mais adiante.
Hierarquia
A classe Thread deriva diretamente da classe Object.
java.lang.Object
|
+--java.lang.Thread
Construtores
A tabela 2.1 mostra os principais construtores da classe Thread.
Podemos notar que possvel nomear os threads e agrup-los. Isto
til para obter a referncia de threads por meio do seu nome.
Tpicos Avanados
Construtor
Thread(ThreadGroup g, String nome)
Thread(Runnable ob, String nome)
Thread(ThreadGroup g,
Runnable ob, String nome)
Thread(String nome)
Thread()
Thread(Runnable ob)
Thread(ThreadGroup g, Runnable ob)
15
Descrio
Mtodos
A tabela 2.2 apresenta os principais mtodos da classe Thread.
Alguns mtodos muito usados nas verses anteriores do SDK1.2
esto sendo descontinuados (deprecated ) por serem considerados
inseguros ou com tendncia a causarem deadlock 2 . Os mtodos
descontinuados so: stop(), suspend() e resume().
16
Java na prtica
Mtodo
static Thread currentThread()
static int enumerate(Thread[] v)
String getName()
int getPriority()
ThreadGroup getThreadGroup()
void interrupt()
void run()
void setName(String name)
void setPriority(int p)
static void sleep(long milis)
static void sleep(long milis,
int nanos)
void start()
static void yield()
Descrio
Tpicos Avanados
17
Mtodo
Descrio
void notify()
void notifyAll()
void wait()
void wait(long milis,
int nanos)
Mtodo
Descrio
18
Java na prtica
Tpicos Avanados
19
// 1 0 0 0 m i l i s e g u n d o s ( 1 segundo )
// Transio do e s t a d o em execuo
// para o e s t a d o s u s p e n s o
sleep (1000);
} catch ( I n t e r r u p t e d E x c e p t i o n e ) { }
// Evento : fim do tempo de s u s p e n s o
// Transio do e s t a d o em s u s p e n s o
// para o e s t a d o pr on to e d e s t e p/ execuo
}
System . out . p r i n t l n ( "FIM ! " + getName ( ) ) ;
// Evento : fim da execuo do t h r e a d
// Transio do e s t a d o a t i v o s u s p e n s o para o
// e s t a d o morto
sleep
O mtodo sleep() um mtodo esttico e possui as seguintes
interfaces:
static void sleep(long ms)
throws InterruptedException
ou
20
Java na prtica
static void sleep(long ms, int ns)
throws InterruptedException
String s ;
public ThreadComSleep ( S t r i n g a s )
{
}
super ( ) ;
s = new S t r i n g ( a s ) ;
}
System . out . p r i n t l n ( "FIM ! "+s ) ;
Tpicos Avanados
21
yield
O mtodo yield() um mtodo esttico com a seguinte interface:
String s ;
public ThreadComYield ( S t r i n g a s )
{
}
super ( ) ;
s = new S t r i n g ( a s ) ;
}
System . out . p r i n t l n ( "FIM ! "+s ) ;
22
Java na prtica
join
O mtodo join() um mtodo de instncia da classe Thread e
utilizado quando existe a necessidade do thread corrente esperar
pelo trmino da execuo de outro thread. As verses do mtodo
join() so as seguintes:
String s ;
public ThreadComJoin ( S t r i n g a s )
{
}
super ( ) ;
s = new S t r i n g ( a s ) ;
public c l a s s T e s t a J o i n
Tpicos Avanados
23
public ThreadDaemon ( )
24
Java na prtica
{
setDaemon ( true ) ;
start ();
{
}
for ( ; ; ) y i e l d ( ) ;
public c l a s s TestaDaemon
try
stdin . readLine ( ) ;
} catch ( IOException e ) { }
Tpicos Avanados
25
26
Java na prtica
Tpicos Avanados
27
1 Linha1
2 Linha1
3 Linha1
4 Linha1
FIM! Linha1
28
Java na prtica
Prioridades Java
Prioridades MSWindows
0
1(Thread.MIN_PRIORITY)
2
3
4
5(Thread.NORM_PRIORITY)
6
7
8
9
10(Thread.MAX_PRIORITY)
THREAD_PRIORITY_IDLE
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_BELOW_HIGHEST
THREAD_PRIORITY_BELOW_HIGHEST
THREAD_TIME_CRITICAL
Tpicos Avanados
29
private int v e t I n t [ ] ;
public CalcDez ( ) { v e t I n t=new int [ 1 0 ] ; }
public void run ( )
if
else
for ( ; ; )
{
30
Java na prtica
}
Tpicos Avanados
31
c l a s s Compartilhada
private int v e t I n t [ ] ;
public Compartilhada ( ) { v e t I n t=new int [ 1 0 ] ; }
public void s e t V a l ( )
for ( ; ; )
}
}
1000);
v et I n t [ i ]= v e tI n t [0]+ i ;
private Compartilhada o b j ;
private int t i p o ;
public CalcDez2 ( Compartilhada aObj , int aTipo )
{ o b j = aObj ; t i p o = aTipo ; }
for ( ; ; )
i f ( t i p o ==1) o b j . s e t V a l ( ) ;
else
{
32
Java na prtica
Tpicos Avanados
33
34
Java na prtica
Hoare. Na linguagem Java todo objeto possui um monitor associado. Para facilitar o entendimento podemos encarar o monitor
como detentor de um passe. Todo thread pode pedir emprestado o passe ao monitor de um objeto antes de realizar alguma
computao. Como o monitor possui apenas um passe, apenas
um thread pode adquirir o passe em um determinado instante.
O passe tem que ser devolvido para o monitor para possibilitar
o emprstimo do passe a outro thread. A gura 2.5 ilustra essa
analogia.
Nos resta saber como solicitar o passe ao monitor. Isto feito
por meio da palavra chave synchronized. Existem duas formas
de se usar a palavra chave synchronized: na declarao de mtodos e no incio de blocos. O exemplo 2.12 mostra duas verses
da classe FilaCirc que implementa uma la circular de valores
inteiros: uma com mtodos synchronized e outra com blocos
synchronized. Um objeto desta classe pode ser compartilhado
por dois ou mais threads para implementar o exemplo clssico de
concorrncia do tipo produtor/consumidor.
A palavra chave synchronized na frente dos mtodos de instncia signica que o mtodo ser executado se puder adquirir o
monitor do objeto a quem pertence o mtodo3 . Caso contrrio, o
thread que invocou o mtodo ser suspenso at que possa adquirir
o monitor. Esta forma de sincronizao abordada no exemplo 2.12 a. Portanto, se algum thread chamar algum mtodo de
um objeto da classe FilaCirc nenhum outro thread que compartilha o mesmo objeto poder executar um mtodo do objeto at
que o mtodo chamado pelo primeiro thread termine. Caso outro
thread invoque um mtodo do mesmo objeto car bloqueado at
Tpicos Avanados
35
class FilaCirc
{
private final int TAM = 10;
private int vetInt[];
private int inicio, total;
class FilaCirc
{
private final int TAM = 10;
private int vetInt[];
private int inicio, total;
public FilaCirc()
{
vetInt=new int[TAM];
inicio=0;
total =0;
}
public synchronized
void addElement(int v)
throws Exception
{
if (total == TAM) throw new
Exception("Fila cheia!");
vetInt[(inicio+total)%TAM] = v;
total++;
}
public synchronized
int getElement()
throws Exception
{
if (total == 0 ) throw new
Exception("Fila vazia!");
int temp = vetInt[inicio];
inicio = (++inicio)%TAM;
total--;
return temp;
}
}
public FilaCirc()
{
vetInt=new int[TAM];
inicio=0;
total =0;
}
public void addElement(int v)
throws Exception
{
synchronized(this) {
if (total == TAM) throw new
Exception("Fila cheia!");
vetInt[(inicio+total)%TAM] = v;
total++;
}
}
public int getElement()
throws Exception
{
synchronized(this) {
if (total == 0 ) throw new
Exception("Fila vazia!");
int temp = vetInt[inicio];
inicio = (++inicio)%TAM;
total--;
}
return temp;
}
O leitor pode estar se perguntando sobre a necessidade de sincronizar os mtodos da classe FilaCirc uma vez que ocorrem
apenas atribuies simples a elementos individuais de um vetor e
as atribuies de inteiros so atmicas. De fato o problema ocorre
no na atribuio dos elementos e sim na indexao do array. Por
exemplo, a instruo
inicio = (++inicio)%TAM;
36
Java na prtica
do mtodo getElement() no atmica. Suponha que os mtodos da classe FilaCirc no sejam sincronizados e que as variveis
inicio e total possuam os valores 9 e 1 respectivamente. Suponha tambm que thread invocou o mtodo getElement() e foi
interrompido na linha de cdigo mostrada acima aps o incremento da varivel inicio mas antes da concluso da linha de
cdigo. Nesse caso o valor de inicio 10. Se neste instante
outro thread executar o mtodo getElement() do mesmo objeto
ocorrer uma exceo IndexOutOfBoundsException ao atingir a
linha de cdigo
inicio = (inicio+1)%TAM;
evitaremos a exceo, mas no evitaremos o problema de retornar
mais de uma vez o mesmo elemento. Por exemplo, se um thread
for interrompido no mesmo local do caso anterior, outro thread
pode obter o mesmo elemento, uma vez que os valores de inicio
e total no foram alterados. Na verdade, o nmero de situaes problemticas, mesmo para esse exemplo pequeno, enorme
e perderamos muito tempo se tentssemos descrev-las em sua
totalidade.
Em alguns casos pode ser indesejvel sincronizar todo um mtodo, ou pode-se desejar adquirir o monitor de outro objeto, diferente daquele a quem pertence o mtodo. Isto pode ser feito
usando a palavra chave synchronized na frente de blocos. Esta
forma de sincronizao mostrada no exemplo 2.12 b. Neste
modo de usar a palavra-chave synchronized necessrio indicar
o objeto do qual se tentar adquirir o monitor. Caso o monitor
seja adquirido, o bloco executado, caso contrrio o thread suspenso at que possa adquirir o monitor. O monitor liberado no
nal do bloco.
No exemplo 2.12 b, o monitor usado na sincronizao o
do prprio objeto do mtodo, indicado pela palavra chave this.
Qualquer outro objeto referencivel no contexto poderia ser usado.
Tpicos Avanados
37
private F i l a C i r c o b j ;
private int t i p o ;
public T e s t a F i l a C i r c ( F i l a C i r c aObj , int aTipo )
{ o b j = aObj ; t i p o = aTipo ; }
for ( ; ; )
try
{
i f ( t i p o ==1)
o b j . getElement ( ) ) ;
} catch ( E x c e p t i o n e )
{ System . out . p r i n t l n ( e . getMessage ( ) ) ; }
F i l a C i r c o b j = new F i l a C i r c ( ) ;
T e s t a F i l a C i r c t 1 = new T e s t a F i l a C i r c ( obj , 1 ) ;
T e s t a F i l a C i r c t 2 = new T e s t a F i l a C i r c ( obj , 2 ) ;
38
Java na prtica
t1 . s t a r t ( ) ;
t2 . s t a r t ( ) ;
Tpicos Avanados
39
40
Java na prtica
b)
c)
class X
{
...
public synchronized
int mx()
{
...
// Espera uma condio
while(!cond) wait();
// Prossegue com a
// condio satisfeita
...
}
...
}
class Y
{
X ob;
...
public int my()
{
...
synchronized (ob)
{
// Notifica algum
// thread
ob.notify();
...
}
...
}
class Z
{
X ob;
...
public int mz()
{
...
synchronized (ob)
{
// Notifica todos
// os threads que
// esperam na fila
// do monitor de ob
ob.notifyAll();
...
}
...
}
Tpicos Avanados
41
monitor do objeto ao qual pertence o mtodo. Por isso, nos exemplos 2.14 b e 2.14 c, o objeto sincronizado no bloco o mesmo que
invoca os mtodos notify() e notifyAll().
Outra observao importante que o thread que invoca o mtodo wait() o faz dentro de um lao sobre a condio de espera.
Isto ocorre porque apesar de ter sido noticado isto no assegura
que a condio est satisfeita. O thread pode ter sido noticado
por outra razo ou, entre a noticao e a retomada da execuo
do thread, a condio pode ter sido novamente alterada.
Uma vez noticado o thread no retoma imediatamente a execuo. preciso primeiro retomar a posse do monitor que no
momento da noticao pertence ao thread que noticou. Mesmo
aps a liberao do monitor nada garante que o thread noticado
ganhe a posse do monitor. Outros threads podem ter solicitado a
posse do monitor e terem preferncia na sua obteno.
O exemplo 2.14 mostra apenas um esquema para uso dos mtodos para noticao. O exemplo 2.15 uma verso do exemplo 2.12 a que usa os mtodos de noticao para evitar problemas
como a espera ocupada. O exemplo 2.13 pode ser usado sem modicaes para testar essa verso.
class FilaCirc
while ( t o t a l == TAM) w a i t ( ) ;
v e t I n t [ ( i n i c i o+t o t a l )%TAM] = v ;
t o t a l ++;
notify ();
42
Java na prtica
throws E x c e p t i o n
while ( t o t a l = = 0 ) w a i t ( ) ;
int temp = v e t I n t [ i n i c i o ] ;
i n i c i o = (++ i n i c i o )%TAM;
t o t a l ;
notify ();
return temp ;
Tpicos Avanados
43
44
Java na prtica
S t r i n g men)
i f ( l i s t a M e n==null )
{
}
l i s t a M e n = new Vector ( ) ;
tamMen . put ( d e s t , l i s t a M e n ) ;
// A f i l a e s t vazia , p o r t a n t o t h r e a d deve
// e s p e r a r a chegada de mensagens
while ( l i s t a M e n . s i z e ()==0) w a i t ( ) ;
S t r i n g temp = ( S t r i n g ) l i s t a M e n . f i r s t E l e m e n t ( ) ;
// A mensagem removida da f i l a
l i s t a M e n . removeElementAt ( 0 ) ;
return temp ;
Tpicos Avanados
6
{
7
super ( tg , nome ) ;
8
g e r = aGer ;
9
}
10
public void run ( )
11
{
12
S t r i n g nome = Thread . c u r r e n t T h r e a d ( ) . getName ( ) ;
13
for ( ; ; )
14
try
15
{
16
S t r i n g men = g e r . getMen ( nome ) ;
17
i f ( men . e q u a l s ( " fim " ) ) return ;
18
System . out . p r i n t l n ( nome+">Mensagem r e c e b i d a : "+
19
men ) ;
20
} catch ( E x c e p t i o n e )
21
{
22
System . out . p r i n t l n ( e . getMessage ( ) ) ;
23
}
24
}
25 }
26
27 c l a s s Gerador extends Thread
28 {
29
private GerenteMen g e r ;
30
public Gerador ( ThreadGroup tg , S t r i n g nome ,
31
GerenteMen aGer )
32
{
33
super ( tg , nome ) ;
34
g e r = aGer ;
35
}
36
public void run ( )
37
{
38
S t r i n g nome = Thread . c u r r e n t T h r e a d ( ) . getName ( ) ;
39
ThreadGroup t g =
40
Thread . c u r r e n t T h r e a d ( ) . getThreadGroup ( ) ;
41
Thread [ ] t l=null ;
42
for ( int i =0; i <100; i ++)
43
{
44
i f ( t l==null | | t l . l e n g t h != t g . a c t i v e C o u n t ( ) )
45
t l = new Thread [ t g . a c t i v e C o u n t ( ) ] ;
46
t g . enumerate ( t l ) ;
47
int n = ( int ) ( Math . random ( ) 1 0 0 0 ) % t l . l e n g t h ;
48
i f ( t l [ n ] ! = Thread . c u r r e n t T h r e a d ( ) )
49
{
50
System . out . p r i n t l n ( nome+
51
">Mensagem e n v i a d a para "+
52
t l [ n ] . getName ()+ " : mensagem "+i ) ;
53
g e r . addMen ( t l [ n ] . getName ( ) , "mensagem "+i ) ;
54
}
55
}
56
t l = new Thread [ t g . a c t i v e C o u n t ( ) ] ;
57
t g . enumerate ( t l ) ;
58
for ( int i =0; i <t l . l e n g t h ; i ++)
59
i f ( t l [ i ] ! = Thread . c u r r e n t T h r e a d ( ) )
60
g e r . addMen ( t l [ i ] . getName ( ) , " fim " ) ;
61
}
45
46
Java na prtica
62 }
63
64 public c l a s s TestaGerenteMen
65 {
66
public s t a t i c void main ( S t r i n g a r g s [ ] )
67
throws E x c e p t i o n
68
{
69
GerenteMen g e r = new GerenteMen ( ) ;
70
ThreadGroup t g = new ThreadGroup ( " t g " ) ;
71
Re cep tor r 1 = new Rec ept or ( tg , "r_um" , g e r ) ;
72
Re cep tor r 2 = new Rec ept or ( tg , " r _ d o i s " , g e r ) ;
73
Gerador g = new Gerador ( tg , " g " , g e r ) ;
74
r1 . s t a r t ( ) ;
75
r2 . s t a r t ( ) ;
76
g . start ();
77
}
78 }
Thread.currentThread().getName();
para se obter o nome do thread corrente. O nome do thread
usado para referenciar a la de mensagens do thread. Entre as
Tpicos Avanados
47
Thread.currentThread().getThreadGroup();
obtm uma referncia para o grupo de threads ao qual pertence
o thread corrente. Na linha 41 declarada uma varivel que ir
referenciar um vetor contendo referncias a todos os threads ativos
do grupo. Entre as linhas 42 e 55 executado um lao com 100
iteraes que produz e armazena as mensagens. Na linha 44
realizado um teste para a vericar da necessidade de criar o vetor
que ir conter as referncias para os threads ativos. Ele deve ser
criado a primeira vez e em todas as vezes que a capacidade do vetor
for diferente do nmero de threads ativos do grupo. O tamanho
do vetor determinado pelo mtodo de instncia activeCount()
da classe ThreadGroup. A linha 46 contm o cdigo
tg.enumerate(tl);
que insere as referncias de todos os threads no vetor tl. O comando
48
Java na prtica
int n = (int)(Math.random()*1000)%tl.length;
da linha 47 calcula um nmero que ser usado para acessar o thread
dentro do vetor de referncias. O teste da linha 48 impede que
seja enviada uma mensagem para o prprio gerador, descartando
as mensagens. As linhas 50 a 53 tratam da impresso e envio da
mensagem construda. J fora da iterao, as linhas 56 a 60 tratam
do envio da mensagem m para todos os threads receptores, o
que far com que encerrem sua execuo.
As linhas 64 a 78 denem a classe que ser usada como ponto
de entrada da aplicao. Ela responsvel pela criao dos objetos
e disparos dos threads. No exemplo, alm do thread gerador, apenas dois threads receptores so criados. interessante notar que
no preciso indicar para o thread gerador as referncias para os
threads receptores. Elas so obtidas dinamicamente por meio do
grupo de threads. Um possvel trecho da sada obtida na execuo
do programa do exemplo 2.17 seria o seguinte:
...
g>Mensagem enviada para r_dois:mensagem 88
r_um>Mensagem recebida:mensagem 87
g>Mensagem enviada para r_dois:mensagem 90
r_dois>Mensagem recebida:mensagem 88
g>Mensagem enviada para r_um:mensagem 91
r_dois>Mensagem recebida:mensagem 90
g>Mensagem enviada para r_um:mensagem 93
r_um>Mensagem recebida:mensagem 91
g>Mensagem enviada para r_um:mensagem 95
r_um>Mensagem recebida:mensagem 93
g>Mensagem enviada para r_um:mensagem 96
r_um>Mensagem recebida:mensagem 95
g>Mensagem enviada para r_um:mensagem 97
r_um>Mensagem recebida:mensagem 96
g>Mensagem enviada para r_dois:mensagem 99
r_um>Mensagem recebida:mensagem 97
r_dois>Mensagem recebida:mensagem 99
Tpicos Avanados
49
public S t r i n g getMen ( S t r i n g d e s t )
throws E x c e p t i o n
i f ( l i s t a M e n==null )
{
}
l i s t a M e n = new Vector ( ) ;
tamMen . put ( d e s t , l i s t a M e n ) ;
// A f i l a e s t vazia , p o r t a n t o t h r e a d
50
Java na prtica
// deve e s p e r a r
while ( l i s t a M e n . s i z e ()==0)
synchronized ( l i s t a M e n ) { l i s t a M e n . w a i t ( ) ; }
S t r i n g temp = ( S t r i n g ) l i s t a M e n . f i r s t E l e m e n t ( ) ;
// A mensagem removida da f i l a
l i s t a M e n . removeElementAt ( 0 ) ;
return temp ;
Operao
inicializar
P
V
Descrio
Tpicos Avanados
51
Produtor
Consumidor
s=1; n=0;
incio loop
incio loop
Produz mensagem
//regio crtica
//regio crtica
Retira mensagem
de mens.
Consome Mensagem
fim loop
private int c o n t ;
public Semaforo ( ) { c o n t = 0 ; }
public Semaforo ( int i ) { c o n t = i ; }
public synchronized void P ( )
throws I n t e r r u p t e d E x c e p t i o n
{
}
52
Java na prtica
public synchronized void V( )
{
}
c o n t++;
notifyAll ();
private Vector b u f f ;
private Semaforo s , n ;
public Consumidor ( Vector aBuff , Semaforo as ,
{
}
Semaforo an )
super ( ) ;
b u f f = a B u f f ; s = a s ; n = an ;
for ( ; ; )
try
{
n . p ( ) ; // V e r i f i c a se e x i s t e mensagens
s . p ( ) ; // V e r i f i c a se pode e n t r a r na
// r e g i o c r t i c a
S t r i n g men = ( S t r i n g ) b u f f . f i r s t E l e m e n t ( ) ;
b u f f . removeElementAt ( 0 ) ;
s .v();
i f ( men . e q u a l s ( " fim " ) ) return ;
System . out . p r i n t l n ( "Mensagem r e c e b i d a : "+
men ) ;
} catch ( E x c e p t i o n e )
{ System . out . p r i n t l n ( e . getMessage ( ) ) ; }
private Vector b u f f ;
private Semaforo s , n ;
public Produtor ( Vector aBuff , Semaforo as ,
{
Semaforo an )
super ( ) ;
Tpicos Avanados
b u f f = a B u f f ; s = a s ; n = an ;
try
s . p ( ) ; // V e r i f i c a se pode e n t r a r na
// r e g i o c r t i c a
i f ( i <10)
public c l a s s TestaSemaforo
53
54
Java na prtica
Captulo 3
Programao em rede
Diferentemente da maioria das linguagens de programao atuais,
Java foi projetada na era da Internet, e por isso mesmo ferramentas para comunicao dentro da Grande Rede foram incorporadas
linguagem desde a sua concepo. Classes para manipulao de
URLs (Uniform Resource Locator ) e dos protocolos que constituem a Internet fazem parte do ncleo bsico da linguagem. Isto
facilita muito a tarefa de desenvolver aplicaes para a Internet
ou outras redes que fazem uso do mesmo conjunto de protocolos.
Esta uma das principais foras da linguagem Java. Para entendermos como desenvolver aplicaes em rede com Java importante a compreenso de alguns conceitos bsicos sobre protocolos
de comunicao.
56
Java na prtica
Tpicos Avanados
57
3.1.1 TCP
O protocolo TCP um protocolo orientado a conexo que prov
um uxo convel de dados entre dois computadores. Por protocolo orientado a conexo queremos dizer que estabelecido um
canal de comunicao ponto-a-ponto onde os dados podem trafegar em ambas as direes. O TCP garante que os dados enviados
em uma ponta cheguem ao destino, na mesma ordem que foram
enviados. Caso contrrio, um erro reportado. Protocolos como
58
Java na prtica
HTTP, FTP e TELNET exigem um canal de comunicao convel e a ordem de recebimento dos dados fundamental para o
sucesso dessas aplicaes.
3.1.2 UDP
No entanto, nem todas as aplicaes necessitam destas caractersticas do protocolo TCP e o processamento adicional exigido
para garantir a conabilidade e a ordenao dos dados podem
inviabiliz-las. Para esses casos existe o protocolo de transporte
UDP. UDP um protocolo para envio de pacotes independentes
de dados, chamados de datagramas, de um computador a outro,
sem garantias sobre a chegada dos pacotes. O protocolo UDP no
orientado a conexo.
Tpicos Avanados
59
60
Java na prtica
Protocolo
HTTP
echo
FTP
SMTP
Finger
Daytime
pop3
Porta
80
7
20, 21
25
79
13
110
Tpicos Avanados
61
Descrio
Socket
ServerSocket
DatagramSocket
DatagramPacket
InetAddress
62
Java na prtica
import j a v a . i o . ;
import j a v a . n e t . ;
public c l a s s C l i e n t e D a t a
S o c k e t s o c k e t = null ;
B u f f e r e d R e a d e r i n = null ;
try
s o c k e t = new S o c k e t ( a r g s [ 0 ] , 1 3 ) ;
i n = new B u f f e r e d R e a d e r (
new InputStreamReader (
socket . getInputStream ( ) ) ) ;
} catch ( UnknownHostException e )
{
System . e r r . p r i n t l n ( " h o s t i n e x i s t e n t e : "+a r g s [ 0 ] ) ;
System . e x i t ( 1 ) ;
} catch ( IOException e )
{
System . e r r . p r i n t l n ( " Erro I /O: "+e . getMessage ( ) ) ;
System . e x i t ( 1 ) ;
in . close ( ) ;
socket . close ( ) ;
Tpicos Avanados
63
S e r v e r S o c k e t s s o c k e t = null ;
S o c k e t s o c k e t = null ;
B u f f e r e d W r i t e r out = null ;
64
Java na prtica
try
s s o c k e t = new S e r v e r S o c k e t ( 5 0 1 3 , 5 ) ;
for ( ; ; )
}
} catch ( IOException e )
{
System . out . p r i n t l n ( e . getMessage ( ) ) ;
}
finally {
out . c l o s e ( ) ;
socket . close ( ) ;
}
Tpicos Avanados
65
S e r v e r S o c k e t s s o c k e t=null ;
try
s s o c k e t = new S e r v e r S o c k e t ( 5 0 1 3 , 5 ) ;
while ( true )
}
} catch ( E x c e p t i o n e )
{ System . e r r . p r i n t l n ( e . getMessage ( ) ) ; }
finally { ssocket . close ();}
Socket socket ;
public SubServer ( S o c k e t a S o c k e t )
66
Java na prtica
socket = aSocket ;
try
}
}
B u f f e r e d W r i t e r out = new B u f f e r e d W r i t e r (
new OutputStreamWriter (
s o c k e t . getOutputStream ( ) ) ) ;
out . w r i t e ( ( new Date ( ) ) . t o S t r i n g ()+ "\n" ) ;
out . f l u s h ( ) ;
out . c l o s e ( ) ;
socket . close ( ) ;
catch ( E x c e p t i o n e ) { System . e r r . p r i n t l n ( e ) ; }
Tpicos Avanados
67
As classes DatagramPacket e DatagramSocket contm os mtodos necessrios para realizar este tipo de comunicao. Para
ilustrar o uso destas classes modicaremos os exemplos 3.1 e 3.2
para implementarmos uma aplicao Cliente/Servidor Daytime
que usa o protocolo UDP. O exemplo 3.4 mostra o cdigo fonte
do cliente e o exemplo 3.5 mostra o cdigo do servidor.
import j a v a . i o . ;
import j a v a . n e t . ;
public c l a s s DataClienteUDP
i f ( args . length != 1)
System . e r r . p r i n t l n (
"Uso : j a v a DataClienteUDP h o s t " ) ;
System . e x i t ( 1 ) ;
DatagramPacket dp =
new DatagramPacket ( b u f f , b u f f . l e n g t h ,
I n e t A d d r e s s . getByName ( a r g s [ 0 ] ) , 5 0 1 3 ) ;
ds . r e c e i v e ( dp ) ;
S t r i n g s = new S t r i n g ( dp . getData ( ) ) ;
System . out . p r i n t l n ( "Data e hora r e c e b i d a de "+
dp . g e t A d d r e s s ()+ " : "+s ) ;
68
Java na prtica
dados enviados pelo servidor e foi dimensionado para conter 64 bytes. O mtodo receive() do objeto DatagramSocket aguarda o
recebimento do pacote, tendo como argumento o objeto da classe
DatagramPacket. Aps o recebimento do pacote os dados so
convertidos para String e exibidos na sada padro.
import j a v a . i o . ;
import j a v a . n e t . ;
import j a v a . u t i l . ;
public c l a s s DataServerUDP
DatagramSocket ds ;
DatagramPacket dp ;
I n e t A d d r e s s addr =
I n e t A d d r e s s . getByName ( " 2 5 5 . 2 5 5 . 2 5 5 . 0 " ) ;
ds = new DatagramSocket ( ) ;
byte [ ] b u f f ;
for ( ; ; )
{
Thread . s l e e p ( 1 0 0 0 ) ;
S t r i n g s = ( new Date ( ) ) . t o S t r i n g ( ) ;
buff = s . getBytes ( ) ;
dp = new DatagramPacket (
b u f f , b u f f . l e n g t h , addr , 5 0 1 3 ) ;
ds . send ( dp ) ;
Tpicos Avanados
69
Classe
Endereo de Broadcast
0 a 126
128 a 191
192 a 223
A
B
C
255.0.0.0
255.255.0.0
255.255.255.0
70
Java na prtica
http://java.sun.com:80/doc/tutorial.html
http://infax.com.br."claudio"."1234"/base/vendas
A ltima parte de uma URL representa o caminho at o recurso
no sistema de arquivos do host e chamada de URI (Uniform
Resource Identier ). Esta seo separada da seo anterior por
uma barra simples (/).
Classe
Descrio
URL
URLConnection
Representa um URL.
Classe abstrata que representa uma conexo entre uma
aplicao e um URL. Instncias desta classe podem ser
usadas para ler e escrever no recurso referenciado pela
URL.
Usada para lidar com o formato MIME.
Classe abstrata usada para dar suporte a conexes
HTTP.
URLEncoder
HttpURLConnection
Tpicos Avanados
71
http://www.dpi.ufv.br/professores.html
Os construtores geram a exceo MalformedURLException, se
o URL invlido. Portanto, o programador deve providenciar o
cdigo para a captura e tratamento desta exceo.
import j a v a . n e t . ;
import j a v a . i o . ;
public c l a s s LeURL
i f ( a r g s . l e n g t h < 1)
}
URL u r l = new URL( a r g s [ 0 ] ) ;
B u f f e r e d R e a d e r i n = new B u f f e r e d R e a d e r (
new InputStreamReader ( u r l . openStream ( ) ) ) ;
String linha ;
while ( ( l i n h a = i n . r e a d L i n e ( ) ) ! = null )
System . out . p r i n t l n ( l i n h a ) ;
in . close ( ) ;
72
Java na prtica
Web dinamicamente. Os dados so obtidos de formulrios HTML e submetidos a um programa binrio no servidor que gera a resposta na forma de uma
pgina Web. O programa pode ser escrito em uma variedade de linguagens,
como Perl e C.
Tpicos Avanados
73
i f ( args . length != 2)
System . e r r . p r i n t l n (
"Uso : j a v a Converte temp u r l " ) ;
System . e x i t ( 1 ) ;
String string =
URLEncoder . encode ( a r g s [ 0 ] , "UTF8" ) ;
URL u r l = new URL( a r g s [ 1 ] ) ;
URLConnection c = u r l . openConnection ( ) ;
c . setDoOutput ( true ) ;
P r i n t W r i t e r out =
new P r i n t W r i t e r ( c . getOutputStream ( ) ) ;
out . p r i n t l n ( " c e l c i u s=" + s t r i n g ) ;
out . c l o s e ( ) ;
B u f f e r e d R e a d e r i n = new B u f f e r e d R e a d e r (
new InputStreamReader (
c . getInputStream ( ) ) ) ;
String retorno ;
while ( ( r e t o r n o = i n . r e a d L i n e ( ) ) ! = null )
System . out . p r i n t l n ( r e t o r n o ) ;
in . close ( ) ;
74
Java na prtica
out.println("string="+ string);
Aps isso o stream de sada fechado e o stream de entrada
aberto. A cadeia de caracteres com a temperatura convertida
lida e exibida no dispositivo de sada padro.
Captulo 4
Acesso a Banco de
Dados
Nos dias de hoje, uma linguagem sem recursos para acesso a sistemas de Banco de Dados est fadada ao fracasso. Pensando nisso
a Sun incluiu, como parte do ncleo de bibliotecas de classes da
linguagem Java, uma API (Application Program Interface ) com
o objetivo de preencher esta funo, chamada de JDBC (segundo
a Sun JDBC apenas um acronismo, no entanto, muitas pessoas acreditam que uma sigla para Java Database Connectivity ).
JDBC uma API baseada no X/Open SQL Call Level Interface,
tendo sido desenvolvida originalmente como um pacote separado,
porm a partir do JDK1.1 passou a fazer parte do ncleo bsico de
pacotes. Utilizando a API JDBC possvel conectar um programa
Java com servidores de Banco de Dados e executar comandos SQL
(Structure Query Language ). Sendo uma API independente do
Sistema Gerenciador de Banco de Dados, no necessrio escrever uma aplicao para acessar um Banco de Dados Oracle, outra
para uma Base de Dados Sybase, outra para o DB2, e assim por
diante.
A idia de se usar uma camada intermediria entre o Banco
de Dados e a aplicao, com o objetivo de isol-la das particularidades do SGBD (Sistema gerenciador de Banco de dados), no
75
76
Java na prtica
Tpicos Avanados
77
78
Java na prtica
neste
caso as chamadas JDBC so convertidas para um protocolo
de rede independente do SGBD que depois traduzido para
as chamadas na API nativa do SGBD por um servidor.
Esta uma arquitetura em trs camadas, onde o servidor
middleware capaz de conectar seus clientes Java puros
com vrios SGBDs. Esta soluo permite o desenvolvimento
de clientes 100% Java, tendo como consequncia a no
necessidade de instalao de qualquer cdigo na mquina
cliente.
Tpicos Avanados
79
ou
export CLASSPATH=$CLASSPATH:/usr/hsqldb/lib/hsqldb.jar (Linux)
80
Java na prtica
java org.hsqldb.Server -database meudb
onde meudb o nome do banco de dados. Para executar o gerenciador grco para execuo de comandos digite:
java org.hsqldb.util.DatabaseManager
Tpicos Avanados
81
matricula
1
2
3
4
5
6
nome
Railer Costa Freire
Alexandre Alto Pigatti
Andr M. A. Landro
Ana Maria Freitas
Claudia Maria Oliveira
Alexandra Moreira
82
Java na prtica
codlivro
1
2
3
4
5
6
7
8
9
10
titulo
Curso Pratico de Java
Curso Pratico de Java
Introduo a Compiladores
Fundamentos de Banco de Dados
Redes de Computadores Fcil
Redes de Computadores Fcil
Lgica matemtica
Engenharia de Software para Leigos
Aprenda Computao Grfica em duas horas
Aprenda Inteligncia Artificial em 5 anos
volume
1
2
1
1
1
2
1
1
1
1
matricula
1
3
6
3
2
2
dataemp
01/01/99
03/01/99
12/01/99
20/01/99
03/02/99
12/02/99
datadev
10/01/99
13/01/99
22/01/99
30/01/99
13/02/99
22/02/99
Tpicos Avanados
83
84
Java na prtica
try
Tpicos Avanados
85
86
Java na prtica
3. <identicador> a parte onde se identica o Banco de Dados. A forma de identicao varia de acordo com o subprotocolo. Como o HSQLDB gerencia apenas uma base dados
em uma determinada mquina, ento preciso apenas indicar a mquina onde est localizado o gerenciador. Isto feito
por meio da palavra chave hsql: seguida da identicao da
mquina. Como o gerenciador est executando na mquina
local, ento a identicao da mquina localhost.
Arquivo
Descrio
jdbc:odbc:biblioteca
jdbc:odbc:bd1;CacheSize=20
jdbc:odbc:contas;UID=ana;PWD=sght
jdbc:oracle:thin:@sap.ufv.br:1521:agenda
jdbc:postgresql://localhost/dpi
Tpicos Avanados
87
88
Java na prtica
possvel recuperar o valor da coluna passando como parmetro o nmero da coluna no lugar de seu nome. Neste caso a
recuperao do nome do aluno no exemplo 4.2 caria na seguinte
forma:
rs.getString(1);
Tpicos Avanados
89
void accessDB ( S t r i n g c o n s u l t a )
try
90
Java na prtica
boolean h a s R e s u l t s = s t a t e m e n t . e x e c u t e ( c o n s u l t a ) ;
i f ( hasResults )
}
connection . close ( ) ;
} catch ( E x c e p t i o n ex )
{
ex . p r i n t S t a c k T r a c e ( ) ;
}
while ( r . next ( ) )
System . out . p r i n t l n (
nomeCol [ i 1]+"="+r . g e t S t r i n g ( i ) ) ;
i f ( i==nCol )
System . out . p r i n t ( " \n" ) ;
{
}
Tpicos Avanados
91
tipo
Descrio e Exemplo
DATE
TIME
TIME(i )
TIMESTAMP
S t r i n g dataemp )
try
Statement s t a t e m e n t = con . c r e a t e S t a t e m e n t ( ) ;
s t a t e m e n t . executeUpdate (
92
Java na prtica
"UPDATE EMPRESTIMOS SET DATADEV = ' "+
datadev+" ' WHERE MATRICULA="+mat+
" AND CODLIVRO="+c o d l i v r o+
" AND DATAEMP='"+dataemp+" ' " ) ;
}
...
} catch ( E x c e p t i o n ex )
{
ex . p r i n t S t a c k T r a c e ( ) ;
}
Tpicos Avanados
93
con.setAutoCommit(false);
A partir do momento em que executado o comando acima, o
programador responsvel pela indicao do nal da transao,
por meio da execuo do mtodo commit() do objeto Connection.
con.commit();
Se alguma exceo for levantada durante a execuo de qualquer operao da transao, o programador pode usar o mtodo
rollback() para desfazer as operaes j realizadas aps o ltimo commit(). O exemplo 4.5 mostra um trecho de cdigo que
procura explorar o uso do commit() e rollback().
...
con . setAutoCommit ( f a l s e ) ;
try
catch ( E x c e p t i o n e )
{
}
con . r o l l b a c k ( ) ;
finally
try
94
Java na prtica
{
}
catch ( SQLException s q l e )
{
}
...
NumCC
10189-9
20645-7
Saldo
200,00
300,00
Tpicos Avanados
95
Tempo
1
2
3
4
5
Transao 1
Transao 2
Escrita do Saldo+70,00
96
Java na prtica
NumCC
10189-9
20645-7
Saldo
220,00
300,00
dos. Evita o problema de Dirty reads, no entanto duas leituras de um mesmo item em uma mesma transao podem
possuir valores diferentes, uma vez que o valor pode ser mudado por outra transao entre duas leituras.
i f ( meta . s u p p o r t s T r a n s a c t i o n I s o l a t i o n L e v e l (
con .TRANSACTION_READ_COMMITTED) ) {
con . s e t T r a n s a c t i o n I s o l a t i o n (
con .TRANSACTION_READ_COMMITTED) ;
else return ;
Tpicos Avanados
97
Constante
TRANSACTION_NONE
TRANSACTION_READ_UNCOMMITTED
TRANSACTION_READ_COMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
98
Java na prtica
Antes de especicar os parmetros necessrio limpar qualquer outro parmetro previamente especicado. Para especicar
os parmetros utilizado um conjunto de mtodos com o nome no
formato setXXX(), onde XXX o tipo sendo passado. O primeiro
parmetro do mtodo setXXX() o ndice da ocorrncia do caractere ` ?' que ser substitudo pelo valor. O segundo parmetro
o valor que ser transmitido.
Tpicos Avanados
99
Independncia entre a aplicao e o esquema do BD - se o esquema mudar, provavelmente ser necessrio mudar apenas
os procedimentos armazenados.
Desempenho - os procedimentos so previamente compilados, eliminando esta etapa.
Segurana - as aplicaes possuem privilgio apenas para
execuo de procedimentos armazenados, evitando assim
acessos no autorizados.
A sintaxe dos procedimentos armazenados depende do SGBD
em questo. Utilizaremos um exemplo em PL/SQL. No exemplo 4.7 o procedimento retorna o nome do aluno a partir de sua
matrcula.
CREATE OR REPLACE PROCEDURE sp_obtem_nome
( i d IN INTEGER, Nome_aluno out VARCHAR2) IS
BEGIN
100
Java na prtica
cstmt . s e t I n t ( 1 , 3 ) ;
cstmt . e x e c u t e ( ) ;
System . out . p r i n l n ( "O nome do a l u n o numero 3 : "
+cstmt . g e t S t r i n g ( 2 ) ;
Tpicos Avanados
101
Alm disso, no incio de seu processamento, a classe Agenda estabelece uma conexo com o gerenciador de banco de dados que
permanece ativa at que o programa termine. Esta no a melhor forma de se manter conexes com o banco de dados, a no ser
que o sistema funcione com poucos usurios. O mais adequado
que as conexes sejam estabelecidas apenas durante os acessos ao
banco de dados e que sejam, preferencialmente, gerenciadas em
um pool de conexes1 .
Note que o mtodo exibeTodos() usa no comando SQL a expresso LIKE `...%'. Esta expresso usada quando se deseja
obter cadeias de caracteres com um trecho idntico ao da expresso. O caractere `%' funciona como um curinga que casa com
qualquer sequncia de palavras. Portanto, a expresso utilizada
no exemplo determina que todos os nomes que iniciam com a
sequncia digitada devem ser recuperados.
import j a v a . s q l . ;
public c l a s s Agenda
Connection con=null ;
AgendaIntUsuario a i = null ;
// Construtor
public Agenda ( )
{
}
public void i n i c i a ( )
try
public void c l o s e A g e n d a ( )
1 pool de conexes uma camada de software que ca entre o programa
e o SGBD e que responsvel pelo manuteno e reuso compartilhado das
conexes com o SGBD, de forma a promover um uso otimizado deste recurso.
102
{
}
Java na prtica
i f ( con ! = null )
try { con . c l o s e ( ) ; } catch ( E x c e p t i o n e ) { } ;
public void i n s e r i r ( S t r i n g n , S t r i n g t )
stmt . c l o s e ( ) ;
} catch ( E x c e p t i o n e ) { a i . s e t S t a t u s ( e . getMessage ( ) ) ; }
public void c o n s u l t a r ( S t r i n g n )
else
a i . s e t S t a t u s ( " no e n c o n t r a d o " ) ;
stmt . c l o s e ( ) ;
} catch ( E x c e p t i o n e ) { a i . s e t S t a t u s ( e . getMessage ( ) ) ; }
Tpicos Avanados
{
{
}
new Agenda ( ) . i n i c i a ( ) ;
{
}
ag =a ;
initComponents ( ) ;
103
104
Java na prtica
j L a b e l S t a t u s = new j a v a x . swing . JLabel ( ) ;
j P a n e l 4 = new j a v a x . swing . JPanel ( ) ;
jButtonCons = new j a v a x . swing . JButton ( ) ;
j B u t t o n I n s = new j a v a x . swing . JButton ( ) ;
jButtonRem = new j a v a x . swing . JButton ( ) ;
j B u t t o n L i s t = new j a v a x . swing . JButton ( ) ;
addWindowListener ( new j a v a . awt . e v e n t . WindowAdapter ( )
{
public void windowClosing (
j a v a . awt . e v e n t . WindowEvent e v t )
{
exitForm ( e v t ) ;
}
});
j P a n e l 1 . s e t L a y o u t ( new j a v a . awt . GridLayout ( 2 , 2 ) ) ;
j L a b e l 1 . s e t T e x t ( "Nome : " ) ;
j P a n e l 1 . add ( j L a b e l 1 ) ;
j P a n e l 1 . add ( jTextFieldNome ) ;
jLabel2 . setText ( " Telefone : " ) ;
j P a n e l 1 . add ( j L a b e l 2 ) ;
j P a n e l 1 . add ( j T e x t F i e l d T e l ) ;
getContentPane ( ) . add (
j P a n e l 1 , j a v a . awt . BorderLayout .NORTH) ;
j T e x t A r e a S a i d a . setColumns ( 6 0 ) ;
jTextAreaSaida . s e t E d i t a b l e ( f a l s e ) ;
jTextAreaSaida . setFont (
new j a v a . awt . Font ( " C o u r i e r " , 0 , 1 0 ) ) ;
j T e x t A r e a S a i d a . setRows ( 1 2 ) ;
j S c r o l l P a n e 1 . setViewportView ( j T e x t A r e a S a i d a ) ;
j P a n e l 2 . add ( j S c r o l l P a n e 1 ) ;
getContentPane ( ) . add ( j P a n e l 2 ,
j a v a . awt . BorderLayout .CENTER) ;
j P a n e l 3 . s e t L a y o u t ( new j a v a . awt . BorderLayout ( ) ) ;
j L a b e l S t a t u s . setBackground (
new j a v a . awt . C o l o r ( 0 , 2 5 5 , 2 5 5 ) ) ;
jLabelStatus . setForeground (
new j a v a . awt . C o l o r ( 2 5 5 , 0 , 1 0 2 ) ) ;
jLabelStatus . setHorizontalAlignment (
SwingConstants . LEFT ) ;
jLabelStatus . setVerticalAlignment (
SwingConstants .TOP) ;
jLabelStatus . setBorder (
new j a v a x . swing . b o r d e r . T i t l e d B o r d e r ( " S t a t u s " ) ) ;
j P a n e l 3 . add ( j L a b e l S t a t u s ,
Tpicos Avanados
j a v a . awt . BorderLayout .CENTER) ;
getContentPane ( ) . add ( j P a n e l 3 ,
j a v a . awt . BorderLayout .SOUTH) ;
j P a n e l 4 . s e t L a y o u t ( new j a v a . awt . GridLayout ( 4 , 0 ) ) ;
jButtonCons . s e t T e x t ( " C o n s u l t a r " ) ;
jButtonCons . a d d A c t i o n L i s t e n e r (
new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) {
public void a c t i o n P e r f o r m e d (
j a v a . awt . e v e n t . ActionEvent e v t ) {
jButtonConsActionPerformed ( e v t ) ;
}
});
j P a n e l 4 . add ( jButtonCons ) ;
jButtonIns . setText ( " I n s e r i r " ) ;
jButtonIns . addActionListener (
new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) {
public void a c t i o n P e r f o r m e d (
j a v a . awt . e v e n t . ActionEvent e v t ) {
jButtonInsActionPerformed ( evt ) ;
}
});
j P a n e l 4 . add ( j B u t t o n I n s ) ;
jButtonRem . s e t T e x t ( "Remover" ) ;
jButtonRem . a d d A c t i o n L i s t e n e r (
new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) {
public void a c t i o n P e r f o r m e d (
j a v a . awt . e v e n t . ActionEvent e v t ) {
jButtonRemActionPerformed ( e v t ) ;
}
});
j P a n e l 4 . add ( jButtonRem ) ;
jButtonList . setText ( " L i s t a r " ) ;
jButtonList . addActionListener (
new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) {
public void a c t i o n P e r f o r m e d (
j a v a . awt . e v e n t . ActionEvent e v t ) {
jButtonListActionPerformed ( evt ) ;
}
});
j P a n e l 4 . add ( j B u t t o n L i s t ) ;
getContentPane ( ) . add ( j P a n e l 4 ,
j a v a . awt . BorderLayout . EAST ) ;
}
pack ( ) ;
105
106
Java na prtica
private void j B u t t o n I n s A c t i o n P e r f o r m e d (
}
j a v a . awt . e v e n t . ActionEvent e v t ) {
ag . i n s e r i r ( getNome ( ) , g e t T e l ( ) ) ;
j a v a . awt . e v e n t . ActionEvent e v t ) {
ag . c o n s u l t a r ( getNome ( ) ) ;
j a v a . awt . e v e n t . ActionEvent e v t ) {
ag . remover ( getNome ( ) ) ;
private void j B u t t o n L i s t A c t i o n P e r f o r m e d (
}
j a v a . awt . e v e n t . ActionEvent e v t ) {
ag . exibeTodos ( getNome ( ) ) ;
{
}
ag . c l o s e A g e n d a ( ) ;
System . e x i t ( 0 ) ;
public void s e t S t a t u s ( j a v a . l a n g . S t r i n g s ) {
}
jLabelStatus . setText ( s ) ;
public void s e t S a i d a ( j a v a . l a n g . S t r i n g s ) {
}
jTextAreaSaida . setText ( s ) ;
public void p r i n t ( j a v a . l a n g . S t r i n g s ) {
}
j T e x t A r e a S a i d a . append ( s ) ;
public void p r i n t l n ( j a v a . l a n g . S t r i n g s ) {
}
public S t r i n g getNome ( ) {
return jTextFieldNome . getText ( ) ;
public S t r i n g g e t T e l ( ) {
return j T e x t F i e l d T e l . getText ( ) ;
Tpicos Avanados
107
jTextFieldNome . s e t T e x t ( s ) ;
public void s e t T e l ( S t r i n g s ) {
}
jTextFieldTel . setText ( s ) ;
private
private
private
private
private
private
private
private
private
private
private
private
private
private
private
108
Java na prtica
Tpicos Avanados
109
110
Java na prtica
Aps isso a base de dados pode ser acessada via ponte JDBCODBC por meio do driver sun.jdbc.odbc.JdbcOdbcDriver e da
URL jdbc:odbc:agenda, onde agenda o nome dado fonte de
dados na congurao do ODBC.
Captulo 5
RMI
A RMI (Remote Method Invocation ) uma tecnologia que coloca a programao com rede em um nvel mais alto. RMI torna
possvel que objetos distribudos em uma rede se comuniquem de
forma transparente para o programador utilizando chamadas de
procedimentos remotos.
O principal objetivo da tecnologia RMI permitir que programadores desenvolvam programas distribudos utilizando a mesma
sintaxe e semntica de programas Java convencionais. Antes da
introduo da RMI no mundo Java, no JDK 1.1, para fazer com
que dois objetos em mquinas diferentes se comunicassem, o programador deveria denir um protocolo de comunicao e escrever
cdigo utilizando soquete para implementar este protocolo. Com
RMI a maior parte do trabalho quem realiza a mquina virtual
Java.
Existem outras tecnologias, como CORBA, que tambm tem
como objetivo fazer com que objetos distribudos em uma rede se
comuniquem. Java tem suporte a CORBA, mas para projetos em
um ambiente Java puro, a RMI consideravelmente mais simples
que a CORBA.
111
112
Java na prtica
Tpicos Avanados
113
114
Java na prtica
2
4
import j a v a . rmi . ;
import j a v a . u t i l . ;
public c l a s s AgendaImpl
extends j a v a . rmi . s e r v e r . UnicastRemoteObject
implements Agenda{
Hashtable pessoas ;
10
12
14
16
18
public Enumeration g e t P e s s o a s ( )
throws RemoteException {
return p e s s o a s . e l e m e n t s ( ) ;
20
22
p e s s o a s . put ( p . getNome ( ) , p ) ;
Tpicos Avanados
115
Quando uma classe herda UnicastRemoteObject, seu construtor deve poder levantar a exceo java.rmi.RemoteException e
este construtor deve chamar o mtodo super() que inicializa a
classe para usar RMI, como na linha 8.
Para compilar a AgendaImpl, usamos:
javac AgendaImpl.java
116
2
4
6
Java na prtica
8
10
12
14
16 }
import j a v a . rmi . ;
public c l a s s AgendaCliente {
public s t a t i c void main ( S t r i n g [ ] a r g s ) {
try {
Agenda a = ( Agenda )
Naming . lookup ( " rmi : / / l o c a l h o s t : 1 0 9 9 / Agenda" ) ;
Pessoa p1 = new Pessoa ( " Joo S i l v a " ,
" 999 99999 " , "Rua Avenida " ) ;
Pessoa p2 = new Pessoa ( " Manuel " ,
" 888 8888 " , " Avenida Rua" ) ;
a . i n s e r i r ( p1 ) ;
a . i n s e r i r ( p2 ) ;
Tpicos Avanados
14
16
18
20 }
117
5.3.1 No Windows
Abra trs janelas do DOS e digite na primeira:
rmiregistry
118
Java na prtica
Agora temos o objeto servidor inicializado e vinculado ao servidor de nomes. Na terceira janela do DOS digite o teste:
java AgendaCliente
rmiregistry
5.3.2 No Linux
Abra uma shell e digite:
rmiregistry &
Captulo 6
CORBA
A tecnologia RMI prov, para a plataforma Java, uma forma eciente e intuitiva de trabalhar com objetos distribudos. Contudo,
alguns problemas surgem quando os sistemas vo se tornando mais
complexos. Caractersticas como interoperabilidade com diferentes componentes, possivelmente escritos em vrias linguagens e
plataformas diferentes, passam a ser exigidas. Interfaciamento
com sistemas legados so tambm caractersticas que grandes sistemas reais geralmente pedem. Neste cenrio temos aplicaes
escritas em COBOL, C, ADA e outras linguagens, rodando em
Sistemas Operacionais distintos como Windows, UNIX e VMS.
Uma abordagem para tratar de forma homegnia esse problema
o uso de CORBA.
Neste Captulo sero mostrados os conceitos bsicos de
CORBA e como criar e utilizar objetos em um ORB, escrevendoos em Java. Na seo 6.2 um exemplo de objetos escritos em Java
interoperando com objetos escritos em C ser mostrado.
120
Java na prtica
Management Group ). O OMG composto por mais de 700 empresas com o propsito comum de utilizar esse conjunto de protocolos
padres. CORBA dene o protocolo de interao entre objetos.
Uma das diretrizes desses padres que objetos podem ser escritos em diferentes linguagens de programao, rodar em diferentes
sistemas operacionais, hospedados em diferentes mquinas.
O meio de comunicao entre os objetos o ORB (Object Request Broker ). O ORB pode transmitir mensagens entre objetos,
sendo que estes objetos podem estar na mesma mquina ou em
mquinas diferentes na rede. No primeiro caso, o ORB deve otimizar a troca de mensagens.
O ORB especico da implementao CORBA, mas ORBs
de diferentes fornecedores devem poder se comunicar, transparentemente, utilizando um protocolo comum. Isso signica que ns
podemos usar um ORB para desenvolver os objetos, e mais tarde,
por qualquer motivo, podemos usar outro ORB para interagir com
nossos objetos.
Para possibilitar que os objetos CORBA sejam escritos em diferentes linguagens, mquinas e sistemas operacionais, utilizada
uma notao para denir quais caractersticas do objeto (mtodos, atributos) so expostas. CORBA oferece tambm um padro
para esta notao: a IDL (Interface Denition Language ).
Implementacao
Cliente
do Objeto
IDL
IDL
ORB
Tpicos Avanados
121
Implementacao
Cliente
Implementacao
Cliente
do Objeto
IDL
IDL
do Objeto
IDL
IDL
ORB
ORB
Rede
122
Java na prtica
Cliente - Realiza suas tarefas obtendo referncias para objetos e invocando suas operaes. Os objetos podem estar
na mesma mquina que o cliente ou estarem localizados em
outras mquinas. A chamada de um mtodo remoto, para
o programador, no difere da chamada de um mtodo local.
Objeto - No CORBA um objeto uma instncia de uma
interface da linguagem IDL. O objeto identicado unicamente por uma referncia de objeto. Um ObjectId associa
um objeto com o servant que o implementa.
Servant - Este componente implementa as operaes denidas pela IDL. Em linguagens como Java, que suportam
orientao a objetos (OO), os servants so implementados
usando um ou mais objetos. Em linguagens no OO, os
servants so implementados usando funes e structs. Um
cliente nunca interage diretamente com um servant, e sim
atravs de um objeto.
ORB core - Quando um cliente invoca uma operao em
um objeto, o ORB Core responsvel por entregar a requisio para o objeto correto e retornar a resposta, se existir alguma, para o cliente. Para objetos executando remotamente, um ORB CORBA deve se comunicar com outro
via alguma verso do General Inter-ORB Protocol (GIOP).
Normalmente um ORB Core implementado como uma biblioteca que linkada no cliente e no servidor.
GIOP - O General InterORB Protocol especica todos os
aspectos de interoperabilidade sobre o transporte das mensagens na rede. O GIOP dene um pequeno conjunto de
mensagens que um ORB transmite para outro quando um
cliente invoca um mtodo de um objeto servidor. O GIOP
no dene como essas mensagens devem ser transportadas.
IIOP - A especicao da GIOP sendo transportada pela
pilha TCP/IP recebe o nome de IIOP(Internet Inter-ORB
Protocol )
Tpicos Avanados
123
124
Java na prtica
A gura 6.3 mostra um adaptador direcionando requisies
para os servants.
Requisicao
ORB
Servants
POA
Nome do Tipo
(ID no repositorio)
Protocolo e
detalhes de endereco
e porta
Chave do objeto
(Adaptador e
nome do objeto
Tpicos Avanados
125
Cliente
Referencia do Objeto
IDL:MeuObj:1.0
serv:4443
CT5, Math
Servidor em serv:4443
Adaptadores
Obj5
Obj1
CT5
Obj1
Math
Obj10
(2)
(1)
Math
CK1
(3)
Obj5
Obj10
Servants
126
Java na prtica
Objetos da
Aplicacao
Cliente
Cliente
CORBA Services
Tpicos Avanados
};
127
};
128
Java na prtica
P r o p e r t i e s p r o p s = System . g e t P r o p e r t i e s ( ) ;
Tpicos Avanados
129
synchronized ( sync ) {
}
sync . w a i t ( ) ;
} catch ( E x c e p t i o n ex ) {
ex . p r i n t S t a c k T r a c e ( ) ;
}
P r o p e r t i e s p r o p s = System . g e t P r o p e r t i e s ( ) ;
130
Java na prtica
orb . s t r i n g _ t o _ o b j e c t ( i o r ) ;
i f ( o b j == null )
throw new RuntimeException ( ) ;
MinhaLib . Matematica s r v =
MinhaLib . MatematicaHelper . narrow ( o b j ) ;
i f ( s r v == null )
throw new RuntimeException ( ) ;
long r e s = s r v . f a t o r i a l ( 1 0 ) ;
java FatorialServer
no outro console digite:
java FatorialClient
a saida ser:
O fatorial de 10 e 3628800
Tpicos Avanados
131
O ORBit um ORB compatvel com a verso 2.4 da especicao. Os principais mapeamentos do ORBit so para as linguagens C e Perl, mas mapeamentos para outras tambm esto
disponveis C++, Lisp, Pascal, Python, Ruby e TCL). O ORBit
tem como diretriz de desenvolvimento a grande preocupao com
a performance. Por isso o core ORB escrito em C e foi escolhido como base para a comunicao entre objetos no ambiente
grco GNOME. O ORBit roda sobre Linux, UNIX (BSD, Solaris, HP-UX) e Windows. Outra importante caracterstica o
desenvolvimento realizado sobre a licensa GPL/LGPL.
O ORBit no utiliza por default a comunicao entre objetos
atravs da rede, colocando todas as trocas de mensagens entre objetos sendo realizada por mecanismos de IPC do sistema operacional. Essa abordagem justicada pela busca de alta performance.
Como nosso ORB Java no conhece esse interconector IPC, que
prprio do ORBit, devemos habilitar o uso do IIOP sobre sockets
de rede. Com esse propsito a listagem 6.5 deve ser colocada no
diretrio home do usurio que colocar os objetos para rodar.
ORBIIOPUSock=1
ORBIIOPIPv4=1
ORBIIOPIPv6=0
132
Java na prtica
Tpicos Avanados
133
134
Java na prtica
CORBA_ORB_run( orb , ev ) ;
return 0 ;
CORBA_exception_init(&ev ) ;
orb = CORBA_ORB_init(&dummy_argc ,
dummy_argv , " o r b i t l o c a l orb " , & ev ) ;
s e r v e r = CORBA_ORB_string_to_object (
orb , argv [ 1 ] , & ev ) ;
p r i n t f ( "O f a t o r i a l de 1 0 e i g u a l a %d\n" ,
MinhaLib_Matematica_fatorial ( s e r v e r , 1 0 , & ev ) ) ;
CORBA_Object_release ( s e r v e r ,& ev ) ;
exit (0);
Tpicos Avanados
135
i d l j f a l l Fatorial . idl
j a v a c MinhaLib / . j a v a
javac . java
ORBC: c l i e n t s e r v e r
c l i e n t : codigo
g c c o c l i e n t $ ( LIBS ) $ (LISTA_CLIENTE)
server : codigo
g c c o s e r v e r $ ( LIBS ) $ (LISTA_SERVER)
codigo : i d l
g c c c $ (CFLAGS ) . c
idl : Fatorial . idl
o r b i t i d l F a t o r i a l . i d l
clean :
cd MinhaLib ; rm f . c l a s s ~
rm f . o ~ s e r v e r c l i e n t . c l a s s . i o r
136
Java na prtica
Captulo 7
Servlets e JSP
Servlets e JSP so duas tecnologias criadas pela Sun para desenvolvimento de aplicaes na Web a partir de componentes Java
que executem no lado servidor. Essas duas tecnologias fazem parte
da plataforma J2EE (Java 2 Enterprise Edition ) que fornece um
conjunto de tecnologias para o desenvolvimento de solues escalveis e robustas para a Web. Neste livro abordaremos apenas as
tecnologias Servlets e JSP, sendo o suciente para o desenvolvimento de sites dinmicos de razovel complexidade. Se a aplicao
exigir uma grande robustez e escalabilidade o leitor deve considerar o uso em conjunto de outras tecnologias da plataforma J2EE.
7.1 Servlets
Servlets so classes Java que so instanciadas e executadas em
associao com servidores Web, atendendo requisies realizadas
por meio do protocolo HTTP. Ao serem acionados, os objetos Servlets podem enviar a resposta na forma de uma pgina HTML ou
qualquer outro contedo MIME. Na verdade os Servlets podem
trabalhar com vrios tipos de servidores e no s servidores Web,
uma vez que a API dos Servlets no assume nada a respeito do
ambiente do servidor, sendo independente de protocolos e plataformas. Em outras palavras Servlets uma API para construo
137
138
Java na prtica
Tpicos Avanados
139
140
Java na prtica
public interface S e r v l e t {
public void i n i t ( S e r v l e t C o n f i g c o n f i g )
throws S e r v l e t E x c e p t i o n ;
public S e r v l e t C o n f i g g e t S e r v l e t C o n f i g ( ) ;
public void s e r v i c e ( S e r v l e t R e q u e s t req ,
ServletResponse res )
throws S e r v l e t E x c e p t i o n , IOException ;
public S t r i n g g e t S e r v l e t I n f o ( ) ;
public void d e s t r o y ( ) ;
Tpicos Avanados
141
public abstract c l a s s H t t p S e r v l e t
extends G e n e r i c S e r v l e t
implements j a v a . i o . S e r i a l i z a b l e
mtodo
doGet
doPost
doPut
doDelete
Descrio
Trata as requisies
Trata as requisies
Trata as requisies
Trata as requisies
HTTP
HTTP
HTTP
HTTP
GET.
POST.
PUT.
DELETE.
142
Java na prtica
public S t r i n g g e t S e r v l e t I n f o ( )
{ return " Ola v e r s o 0 . 1 " ; }
public void doGet ( H t t p S e r v l e t R e q u e s t req ,
HttpServletResponse res )
throws IOException , S e r v l e t E x c e p t i o n
r e s . setContentType ( " t e x t / html " ) ;
j a v a . i o . P r i n t W r i t e r out = r e s . g e t W r i t e r ( ) ;
out . p r i n t l n ( "<html>" ) ;
out . p r i n t l n ( "<head>" ) ;
out . p r i n t l n ( "< t i t l e >S e r v l e t </ t i t l e >" ) ;
out . p r i n t l n ( "</head>" ) ;
out . p r i n t l n ( "<body>Ola mundo ! ! ! " ) ;
out . p r i n t l n ( "</body>" ) ;
out . p r i n t l n ( "</html>" ) ;
out . c l o s e ( ) ;
Tpicos Avanados
143
isso utilizado o objeto da classe HttpServletResponse. Primeiramente usado o mtodo setContentType() para denir o
tipo do contedo a ser enviado ao cliente. Como argumento deve
ser passado um dos tipos denidos no protocolo MIME (Multipurpose Internet Mail Extensions ). Tipos MIME denem o tipo de
contedo que est sendo transmitido e so especicados na forma
tipo-principal/subtipo. Exemplos de tipos MIME so text/html,
application/pdf e image/gif. O mtodo setContentType()
deve ser usado apenas uma vez e antes de se obter um objeto
do tipo PrintWriter ou ServletOutputStream para a resposta.
Aps isso usado o mtodo getWriter() para se obter um objeto
do tipo PrintWriter que usado para escrever a resposta. Neste
caso os dados da resposta so baseados em caracteres. Se o programador desejar enviar a resposta em bytes deve usar o mtodo
getOutputStream() para obter um objeto OutputStream. A partir de ento o programa passa a usar o objeto PrintWriter para
enviar a pgina HTML.
144
Java na prtica
Tpicos Avanados
145
C:\...\Tomcat 4.1
|
|______bin
|______common
|______conf
|______logs
|______server
|______shared
|______temp
|______src
|______webapps
|______work
No diretrio bin encontram-se os programas para execuo e interrupo do container Tomcat. No diretrio common
encontram-se as bibliotecas e classes de uso comum. No diretrio conf encontram-se os arquivos de congurao. No diretrio logs so registradas as mensagens geradas durante a execuo do sistema. No diretrio server encontram-se as classes do
Tomcat e aplicaes para administrao do Tomcat. No diretrio
shared encontram-se as classes compartilhadas entre as aplicaes do Tomcat. O diretrio temp usado pela mquina virtual
para armazenamento temporrio. No diretrio src encontram-se
os arquivos fontes do container e da implementao da API de
congurao. Finalmente, no diretrio webapps encontram-se as
pginas e cdigos das aplicaes dos usurios. O diretrio work
usado pelo Tomcat para armazenar as classes resultantes da compilao dos Servlets.
Antes de executar o Tomcat necessrio denir a varivel de
ambiente CATALINA_HOME com o valor do diretrio onde foi instalado o Tomcat. Por exemplo, supondo que no Linux o Tomcat foi
instalado no diretrio /usr/jakarta-tomcat-4.1.24-LE-jdk14
ento os seguintes comandos devem ser colocados no arquivo de
inicializao apropriado:
CATALINA_HOME=/usr/jakarta-tomcat-4.1.24-LE-jdk14
export CATALINA_HOME
146
Java na prtica
(Windows)
$CATALINA_HOME/bin/startup.sh
(Unix)
(Windows)
$CATALINA_HOME/bin/shutdown.sh
(Unix)
http://127.0.0.1:8080/
ou
http://localhost:8080/
A gura 7.7 mostra a tela principal do Tomcat.
1 Caso ao iniciar o servidor no MS-Windos aparea a mensagem sem
espao de ambiente clique com o boto direito do mouse no arquivo .bat e
edite as propriedades denindo o ambiente inicial com 4096 bytes de memria.
Feche o arquivo e execute novamente.
Tpicos Avanados
147
148
Java na prtica
Alternativamente, possvel indicar o classpath na prpria linha de execuo do compilador Java. Por exemplo, no ambiente
MS-Windows caria na seguinte forma:
javac -cp %CLASSPATH%;%TOMCAT_HOME%\common\lib\servlet.jar Ola.java
Tpicos Avanados
149
150
Java na prtica
Por exemplo, suponha que o nome da aplicao criada no Tomcat seja teste e que o Tomcat esteja rodando no computador local. Ento a URL para a invocao do Servlet do exemplo 7.1
teria a seguinte forma:
http://mquina :porta /contexto da aplicao /nome servlet
Por exemplo,
http://localhost:8080/teste/ola
Tpicos Avanados
151
POST e GET. Apesar de aparentemente cumprirem a mesma funo, existem diferenas importantes entre estes dois mtodos. O
mtodo GET tem por objetivo enviar uma requisio por um recurso. As informaes necessrias para a obteno do recurso
(como informaes digitadas em formulrios HTML) so adicionadas URL e, por consequncia, no so permitidos caracteres
invlidos na formao de URLs, como espaos em branco e caracteres especiais. J na requisio POST os dados so enviados no
corpo da mensagem.
O mtodo GET possui a vantagem de ser idempotente, ou seja,
os servidores Web podem assumir que a requisio pode ser repetida, sendo possvel adicionar a URL ao bookmark. Isto muito
til quando o usurio deseja manter a URL resultante de uma
pesquisa. Como desvantagem as informaes passadas via GET
no podem ser muito longas, um vez que o nmero de caracteres
permitidos por volta de 2K.
J as requisies POST, a princpio, podem ter tamanho ilimitado. No entanto, elas no so idempotente, o que as tornam
ideais para formulrios onde os usurios precisam digitar informaes condenciais, como nmero de carto de crdito. Desta
forma o usurio obrigado a digitar a informao toda vez que
for enviar a requisio, no sendo possvel registrar a requisio
em um bookmark.
7.6 Concorrncia
Uma vez carregado o Servlet no mais descarregado, a no ser
que o servidor Web tenha sua execuo interrompida. De modo
geral, cada requisio que deve ser direcionada a uma determinada instncia de Servlet tratada por um thread sobre a instncia de Servlet. Isto signica que se existirem duas requisies
simultneas que devem ser direcionadas para um mesmo objeto o
container criar dois threads sobre o mesmo objeto Servlet para
tratar as requisies. A gura 7.11 ilustra esta situao.
152
Java na prtica
HttpServletResponse res )
throws S e r v l e t E x c e p t i o n , j a v a . i o . IOException {
Tpicos Avanados
153
v. clear ();
Enumeration e = r e q . getParameterNames ( ) ;
while ( e . hasMoreElements ( ) ) {
S t r i n g name = ( S t r i n g ) e . nextElement ( ) ;
S t r i n g v a l u e = r e q . getParameter ( name ) ;
i f ( v a l u e ! = null ) v . add ( v a l u e ) ;
154
Java na prtica
java . io . ;
java . u t i l . ;
javax . s e r v l e t . ;
javax . s e r v l e t . http . ;
public c l a s s R e q u e s t I n f o extends H t t p S e r v l e t
HttpServletResponse res )
throws IOException , S e r v l e t E x c e p t i o n
r e s . setContentType ( " t e x t / html " ) ;
P r i n t W r i t e r out = r e s . g e t W r i t e r ( ) ;
out . p r i n t l n ( "<html><head>" ) ;
out . p r i n t l n (
"< t i t l e >Exemplo de R e q u i s i c a o de I n f o </ t i t l e >" ) ;
out . p r i n t l n ( "</head><body>" ) ;
out . p r i n t l n (
"<h3 > Exemplo s o b r e R e q u i s i c a o de I n f o </h3>" ) ;
out . p r i n t l n ( "Metodo : " + r e q . getMethod ()+ "<br>" ) ;
out . p r i n t l n (
" Request URI : " + r e q . getRequestURI ()+ "<br>" ) ;
out . p r i n t l n (
" P r o t o c o l o : " + r e q . g e t P r o t o c o l ()+ "<br>" ) ;
out . p r i n t l n (
" P a t h I n f o : " + r e q . g e t P a t h I n f o ()+ "<br>" ) ;
out . p r i n t l n ( " Endereco remoto : "+r e q . getRemoteAddr ()+
"<br><br>" ) ;
Enumeration e = r e q . getHeaderNames ( ) ;
while ( e . hasMoreElements ( ) )
{
S t r i n g name = ( S t r i n g ) e . nextElement ( ) ;
S t r i n g v a l u e = r e q . getHeader ( name ) ;
Tpicos Avanados
155
HttpServletResponse res )
{
}
throws IOException , S e r v l e t E x c e p t i o n
doGet ( req , r e s ) ;
156
Java na prtica
java . io . ;
java . u t i l . ;
javax . s e r v l e t . ;
javax . s e r v l e t . http . ;
throws IOException , S e r v l e t E x c e p t i o n
r e s . setContentType ( " t e x t / html " ) ;
P r i n t W r i t e r out = r e s . g e t W r i t e r ( ) ;
out . p r i n t l n ( "<html>" ) ;
out . p r i n t l n (
"<head><t i t l e >Trata f o r m u l a r i o </ t i t l e ></head>" ) ;
out . p r i n t l n ( "<body b g c o l o r =\" w h i t e \">" ) ;
Tpicos Avanados
157
{
}
throws IOException , S e r v l e t E x c e p t i o n
doGet ( req , r e s ) ;
158
Java na prtica
Tpicos Avanados
159
throws IOException , S e r v l e t E x c e p t i o n
r e s . setContentType ( " t e x t / html " ) ;
P r i n t W r i t e r out = r e s . g e t W r i t e r ( ) ;
out . p r i n t l n ( "<html>" ) ;
out . p r i n t l n ( "<body b g c o l o r =\" w h i t e \">" ) ;
out . p r i n t l n ( "<head><t i t l e >T e s t e de C o o k i e s " ) ;
out . p r i n t l n ( "</ t i t l e ></head><body>" ) ;
out . p r i n t l n ( "<h3>T e s t e de Cookies </h3>" ) ;
Cookie [ ] c o o k i e s = r e q . g e t C o o k i e s ( ) ;
i f ( c o o k i e s . l e n g t h > 0)
{
for ( int i = 0 ; i < c o o k i e s . l e n g t h ; i ++)
{
Cookie c o o k i e = c o o k i e s [ i ] ;
out . p r i n t ( " Cookie Nome : " +
c o o k i e . getName ( ) + "<br>" ) ;
out . p r i n t l n ( " Cookie Valor : " +
c o o k i e . g e t V a l u e ( ) + "<br><br>" ) ;
}
}
S t r i n g cName = r e q . getParameter ( " cookienome " ) ;
S t r i n g c V a l o r = r e q . getParameter ( " c o o k i e v a l o r " ) ;
i f ( cName ! = null && c V a l o r ! = null )
{
Cookie c o o k i e = new Cookie ( cName , c V a l o r ) ;
r e s . addCookie ( c o o k i e ) ;
out . p r i n t l n ( "<P>" ) ;
out . p r i n t l n ( "<br>" ) ;
out . p r i n t ( "Nome : "+cName +"<br>" ) ;
160
Java na prtica
out . p r i n t l n ( "<P>" ) ;
out . p r i n t (
"<form a c t i o n =\" C o o k i e T e s t e \ " method=POST>" ) ;
out . p r i n t l n ( "Nome : "+
"<i n p u t type=t e x t l e n g t h =20 name=cookienome>" ) ;
out . p r i n t l n ( "<br>Valor : "+
"<i n p u t type=t e x t l e n g t h =20 name=c o o k i e v a l o r >" ) ;
out . p r i n t l n ( "<br><i n p u t type=submit></form>" ) ;
out . p r i n t l n ( "</body>" ) ;
out . p r i n t l n ( "</html>" ) ;
{
}
throws IOException , S e r v l e t E x c e p t i o n
doGet ( req , r e s ) ;
Tpicos Avanados
161
162
Java na prtica
import j a v a x . s e r v l e t . ;
import j a v a x . s e r v l e t . h t t p . ;
public c l a s s S e s s i o n T e s t e extends H t t p S e r v l e t
throws IOException , S e r v l e t E x c e p t i o n
r e s p . setContentType ( " t e x t / html " ) ;
P r i n t W r i t e r out = r e s p . g e t W r i t e r ( ) ;
out . p r i n t l n ( "<html><head>" ) ;
out . p r i n t l n ( "< t i t l e >T e s t e de S e s s a o </ t i t l e >" ) ;
out . p r i n t l n ( "</head>" ) ;
out . p r i n t l n ( "<body>" ) ;
out . p r i n t l n ( "<h3>T e s t e de S e s s a o </h3>" ) ;
H t t p S e s s i o n s e s s i o n = r e q . g e t S e s s i o n ( true ) ;
out . p r i n t l n ( " I d e n t i f i c a d o r : " + s e s s i o n . g e t I d ( ) ) ;
out . p r i n t l n ( "<br>" ) ;
out . p r i n t l n ( "Data : " ) ;
out . p r i n t l n ( new Date ( s e s s i o n . g e t C r e a t i o nT i m e ())+
"<br>" ) ;
out . p r i n t l n ( " Ultimo a c e s s o : " ) ;
out . p r i n t l n (
new Date ( s e s s i o n . g e tL a s tA c c es s e dT i m e ( ) ) ) ;
S t r i n g nomedado = r e q . getParameter ( "nomedado" ) ;
S t r i n g v a l o r d a d o = r e q . getParameter ( " v a l o r d a d o " ) ;
i f ( nomedado ! = null && v a l o r d a d o ! = null )
{
s e s s i o n . s e t A t t r i b u t e ( nomedado , v a l o r d a d o ) ;
}
out . p r i n t l n ( "<P>" ) ;
out . p r i n t l n ( "Dados da S e s s a o : " + "<br>" ) ;
Enumeration valueNames =
s e s s i o n . ge t At tr i bu t eN am e s ( ) ;
Tpicos Avanados
163
out . p r i n t l n ( "<P>" ) ;
out . p r i n t (
"<form a c t i o n =\" S e s s i o n T e s t e \ " method=POST>" ) ;
out . p r i n t l n (
"Nome:< i n p u t type=t e x t s i z e =20 name=nomedado>" ) ;
out . p r i n t l n ( "<br>Valor : "+
"<i n p u t type=t e x t s i z e =20 name=valordado >" ) ;
out . p r i n t l n ( "<br><i n p u t type=submit>" ) ;
out . p r i n t l n ( "</form>" ) ;
out . p r i n t l n ( "</body></html>" ) ;
{
}
throws IOException , S e r v l e t E x c e p t i o n
doGet ( req , r e s p ) ;
164
Java na prtica
7.11 JSP
Servlets uma boa idia, mas voc se imaginou montando uma
pgina complexa usando println()? Muitas vezes o desenvolvimento de um site uma tarefa complexa que envolve vrios
prossionais. A tarefa de projeto do layout da pgina ca a cargo
do Web Designer, incluindo a diagramao dos textos e imagens,
aplicao de cores, tratamento das imagens, denio da estrutura
da informao apresentada no site e dos links para navegao pela
mesma. J o Desenvolvedor Web responsvel pela criao das
aplicaes que vo executar em um site. O trabalho destes dois
prossionais somado na criao de um nico produto, mas durante o desenvolvimento a interferncia mtua deve ser a mnima
possvel. Ou seja, um prossional no deve precisar alterar o que
foi feito pelo outro prossional para cumprir sua tarefa. A tecnologia Servlet no nos permite atingir esse objetivo. Por exemplo,
suponha que um Web Designer terminou o desenvolvimento de
uma pgina e a entregou para o Desenvolvedor Web codicar em
um Servlet. Se aps a codicao o Web Designer desejar realizar
uma alterao na pgina ser necessrio que ele altere o cdigo do
Servlet (do qual ele nada entende) ou entregar uma nova pgina
para o Desenvolvedor Web para que ele a codique totalmente,
Tpicos Avanados
165
Java Server Pages (JSP) so pginas HTML que incluem cdigo Java e outros tags especiais. Desta forma as partes estticas
da pgina no precisam ser geradas por println(). Elas se encontram na prpria pgina. A parte dinmica gerada pelo cdigo
JSP. Assim a parte esttica da pgina pode ser projetada por um
Web Designer que nada sabe de Java.
A primeira vez que uma pgina JSP carregada pelo container JSP o cdigo Java compilado gerando um Servlet que
executado, gerando uma pgina HTML que enviada para o
navegador. As chamadas subsequentes so enviadas diretamente
ao Servlet gerado na primeira requisio, no ocorrendo mais as
etapas de gerao e compilao do Servlet.
A gura 7.14 mostra um esquema das etapas de execuo de
uma pgina JSP na primeira vez que requisitada. Na etapa (1)
a requisio enviada para um servidor Web que reencaminha a
requisio (etapa 2) para o container Servlet/JSP. Na etapa (3)
o container verica que no existe nenhuma instncia de Servlet
correspondente pgina JSP. Neste caso, a pgina JSP traduzida
para cdigo fonte de uma classe Servlet que ser usada na resposta
requisio. Na etapa (4) o cdigo fonte do Servlet compilado,
e na etapa (5) criada uma instncia da classe. Finalmente, na
etapa (6) invocado o mtodo service() da instncia Servlet
para gerar a resposta requisio.
A idia de se usar scripts de linguagens de programao em pginas HTML que so processados no lado servidor para gerar contedo dinmico no restrita linguagem Java. Existem vrias
solues desse tipo fornecida por outros fabricantes. Apresentase, a seguir, comparaes com outras duas tecnologias similares a
JSP.
166
Java na prtica
Tpicos Avanados
167
168
Java na prtica
http://localhost:8080/teste/ola.jsp
O Servlet criado a partir da pgina JSP colocado em um diretrio
de trabalho. No caso do Tomcat o Servlet colocado em subdiretrio
associado aplicao e subordinado ao diretrio /work do Tomcat. O
exemplo 7.9 mostra os principais trechos do Servlet criado a partir da
traduo do arquivo ola.jsp pelo tradutor do Tomcat. Note que o
Servlet subclasse de uma classe HttpJspBase e no da HttpServlet.
Alm disso, o mtodo que executado em resposta requisio o
mtodo _jspService() e no o mtodo service(). Note tambm que
todas as partes estticas da pgina JSP so colocadas como argumentos
do mtodo write() do objeto referenciado por out.
...
public void _ j s p S e r v i c e ( H t t p S e r v l e t R e q u e s t r e q u e s t ,
HttpServletResponse response )
throws j a v a . i o . IOException , S e r v l e t E x c e p t i o n {
J s p F a c t o r y _jspxFactory = null ;
j a v a x . s e r v l e t . j s p . PageContext pageContext = null ;
H t t p S e s s i o n s e s s i o n = null ;
S e r v l e t C o n t e x t a p p l i c a t i o n = null ;
S e r v l e t C o n f i g c o n f i g = null ;
J s p W r i t e r out = null ;
Object page = this ;
J s p W r i t e r _jspx_out = null ;
try {
...
out . w r i t e ( "<html>\r \n
");
out . w r i t e ( "<head>\r \n
");
out . w r i t e ( "< t i t l e >Exemplo JSP" ) ;
out . w r i t e ( "</ t i t l e >\r \n
");
out . w r i t e ( "</head>\r \n
");
out . w r i t e ( "<body>\r \n
");
Tpicos Avanados
169
out . w r i t e ( "\ r \n
");
out . p r i n t ( x ) ;
out . w r i t e ( "\ r \n
");
out . w r i t e ( "</body>\r \n" ) ;
out . w r i t e ( "</html>" ) ;
} catch ( Throwable t ) {
...
}
Classe
HttpServletRequest
HttpServletResponse
PageContext
ServletContext
HttpSession
JspWriter
Varivel
request
response
pageContext
application
session
out
7.11.6
Tags JSP
170
Java na prtica
Expresses
<%= expresses %>
No primeiro exemplo inserido na pgina a data corrente em milsimo de segundos e no segundo inserido o nome do mtodo (GET,
POST, etc.) usado na requisio. Note que cada expresso contm
apenas um comando Java. Note tambm que o comando Java no
terminado pelo caractere `;'.
Scriptlets
<%= cdigo Java %>
Tpicos Avanados
171
<html>
<head>< t i t l e >Conversao C e l s i u s F a h r e n h e i t</ t i t l e ></ head>
<body>
<%
i f ( valor != null )
{
d o u b l e f = Double . p a r s e D o u b l e ( v a l o r ) 9 / 5 + 3 2 ;
out . p r i n t l n ( "<P>" ) ;
out . p r i n t l n (
"<h2>Valor em F a h r e n h e i t : " + f +"<h2><br>" ) ;
}
%>
<form action=c o n v e r s a o . j s p method=POST>
C e l c i u s : <input type=text s i z e =20 name=c e l s i u s><br>
<input type=submit>
</ form>
</ body>
</ html>
Note o uso das variveis request e out sem a necessidade de declarao. Todo o cdigo digitado inserido no mtodo _jspService(). A
gura 7.15 mostra o resultado da requisio aps a digitao do valor
30 na caixa de texto do formulrio.
172
Java na prtica
Declaraes
Uma declarao JSP permite denir variveis ou mtodos que so inseridos no corpo do Servlet. Como as declaraes no geram sada, elas
so normalmente usadas em combinao com expresses e scriptlets.
O exemplo 7.12 mostra a declarao de uma varivel que usada para
contar o nmero de vezes que a pgina corrente foi requisitada desde
que foi carregada.
<%! P r i v a t e int numAcesso = 0; % >
Acessos desde carregada :
<%= ++ numAcesso %>
Tpicos Avanados
173
{
}
%>
return c 9 / 5 + 3 2 ;
Comentrios
Existem dois tipos de comentrios utilizados em pginas JSP. O primeiro exclui todo o bloco comentado da sada gerada pelo processamento da pgina. A forma geral deste tipo de comentrio a seguinte:
<% comentrio %>
Diretivas
Diretivas so mensagens para JSP container. Elas no enviam nada
para a pgina mas so importantes para denir atributos JSP e dependncias com o JSP container. A forma geral das diretivas a seguinte:
174
Java na prtica
Diretiva page
<%@ page atributo 1 ="valor 1 ". . . atributo n ="valor n "%>
Atributo e Forma Geral
import="package.class "
ou
import="package.class 1 ,. . .,
package.class n "
contentType="MIME-Type"
isThreadSafe="true|false"
session="true|false"
buffer="tamkb |none"
autoflush="true|false"
info="mensagem "
Descrio
Permite especicar os pacotes que devem
ser importados para serem usados na pgina JSP. Exemplo:
<%@ page import="java.util.*" %>
Especica o tipo MIME da sada. O default text/html. Exemplo:
<%@ page contentType="text/plain" %>
possui o mesmo efeito do scriptlet
<%
response.setContentType("text/plain");
%>
Um valor true (default) indica um processamento normal do Servlet, onde mltiplas requisies so processadas simultaneamente. Um valor false indica que o
processamento deve ser feito por instncias
separadas do Servlet ou de forma serial.
Um valor true (default) indica que a varivel predenida session (HttpSession)
deve ser associada sesso, se existir, caso
contrrio uma nova sesso deve ser criada
e associada a ela. Um valor false indica
que nenhuma sesso ser usada.
Especica o tamanho do buer para escrita
usado pelo objeto JspWriter. O tamanho
default no menor que 8k.
Um valor true (default ) indica que o buer
deve ser esvaziado quando estiver cheio.
Dene uma cadeia de caracteres que pode
ser recuperada via getServletInfo().
Tpicos Avanados
errorPage="url "
isErrorPage="true|false"
language="java"
175
Especica a pgina JSP que deve ser processada em caso de excees no capturadas.
Indica se a pgina corrente pode atuar
como pgina de erro para outra pgina
JSP. O default false.
Possibilita denir a linguagem que est
sendo usada. No momento a nica possibilidade Java.
import
contentType
isThreadSafe
session
buffer
autoflush
info
errorPage
isErrorPage
language
Tabela 7.4 Tabela de diretivas Page.
Diretiva include
<%@ include file="uri relativa " %>
Permite incluir arquivos no momento em que a pgina JSP traduzida em um Servlet. Por exemplo:
176
Java na prtica
Tpicos Avanados
177
178
Java na prtica
Tpicos Avanados
179
<html><body>
<H1>Id da s e s s&a t i l d e ; o : <%= s e s s i o n . g e t I d () %></H1>
<%
String nome = r e q u e s t . getParameter ( "nome" ) ;
String t e l e f o n e = r e q u e s t . getParameter ( " t e l e f o n e " ) ;
%>
180
Java na prtica
Tpicos Avanados
181
Onde nome o identicador da varivel que conter uma referncia para uma instncia do JavaBean. Voc tambm pode modicar
o atributo scope para estabelecer o escopo do bean alm da pgina
corrente.
<jsp:useBean
id="nome "scope="session "class="package.class "/>
Pgina bean.jsp
<HTML> <HEAD>
<TITLE>Uso de beans</TITLE>
</HEAD> <BODY> <CENTER>
<TABLE BORDER=5> <TR><TH CLASS="TITLE"> Uso de JavaBeans
</TABLE> </CENTER> <P>
<j s p : useBean i d=" t e s t e " c l a s s=" c u r s o . BeanSimples " />
<j s p : s e t P r o p e r t y name=" t e s t e " p r o p e r t y="mensagem"
value=" Ola mundo ! " />
<H1> Mensagem : <I>
<j s p : g e t P r o p e r t y name=" t e s t e " p r o p e r t y="mensagem" />
</ I></H1>
</BODY> </HTML>
Arquivo Curso/BeanSimples.java
package c u r s o ;
public c l a s s BeanSimples {
182
Java na prtica
Tpicos Avanados
183
<BODY> <CENTER>
<TABLE BORDER=5> <TR><TH CLASS="TITLE"> Uso de JavaBeans
</TABLE> </CENTER> <P>
<j s p : useBean i d=" t e s t e " c l a s s=" c u r s o . BeanSimples " />
<j s p : s e t P r o p e r t y name=" t e s t e " p r o p e r t y=" " />
<H1> Mensagem : <I>
<j s p : g e t P r o p e r t y name=" t e s t e " p r o p e r t y="mensagem" />
</ I></H1>
<form method="POST" action=" bean2 . j s p ">
Texto : <input type=" t e x t " s i z e=" 20 " name="mensagem" >
<br><INPUT TYPE=submit name=submit value=" e n v i e ">
</ form>
</BODY> </HTML>
184
Java na prtica
Escopo
Descrio
page
request
session
application
Pgina compras.jsp
<html>
<j s p : useBean i d=" c a r r i n h o " s c o p e=" s e s s i o n "
c l a s s=" compra . C a r r i n h o " />
<j s p : s e t P r o p e r t y name=" c a r r i n h o " p r o p e r t y=" " />
Tpicos Avanados
185
<body bgcolor="#FFFFFF">
<%
String [ ] i t e m s = c a r r i n h o . g e t I t e m s ( ) ;
%>
i f ( i t e m s . l e n g t h>0 ) {
JavaBean compra/Carrinho.java
package compra ;
import j a v a x . s e r v l e t . h t t p . ;
import j a v a . u t i l . Vector ;
import j a v a . u t i l . Enumeration ;
public c l a s s C a r r i n h o {
Vector v = new Vector ( ) ;
186
Java na prtica
S t r i n g submit = null ;
S t r i n g item = null ;
public void se tS u b m it ( S t r i n g s )
{ submit = s ;
public S t r i n g [ ] g e t I t e m s ( ) {
S t r i n g [ ] s = new S t r i n g [ v . s i z e ( ) ] ;
}
v . copyInto ( s ) ;
return s ;
private void r e s e t ( ) {
submit = null ;
item = null ;
public void p r o c e s s R e q u e s t ( H t t p S e r v l e t R e q u e s t r e q u e s t )
reset ();
Tpicos Avanados
187
7.12 Reencaminhando ou
nando requisies
Redirecio-
Existem algumas situaes onde pode ser desejvel transferir uma requisio para outra URL. Isto feito com frequncia em sistemas que
combinam o uso de Servlets juntamente com pginas JSP. No entanto,
a transferncia pode ser para qualquer recurso. Assim, podemos transferir uma requisio de um Servlet para uma pgina JSP, HTML ou
um outro Servlet. Da mesma forma uma pgina JSP pode transferir
uma requisio para uma outra pgina JSP, HTML ou um Servlet.
Existem dois tipos de transferncia de requisio: o redirecionamento e o reencaminhamento. O redirecionamento obtido usando o
mtodo sendRedirect() de uma instncia HttpServletResponse, passando como argumento a URL de destino. O exemplo 7.20 mostra o
cdigo de um Servlet redirecionando para a pgina JSP do exemplo 7.8.
import j a v a x . s e r v l e t . ;
import j a v a x . s e r v l e t . h t t p . ;
import j a v a . i o . ;
188
Java na prtica
public c l a s s R e d i r e c i o n a extends H t t p S e r v l e t
HttpServletResponse res )
{
}
throws S e r v l e t E x c e p t i o n , IOException
res . sendRedirect (" ola . jsp " ) ;
import j a v a x . s e r v l e t . ;
import j a v a x . s e r v l e t . h t t p . ;
public c l a s s Reencaminha extends H t t p S e r v l e t
HttpServletResponse response )
try
Tpicos Avanados
189
getServletContext ( ) .
getRequestDispatcher ( "/ ola . j s p " ) .
forward ( request , response ) ;
} catch ( E x c e p t i o n e ) {
System . out . p r i n t l n ( " S e r v l e t f a l h o u : " ) ;
e . printStackTrace ( ) ;
}
190
Java na prtica
Tpicos Avanados
191
de EJB (Enterprise JavaBeans ) recomendado para a implementao do Middleware, uma vez que os EJBs possuem capacidades
para gerncia de transaes e persistncia. Isto implica na adoo
de um servidor de aplicao habilitado para EJB.
A gura 7.23 ilustra a interao entre os componentes. Essa arquitetura possui as seguintes vantagens:
192
Java na prtica
A gura 7.24 mostra a arquitetura fsica de uma aplicao de comrcio eletrnico. Demilitarized Zone (DMZ) onde os servidores HTTP
so instalados. A DMZ protegida da rede pbica por um rewall,
tambm chamado de rewall de protocolo. O rewall de protocolo
deve ser congurado para permitir trfego apenas atravs da porta 80.
Um segundo rewall, tambm chamado de rewall de domnio separa a
DMZ da rede interna. O rewall de domnio deve ser congurado para
permitir comunicao apenas por meio das portas do servidor de aplicao. Desta forma os dados corporativos cam protegidos de ataques
externos.
7.13.3 Agenda Web: Um Exemplo de uma aplicao Web usando a arquitetura MVC
O exemplo a seguir mostra o desenvolvimento da agenda eletrnica para
o funcionamento na Web. A arquitetura adotada uma implementao
do modelo MVC. Apenas, para simplicar a soluo, a camada intermediria foi simplicada e implementada por um JavaBean que tem
a funo de gerenciar a conexo com o banco de dados. O sistema
composto pelos arquivos mostrados na tabela 7.6.
Tpicos Avanados
193
Arquivo
Descrio
agenda.html
principal.jsp
LoginBean.java
AgendaServlet.java
AcaoBean.java
ConnectionBean.java
194
Java na prtica
Tpicos Avanados
195
Descreveremos agora cada componente da aplicao. O exemplo 7.22 mostra o cdigo HTML da pgina agenda.html. Esta a
pgina inicial da aplicao. Ela contm o formulrio para a entrada do
login e senha para entrar no restante do site.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<HTML>
<HEAD>
<TITLE>Agenda</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<P a l i g n=" c e n t e r "><IMG s r c=" t i t . g i f " width=" 350 "
h e i g h t=" 100 " b o r d e r="0"></P>
<BR>
<CENTER>
<FORM method="POST" name=" TesteSub "
onsubmit=" r e t u r n TestaVal ( ) "
a c t i o n="/ agenda / agenda "><BR>
Login :<INPUT s i z e=" 20 " type=" t e x t " name=" l o g i n ">
<BR><BR>
Senha :<INPUT s i z e=" 20 " type=" password "
name=" senha ">
<BR><BR><BR>
<INPUT type=" submit " name=" e n v i a " v a l u e=" Enviar ">
<INPUT s i z e="3 " type=" Hidden " name=" c o r r e n t e "
v a l u e="0">
<BR>
</FORM>
</CENTER>
<SCRIPT l a n g u a g e=" J a v a S c r i p t ">
<!
f u n c t i o n TestaVal ( )
{
i f ( document . TesteSub . l o g i n . v a l u e == "" )
{
a l e r t ( "Campo Login nao P r e e n c h i d o ! " )
}
return f a l s e
{
}
return f a l s e
else
196
42
43
44
45
46
Java na prtica
return true
}
//></SCRIPT>
</BODY></HTML>
Tpicos Avanados
197
<HTML><HEAD>
<TITLE>Tela da Agenda </TITLE>
</HEAD><BODY b g c o l o r="#FFFFFF">
<%@ page s e s s i o n=" t r u e " import=" agenda . " %>
<%
agenda . LoginBean l b =(agenda . LoginBean )
session . getAttribute (" loginbean " ) ;
agenda . AcaoBean ab = ( agenda . AcaoBean )
r e q u e s t . g e t A t t r i b u t e ( " acaobean " ) ;
i f ( l b ! = null && l b . g e t S t a t u s ( ) )
{ %>
<H2>S e s s&a t i l d e ; o do <%= l b . getNome() %></H2>
<%
i f ( ab!= null ) out . p r i n t l n ( ab . t o S t r i n g ( ) ) ;
%>
<P><BR></P>
<FORM method="POST" name=" f o r m p r i n "
onsubmit=" r e t u r n TestaVal ( ) " a c t i o n="/ agenda / agenda ">
Nome: <INPUT s i z e=" 50 " type=" t e x t " name="nome"><BR>
T e l e f o n e : <INPUT s i z e=" 20 " type=" t e x t " name=" t e l e f o n e ">
<BR>
Endere&c c e d i l ; o : <INPUT s i z e=" 50 " type=" t e x t "
name=" e n d e r e c o "><BR>
Email : <INPUT s i z e=" 50 " type=" t e x t " name=" e m a i l "><BR>
<BR>
P&a a c u t e ; g i n a : <INPUT s i z e=" 50 " type=" t e x t "
name=" p a g i n a "><BR>
C e l u l a r : <INPUT s i z e=" 20 " type=" t e x t " name=" c e l u l a r ">
<BR>
D e s c r i&c c e d i l ;& a t i l d e ; o : <INPUT s i z e=" 20 " type=" t e x t "
name=" d e s c r i c a o ">
<BR><CENTER>
<INPUT type=" submit " name=" acao " v a l u e=" C o n s u l t a ">
<INPUT type=" submit " name=" acao " v a l u e=" I n s e r e ">
<INPUT type=" submit " name=" acao " v a l u e="Apaga"></CENTER>
<INPUT s i z e="3 " type=" Hidden " name=" c o r r e n t e " v a l u e="1 ">
</FORM>
<%
}
else
198
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Java na prtica
%>
<H1>Usu&a a c u t e ; r i o n&a t i l d e ; o a u t o r i z a d o </H1>
<%
}
%>
<SCRIPT l a n g u a g e=" J a v a S c r i p t "><!
f u n c t i o n TestaVal ( )
{
i f ( document . f o r m p r i n . nome . v a l u e == " " &&
document . f o r m p r i n . d e s c r i c a o . v a l u e== "" )
{
a l e r t ( "Nome ou D e s c r i c a o devem s e r P r e e n c h i d o s ! " )
}
return f a l s e
else
{
}
return true
//></SCRIPT>
</BODY></HTML>
Tpicos Avanados
199
O exemplo 7.24 mostra o cdigo do JavaBean usado para intermediar a conexo com o banco de dados. O JavaBean ConnectionBean
tem a responsabilidade de abrir uma conexo com o banco de dados,
retornar uma referncia desta conexo quando solicitado e registrar se
a conexo est livre ou ocupada. Neste exemplo o ConnectionBean se
encarrega apenas de obter a conexo e fech-la, no entanto, em uma
aplicao, com um nmero maior de acessos ao banco de dados, pode
ser necessrio um maior controle sobre o uso das conexes, mantendoas em uma estrutura de dados para fazer o papel de pool de conexes.
Na linha 13 podemos observar que o construtor da classe foi declarado
com o modicador de acesso private. Isto signica que no possvel
invocar o construtor por meio de um objeto de outra classe. Isto
feito para que se possa ter um controle sobre a criao de instncias da
classe. No nosso caso permitiremos apenas que uma instncia da classe
seja criada, de modo que todas as referncias apontem para um mesmo
objeto. Esta tcnica de programao, onde se permite uma nica instncia de uma classe, denominada de padro de projeto Singleton. O
objetivo de utilizarmos este padro porque desejamos que apenas um
objeto controle a conexo com o banco de dados. Mas se o construtor
no pode ser chamado fora da classe, ento como uma instncia da
classe criada e sua referncia passada para outros objetos? Esta
a tarefa do mtodo esttico getInstance() (linhas 15 a 23). Este
mtodo verica se j existe a instncia e retorna a referncia. Caso a
instncia no exista ela criada antes de se retornar a referncia. O
mtodo init() (linhas 25 a 35) chamado pelo construtor para estabelecer a conexo com o SGBD. Ele carrega o driver JDBC do tipo 4
para HSQLDB (veja a seo 4.3) e obtm uma conexo com o SGBD.
O mtodo devolveConnection() (linhas 37 a 45) chamado quando
se deseja devolver a conexo. Finalmente, o mtodo getConnection()
(linhas 57 a 57) chamado quando se deseja obter a conexo.
1
2
3
4
5
6
7
8
9
10
package agenda ;
import j a v a . s q l . ;
import j a v a . l a n g . ;
import j a v a . u t i l . ;
public c l a s s ConnectionBean
200
11
12
13
14
15
16
17
Java na prtica
s t a t i c synchronized
public ConnectionBean g e t I n s t a n c e ( )
18
20
21
23
24
25
26
29
30
31
32
33
36
37
38
39
return i n s t a n c e ;
try
28
35
public synchronized
void d e v o l v e C o n n e c t i o n ( Connection con )
40
i f ( this . con==con )
41
42
43
44
45
46
47
48
49
50
51
i n s t a n c e = new ConnectionBean ( ) ;
private void i n i t ( )
27
34
i f ( i n s t a n c e == null )
19
22
init (); }
c l i e n t s ;
notify ();
i f ( c l i e n t s >0)
try { w a i t ( 5 0 0 0 ) ; }
Tpicos Avanados
catch ( I n t e r r u p t e d E x c e p t i o n e ) { } ;
i f ( c l i e n t s >0) return null ;
52
53
54
55
56
57
58
201
}
c l i e n t s ++;
return con ;
202
Java na prtica
25
stmt = con . c r e a t e S t a t e m e n t ( ) ;
26
R e s u l t S e t r s = stmt . executeQuery ( c o n s u l t a ) ;
27
i f ( r s . next ( ) )
28
{
29
s t a t u s = true ;
30
nome = r s . g e t S t r i n g ( "NOME" ) ;
31
}
32
} catch ( E x c e p t i o n e ) {
33
System . out . p r i n t l n ( e . getMessage ( ) ) ;
34
}
35
finally
36
{
37
ConnectionBean . g e t I n s t a n c e ( ) . d e v o l v e C o n n e c t i o n ( con ) ;
38
try { stmt . c l o s e ( ) ; } catch ( E x c e p t i o n e e ) { } ;
39
}
40 }
41
42 public S t r i n g g e t L o g i n ( ) { return l o g i n ; }
43 public S t r i n g getNome ( ) { return nome ; }
44 public boolean g e t S t a t u s ( ) { return s t a t u s ; }
45 }
Tpicos Avanados
203
package agenda ;
import j a v a x . s e r v l e t . ;
import j a v a x . s e r v l e t . h t t p . ;
import agenda . ;
public c l a s s A g e n d a S e r v l e t extends H t t p S e r v l e t
HttpServletResponse resp )
performTask ( req , r e s p ) ;
{
}
HttpServletResponse resp )
performTask ( req , r e s p ) ;
HttpServletResponse resp )
String url ;
HttpSession sessao ;
S t r i n g c o r r e n t e = r e q . getParameter ( " c o r r e n t e " ) ;
int i c o r r =0;
i f ( c o r r e n t e ! = null )
icorr = Integer . parseInt ( corrente ) ;
try
switch ( i c o r r )
204
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Java na prtica
else
case 1 :
s e s s a o = r e q . g e t S e s s i o n ( true ) ;
sessao . setAttribute (" loginbean " ,
new agenda . LoginBean ( l o g i n , senha ) ) ;
u r l = "/ p r i n c i p a l . j s p " ;
break ;
sessao = req . getSession ( false ) ;
i f ( s e s s a o == null )
u r l = "/ agenda . html " ;
else
break ;
}
getServletContext ( ) . getRequestDispatcher ( url ) .
f o r w a r d ( req , r e s p ) ;
} catch ( E x c e p t i o n e ) {
System . out . p r i n t l n ( " A g e n d a S e r v l e t f a l h o u : " ) ;
e . printStackTrace ( ) ;
}
Tpicos Avanados
205
206
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Java na prtica
}
}
S t r i n g d e s c r i = r e q . g et Pa ra me te r ( " d e s c r i c a o " ) ;
c o n s u l t a ( nome , d e s c r i ) ;
i n s e r e ( req ) ;
apaga ( r e q ) ;
S t r i n g c o n s u l t a = null ;
r e t = new S t r i n g B u f f e r (
" D i g i t e o nome ou d e s c r i c a o ! " ) ;
return ;
i f ( d e s c r i == null | | d e s c r i . l e n g t h () <1)
consulta =
"SELECT FROM PESSOA WHERE NOME LIKE '% "
+nome+"%'"+" ORDER BY NOME" ;
e l s e i f ( nome == null | | nome . l e n g t h () <1)
consulta =
"SELECT FROM PESSOA WHERE DESCRICAO LIKE '% "
+d e s c r i+"%'"+" ORDER BY NOME" ;
e l s e c o n s u l t a=
"SELECT FROM PESSOA WHERE DESCRICAO LIKE '% "
+d e s c r i+
" % ' AND NOME LIKE '% "+nome+" % ' ORDER BY NOME" ;
try
con=ConnectionBean . g e t I n s t a n c e ( ) . g e t C o n n e c t i o n ( ) ;
i f ( con == null )
{
r e t = new S t r i n g B u f f e r (
" S e r v i d o r ocupado . Tente mais t a r d e . ! " ) ;
return ;
}
stmt = con . c r e a t e S t a t e m e n t ( ) ;
R e s u l t S e t r s = stmt . executeQuery ( c o n s u l t a ) ;
r e t = new S t r i n g B u f f e r ( ) ;
r e t . append ( "<br><h3>Resultado </h3><br>" ) ;
while ( r s . next ( ) )
{
r e t . append ( "ID : " ) . append ( r s . g e t S t r i n g ( " i d " ) ) ;
r e t . append ( "<br>Nome : " ) . append (
r s . g e t S t r i n g ( "Nome" ) ) ;
r e t . append ( "<br>T e l e f o n e : " ) . append (
rs . getString (" Telefone " ) ) ;
r e t . append ( "<br>Endereco : " ) . append (
r s . g e t S t r i n g ( " Endereco " ) ) ;
r e t . append ( "<br>e m a i l : " ) . append (
rs . getString ( " email " ) ) ;
Tpicos Avanados
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
}
} catch ( E x c e p t i o n e )
{
System . out . p r i n t l n ( e . getMessage ( ) ) ;
}
finally {
ConnectionBean . g e t I n s t a n c e ( ) .
d e v o l v e C o n n e c t i o n ( con ) ;
try { stmt . c l o s e ( ) ; } catch ( E x c e p t i o n e e ) { } ;
}
private void i n s e r e ( H t t p S e r v l e t R e q u e s t r e q )
S t r i n g [ ] par =
{ " t e l e f o n e " , " e n d e r e c o " , " e m a i l " , "hp" ,
" celular " ," descricao " };
S t r i n g B u f f e r comando =
new S t r i n g B u f f e r ( "INSERT INTO PESSOA( " ) ;
StringBuffer values =
new S t r i n g B u f f e r ( " VALUES( " ) ;
S t r i n g aux = r e q . g et Pa ra me te r ( "nome" ) ;
i f ( aux == null | | aux . l e n g t h () <1)
{
r e t = new S t r i n g B u f f e r (
"<br><h3>D i g i t e o nome!</h3><br>" ) ;
return ;
}
try
con=ConnectionBean . g e t I n s t a n c e ( ) . g e t C o n n e c t i o n ( ) ;
i f ( con == null )
{
r e t = new S t r i n g B u f f e r (
" S e r v i d o r ocupado . Tente mais t a r d e ! " ) ;
return ;
}
con . setAutoCommit ( f a l s e ) ;
DatabaseMetaData meta=con . getMetaData ( ) ;
i f ( meta . s u p p o r t s T r a n s a c t i o n I s o l a t i o n L e v e l (
}
con . TRANSACTION_SERIALIZABLE ) ) {
con . s e t T r a n s a c t i o n I s o l a t i o n (
con . TRANSACTION_SERIALIZABLE ) ;
207
208
Java na prtica
135
136
int u l t = obtemUltimo ( con ) ;
137
i f ( u l t ==1) return ;
138
u l t ++;
139
comando . append ( " id , nome" ) ;
140
v a l u e s . append ( u l t+" , ' " ) . append ( aux ) . append ( " ' " ) ;
141
142
for ( int i =0; i <par . l e n g t h ; i ++)
143
{
144
aux = r e q . g et Pa ra me te r ( par [ i ] ) ;
145
i f ( aux ! = null && aux . l e n g t h () >0)
146
{
147
comando . append ( " , " ) . append ( par [ i ] ) ;
148
v a l u e s . append ( " , ' " ) . append ( aux ) . append ( " ' " ) ;
149
}
150
}
151
comando . append ( " ) " ) ;
152
v a l u e s . append ( " ) " ) ;
153
aux = comando . t o S t r i n g ()+ v a l u e s . t o S t r i n g ( ) ;
154
stmt = con . c r e a t e S t a t e m e n t ( ) ;
155
stmt . executeUpdate ( aux ) ;
156
con . setAutoCommit ( true ) ;
157
i f ( meta . s u p p o r t s T r a n s a c t i o n I s o l a t i o n L e v e l (
158
con .TRANSACTION_READ_COMMITTED) ) {
159
con . s e t T r a n s a c t i o n I s o l a t i o n (
160
con .TRANSACTION_READ_COMMITTED) ;
161
}
162
r e t = new S t r i n g B u f f e r (
163
"<br><h3>I n s e r i d o !</h3><br>" ) ;
164
return ;
165
} catch ( E x c e p t i o n e )
166
{
167
r e t = new S t r i n g B u f f e r ( "<br><h3>Erro : "+
168
e . getMessage ()+ "!</h3><br>" ) ;
169
}
170
finally
171
{
172
ConnectionBean . g e t I n s t a n c e ( ) .
173
d e v o l v e C o n n e c t i o n ( con ) ;
174
try { stmt . c l o s e ( ) ; } catch ( E x c e p t i o n e e ) { } ;
175
}
176 }
177
178 private int obtemUltimo ( Connection con )
179 {
180
String consulta =
181
"SELECT MAX( ID ) AS maior FROM PESSOA" ;
182
try
183
{
184
i f ( con == null )
185
{
186
r e t = new S t r i n g B u f f e r (
187
" S e r v i d o r ocupado . Tente mais t a r d e . ! " ) ;
188
return 1;
189
}
190
stmt = con . c r e a t e S t a t e m e n t ( ) ;
Tpicos Avanados
191
R e s u l t S e t r s = stmt . executeQuery ( c o n s u l t a ) ;
192
i f ( r s . next ( ) )
193
return I n t e g e r . p a r s e I n t ( r s . g e t S t r i n g ( " maior " ) ) ;
194
e l s e return 0 ;
195
} catch ( E x c e p t i o n e ) {
196
r e t = new S t r i n g B u f f e r ( "<br><h3>Erro : "+
197
e . getMessage ()+ "!</h3><br>" ) ;
198
return 1;
199
}
200
f i n a l l y { try { stmt . c l o s e ( ) ; } catch ( E x c e p t i o n e e ) { } ; }
201 }
202
203 private void apaga ( H t t p S e r v l e t R e q u e s t r e q )
204 {
205
S t r i n g aux = r e q . ge tP ar am et er ( "nome" ) ;
206
i f ( aux == null | | aux . l e n g t h () <1)
207
{
208
r e t = new S t r i n g B u f f e r (
209
"<br><h3>D i g i t e o nome!</h3><br>" ) ;
210
return ;
211
}
212
S t r i n g c o n s u l t a = "DELETE FROM PESSOA WHERE NOME = ' "
213
+aux+" ' " ;
214
try
215
{
216
con=ConnectionBean . g e t I n s t a n c e ( ) . g e t C o n n e c t i o n ( ) ;
217
i f ( con == null )
218
{
219
r e t = new S t r i n g B u f f e r (
220
" S e r v i d o r ocupado . Tente mais t a r d e . ! " ) ;
221
return ;
222
}
223
stmt = con . c r e a t e S t a t e m e n t ( ) ;
224
stmt . executeUpdate ( c o n s u l t a ) ;
225
226
r e t=new S t r i n g B u f f e r ( "<br><h3>Removido!</h3><br>" ) ;
227
} catch ( E x c e p t i o n e ) {
228
r e t = new S t r i n g B u f f e r ( "<br><h3>Erro : "+
229
e . getMessage ()+ "!</h3><br>" ) ;
230
}
231
finally {
232
ConnectionBean . g e t I n s t a n c e ( ) .
233
d e v o l v e C o n n e c t i o n ( con ) ;
234
try { stmt . c l o s e ( ) ; } catch ( E x c e p t i o n e e ) { } ;
235
}
236 }
237
238 public S t r i n g [ ] getLe g ( ) { return l e g e n d a ; }
239 public S t r i n g t o S t r i n g ( ) { return r e t . t o S t r i n g ( ) ; }
240 }
209
210
Java na prtica
Instalao da Aplicao
Para instalar crie a seguinte estrutura de diretrio abaixo do diretrio
webapps do Tomcat:
...
</webapp>
Tpicos Avanados
211
ndice
B2B, 189
B2C, 189
BLOB, 77
bytecode, 2
Metadados, 89
MIME, 143
monitor, 33
MVC, 190
localhost, 62
lookup, 117
nvel de isolamento, 94
Naming, 116
notify, 39
Daemon Threads, 23
DMZ, 192
FTP, 69
ponteiros, 3
pool de conexes, 101
preemptivo, 25
prepared statements, 97
procedimentos armazenados,
98
green-threads, 25
HSQLDB, 79
HTTP, 69
Internet, 138
IP: nmero, 58
Race Conditions, 32
rebind, 116
redes, 55
redirecionando requisies, 187
reencaminhando requisies,
187
Regies Crticas, 32
registry, 115
java.rmi.Remote, 113
java.rmi.RemoteException,
113
JDBC, 75
JDBC-ODBC, 107
JNDI, 115
join, 22
212
Tpicos Avanados
resume, 23
RMI, 111
rmic, 115
Round-Robin, 26
Runnable, 13
Scriptlets, 170
Sees Crticas, 32
semforo, 50
Servlets, 137
SGBD, 75
sleep, 19
socket, 61
SQL, 75
stop, 23
stored procedures, 98
suspend, 23
synchronized, 34
TCP, 57
Thread, 7
ThreadGroup, 44
Tomcat, 143
transao, 92
UDP, 58, 66
UnicastRemoteObject, 114
URI, 70
URL, 69, 85
wait, 39
yield, 21
213
214
Java na prtica
Bibliograa
[1] Eckel B. Thinking in Java. 3rd Ed. New Jersey: Prentice Hall,
2003.
[2] Elmasri R. e Navathe S. B. Fundamentals of Database Systems.
3rd Ed. Vancouver: Addison Wesley, 2000.
[3] Gosling J., Joy W., Steele G. The Java Language Specication.
Massachusetts : Addison-Wesley, 1996.
[4] Elmasri R., Navathe S. Fundamentals of Database Systems. 3rd
Ed. Massachusetts : Addison-Wesley, 2000.
[5] Oaks S., Wong H. Java Threads. 2nd Ed. California : O'Reilly and
Associates, Inc, 1999.
[6] Sadtler C. et al. Patterns for e-business: User-to-Business Patterns for Topology 1 and 2 using WebSphere Advanced Edition.
IBM RedBooks, California, April 2000.
[7] Silberschatz A., Forth H., Sudarshan S. Database Systems Concepts. McGraw-Hill, 1997.
[8] Wahli U. et al. Servlet and JSP Programming with IBM WebSphere
Studio and VisualAge for Java, IBM RedBooks, California, May
2000.
[9] Watt D. A. Programming Language Concepts and Paradigms.
Great Britain : Prentice Hall, 1990.
215