Escolar Documentos
Profissional Documentos
Cultura Documentos
CPqD Telecom & IT Solutions.
!
#"$%&
"2.34657*
859*:;
Copyright (c) - 2004 Andr Temple, Rodrigo Fernandes de Mello, Danival Taffarel
Calegari and Maurcio Schiezaro
< =?>A@-BDC,C,B,EGFHBDCJI?>LKMFN-=PO!NPERQPEMSTUVODBDCWN?>XBGY-ZN-=[K-FPO,\-E?>]@GE-O-BG^WT_NM`PBDCaO-EMQPZb@c=MFPN
Z,FPO-=d>eNM`=N,=?>A@DCHEM^fNM`P=JgDhGikjl>m=-=!nPEMQ-Z@G=GFPNPK-NDBbEMFpo,BcQP=-FGC=7Urqs=?>tC,BEMF!u?vxw
E>yKMFbT!zcKPN-=?>V{D=?>tC,BbEMF[S-Z-YzGB-Cc`P=,O!YbT!NM`=|jM>X=-=[}-EM^N~sK?>m=|j;EMZ-FO-K,NDBEMF
~lB,NM`[FPERPF{DK>tBKMFPNp}P=MQPN-B,E-FGCUyFE|jl>XE-FPNL-E{D=?>s=PGNsCUKGFPOkFPE!,K-QDlLPE,{D=>
D=PMNGC7v QEMSbTpEM^[N-`P=_z,BGQP=GFGC=_B-C[BGF-QbzDZO-=POkB,F[NM`P=_Cb=MQNDBEMFJ=MFNDB,Nczc=PO
Ag-hGiRjs>X=-=[n-EGQ-Zb@,=MFN-K-N-BEMFpo,BGQ=MFcCb=v
Parte I......................................................................................................................................................7
Desenvolvendo Interfaces e Controles de Interao com o Usurio..........................................7
Captulo 1...............................................................................................................................................8
Introduo.............................................................................................................................................8
1.1 Colocar Nome do tpico?...........................................................................................................8
1.1 Comparando Servlets com CGIs.................................................................................................9
1.2 O que so Servlets?.....................................................................................................................10
1.3 O que so pginas JSP?.............................................................................................................11
Captulo 2............................................................................................................................................12
Instalao e Configurao...............................................................................................................12
2.1 Colocar Nome do tpico?.........................................................................................................12
2.1 Instalao e configurao no Apache Tomcat.....................................................................12
2.2 Instalao e Configurao de uma Aplicao Web............................................................13
Captulo 3............................................................................................................................................22
Servlets caractersticas bsicas......................................................................................................22
3.1 Colocar Nome do tpico?.........................................................................................................22
3.2 O protocolo HTTP..........................................................................................................................22
3.3 Hierarquia de um Servlet.............................................................................................................24
3.4 Ciclo de vida de um Servlet.......................................................................................................24
3.5 Inicializao ..................................................................................................................................25
3.6 A classe ServletContext ..........................................................................................................29
3.7 Finalizao ....................................................................................................................................33
3.8 Atendimento de Requisies ....................................................................................................34
3.9 Concorrncia no atendimento de requisies.......................................................................35
3.10 Retornando informaes sobre o Servlet ..............................................................................37
Captulo 4............................................................................................................................................39
Servlets Gerao da sada.............................................................................................................39
4.1 Gerao de sada HTML simples ..............................................................................................39
4.2 Headers da resposta HTTP...........................................................................................................41
4.2 Gerao de outros tipos de sadas...........................................................................................44
4.3 Gerando contedo XML.............................................................................................................46
4.4 Status HTTP.....................................................................................................................................47
4.5 Cdigo de Status de erro............................................................................................................52
4.6 Buffering da resposta...............................................................................................................52
Captulo 5............................................................................................................................................55
Servlets Captura de parmetros da requisio..........................................................................55
5.1 Informaes sobre o servidor ....................................................................................................55
5.2 Informaes sobre a requisio\: ............................................................................................56
5.3 Formulrios HTML e parmetros da requisio\: ...................................................................60
5.4 Captura de parmetros da requisio\: ................................................................................61
5.5 Headers da requisio HTTP.......................................................................................................63
5.6 Upload de arquivos......................................................................................................................65
5.7 Atributos da requisio................................................................................................................66
Captulo 6............................................................................................................................................67
Servlets Cookies e Sesses..............................................................................................................67
6.1 Colocar Nome do tpico?.........................................................................................................67
6.1 Campos escondidos de formulrios HTML...............................................................................67
6.2 Informaes adicionais de caminho.........................................................................................69
6.3 Cookies...........................................................................................................................................70
6.4 Gerenciamento de sesses........................................................................................................73
Captulo 7............................................................................................................................................84
Pginas JSP..........................................................................................................................................84
7.1 Formatao do contedo da resposta com Servlets............................................................84
7.2 Formatao do contedo da resposta com pginas JSP....................................................86
7.3 Funcionamento interno...............................................................................................................87
7.4 Ciclo de vida.................................................................................................................................89
7.5 Elementos dinmicos...................................................................................................................89
7.6 Diretivas..........................................................................................................................................89
7.7 Expresses......................................................................................................................................91
7.8 Scriptlets.........................................................................................................................................92
7.9 Objetos implcitos.........................................................................................................................93
7.10 Declaraes................................................................................................................................95
7.11 Comentrios................................................................................................................................96
7.12 JavaBeans...................................................................................................................................96
7.13 Bibliotecas de Tags (Tag Libraries)...........................................................................................99
Captulo 8..........................................................................................................................................104
Modelo MVC.....................................................................................................................................104
8.1 Colocar Nome do tpico?.......................................................................................................104
8.1 Arquitetura bsica......................................................................................................................104
8.2 Forward de requisies..............................................................................................................105
8.3 Atributos de requisies............................................................................................................106
8.4 Juntando as partes....................................................................................................................107
Captulo 9..........................................................................................................................................111
Tpicos adicionais ...........................................................................................................................111
9.1 Arquivos WAR..............................................................................................................................111
9.2 Autenticao HTTP.....................................................................................................................111
9.3 Pools de conexes a base de dados.....................................................................................114
Parte II.................................................................................................................................................121
Desenvolvimento de Aplicaes Distribudas Utilizando EJB.....................................................121
Captulo 10........................................................................................................................................122
Novas Tcnicas de Desenvolvimento...........................................................................................122
10.1 Desenvolvimento de Clssico de Aplicaes.....................................................................122
10.2 Sistemas Distribudos.................................................................................................................124
10.3 Primeiros Ensaios de Arquiteturas para Sistemas Distribudos no Mercado.....................130
10.4 Mercado Atual para Sistemas Distribudos...........................................................................132
Captulo 11........................................................................................................................................134
J2EE e Enterprise JavaBeans...........................................................................................................134
11.1 O que J2EE?..........................................................................................................................134
11.2 Viso da plataforma................................................................................................................134
11.3 Instalando o J2SDKEE..............................................................................................................136
11.4 O que so Enterprise JavaBeans?.........................................................................................136
11.5 Para que servem e por que utiliz-los?.................................................................................137
11.6 Componentes EJB....................................................................................................................138
B.2 Excees.....................................................................................................................................225
Apndice C.......................................................................................................................................228
Aplicao J2EE Exemplo..............................................................................................................228
Apndice C.......................................................................................................................................260
!#"%$&'
(*)+,-.!/0
1234!#$567&8:9
;<
>=?!#@
"!"#%$'&
(*),+.-
$0/1)'2
3
3
Figura 1.1
O CGI, ou Common Gateway Interface, surgiu como uma das primeiras tecnologias
disponveis para a gerao de contedo dinmico em servidores Web: o
desenvolvedor implementa uma aplicao que deve ser executada a cada requisio
recebida, sendo que o servidor Web passa para essa aplicao, atravs de variveis
de ambiente e entrada padro, os parmetros recebidos, e retorna a sada da
aplicao como resposta da requisio.
Figura 1.2
Funcionamento de um CGI.
Podemos usar o CGI para analisar algumas das vantagens em se utilizar Servlets.
Em primeiro lugar, h um grande ganho em performance na utilizao de Servlets: ao
invs de iniciar um novo processo a cada requisio recebida, um Servlet fica
carregado em memria e atende as requisies recebidas atravs de novos threads.
Alm disso, um Servlet pode tirar proveito dessa persistncia para manter tambm em
memria recursos que demandem grande processamento para serem inicializados. Um
exemplo tpico, para esse caso, a manuteno de conexes com banco de dados:
ao invs de inicializar uma nova conexo com o banco de dados a cada requisio
recebida, um Servlet pode inicializar diversas conexes ao ser carregado, e
simplesmente alocar uma conexo desse pool a cada requisio recebida (e retornar
a conexo ao pool aps o atendimento da requisio).
Alm destes ganhos de performance, a utilizao de um Servlet possibilita uma maneira
mais padronizada e portvel de se distribuir / implantar sua aplicao. Conforme
explicado mais adiante no Captulo
2 Instala o e Configura o, o ambiente onde
sua aplicao ser implantada no precisa ser igual ao ambiente onde foi feito o
desenvolvimento: seus Servlets podem ser instalados em qualquer ambiente onde
haja um Servidor de Aplicaes que implemente a especificao de Servlets.
,) + ') ")
+
Servlets so classes Java, desenvolvidas de acordo com uma estrutura bem definida, e
que, quando instaladas junto a um Servidor que implemente um Servlet Container (um
servidor que permita a execuo de Servlets, muitas vezes chamado de Servidor de
Aplicaes Java), podem tratar requisies recebidas de clientes.
Um cenrio tpico de funcionamento de uma aplicao desenvolvida com Servlets o
seguinte:
Figura 1.3
Exemplo de Servlet
! "$#%&(' #) *!+)
,
EJD!' #!9%8#735#J#".8;LK8,M#9EJD#"2"$
I2 9
. F#!
$#"Q !9" #
'
'
" #!5
'
-.
'
K8' 56"2*/+
#%9%E!#F#G
. 8#!8
H I$#&%'!)(
%',!+
- >?BAC,
0
0
,) + *! -
$,+
,1
3254
76 38
As pginas JSP, ou Java Server Pages, foram criadas para contornar algumas das
limitaes no desenvolvimento com Servlets: se em um Servlet a formatao da pgina
HTML resultante do processamento de uma requisio se mistura com a lgica da
aplicao em si, dificultando a alterao dessa formatao, em uma pgina JSP essa
formatao se encontra separada da programao, podendo ser modificada sem
afetar o restante da aplicao.
Assim, um JSP consiste de uma pgina HTML com alguns elementos especiais, que
conferem o carter dinmico da pgina. Esses elementos podem tanto realizar um
processamento por si, como podem recuperar o resultado do processamento realizado
em um Servlet, por exemplo, e apresentar esse contedo dinmico junto a pgina JSP.
Existe tambm um recurso adicional bastante interessante na utilizao de pginas JSP:
a recompilao automtica, que permite que alteraes feitas no cdigo da pgina
sejam automaticamente visveis em sua apresentao. Assim, no necessrio
interromper o funcionamento da aplicao para incorporar uma modificao de
layout, por exemplo.
/ I
/ ' #"
>?BAC
.
- >(?
A0C
'
) ,! + ! +
O primeiro passo para desenvolver aplicaes Web com Servlets e pginas JSP a
configurao de um ambiente bsico para a implantao e execuo dessas
aplicaes. Esse ambiente bsico pressupe a instalao de dois componentes
principais: o Java 2 Standard Development Kit (J2SDK), utilizado para compilar
aplicaes Java, e um Servlet Container, que ir executar os Servlets desenvolvidos.
Alguns sistemas operacionais j possuem um J2SDK instalado por default. Caso esse
).
ainda no se encontre instalado, pode-se obt-lo no site oficial do Java (
Neste site possvel selecionar entre as verses de J2SDK para as diversas plataformas
de mercado tais como Windows, Linux, Solaris e outros.
!44
Executv eis, incluindo os aplicativos para iniciar e para encerrar a execuo do servidor
conf
logs
Arquivos de log do servidor. Alm de gerar arquivos de log contendo entradas para cada
requisio recebida, como qualquer servidor Web, o Tomcat tambm pode gerar arquivos
de log com tudo o que as aplicaes desenvolvidas enviam para as sadas padro do
sistema: tipicam ente, o que impresso atravs do System.out acrescido no arquivo
stdout.log, e tudo o que impresso atravs do System.err acrescido no arquivo
stderr.log .
work
Diretrio temporrio do Tomcat. Esse diretrio utilizado, por exemplo, para realizar a
recompilao automtica de pginas JSP (esse processo explicado mais adiante no
captulo Pginas JSP).
webapps Nesse diretrio so instaladas as diversas aplicaes web desenvolvidas por voc ou por
terceiros.
Figura 2.1
Subdiret
rios na instala
o do Apache Tomcat.
'
- + $ "$,& ) - 1 ! $ & ,) .$0 "!"# $ & / )'2
&
!4
De acordo com a especificao de Servlets, existem duas maneiras pelas quais uma
aplicao web pode ser instalada junto a um Servlet Container: por meio de um
arquivo WAR (Web Application Archive), explicado mais adiante no Cap tulo 9, ou por
meio de uma estrutura de diretrios criada junto ao servidor. No caso especfico do
Tomcat, essa estrutura deve ser criada abaixo do diretrio webapps.
Para uma determinada aplicao Web, a estrutura de diretrios mnima que deve ser
criada abaixo do diretrio webapps a seguinte:
Figura 2.2
/ &#
Conforme pode ser visto na figura anterior, deve ser criado, abaixo do diretrio
,
um diretrio com o nome da aplicao. Esse diretrio deve conter pelo menos um
subdiretrio
; podem haver alm do subdiretrio , por outro lado, outros
subdiretrios e arquivos, como pginas html, pginas JSP etc.
O diretrio
, por sua vez, deve conter um arquivo chamado web.xml e dois
subdiretrios: classes, com todas as classes, e lib, com as bibliotecas utilizadas.
Obviamente, abaixo do diretrio classes podem haver subdiretrios para refletir o
path relacionado aos packages Java (mais informaes sobre packages podem
ser obtidas em qualquer livro introdutrio sobre a linguagem Java).
/"* (/
, contendo o Servlet
Utilizando como exemplo uma aplicao chamada
RemoteIPServlet do exemplo do captulo 1 desse livro, uma estrutura possvel abaixo
do diretrio webapps seria a seguinte:
Figura 2.3
Figura 2.4
O path do contexto serve para que o Servidor possa mapear e distribuir as requisies
recebidas para as diversas aplicaes instaladas. No Apache Tomcat, o path do
contexto coincide com o nome do subdiretrio criado abaixo do webapps.
Assim, no nosso exemplo, supondo que o endereo IP do servidor onde instalamos o
, teremos os acessos s URLs iniciadas por
Apache Tomcat
*8&
-F-
! !!
- P%#!JQ8#H I
-
QE"F&$
' #98#"
Figura 2.5
Por fim, conforme o leitor pode ter reparado nos exemplos citados anteriormente, para
cada aplicao h um Deployment Descriptor: trata-se de um arquivo, chamado
web.xml e localizado abaixo do diretrio
, e que contm informaes de
configurao da aplicao, tais como, parmetros de inicializao, mapeamentos de
Servlets, entre outros.
Deployment Descriptor: Arquivo XML com as informaes de configurao de uma Aplicao Web.
Esse arquivo fica abaixo do diretrio WEB-INF e se chama web.xml.
'!%#$"2 !9
#!96DE 9<
9 ? (I$
#N!
I " !C6H
!
'
% E8E!
@
H /
#
-$-2/ 59
A D!)!"$"F&#J"
H 9D -.- (
?-
#!N( !
%
-F-
&
8*%+& ! -F-
- E8E -
#N!
88#.9 - P#!
'!%#$"2 !9
9
? (
I$
I "
CH
,
B#9DE 9<FH /
#N!
-.- / 59
A0 D!F"#$"$8#J"
H 9D! -.- (
?-/
- E&E -
#!N$*
%
-F-
)&
#!N( !
-
#!N+!
/ .
- ((
: esse o elemento
Em seguida, vem o elemento
(raiz) desse XML, ou seja,
, e abaixo dele devem ficar todos os outros
deve haver somente um elemento
elementos do XML.
/ &
- ((&
#) %".* / , '(%./ " ."-* ,
# /# # (% '(% 0 / ')("* / / )# /-- (- & 0/ # / - / # / - / * & %"0
O elemento #) % .* / deve conter um nome da aplicao a ser apresentado por
!
EQ"$&.JE#
' #9&#"
#
J# Q"2#OQE" - F
89J#
O' 56#
- D9F#QQ,F $/
QD9&#Q,F
./
Q
F +96J# QH I96DQ OQE6"
Q
F O!' 5%#
=
9J#
- %.
' 5#
- .
- D9F#QQ,F $/
, serve para que se possa especificar o perodo mximo,
O elemento seguinte,
em minutos, de uma sesso (esse recurso explicado mais adiante no livro, no captulo
, esse elemento opcional, mas caso o
6 Sesses). Assim como o elemento !
desenvolvedor opte por utiliz-lo, deve existir somente uma instncia desse elemento no
arquivo.
#, %".* /
D!9%K8 <.
& J#5
/ '( * / / #
/"--(- 0/
# e
Os elementos
contm, respectivamente, a lista ordenada de
pginas a serem utilizadas como index e as pginas a serem apresentadas em casos
de erros HTTP ou excees no tratadas pela aplicao. Esses dois elementos so
opcionais, sendo que somente o primeiro admite uma instncia por Deployment
Descriptor.
Exemplo de utilizao dos elementos welcome-file-list e error-page
@
-
Q#!
#!
F
DE#
-
- #2F F
<#
Q#!
F*8 <@#
- #2F F
<#
feito
um
acesso
a
URL
)
, o Servidor tentar retornar a pgina index.html, conforme
. Caso essa pgina no exista, o Servidor tentar
especificado na lista do
utilizar a pgina index.jsp.
/--("- &0/
A figura anterior tambm demonstra a utilizao do elemento
duas vezes: a
primeira vez para mapear erros HTTP 404 (pgina no encontrada) a uma pgina de
erro-padro, e a segunda, para mapear exceptions com.minhaempresa.exceptions.
DBConnException a uma outra pgina de erro.
, servem para definir, respectivamente, os
e
Os ltimos dois elementos,
Servlets da aplicao, com seus respectivos parmetros, e os mapeamentos de URLs a
cada Servlet da aplicao.
Cada elemento
".FF&56
- $
89
# Q
$ ' 5#&
QLDE"F)$7E#
9("F&)5
- ' E
- "2#@' #
Q5O.' F
! / & /%.# (
!*
!
URLs com o sufixo indicado sejam tratados por um mesmo Servlet. Um ltimo exemplo
de mapeamento interessante diz respeito ao padro , que define o Servlet default para
todos os acessos que no se encaixarem em nenhum outro padro.
'!%#$"2 !9
9
? (
I$
I "
CH
*8& -F@
,
B#9DE 9<FH /
#N!
A0 D!F"#$"$8#J"
H 9D! -.- (
?-/
-.- / 59
- E&E -
#!N$*
%
-F-
)&
'%B E8E!
#!N +
#!N( !
EQ".&$JE!#
D!9!&#QQ,F
!$/
!)! 89%J# *&BJ#Q".# OQE6"
!)! ' 5#
- .
9#
' 5#
- D9 &
./
QD!9F#QQ,F
$/
!)! 89%J# QH I9%DQ OE"'
!)! ' 5#
- D9 &
./
Q".#"."Q 9)
) J#!5%
89J#
!' 5#
-
#!
@
@
#!' DQ!
F <(#
Q#2$!*+D!E#
- #.)% 8 DE#
-
$
-
$
- # F F
Q<O#
#!
F <(#
- # F F
Q<O#
9 8
$/
$ 89J#JQ ' / #!) E / A ?BI
" J&
9!*6 #!
F#" D! N! -
F !' 5#
- $
- 9 ./
9 8
$/
$ 89J#JQ ' P#J#Qb# -
F 9J# Q
!F
"Q F#1 9*Q#7
)#". DQ! N -
$ ' 5# - 9 ,
!)>
' 56#
9 8
$/
$ 89J#JQ ' O#"F) 9 8!$ -
. 9!J#Q
F !' 5#
#9EQ" J 9*%Q#!
F#"$! DQ N -
. ' 56# - 9 ,8
F>
9 8
$/
$ 89J#JQ ' * "."Q598 -
. 9J#Q
$ !' 5#
& 7DE"$&$7E#JD!' #!9F# -
!) ' 5# - 9 8
$/
' !QE(!9 "F&)&5
- ' QE(!9("$8!.5
-
#!N+!
#
#
Antes que voc possa iniciar o desenvolvimento de seus Servlets, imprescindvel que
voc tenha disponvel a biblioteca de Servlets Java (normalmente, um arquivo
; se voc estiver utilizando o Apache Tomcat, voc pode encontrar
chamado
esse arquivo abaixo do diretrio de instalao do Tomcat, no subdiretrio
). Essa
biblioteca contm todas as classes e interfaces necessrias para o desenvolvimento de
Servlets, e deve estar contida em seu classpath.
# /- /. ! &-
'(&* * (%
#
&
# / /.# #
de comunicao cliente-servidor: o cliente envia uma
O HTTP um protocolo
requisio para o servidor, este processa a requisio e devolve uma resposta para o
cliente, sendo que, a princpio, nenhuma informao mantida no servidor em relao
s requisies previamente recebidas.
I -
Existem diversos mtodos HTTP que podem ser especificados em requisies, sendo os
mais comuns o mtodo , normalmente utilizado para obter o contedo de um
arquivo no servidor, e o mtodo
, utilizado para enviar dados de formulrios HTML ao
servidor. Alm desses mtodos, o protocolo HTTP 1.0 admite tambm o mtodo
,
que permite que o cliente obtenha somente os headers da resposta; j o protocolo
HTTP verso 1.1 admite os seguintes mtodos:
PUT: transfere um arquivo do cliente para o servidor
3
3
Alm do mtodo, path e verso, uma requisio pode conter parmetros adicionais,
chamados headers. Dois headers comuns so, por exemplo, o header
, que
contm informaes sobre o cliente que est gerando a requisio (tipo, verso do
browser etc.) e o header
, que serve para especificar os tipos de recursos aceitos
pelo cliente para a requisio enviada.
# /- 0 /%&
'.',/&
I -
+DQ
/ H
=
9E
"
@ <.Q
Uma vez processada a requisio, o servidor, por sua vez, manda uma resposta para o
cliente, sendo que essa resposta tambm tem um formato predeterminado: a primeira
linha contm informaes sobre a verso do protocolo, um cdigo de status da
resposta e uma mensagem associada a esse status; em seguida so enviados tambm
headers (com informaes do servidor que gerou a resposta, por exemplo); e
finalmente, enviado o contedo, propriamente dito, da resposta.
I -
/ #F#
-
%
*
QD*#
!9%8#!9%,8C6#!9!<&*) %
"
9
#!D
'
>?BAC
-
- >(?
A0C
! ) $ ,!$ )
1 !1
) )
Conforme descrito anteriormente, um Servlet nada mais que uma classe Java que
obedece a uma estrutura bem definida. Em especial, essa classe deve implementar a
.
interface
/- /.
Figura 3.1
QEQ".&$J# 	E"
!"# ) , ! $ , )
1
) )
)
Todo Servlet segue, por outro lado, um ciclo de vida composto de 3 fases: inicializao,
atendimento de requisies e finalizao.
(
Figura 3.2
Cada uma das fases se traduz, na verdade, em mtodos do Servlet que so chamados
pelo Servlet Container nos diversos instantes do ciclo.
" -
!"# ! $, ! ,$,&
#9( :#!
"EE"
N%#!
",5%D#EO E
EJDQE6Q".&$
>(8&
/ #!)6' #R
QEQ".&$J# 	E"
5N' DO! E
9 5 R
0
As assinaturas do mtodo
%
!
so:
9
!5ON' D! E
=D%9!K <
%9!K <
8
%
Conforme pode ser visto, o mtodo admite duas assinaturas, sendo que em uma
delas, recebido como parmetro um objeto da classe
# : atravs
desse objeto, o Servlet pode obter os parmetros de inicializao do Servlet, contidos
no Deployment Descriptor (veja seo 2.2). Por outro lado, caso voc opte por
implementar o mtodo ! sem nenhum parmetro, possvel tambm obter uma
referncia para o objeto # por meio da chamada , da prpria classe
*
.
%
/"- /& (% 0
! # /- /.! /%&/- ' /- / $& %(.#)#)2' # # /2/&# /"% /
!9%K8 <
/"- /.
(% 0
$J#QF#!
&
J#
/ & 9<
9K8 <
".#)6' #
"
/ #!)' #Q !
,D#%
& !9R
!9%K8 <
#%&6 E! / A
?BI!+
0
0
&
J#"@+
!5ON' D! E
* ' # +'
/ #!)' #Q !
,D#%
& !9R
"
!9%K8 <
%.J#&#! =
& J#"3J
".#(' #
".#)6' #
9K8 <
&
J#"
8
9 :956' '
&
$J#Q8#
,
R
/ & 9<0'
!)J#8#
&
&
J#
/ ). 9<
'
$J#Q&#
!' 5%#
"8# !' #F
&
29$K <! <#) H 9Q I.. .4#F #2 '
$) &# #
& .4#
0
0
0
JDE!97DE"$&F
-.-
? I:J" #%45"$E
5N' DO! E
/ )$ 9<
?BI&J95' '
P#J#8#!9F#
P#D5 #F9E7"
J#Q.F"
* "
"259F
F.
'J" #%
#9( QE6:7DEJDQEQ"$&.
"
59&&795O' '
/ #)6' #
QD#
& !9R
!9%K <+
-O#"F. 9
B".#F' #
!9%K8 <
EDQE6"F.F
8#"FFQ& D
'D!"EQE"
QEQ".&$J# 	E"
/ A
8#"FFQ& D
N#
".#(' #Q
".#(' #Q
96 D ' MGE
/ #(' #
E#
#!) E / A
"$"2598!+
I ,+
0
0
-.-
#! K& D4D9# 7D%N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%# #. E DQ#9F#
.
#. K& D 9 .L#QQF#!9E" >(+) / #!)' # ' #!L#!9!&" P5969N' #7R
P#K8#!
*F#E$ ?
?
-.-
*F#E
/ #(' #Q
9
/ %
# &6' #
5N' DO! E
!9%K8 <
-.-
C9G9E
K8M#
B".#F' #
"
/ #)6' #
QD#
& !9R
!9%K <+
*$#QE
?
*.#QE
#2 K579%#
?
*.#QE
?B*OF#E &* " +
0
-.-
#D!5GJEJ&*F#QE
59BR
5N' DO! E
* ' #
?B*)#QE
0
0
0
!5ON' D
&*)
9K8 <
!9%K8 <
/ #F' #Q
DQ#
& 9(" 9Q ' N' #QD#
& 9
"
!9%K8 <
P#D!5
#F9EJ#J' E9EJ
J#)F"
-.-
/ #( E! / A
P6#!J#&#!9!8#
J ="
#!(' #
J
"$#%&6' #
.*
K!
" "259!&
J
"$#%&6' #
"=96
#9D!9.FQE"
!
/ #' #
?BI!+
9K& <@ <#&H 96 &I.J#8#!@!J ' O#"$& 9 F. !+
9%#
P6#!J#8#!9%8#
J95' ' *
"."2569&
E#
96 D! ' MG
9
9 +
%
#
"$,++ ) , ) ) - )
#)$/"-! %
/ - /
(% 0
0/ /- / ("% / " /- " ( 2 ' # #)/ /%./"- ' /- /
.
9
98# 8
/"- /
(% /
/- /. (% 0
&
J#"@+
!5ON' D7 5& ' 95J#F & !9L<#&H 9 &I$J#Q8# + Q ' 9<( / .. 9<
F#8#
&
J# +
Por outro lado, importante fazer a distino entre os parmetros iniciais do Servlet e os
parmetros iniciais do contexto, lembrando sempre que esses parmetros so definidos
em sees distintas do DeploymentDescriptor.
!5ON' D! E
-.-
".#)6' #
9K8 <
/ & 9<
E6#7##D5G 7E6
/ #!)' #Q !
,D#%
& !9R
"
/ #' #
-.-/ #
!9%K8 <
9
9F#Q
98# 58
0
Alm dos parmetros de inicializao do contexto do Servlet, podemos usar esse objeto
para atribuir e recuperar atributos que sero compartilhados por todos os Servlets do
contexto. Assim, temos os mtodos:
' 9<( N! #D <(#!*B8& N58#+ ' !9< / & 9<
!5ON' D
!5ON' D
! E.##*B8& N5F# + ' !9<( / &. 9<
!5ON' D
! EJ"2#* +.. N58# + ' !9<( / &2 9<
' 9<( N! #D
=Q+.. N5%8#
&
J#"
:#+
+
8& N5F#&BJ#
' 5#+
No exemplo a seguir, temos dois Servlets que fazem parte de uma mesma Aplicao
Web e que utilizam os atributos do contexto para indicar falhas em suas respectivas
inicializaes.
-.-
/ #@' #
EJ#Q# '
5N' DO! E
# &#!9%E"
-.-
H 9 D '
"
/ #)6' #
QD#
& !9R
#Q&$
9 D '
).56#!
K"+' F
!9%K <+
!
! F#<9EJ
/ &2 9<
B".#F' #
!9%K8 <
9K8 <= <#)H 9 &IFJ#8#!@8IFI. J#! F / #!)' #!+
K8!' "2#
"@".9E7
-.-
/ #!)6' #
-.-
9
"$8Q&56"
E
98# 58
9F#Q
/ #@' #
,+
+
-.-
6"2 #.
".#<(5O9E"
,+
0
-.-:/ #
*6!5#LK&.QD"."
/ #(' #
5E"$#<@59E
-.-
9#
D!.$#Q<@QE"
K+!' ".#
@+' =
"$8Q&5%" / #Q<(59%E! / #!(' #& N!' #9 !' 5%# K8' "2#
"=9% ' N!' # %,D#!
) !9,$F!6":E " / #)6' #&"09
!5%E#!$,
D"256D#"2".9 !+
" #
0
-.-0/ #<(59E
/ #(' #
E#Q#! 6'
5N' DO! E
#2F#!9E6"
-.-
K"+' F
H 9 D '
/ #)6' #
QD#
& !9R
"
#Q&$
9 D '
).56#!
!9%K <+
!
! F#<9EJ
B".#F' #
!9%K8 <
K8!' "2#
-.-
"@".9E7
/ #!)6' #
-.-
9
9F#Q
"$8Q&56"
E
98# 58
/ #@' #
+
-.-
6"2 #.
".#<(5O9E"
98# & <@#Q,* +.. N58# I! J#! . / #' #Q+
0
-.-:/ #
-.-
*6!5#LK&.QD"."
/ #(' #
5E
# F
@+' =
"$8Q&5%"2I. J# ) / #!@' #Q. N!' #!9 ' 56# K8' ".#
"=9% ' N!' # %,D#!
) !9,$F!6":E " / #)6' #&"09
!5%E#!$,
#!4D!.$#Q<@QE!"@9 ,+
&*OF
"
K+!' ".#
9#
/- /
(%& /
("0
J"F<+
(&0
/ &
.
-.-
#"$8#!C6Q<
5N' DO! E
-.-
P#D5 #F9E7"
/ &2 9<
' !
H 9 D '
/ #F' #Q
/ #)6' #
B".#F' #
!9%K8 <
"
/ #)6' #
QD#
& !9R
!9%K <+
J#Q.F"
K"+' F
E#' Q<
96 D ' MGE
E#
/ #(' #
J
".#@' #Q
0
!9!&#Q 5,+
%! - $ !
$'&
/# - (
/# - (
./# - (
A assinatura do mtodo
a seguinte:
+
% &/# - (
-.-
#! K& D4D9# 7D%N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%# #. E DQ#9F#
.
#. K& D 9 .L#QQF#!9E" >(+) / #!)' # ' #!L#!9!&" P5969N' #7R
P#K8#!
*F#E$ ?
?
-.-
/ #(' #Q
5N' DO! E
!9%K8 <
-.-
C9G9E
*.#QE
?
B".#F' #
!9%K <+
*$#QE
#2 K579%#
?B*OF#E &* " +
? *.#QE
# 2 K& "FFF5
0
-.-
#D!5GJEJ&*F#QE
59BR
5N' DO! E
* ' #
K!9
?B*)#QE
0
0
0
-.-
/ #(' #Q
?
*.#QE
K8M#
*F#E
R
"
/ #)6' #
QD#
& !9R
./# - (
No exemplo, o mtodo
serve para indicar que o thread deve ser finalizado: a
faz com que o looping principal do mtodo
atribuio do valor varivel
seja finalizado.
%"$
-$ %
-/ /"-
) -
! )*-
) ) ,! + ! &
(*),+
, que a classe utilizada para Servlets genricos (classe-pai
No caso da classe
para a classe
, que atende requisies HTTP), o mtodo relacionado a essa fase
o mtodo
.
F#35#"$
.#", !96".#+
# /"- '/ ! !
Por outro lado, como voc normalmente estar desenvolvendo Servlets HTTP,
dificilmente voc ter que implementar esse mtodo; em vez disso, para classes que
extendam a classe
, voc dever implementar um ou mais dos seguintes
mtodos: ! , , , , ou
.
( - ',/
! EJEB# + Q ".#(' #Q. *+&
>6+&
/ #' #Q&P6#35#"F
$#35#"F
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
!5ON' D
!5ON' D
! EJE #!' #Q8# QQ " #!)' #& *%+& >(+& / #(' #&P#35#"$
! EJE!I5%+ ".#!)' #Q& *+&
>(+&
/ #F' #)P#35#"$
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#35#".
!5ON' D
! EJE1 Q. 9" + Q " #!(' #Q. *+& >6+) / #F' #Q&P%#!35#"F $#356#"F
!5ON' D
! EJE?
)#!35#".
Quando uma requisio HTTP recebida por uma classe que estende HttpServlet, seu
chamado, sendo que a implementao default desse mtodo ir
mtodo
chamar a funo
correspondente ao mtodo da requisio recebida. Ou seja,
caso uma requisio com mtodo
, por exemplo, seja recebida (vide seo 3.2,
sobre o protocolo HTTP), o mtodo implementado por voc ser chamado.
# /- ',/
(
&( /.
&( /.
( (&#
&(
/
&( (.#
Um exemplo simples de implementao do mtodo .( /. pode ser observado a seguir:
Servlet HelloWorld
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
* 	E J#987E#
5N' D
!$' E
>O+.
/ #F' #R
I:D!
#Q8E
%?
. F#!
'
J
.#",
9"2# <@#Q
'
'
'
'
K8' 56"2*/+
.' E
-.
"
. 8#!8
9 ,+
- >?BAC,
0
0
1
4
./# - (
%
# /- ')/
(
# /- '/
Figura 3.3
Por isso muito importante que voc se preocupe com acesso a variveis de instncia
ou classe e concorrncia no seu desenvolvimento (maiores detalhes sobre esses tpicos
podem ser obtidos, por exemplo, no livro Aprendendo Java 2, da Editora Novatec).
Nesse sentido, uma opo para garantir a execuo livre de problemas de
em seu Servlet.
concorrncia a implementao da interface
Essa interface no define, na verdade, novos mtodos ou variveis de classe, ela serve
somente para indicar ao ServletContainer que o atendimento de requisies do Servlet
em questo deve ser feito de forma a serializar as chamadas ao mtodo
. Ou
seja, somente uma requisio ser atendida por vez pelo seu Servlet.
# /- '/
-.-
/ #!)' #
98E!
Q!#
98E!
9J#FJE#
JJ#!9F
#Q8#9E"0>6)
/ #(' #Q
' #J#!9!&"
/ 9<@' #?
*)#QEA4!E#'R
!9%8QE!
B
8#
9
5N' D
I2 9
. F#!
'
J
.#",
9"2# <@#Q
'
'
'
'
K8' 56"2*/+
-.
. 8#!8
(
(($
98E!
+
- >?BAC,
0
0
(%. .("-
, e
Imagine, por exemplo, que esse Servlet no implemente a interface
receba duas requisies simultaneamente: o primeiro
poderia incrementar o
contador, seguido do segundo
incrementando o contador, seguido dos dois
threads, cada um por sua vez, imprimindo o valor do contador. Nessa situao, o
mesmo valor de contador seria impresso nas duas pginas HTML resultantes.
&(
/
-
- >?
.#D#N EQ"
A0C
(
/
>?BAC
.#D#N EQ"
-
A0C
- >?
(%. &(-
&( /.
Por isso, em vez de implementar esta interface, na maioria das vezes mais
conveniente implementar diretamente um cdigo de sincronizao nos trechos que
precisam ser serializados. O Servlet
, por exemplo, poderia ser implementado
da seguinte forma (com exatamente o mesmo resultado):
/- /
(%& (-
Q!#
-.-
/ #!)' #
98E!
98E!
9J#FJE#
JJ#!9F
#Q8#9E"0>6)
/ #(' #QR
!9%8QE!
B
8#
9
5N' D
-.-
I2 9
'
-.-
. F#!
'
J
.#",
9"2# <@#Q
. 8#!8
2J,M!#!99EL!'
E7D!9%8E!
#
9%' BDQ98E!
"
$ 96D*$!9 M#!E &* " B
R
' =D!9FQE!
(($
98E!2
0
-.-
H
. 9E:9 6
J#!FJE#
'
'
'
K8' 56"2*/+
-.
(
- >?BAC,
0
0
) -
$*- ! - 1 .$'&
(*),+ + *2 ) ,) )
FE #
H 9!&#Q<O#%$ & / .
. 9< + ' =D!98QE6!
&( %
,
Alm dos mtodos
de um Servlet.
0/ /- / % (
/&# - (
!
/ ( ("-
!
, temos:
-.-
!$' E
* 	E J#987E#
I:D!
#Q8E
%?
5N' D
.#", !9%"2#@.*$
I2 9
. F#!
'
J
.#",
9"2# <@#Q
'
'
'
'
K8' 56"2*/+
.' E
-.
. 8#!8
9 ,+
- >?BAC,
0
-.-
5N' D
/ #!)' #Q
.#)5$9>
5%8!**
5F!$#"E
' F
#%$" %!
+
0
0
Caso voc no implemente esse mtodo, um texto vazio ser retornado pela
implementao default desse mtodo.
0+ ! . "),+
5
(
&! # /- /! "! " /- / / .$ /&#
Figura 4.1
0/& - /"-
Para gerar uma sada simples, por exemplo, voc deve utilizar o mtodo
desse
objeto. A chamada desse mtodo ir retornar uma referncia a um objeto da classe
, que encapsula um stream de sada para um contedo do tipo texto. Esse
stream deve ser utilizado para enviar a resposta de seu Servlet para o cliente que
enviou a requisio.
! ("! - %. - /-
. 8#1<@#Q
. &#
.*.
Embora a anlise dos mtodos dessa classe fuja um pouco ao escopo deste livro (tratase de uma classe do prprio core Java), interessante apresentar alguns de seus
mtodos aqui.
"- %
&- %& %
$#)
-.-
!$' E
>O+.
/ #F' #R
* 	E J#987E#
#Q8E
I:D!
%?
5N' D
&*OF
I2 9
. F#!
'
. 9!
!Q>@?BAC+
'
. 9!
'
'
K8' 56"2*/+
. 8#!8
! -
- >?BAC
8
0
0
Assim, nesse exemplo, utilizamos o objeto da classe
para adicionar um
contedo texto (no caso uma pgina HTML) ao stream de sada do Servlet. A resposta
recebida pelo cliente ser justamente essa pgina HTML.
Se voc observou o exemplo anterior com cuidado (e, na verdade, todos os exemplos
anteriores que incluiam algum mtodo
), voc percebeu que o mtodo
foi
: essa
declarado de maneira a possibilitar o lanamento de uma exceo
exceo pode ser lanada pelo mtodo caso haja algum problema gerao
de sada do Servlet.
&(
0 /. - /"-
/ #%&(' #
E#
&(
/
"! (! "'/ (%
/ ( ("-
!
seria, portanto:
-.-
* 	E J#987E#
I:D!
#Q8E
%?
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
R
I 9
'
. &#
!$' E
'
7
$#"Q
!9" #! <(#
. F#!
'
'
'
K ' 5"2*/+
D&D*
H %,D#!
) !9
/ #F' #Q
B#
AC!
- >?
1R
98# 58
)#K8#
8#
,+
0
0
0
Mais detalhes sobre essas excees lanadas durante o processo de gerao da sada
do Servlet, incluindo suas possveis causas, so apresentadas ao longo das prximas
sees desse captulo.
') $ ,) + $ ,) + + $
&
55
>8
Conforme apresentado na seo 3.2 deste livro, a resposta a uma requisio HTTP
composta de diversos elementos, sendo que alguns desses elementos so headers
(cabealhos) HTTP.
I -
/ #F#
-
%
*
QD*#
/ 59
!9%8#!9%,8C6#!9!<&*)
"
9
#!D
'
.' E
9 -
- >?BAC
Embora alguns headers sejam adicionados por default pelo ServletContainer, como
no caso da resposta do Servlet HelloWorld acima, podem haver situaes em que
voc queira definir ou modificar seus prprios headers HTTP, e para fazer isso, voc deve
utilizar o mtodo setHeader ().
*#QE#! =
&
*#QE#!
+
' 5#
Para indicar, por exemplo, que a resposta de um Servlet no deve ficar armazenada
em nenhum cache (armazenamento temporrio) do browser do usurio, nem em
nenhum proxy, podemos definir alguns headers adicionais especiais por meio do
seguinte trecho de cdigo:
8IF
D*#
!% F#"!&A49
FCQ"$,FA4E K
;5O'
+
#E, /
$ "F&# D5.F#9 ?
8
,+
I -
/ #F#
-
%
*
QD*#
D*6#!
"
9
! )#"A!9
;(5'
+
!9%8#!9%,8C6#!9!<&*)
#!D
'
.' E
9 -
- >?BAC
/ ( (-
!
-.?
#FD# $7
-.-
I:D!
%$' E
* 	E J#987E#
#Q8E
%?
$#35%#"F >O&
/
# (' #&P#",
9"2#J
.
#"2
9".# R
-$-
IQ" ".
@#K& 9 9E
*%#E#F"
!
!+IF
D*#
;56'
-$-
I 9
IQ" ".
. &#
8CQ"$,8A
'
7
$#"Q
!9" #! <(#
'
'
'
K ' 5"2*/+
,+
. F#!
D5 F#9?
'
/ #F' #Q
AC!
- >?
98#Q58
' =D!9F#QQ& ' <!O.F .9 K82
"2" #'!N8# F#K8#!
96D
I. 9
J%N #QF
. 8#
!+
0
0
0
Se voc observou atentamente o cdigo para a modificao dos headers, voc deve
ter reparado no uso de um mtodo : esse mtodo , na verdade, uma
variante do mtodo que simplifica a definio de um header com uma data.
Assim como esse mtodo, existe um outro mtodo para a definio de
headers que contenham valores inteiros.
# / &/" ./-
*6#QE6#!
*#E#
&
&
#6' 9<
J# ' 9<
BE!8#
9+
'.$&- -/%& * / #
*#QE#
&
J# +
&
#' !9%<
*#E#% =
& J#' 9<
*#QE#!
' 5#+
EQ8#8
9!+
-.-
/ #F' #Q
>O+.
/
# F' #R
.' E
* 	E J#987E#
-.-
#Q8E
%?
R
-$-
O#K
IQ" ".
9 9E7*#QE#F"
,
-$-
IQ" ".
I 9
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
. &#
&#Q
'
'
'
K ' 5"2*/+
D&D*
H %,D#!
) !9
'
? $
#,
'
/ #F' #Q
!9%8#!9
. F#!
B#
1R
AC!
- >?
98# 58
9D
N #8
I 9
. &#
+
0
0
0
/ " ,*
Podem haver casos em que seja necessrio se alterar esse comportamento default:
nesses casos, o desenvolvedor pode utilizar os mtodos
apresentados
anteriormente, ou o mtodo
diretamente.
# / / ./-
!9%8#!9%&C#!9<6&*B 9%
) $'& ,)
&
DQ98#!9%&C#9<&*/+
+ "! + , ) + $ $,+
* &0/ /&0
Devido a sua importncia, existe uma funo especial utilizada para a definio do
valor desse header.
!9%8#!9% ?
$
# + Q ' 9<@ / .. 9!<
Embora a gerao de uma sada HTML seja a situao mais comum, podem haver
situaes em que voc deseje gerar outros tipos de sada. Nesses casos, voc deve
utilizar o mtodo
para especificar o tipo do contedo desejado.
Assim, podemos usar o seguinte trecho de cdigo para retornar uma imagem JPEG
contida em um arquivo:
Servlet ImageServlet
! "$#%&(' #)
! "$#%&(' #) *!+)
,
;6I
.
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
J956' '
-$-
-$-
-$-
;6I
<@#!
96#
6 ' #!H 9
5 /
7
!+ <#&H 9 &I!FJ#&#! ;6
#<
C%#!9EJD!9%8# 6
E7E#5
-$-
)#8.969E:#"$8#D!9%8# 6
E7DQJ.#",
"FF
9K8 <
!$35 JDQ9	E
56J
<#
5!& !5! / &$#' ="3J $#"Q 9" #! <O#! 5& 5 / &$#
N
$ F#
9
-$-
/ #F' #Q
F&
/ #(' #
' N5K+K+#
' N$&#"3
*O ' # +' N !
$ F#"
' ="2
J9#
N$F#
8
+
B
7' J <@# 6 ' # $#QE + ' N5K+K # 9
. 8# +' N5K K8#!@) ' N
$ &#"'+
-$-
,+
$
R
DQFD*
/ #F' #Q
0
' =D!9F#QQ& ' <!O.F(9 %:K8@ " " #!'O' #
98# 58
J <#
E#7F35
,+
0 /. - /"-
Assim, quando voc desejar que seu Servlet retorne um contedo binrio (no-texto),
como uma imagem JPEG no cdigo anterior, voc dever utilizar esse mtodo
, e obter uma referncia a um objeto da classe
.
e,
. 8#+N
$ 8#
N$F#*.$*$ 8
. 8#BN$8#
. 8#B 9!
N
$ 8#/8
1
N
$ 8#*
F*$O 9%
K+K8".# 9
' #9<&*/+
) $ - # -
)
1
Dentre os diversos tipos de contedos que podem ser gerados como resposta de um
Servlet, apresentamos aqui, como mais um exemplo, a gerao de documentos XML.
Documentos XML so normalmente usados para estruturar um conjunto de dados de
maneira simples, bem-definida e eficiente. Um exemplo de documento XML j foi
apresentado no Captulo
2 Instala o e Configura o: o Deployment Descriptor
um arquivo XML que descreve a maneira como o ServletContainer deve carregar e
gerenciar uma Aplicao Web.
Um outro tipo de documento XML bastante utilizado atualmente o WML (definido
dentro do padro WAP, ou Wireless Application Protocol): atravs desse formato, um
servidor pode formatar um contedo que ser visualizado na tela de telefones celulares.
Embora a explicao detalhada do formato de um documento WML fuja ao escopo
deste livro (mais detalhes podem ser obtidos no site do WapForum,
),
apresentamos abaixo o cdigo de um Servlet que gera uma pgina WML apenas para
exemplificar a gerao de um documento XML.
Servlet HelloWorldWML
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
.' E
/ #F' #Q
AC:# &#!9%E"
K8. 8$
AC
-.-
* 	E J#987E#
$
R
@#K& 9 9E
-$-
IQ" ".
-$-
-$-
-$-
56
E6D!5
-$-
IQ" ".
I 9
'
%?
*%#E#F"
98#9+? (
$
#
AC:#"$8#
96!.
*#QE#!
'
!
' !+
. &#
"%
#Q8E
#!98
'
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
&*!+& ( -.-
. F#!
%'
% ,+
K+! 5J < - @? -
'
' % ,+
'
!$ 9,!
'
'
!$ 9,!
'
K ' 5"2*/+
- DQFE
-F- (& %
!+
.' E
- ,+
' ,8
B#! <(#&A
#"2"$ <(#
98# 58
,+
0
0
0
interessante observar no exemplo anterior a utilizao do mtodo
para
indicar o tipo do contedo na resposta; embora para documentos XML esse tipo seja
geralmente o , no caso especfico do WML ele deve ser definido como
.
$ ,+
/ & *
55
>8
Como explicamos na seo 3.2 deste livro, alm dos headers e do contedo
propriamente dito, a resposta a uma requisio HTTP deve conter tambm a
informao do status da resposta, sendo que essa informao composta por um
cdigo numrico mais um string com uma mensagem.
Esse status utilizado no s para indicar se o processamento da requisio recebida
foi bem-sucedida ou no, mas tambm para indicar algumas outras situaes possveis,
como por exemplo que o documento solicitado encontra-se disponvel em uma outra
URL.
sendo que, conforme explicado anteriormente, para preservar a ordem dos elementos
da resposta HTTP, a chamada a esse mtodo deve ser feita antes de qualquer
definio de headers ou incio da gerao do contedo da resposta.
=".F &5"
E#+
/ ( (-
I -
/ #F#
-
%
*
QD*#
/ 59
"
!9%8#!9%,8C6#!9!<&*)
9
#!D
'
.' E
9 -
- >?BAC
Temos, a seguir, uma tabela com alguns dos cdigos de status HTTP existentes e seus
respectivos significados:
Cdigo de Status
Mensagem
Significado
200
OK
302
Moved Temporarily
404
500
processamen to
obteno
do
documen to
requisitado.
503
.
;6I
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
J956' '
R
-$-
/ & 9<
<#
9K8 <
# "F&#
K",9 ' =K8 ' #! # "$8"3, ' K ' #!9J#/7965' '
0
K!+' =K8 ' #!9J#&:9O5' ' BR
-.-
J7F35
'&
?
"& .+
0
O#K8 9O 9E:J.
E7D9&# E
-$-
-$-
-$-
796#
;6I
<@#!
C%#!9EJD!9%8# 6
E7E#5
-$-
)#8.969E:#"$8#D!9%8# 6
E7DQJ.#",
"FF
!$35 JDQ9	E
56J
<#
5!& !5! / &$#' ="3J $#"Q 9" #! <O#! 5& 5 / &$#
N
$ F#
9
-$-
/ #F' #Q
F&
/ #(' #
'
' N$&#"3
J9#
N5K+K+#
N$F#
8
+
B
7' J <@# 6 ' # $#QE + ' N5K+K # 9
. 8# +' N5K K8#!@) ' N
$ &#"'+
*O ' # +' N !
$ F#"
' ="2
-$-
,+
D&D*
H %,D#!
) !9
.
B#
1R
/ #F' #Q
DQFD*
0
R
' =D!9F#QQ& ' <!O.F(9 %:K8@ " " #!'O' #
98# 58
J <#
E#7F35
,+
0
0
0
Podemos ver, nessa implementao, que o cdigo de status definido pela constante
numrica da classe
.
'&
?
Para cada cdigo de status HTTP existente, a classe HttpServletResponse define uma
constante correspondente, sendo que voc deve dar preferncia ao uso dessas
constantes (em vez do nmero em si) para aumentar a legibilidade de seu cdigo.
Cdigo de Status
200
Mensagem
OK
Constante
SC_OK
302
Moved Temporarily
404
SC_NOT_FOUND
SC_MOVED_TEMPORARILY
500
SC_INTERNAL_SERVER_ERROR
503
Service Unavailable
SC_SERVICE_UNAVAILABLE
Vale observar tambm que, para alguns cdigos de status, existem headers auxiliares
que contm indicaes sobre o que o cliente deve fazer ao receber aquele cdigo de
status.
Assim, no caso do cdigo (
), voc pode definir o valor do header
para indicar o tempo estimado em segundos at que o servio volte a ficar
ativo.
/&- /-
("', (%
Servlet CheckIPAccess
! "$#%&(' #)
! "$#%&(' #) *!+)
,
.
" #
-.-
.#K8 QJE
-.-
-.-
E#D#" ".
# 	E"
@
F#E!#' D!'
)
%;Q<( 9
9#<QE
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
R
-$-
#%$ K8 DQ!9EJ
/ & 9<
+'
"F8!&&"
.*
.*
' '
,8CD
& !9,
A
$#Q)56.9
0
-$-
I 9
. &#
<( 9E#J"256DQ#"2".
'
7
$#"Q
!9" #! <(#
'
'
'
'
K ' 5"2*/+
. F#!
- >?
B#! <(#&A
#"2"$ <(#
? 6
A0I P*
98# 58
,+
PH C+
0
0
# /% / - /&'
CDQQ& !9!
A
?
!AI P*
PH C
F#&5O.9
0
Pelo cdigo:
K!+'
/J956' ' BR
-
F#&5O.9
0
# /"% / -/&',
$#D#!N EQ"
/ #!)' #
-.-
#J
98E!
98E!
9
L#F:E#.#35 "2 G #"
!9%8QE!
B
8#
9
5N' D
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
-.-
2J,M!#!99EL!'
9%' BDQ98E!
E7D!9%8E!
=
"
$ 96D*$!9 M#!E &* " B
R
' =D!9FQE!
(($
98E!2
#
0
-.-:/ ##"FF#:K84
' #" J:D#" ".O.#E F#D !9%7 $75J: ; <= 9:#", #D '
K"+' DQ98QE6!
=R
$#Q.5.9
0
D".D!9%&.;
-.-
I2 9
. J#:9
J#!):E#
'
J
.#",
9"2# <@#Q
. F#!
'
'
'
K8' 56"2*/+
(
. 8#!8
0
0
! ,) $ '+ ) )
4
# /& $ #
# /% / - /"')
e
que permitem a manipulao do status da
Alm dos mtodos
para indicar erros no
resposta do Servlet, possvel tambm utilizar o mtodo
processamento da requisio recebida.
#)/"% -- (-
=".F &5"
E#+
=".F &5"
Esse mtodo deve ser utilizado para a definio de cdigos de status nas faixas dos
e , como por exemplo, os cdigos e
, sendo
que, se o segundo parmetro for utilizado, este deve conter a mensagem descritiva
que acompanha o cdigo de status.
Vale lembrar que de acordo com a configurao das pginas de erro da Aplicao
Web (descrita no Deployment Descriptor, vide seo 2.2), a definio de um cdigo
de status de erro pode levar apresentao de uma pgina alternativa de erro.
:
1 1 ) ! -
4
$ ,) + + $
"
! +8#!E+
.#".#,+
" M#/+
- /
"- % %
Dessa forma, embora tenhamos dito anteriormente que h uma ordem de definio
dos elementos HTTP de resposta de um Servlet a ser obedecida, utilizando essas funes
de manipulao do buffer de resposta, possvel contornar essa regra.
No exemplo a seguir, utilizamos essa funcionalidade para, dependendo do
processamento realizado, redefinir os elementos da resposta do Servlet.
N5%K K8#4E!#
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
-.-
$#"Q "F&
H . 9EJ&
9
9*:EN5K K8#
&
9*:E#K85'
E
N5K+K #4E#
-.-
O#K
9 9E79:F9*LE#
N5%K K8#
+
-.-
>? A0C
I2 9
'
-.-
. F#!
'
J
.#",
9"2# <@#Q
E#
F#"2 ".8&#&%
)(
!+
$#"Q "F&:E#
. 8#!8
#D5&9%E!5
-.-:/ #D2$#!5
-.-
5
#! F
"$8Q&56"
E
)#!" "$8
-$-
#"2
-$-
N
-$-
E#J8#.J"
J# :E
D!9%8# 6
E
;
N65K+K #
#"$#% F#
%!F:D' #!9%8#
! 8#E/!
! +&#E/!BR
D98#EJE!
N5K+K8#4 )F
# "E
-.-
C J"
-.-
-.-
5
#2F
*
C
/
P
96 !$D#"
H& ? P(& *
C
/ 6
P
$#Q)56.9
0
0
-.-
0
0
'
'
K8' 56"2*/+
/ 5%DQ#" ".
9%
A0C
- >?
AC+
Alm de gerar uma resposta para cada requisio recebida, outro trabalho importante
que deve ser realizado por um Servlet o de capturar e tratar os parmetros da
requisio (gerados, por exemplo, a partir de um formulrio HTML). Conforme o
resultado desse tratamento, um Servlet pode gerar respostas diferentes.
Esse captulo explora exatamente esse processo de captura dos parmetros da
requisio recebida.
- 1 .$'&
(*) + + 2 ) + ) ,!
No Captulo 3 Servlets caracter sticas b sicas desse livro (sees 3.5 e 3.6),
apresentamos algumas das funes para a obteno de parmetros e atributos do
Servlet e de seu contexto.
Alm dos mtodos apresentados anteriormente, possvel obter algumas informaes
adicionais relevantes, como o nome do Servlet corrente, e os dados referentes a verso
da API de Servlets suportada pelo ServletContainer (disponvel somente para
ServletContainers que implementem a especificao de Servlets 2.1 ou superior).
/ .2 9<
/ #%&(' #
!+
!5ON' D7 9%
/ #@' #
#!F"Q 9/!+
!5ON' D7 9%
/ #@' #
#!F"Q 9/!+
Existem tambm mtodos para a obteno de informaes sobre o servidor em si, tais
como: nome do servidor, que pode ser o prprio nome da mquina na rede
(dependendo de como o servidor foi instalado); a porta onde o servidor recebe as
requisies; e um texto de identificao do servidor, que normalmente contm o nome
e verso do software que implementa o ServletContainer.
!5ON' D
/ .2 9<
/ #%&(' #
!5ON' D
/ .2 9<
!5ON' D7 9%
>O8&
/ !
# )' #&P#3%56#")& <@#Q / #!)#%$I
&
J#
8
!+
0/& /- ./-
* /
/- /. / $/#
e
devem ser chamados a partir do
Em particular, os mtodos
objeto da classe : como cada servidor pode definir diversos servidores
virtuais, atravs de uma tcnica chamada de virtual hosts, necessrio se utilizar o
prprio objeto da requisio para distinguir qual o servidor (virtual) que gerou a
chamada ao servlet. Mais informaes sobre esse recurso de virtual hosts podem ser
encontradas, geralmente, na documentao de servidores Web.
No prximo exemplo, utilizamos os mtodos apresentados anteriormente para construir
uma pgina HTML com todas as informaes conhecidas sobre o servidor, o Servlet e
seu contexto.
-.-
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
-.-
I2 9
'
-.-
. F#!
. 8#!8
<#
'
/ #( E!*)(
/ #( E
'
(
/ #(' #,
/ #%&(' #
#F" JE=*
<@#Q
/ #!&(' #
9
'
'
K8' 56"2*/+
-.
- >?BAC,
#" #!5
98#2
&
J#
<#
!9%K <
/ #F' #Q
(>P!
D!9%8#2F
&
)(J<@# /
# F' #Q
(
QG %#"4"2NF#J
'
/ #!)6 E!*
/ #%&#! H 9K8/(+P
'
-.-
>? A0C
'
J
.#",
9"2# <@#Q
'
-.-
#( E!
/ #@' #,& J#
98! 9#!
#!)", !9>
#!$"2 %9/
(>P!+
Conforme mostramos na seo 3.2 desse livro, uma requisio HTTP recebida por um
Servlet composta de alguns elementos bsicos: mtodo, path, informaes sobre a
verso do protocolo e headers.
A API de Servlets permite que o desenvolvedor acesse todas essas informaes
associadas a cada requisio recebida. Assim, temos de incio as seguintes funes:
/ .2 9<
!5ON' D
/ .2 9<
!+
!5ON' D
/ .2 9<
!5ON' D
/ .2 9<
!5ON' D
/ .2 9<
+
!5ON' D
/ .2 9<
+
-.-
&*OF
I2 9
'
-.-
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
-.-
. F#!
. 8#!8
'
>? A0C
'
J
.#",
9"2# <@#Q
QG %#"4"2NF#J
(
EE%
(+!P!8
'
'
'
'
'
(
-.-
#F" JE
-.
$#35#"F) <#Q&I$QFD'!
- >?BAC,
(>P!+
'
)(/P!+
'
K8' 56"2*/+
0
-.-.-
&B#"
I
/ ?
EJ#" J
9#! .
.#35#"F
>(8&
/ #!@' #&P#"Q
!9" #7
$#"2
!96".#
0
0
;Q35 9
@
P
I&*JE7$#3%56 "2 G %! - ' (F".#(' #QF" -2/ #)#&H 9K+!P%#!3 - ! *&' P
#." %7E6
-
- >?
P
A0C
0 /. / $/#
!9%8# &IQ&*/
!5ON' D
/ .2 9<
!5ON' D
/ .2 9<
>O&
/
# (' #&P#35#"F& <@#Q / #!)' #&IQ&*/
!5ON' D
/ .2 9<
!5ON' D
/ .2 9<
!5ON' D:".8& D
/ ). 9<
5K K8#!4>68&
" & ' "2 <#Q&P6#35#"F,"=PC+>6+&
/ #(' #&P#35#"$
0/
(%& / & 0 /& /"- /
.#35#"F +
0 /. " % (
Os mtodos
,
e
retornam, respectivamente, o caminho
do contexto, o caminho do Servlet abaixo do contexto, e o restante do path da
requisio (se exclurmos as duas primeiras informaes).
Em particular, no ambiente apresentado no Captulo
2 Instala o e Configura o
desse livro (utilizando o Apache Tomcat), o caminho do contexto equivale ao
, ou seja, o subdiretrio da aplicao Web.
subdiretrio criado abaixo da pasta
Por outro lado, o caminho do Servlet, corresponde ao mapeamento (servletmapping) que originou a chamada ao Servlet.
/ &"#
#
/- / % (&/
-.-
&*OF
I2 9
'
-.-
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
-.-
. F#!
. 8#!8
'
>? A0C
'
J
.#",
9"2# <@#Q
QG %#"4"2NF#J
(
EE%
(+!P!8
'
'
'
'
'
#F" JE
(
F8DQ' E
(
)(/P!+
.#35#"F& <#Q&I)Q&D'
(+!P!8
'
'
9*6E7D!9%8#2F!
'
9*6E
'
/ #F' #Q,
(
F#35#".& <#
E#JD 9*()(
(+!P!8
'
'
-.-
9*64)FE%5M E
E
'
K8' 56"2*/+
-.
'
(
- >?BAC,
&B#"
-.-.-
I
#
/ ?
5N' D
&*OF
EJ#" J
9#! .
0
0
Com essas novas funes, uma possvel sada para esse Servlet passaria a ser:
@
P
;Q35 9
I&*JE7$#3%56 "2 G %! - ' (F".#(' #QF" -2/ #)#&H 9K+!P%#!3 - ! *&' P
#." %7E6
P
!P
96*:E
H 9%K .JQG #"
P
96*)$QE5%M E!
%QI!$Q<@.
' #"
-
1
% *
D*#
DQ
%
- ' F".#F' #8" -./ #' #Q.H 9K8P#3 - *&J' P
A0C
- >?
* ! +
5
2
P
4
A$!?B>
@ <@ &#L"2#5
.8I
/ 6
C
?
/ ?-
*
?BH &
& * 3
A +DQF#"
1A
? (
I F#Q
"=C!?
& *
A
9!J#
/ H
,PP
P
H IC
I?BH &
I?BH &
I?BH &
I,?
H &
? !PP
-./
C
? (
I "25N &
* A
#!9
- PA
-
- >?
A0C
Nesse formulrio, existem 3 parmetros que sero enviados junto com a requisio ao
,
e . Em particular, o parmetro
servidor quando clicamos no boto Enviar:
pode estar associado a mais de um valor, dependendo de quantas cores forem
selecionados pelo usurio que visitar essa pgina.
')(- /#
- (&# /"- /&# /"- /& -.* #/ . % (&* / * /&$ %.("* / ',("- /&# .$ '("- /&# "- /.( /%& ) %& -
*
*
Nesse caso, todo o texto que segue o caractere chamado de texto da query.
importante observar que os nomes e valores dos parmetros contidos nesse texto
devem estar codificados no formato MIME x-www-form-urlencoded.
Infelizmente, um estudo mais aprofundado da linguagem HTML e do protocolo HTTP
foge ao escopo desse livro, sendo deixado para o leitor a opo de consultar a
literatura especfica para maiores esclarescimentos.
$ $ , ) ,$ ) + $ ) ,! + !&
4
/ .2 9<
!5ON' D
/ .2 9<
/ &2 9<
' 5#"
!)#Q8#
!5ON' D7 5& ' 95J#F & !9>68&
/ #' #Q&P6#35#"$& <O#&I$J#Q8#
!5ON' D
/ .2 9<
5#
/ &2 9<
/ ). 9<
&
&
J#+
.J#8# B
& J# +
J#"
,+
8
Por outro lado, conforme vimos no formulrio de exemplo da seo anterior, podem
existir campos com diversos valores associados a um mesmo nome (vide campo
do
, que ir retornar no
exemplo). Nesses casos, devemos utilizar o mtodo
um nico valor, mas sim um array de valores.
'("- /&#
, retorna uma lista enumerada com todos os nomes
O mtodo seguinte,
de parmetros recebidos. Dessa forma, possvel iterar nessa lista e obter os respectivos
valores de parmetros.
-.-
&*OF
I2 9
'
-.-
'
J
.#",
9"2# <@#Q
. F#!
'
-$-
H . 9E
&
%!
/ & 9<
' $
' 5#
J#
=
'
'
FE!"4!"
!)
?
' 5#"
E"
(+P!+
/ & 9<
!+
$
' !)
7
&
K!1H
'
(/P!+
!J#Q.F7D..#98#
+
. 9 (
0
!$ 9&' 9!P,+
0
H
. 9E:.E!
#>?BAC
'
'
K8' 56"2*/+
-.
- >?BAC,
' F!
&=J#+
J#<(+P!+
' 5#
#%' "2#'
"!' %)#!"*
'
56#!
'
)(
' !* )(
H . 9E
K!+' F
$#35#"F& <#Q
J
'
!$ 9,
9%!#
&
J
J#"
' $
'
(
$
/ & 9<
5##$)
#"
/ & 9<
-$-
5#
#Q 8JE!
H F#!$9E796"9!
* ' # +'
-.-
. 8#!8
95J#.
>? A0C
-.-
"2P#3J#2F#!9E6"
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
-.-
E#JDE
/ #!)' #&IF
&
,J#+
-.-.-
&B#"
I
#
5N' D
&*OF
/ ?
EJ#" J
9#! .
0
0
E"4!"4' .#"
?
' 6
#!569!J#!P
#!59%!J# P
' %
M5O' P
E"4!"4' .#"
M5' #FE#P
?
?
'
E"4!"4' .#"
-
- >?
A0C
)'$ ) + $ ) ,! + ! &
0
55
>8
/ .2 9<
/ &2 9<
/ & 9<
*#QE#
J# +
&
J# +
*%#E# B
& J# +
!5ON' D7 5& ' 95J#F & !9>68&
/ #' #Q&P6#35#"$& <O#&>O#QE#F"
!5ON' D7 5& ' 95J#F & !9>68&
/ #' #Q&P6#35#"$& <O#&>O#QE#
&
*6#QE#
&
/ & 9<
J#"
*%#!QE#
&
J# +
+
0 /. / /-#
0/.
/ &/" /0/ % "/& &/"-
#)/! ! /" /-
O mtodo
, por sua vez, permite obter todos os valores associados a um
determinado header: caso voc saiba de antemo que um header ir ter diversos
valores associados, voc deve utilizar esse mtodo para garantir a recuperao de
todos esses valores.
&','/"
O header
tambm bastante importante: ele indica os tipos de contedos aceitos
a seguir verifica o contedo desse header e,
pelo cliente. O Servlet
dependendo de seu valor, retorna uma pgina de saudao em formato HTML ou
WML; dessa forma, ele pode ser usado tanto para atender requisies de browsers
normais da Internet, como tambm para atender requisies de browsers de telefones
celulares (vide seo 4.3).
/- /.
/- '.'/
Servlet ServletVerAccept
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
-.-
5&
DQD#!
*6#QE#
B#
AC
ACLE#!
#9E#!9EJE#".#5D98#
E
/ #!)' #
#,*1DDQ#
I2 9
-.-
. F#!
'
J
.#",
9"2# <@#Q
/ &2 9<
'
DQ9&#
E=
'
"%
&*!+& ( -.-
QDDQ#
,+
-$-
!
. 8#!8
*#E#!4QDD#%
J
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# &*OF
!
35#JE#K 9
' !+
AC
%'
% ,+
K+! 5J < - @? -
'
' % ,+
' DQFE
'
!$ 9,!
'
'
-
' ,=R
DQ9	 (
$
#
!+
' ,8
0
#' " #
R
-$-
'
'
'
0
'
K8' 56"2*/+
- >?
AC!
AC
-F- (& %
* $ ) $ ! +
0
Alm dos campos normais de input, seleo e botes de um formulrio HTML, existe um
tipo de campo especial que permite o upload (ou transferncia) de arquivos da
mquina do usurio para o servidor.
PA
A
+E&!
QH &BI"(?
H &
I "@?
& * 3
A +#!9!6 * (
C " ,9 @!
? (
I ",56N
? (
I K ' #&
* A
+$3!5O !PP
- PA
-
A0C
- >?
- &$ (
Nesse formulrio de exemplo, o campo do tipo # ; esse campo permite que seja
selecionado um arquivo do disco local que ser enviado junto com a requisio. Vale a
pena observar tambm que existe um atributo adicional , com contedo
! ,
, que deve ser especificado junto ao elemento .
# (&$"-',/ (-0/! %&/."- (. /&',# * $ "- - / .$ /&#
O Servlet /"- / ( - a serguir utiliza essa biblioteca para tratar arquivos carregados
Servlet ServletUploadArq
! "$#%&(' #)
! "$#%&(' #) *!+)
,
*&
! 5& ' "2 5' &
%)F#35#"F& / #!)' #Q&A5' &
F&P#35#"$&
*&
! 5& ' "2 5' &
%)F#35#"F& A5' &
F&P%#35#"$&
-.?
F3# 	E"
5N' D
&*OF
I2 9
. F#!
'
J
.#",
9"2# <@#Q
NQF#!9E 9%K
-.-
. 8#!8
-.-
-.-
8#! .;$
-.-
-.-
E#K8 9O
9!J#JE#
5
E $#Q 2
!96E!#
#!9DE 9<
9%#
/ #!)' #&A:5' &
)P%#35#") +
7
%%.&#
!A:5' &
)&P#35#"F& A * P *
6? / 95' '
,
.#35#"$
/ &2 9<
-.-
? J9*6E$3%56
/ &2 9<
-.-
&
-.-
.35 F#!
-.-
D' Q"2" #
F3>JC9<( 8 / &. 9< + ' !F".#. <# ' # / M!# !F35 %,+
/ &2 9<
-.-
.3CDQ!' 7
' $3CD' <#Q,&
#
+
A0C
'
'
'
-.-
5
H . 9E:*#E#!4>(?
'
#J<=FQE!J#!
-.-
)(
F3/(>P,+
(
'
9J#*)3%C%D'
(>P
'
'
K8' 56"2*/+
-.
- >?BAC,+
0
0
! 2 + $ )
! + !&
4
/ .2 9<
+
,+
' 5%#
8
Embora estejamos falando desses mtodos pela primeira vez nesse captulo, exemplos e
uma explicao mais detalhada de seu uso sero apresentados no Cap tulo 8
Modelo MVC.
1
&
! +
2
5
Alm dos tipos de campos de formulrios HTML apresentados na seo 5.3 desse livro,
existe tambm um tipo, chamado hidden, que pode ser usado para esconder
parmetros da requisio.
Na pgina HTML seguinte, o campo
A=!?
>
98E!
.8I
E#
/ ?
*
H &
?
H &
I "@?
? (
I* EE#!9&
H &
I "@?
? (
I ",56N
-
98E%$P#3 -
,
P
+DQ98QE
& * 3
A *B)5' M
- PA
-
- >?
A0C
Se voc tentar abrir essa pgina em um browser, voc poder observar que o campo
no visvel; por outro lado, o nome e valor desse campo sero recebidos
normalmente como um parmetro de requisio pelo seu Servlet.
')(%. .(-
Servlet ServletContadorReq
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
96J#!FJE#
%9!&:
/ #!)' #
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
I2 9
. F#!
. 8#!8
-.-.-
-.-
J!'
-.-
DQ9&QE
K84
J#)F/DQ%9!8E!@#
E
9%' BDQ98E!
)
E#JDE!JD!' #98#
=
R
' =D!9FQE!7H 98#<(#.
$".#H 9!+
$#35#".& <#&I.J#8#%
((
0
D&D*
+D9&QE ,+
' BDQ!9%8E!
&
' =D!9FQE!
B
0
-.-.-
F#".#!9%89ELJ' !4E7D%9!&QE
#%$ &
'
96D.#J#!98JE
A0CJ35# F;
J#"2J
'
'
PA
!9!&QE!
!? > % I
% !
/ ?
%' *
?
H &
!9!&QE.P#3 -
'
'
E#
? =
I
%
&* EE6#!9%
? =
I
%
(H 98#<#!
(
& *
A
PA !+
'
-.
'
K8' 56"2*/+
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
/- /
(%& .(- /
Assim como acontece nesse Servlet, voc pode utilizar campos escondidos de
formulrios HTML para armazenar informaes e fazer com que sejam passadas para
seus Servlets junto com as requisies futuras recebidas.
Por outro lado, esse mtodo tem uma grande desvantagem: para utiliz-lo, voc
precisa garantir que, uma vez armazenado um valor em um campo escondido, todas
as requisies recebidas carregaro esse parmetro junto.
Isso pode gerar um grande trabalho na construo de sua aplicao, alm de no
funcionar em todos os casos: se o usurio de sua aplicao sair de sua pgina, ou at
mesmo usar os botes de navegao de seu browser (como o boto de voltar, por
exemplo), ele automaticamente ir perder os ltimos parmetros definidos.
1
Servlet ServletContadorReqMod
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
96J#!FJE#
%9!&:
/ #!)' #
98E!2P%#3A4EJ# 	E"
E#JDE!JD!' #98#
>(8&
/ #!(' #R
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
I2 9
. F#!
'
J
.#",
9"2# <@#Q
-.-
/ &2 9<
K"
+'
9K+!IQ&*/9 :
965' '
+'
. 8#!8
,+
)* -
,
-.-
-.-
)& D56' "2##"." K84
6. J# )7F#35 "Q G7$#D#!N EJO' E
! #Q&$ D!9%8QE # 965' #O9#"."2#JDQ" 9O D ' MJ" D9FQE!
DQJ!'
-.-.-
9%' BDQ98E!
)
=
R
' =D!9FQE!7H 98#<(#.
$".#H 9!+' 9%K+!I &*+
((
0
D&D*
' BDQ!9%8E!
&
' =D!9FQE!
B
-.-.-
F#".#!9%89ELJ' !4E7D%9!&QE
#%$ &
'
96D.#J#!98JE
A0CJ35# F;
J#"2J
'
'
>@P
E#
%' -
'
K8' 56"2*/+
-.
9FQE!.P%#3A4E
%!@*B&56' M - *
!+
'
(
(
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
0
0
'
! ),+
Por outro lado, vale a pena conhecer os principais atributos de um Cookie; alm de um
nome, que identifica o Cookie para um determinado servidor e path nesse servidor, e o
valor, que contm os dados em si, um Cookie possui tambm alguns atributos
adicionais:
3
3
Caminho (Path): por default, uma vez definido, um Cookie s passado junto com
as requisies para os recursos abaixo do diretrio virtual do recurso que gerou o
Cookie. Se esse caminho for definido, por outro lado, o Cookie passa a ser enviado
junto com as requisies para qualquer recurso abaixo caminho especificado;
A API de Servlets disponibiliza uma classe especial para representar um Cookie, a classe
, sendo que os mtodos dessa classe permitem definir / recuperar os
valores de seus diversos atributos.
/ .2 9<<(#,& J#
!5ON' D
/ .2 9<<(#
/ .2 9<<(#
,+
' 5#/8
=' 5#+
!J#!9!
!J#!9! / &
$ 9<
BDQ!J#9+
/ .2 9<<(#&IQ&*/
% &*8
J B
* <@# +
Para usar um Cookie, primeiro devemos cri-lo, passando como parmetros de seu
construtor o nome e valor do Cookie, e, em seguida, devemos definir seus atributos.
para que seja
Finalmente, o Cookie deve ser adicionado ao objeto
enviado para o browser do usurio.
#' =D #/796#
' =D
# ".#
J#!9
' =D
# ".#&A4
.#",
9"2# QEE
#
98QE6!
+
-
&#"F&#+
*B<# +
(%. .(-
0 /
(.(&+ /#
%$
("%. .("
#
#"
!+
K8 + 9
((
K"' DQ
#" + + <#& J#
.
R
' =D98QE
DQ
#" + + <#& J#
+'
&B5N#!
DQFD*
' =D98QE
DQ
#" + <#
' 5#/8
B
/- /
(%. .(- &/
-.-
96J#!FJE#
%9!&:
/ #!)' #
O#K
!
!+I6F
-.-
D*6#!
<(J!896!DQD*#!+
CQ".,AE K8 #E
;65'
/
$ ".8#
A0?-!+
!+
-.-
-.-
J!'
-.-
DQ9&QE
-.-
-.-
F#D#N E"
E#JDE!JD!' #98#
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
-.-
/
6FD5.J"
D
#
K84
J#)F/DQ%9!8E!@#
E
J'
K"+' DQ
#"
K8 9
EJD9FQE!
#!9%&.#J"0DQ
#"
9%' BDQ98E
#"3+
B
9 L95' '
Q
' BD
#"2 ' #!9%<&* ((
K",+' BDQ!
#" + <#& J#
98QE
+ <#& J#
)
R
' =D98E!
JH 9%8#Q<@#!
' =D98E!
((
DQQFD*
&B5JN#!
' =D98E!
' 5%#
6!$J
QDQ#
Q. 9
=# R
B
0
-.-
5FE9E:JO'
#
' =D
#
' =D
# " #Q
!J#!9!
' =D
# " #Q&A4 *B<#
$#"Q
9" #! EE
-.-
'
#
!9%8QE!
#
+
5
/ #F' #Q
!' EQE#/
-.-
#
@"
+
%9!&QE.P#3+
#Q<(59%E!"
= 958"
*!)"3
E
# +' =DQ #+
F#".#!9%89ELJ' !4E7D%9!&QE
I2 9
'
D% F#98#JEDQ9&QE
J9#
. F#!
'
J
.#",
9"2# <@#Q
. 8#!8
'
'
K8' 56"2*/+
-.
E#
(
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
0
0
Nessa nova implementao do Servlet, vale a pena observar que no necessrio que
o usurio de nossa aplicao clique em nada para que o contador seja atualizado,
basta que ele recarregue a pgina. At mesmo se o usurio visitar outra pgina e
depois voltar para o endereo desse Servlet, o contador incrementado.
Infelizmente, existem situaes em que Cookies no funcionam: geralmente isso
acontece quando o browser do usurio est configurado explicitamente para no
aceitar Cookies. Com as crescentes preocupaes em torno da privacidade de quem
navega na Internet, alguns usurio passaram a bloquear o armazenamento de Cookies
em seus browsers.
requisies vindas daquele usurio carreguem esse identificador de sesso, seja atravs
da definio de Cookies, ou atravs da reescrita das URLs (com informaes adicionais
de caminho) para que incorporem essa informao. Recebido esse identificador, a API
automaticamente disponibiliza para o Servlet o objeto
criado anteriormente.
A primeira assinatura retorna sempre um objeto da sesso, sendo que esse objeto pode
ter sido criado nesse instante, ou ter sido criado em uma requisio anterior (ou seja, j
havia uma sesso criada).
-$/
A segunda assinatura, por sua vez, admite um parmetro que, se for , faz com que o
mtodo tenha o mesmo comportamento da primeira assinatura. Caso contrrio, o
mtodo pode retornar null: se ainda no houver uma sesso criada, ao invs de criar
uma nova sesso, o mtodo retorna null.
Podemos, ento, utilizar o seguinte trecho de cdigo para obter o objeto com a sesso
corrente:
0
#%' "2#
R
-.-/ #!"$" 9E79 %:K8OD!. QE#
& #
!
"=J79%:"
-.-
#"." JDQ!N5JE#J"2#
..FQ8
#"." #DQ"
0
#%' "2#
R
-.-.-
D E <@
;
..FQ8
#"." #!5%&.JD".
#/
!5ON' D7 5& ' 95J#F & !9L<#!*B&. N!5!8#!& J#"
!5ON' D
' 5#+
8
F#Q& !9?B J#
,+
("%. .("-
/- /
(%. .(- &/
98QE
!O9#
Para recuperar o valor desse atributo posteriormente, podemos utilizar esse outro trecho
de cdigo:
'=
"
9&QE
!+
0/
0/& #
' '/.# #/ * /
Servlet ServletInfoSessao
5!) ' ,
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
-.-
O#K
!
!+I6F
D*6#!
H . 9E:*#E#!4>(?
I2 9
'
<(J!896!DQD*#!+
-.-
56"25;.
CQ".,AE K8 #E
/
$ ".8#
A0?-!+
!+
A0C
'
J
.#",
9"2# <@#Q
. F#!
;65'
. 8#!8
-.-
%#"
>O+&
/
# ".", !9' "$#!"$"2Q/
K"9 ' =" #" ".! "
& #
,
R
'
'
'
F#Q& 9%?
695J#!$
EJ"2#"2" !.)(
J'
,+
' "$#<59%E" %
E#" E#7#
D*
#!
DDQ#"2".#E!?B J#
#9&"
! (>!P!+
E# # D*
J#
,
R
' 9J#* &$ N/& / & 9!<B' 9%!J#"*B). N"2 96#Q
' #!J#9
!+
/ &2 9<
N #D
* &
#' " #
'
&
N5%8!
N5%8
(+
* &
0
J' ="2#"."
'
!' !
E#
0
'
#' " #
-.-
&
QF#!>?BAC
'
'
K8' 56"2*/+
-.
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
0
0
9&#' +
9' EQ8#/8
Servlet FormLogin
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
* 6F#".#!9%87 ;
<( 9:>?
A0CJD!
O#K
-.-
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".#
!
!+I6F
H . 9E:*#E#!4>(?
I2 9
-.-
-.-
A0?-!+
!+
A0C
. 8#!8
/ #F' #Q
& #
/
$ ".8#
-.-
;65'
CQ".,AE K8 #E
'
J
.#",
9"2# <@#Q
. F#!
'
<(J!896!DQD*#!+
-.-
D*6#!
, R
" #"." ;J*Q :"2 E7D. QE:#!5%&.JF#3%5O " G !6E#QO#!J"
-$-
"$#
-$-
-$-
' J"$<
/ & 9<
K!+' J"F<
/
:" #
F35#JE#"2# 4K8M#!4
.. 9< =
' =" #"."2Q <#Q,* &2 N58# ,8A
H&
56"25;.
M!#!$4
!+
(+P
!+
0
-.-
H 9E:
*
'
'
'
'
'
PA !+
'
-.
'
K8' 56"2*/+
PA
? =
I
H &
? (
I
% ?
? =
I
%
/
A0C
" A
% 8I*
%?
//
%' & *
H?
!?
>
.@% 8I
% !+
/ ?
%' & * 3
A @% 8C
BH &
%' / (
&B>*% ,P!+
P % & *
A
'% ,(&=?BP*
P %
% P,+
* C)" %',9&$% !P!+
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
Servlet Login
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
-.-
56"25;.
8#
-$-
!D
-$-
+
N!' #9
>(8&
/ !
# (' #R
".#9*BR
K8' "2#
+ ="
#!96*
0
.#)5$9
5N' D
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
-.-
O#K
!
!+I6F
D*6#!
<(J!896!DQD*#!+
;65'
CQ".,AE K8 #E
/
$ ".8#
-.-
-.-
A0?-!+
-.-
-.-
-.-
".# N#!
9 J& %#
E#K8 9 E7DQ"2
!+
&2 N!5!&
FC
98JE#
H & BE
",56DQ#EO E!
CQ<= 9
$#Q.5.9
0
' ="2#"2".! F#J#* +&2 N58# CBH &
-.-
+
#Q&$"4D!
/ &2 9<
/ &2 9<
K"
8C
BH &
!+
, /
&
> *
+
-.-
-$-
-$-
D!9F#!9EJ
56"25;. B#
"
FC
H&
H&
,'
0
#' " #
R
;' E6" 6
D' DQ
-$-
/ #
-$-
-$-
"056J
5"25%;!. 7D%$.#9&##
#!9"$Q<#
E#LK8!' *
C BH &
/
!CQ<= 9J#
- !5
"2#9*%
9O;' E"
9 !8
.#", !9%"2# " #!9EP#E% F#D CQ<= 9 %!.J *&' !+
0
0
-.-.-
&B#"
5N' D
I
#
/ ?
EJ#" J
9#! .
0
0
Um detalhe interessante com relao ao Servlet anterior que ele no retorna nenhum
contedo HTML por si, ele simplesmente efetua um processamento e, conforme seu
resultado, redireciona a requisio para Servlets que apresentaro um contedo. Esse
modelo de funcionamento ser explorado com mais detalhes no Cap tulo 8 Modelo
MVC.
Finalmente, teremos o Servlet que apresenta o menu principal da aplicao (caso a
autenticao tenha sido bem sucedida).
Servlet MenuPrincipal
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
* 6F#".#!9%8:
-.-
O#K
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# &*OF
!
!+I6F
D*6#!
<(J!896!DQD*#!+
;65'
CQ".,AE K8 #E
/
$ ".8#
-.-
-.-
".#"." ;
A0?-!+
/ #F' #Q
"
/#
!+
-.-
".#"." !6" #
-.-
#
!$35#7
5%"25;!$ JD.$#!9F#
9 %
/ &2 9<
K"+' =" #" "./9 J95' ' ' ' < 9/
/
& 9<. ' =" #" ". <@#Q* +.. N5%8# C
H&
,+
CQ<= 9
$#Q.5.9
0
-.-
H 9E:
I2 9
'
'
J
.#",
9"2# <@#Q
. F#!
. 8#!8
'
' ;
'
K8' 56"2*/+
)(
!+
-.
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
0
0
Caso a aplicao venha a ter mais Servlets autenticados (que s podero ser
acessados aps o login do usurio), pode valer a pena criar uma hierarquia de classes
para facilitar o processo de desenvolvimento.
Servlet ServletLogado
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
!5ON' D:N"$&.QD
-.-
C<( 9JE6
-.-
3O5#
5N' D
;:#K+#&56!5J
' < 9
;:& #
/ ). 9<
$8#D F#E
" #5"25%;!.
/ #(' #&C<(QEJ#QQF#!9E"
#Q8#%9%E!#
EL!N! ,
"
F#35#".
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
O#K
-.-
!
!+I6F
D*6#!
<(J!896!DQD*#!+
CQ".,AE K8 #E
/
$ ".8#
-.-
-.-
".#"." ;
-.-
".#"." !6" #
-.-
A0?-!+
/ #F' #Q
"
/#
!+
#
!$35#7
9 %
5%"25;!$ JD.$#!9F#
K"+' =" #" "./9 J95' ' & ' <@ 9/= / & 9!<B' =" #" ".! <@#Q*
H&
,+
9#! .
CQ<= 9
$#Q.5.9
0
E!C%<6<#EB#Q+
)#!35#"F 6
.#",
9"2#+
0
-.-.-
&B#"
I
5N' D
&*OF
/ ?
EJ#" J
0
0
( ( 00 / /.
/%"$ - %'
&(
/
Servlet MenuPrincipal
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
* 6F#".#!9%8:
5N' D
.#", !9%"2#@.*$
-.-
J7#"." #
/ #(' #
/ #@' #&CQ<@QE
R
":*#QE!#F"
I2 9
'
. F#!
'
J
.#",
9"2# <@#Q
. 8#!8
J#95
-$-
E#
'
' ;
'
K8' 56"2*/+
)( $
' <( 9/(+6#"$8#/#
!+
-.
- >?BAC,
0
-.-.-
&B#"
5N' D
I
/ ?
EJ#" J
9#! .
Nos quatro captulos anteriores, exploramos com detalhes como um Servlet pode tratar
uma requisio HTTP e gerar sua resposta.
Infelizmente, as aplicaes que pudemos desenvolver at agora tem uma sria
limitao inerente a prpria tecnologia de Servlets: a formatao do contedo da
resposta est totalmente integrada a programao da lgica da aplicao. A
tecnologia de pginas JSP, que estudaremos nesse captulo, nos ajudar a transpor
essa limitao.
.$ $'&
# -
) $ ) + + $ # , ) ) +
" #!5
#%9%E!#F#G
-
- >?
H I$#>
@
A0C
- >
>@?=?BI
9	, ?'$ #
H?
C P
H A
&.* =
A 8C
QI
&=?
& ? (&=?
,
C
&=?-
QI
/ P
!'
/ H
,P
- I
&=?
* * !'
=
=
, -
-
A0C
!
* *
" QI;
-
- >(?
"=H
*
/ H
-
".#5J#9E#!)#!G
H I$#
" -
.( /.
do Servlet era
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
I2 9
. F#!
'
'
'
'
K8' 56"2*/+
" #!5
-
H I$#&%'!)(
#%9%E!#F#G
-.
. 8#!8
%',!+
- >?BAC,
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
I2 9
. F#!
'
'
'
* >(?=? I !
% ,8
"BH '%
'
'
'
'
P .P
C P %'
* %' *
@%'
/ P
. ' %'
!'
/ H
H IJE
" -
)+
'
'
#9E#F#G!H I&#>
. 9!)' 9
&=? (&=?-@%
% !!+
'
'
98#9,+? (
$
#%
'
D' #!9!&# -
. 8#!8
! -
- >?BAC
".#5
8
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
I2 9
. F#!
'
'
'
'
>(?=?
I !
C9%E!#.#G
"BH '%
. 8#!8
98#9,+? (
$
#%
H I - ? H ?BC!+
&=? (&=?-@%
% !!+
'
'
'
P .P
'
'
'
@%'
/ P
. ' %'
!'
/ H
H IJE
" -
,+
'
% !!+
* %' *
C P %'
-.
" #!5
- >?BAC,
Todo esse processo faz com que o desenvolvedor tenha um grande trabalho cada vez
que a formatao da pgina precise ser modificada, tornando esse processo lento e
pouco flexvel.
&
.$ $,&
32 4
76 <8
" #!5
-
#%9%E!#F#G
- >?
?
A0C
EE
,
?
Desde que esse elemento no seja alterado, podemos incluir / alterar livremente a
formatao da pgina sem afetar o funcionamento da aplicao. Podemos, portanto,
modificar essa pgina de maneira a ter a segunda verso do Servlet apresentado na
seo anterior:
,?
- >
H?
*
>@?=?BI
"=H
9	, ?'$
#
C
& ? (&=?
,
C P
QH A
QI&=?
" QI;
!
/ P
* "*
'
/ H
& * 3
A 8C
P .P !P
C P,!C" !
A0C
- >?
*-
#%! -'$ )*-
! - ) -
!1
A mgica por trs de uma pgina JSP a seguinte: existe um Servlet especial,
, que intercepta requisies direcionadas a recursos com extenso
chamado
.jsp.
".0/
(&* /-
No instante em que recebida uma requisio para uma pgina JSP, o Page Compiler
transforma essa pgina em um Servlet e o compila, sendo que o resultado dessa
compilao carregado em memria para evitar que esse processo tenha que ser
repetido para todas as requisies recebidas.
"FFQ& D7R
0
5N' D7
<
"2
R
0
8#"FFQ& D7N' #9$ "2
9O 8#E
"4F<( ! D*%#! Q"2 %#!. .59!& J#! ;%"2 %,DQ# & !9R
K8!' "2#
5N' D
;%",
D &!$/
$#3%5%#!")
>(+)
/ #(' #Q&P6#"2
%!9".#
"0 Q ! H QDQ# Q& 9 / #!)' #DQ# & !9R
", QD8
95' '
IQ<#
!9%8#2
<#
7965' '
98#2
9
/ #!)6' #
9K& <
;%",
<@#/&*O "Q
/ &2 9<
)
7956' '
DQ9K& <
%5!57965' '
. F#!
N #D
J95' '
!' 5%#
R
K5
"2 !
9 8#E>
K8' "$#
" 6
$ 96D*$!9 M#E
"
R
&* "BR
9 8#E>
K8' ".# R
"Q Q
9
+
"Q Q
9 F#E/..56#!
0
0
0
"Q
6QDQ8
=;6"2
<#
J
D!9%K <
<@#
7
-$-
>?
#9E
-$-
N#<( 9
9K8 <
!+
9 &
* "
$#356#"F
.#"2
%!9" #
9
+
+
N#<( 9
-$-
+
- -
AC
5&
<O#
6QDQ8 (
$ <#Q O
#K+5' D &!$
" #!5
+ 8
#!96E#%)#H I
+ 8
% !+
#9E
-$-
>?
5&
-$-
- -
AC
. &#
?B*$
% + 8
N' #:1R
K5 5
9 :
9O5' '
- >?
#9E
D&D*
N#<( 9
+
!9%8# 59 :
95O' ' B
<@#
R
"2
! D &#$
!9!&#QQ+ <@#
!9F#Q +
0
0
0
novamente para garantir que modificaes feitas na pgina sejam visveis para os
usurios da aplicao.
Devido a todo esse processo de compilao / recompilao, voc poder observar
que o primeiro acesso aps a criao ou modificao de uma pgina JSP sempre
mais lento que os acessos seguintes (at que haja uma modificao no contedo da
pgina).
!"#
) , ! $
O fato de uma pgina JSP ser convertida para um Servlet faz com que ela tenha o
mesmo ciclo de vida apresentado na seo 3.4 desse livro: existe uma etapa de
inicializao, uma etapa de atendimento de requisies, e finalmente, uma etapa de
finalizao.
( /.
( (#
# %
#) /#)- (
que possibilitam a implementao
Por outro lado, existem os mtodos ! e
de cdigos de inicializao e finalizao, respectivamente, da pgina JSP. A maneira
pela qual esses dois mtodos podem ser declarados para uma pgina JSP ser
apresentada na seo Declaraes mais adiante nesse mesmo captulo.
) )*-
+ ! - . !"# +
?
e
! ) ! ,$'+
-/
.0 / %' $ /
?
.0
&0/
% ( ',("%. /%. /
O atributo info deve ser utilizado para se definir um texto informativo sobre a pgina
sendo construda; seu valor retornado pelo mtodo do Servlet (veja seo
3.10).
0/& /- / % (
<O#
9#=E!=5F!
?
apresentado na seo 4.2 desse livro, o
Da mesma forma que o mtodo
atributo
serve para indicar o tipo de contedo sendo gerado pela pgina JSP.
Assim, podemos utilizar a seguinte diretiva no incio de uma pgina JSP para indicar que
seu contedo uma pgina HTML.
'(%./%. /
* (-
O atributo seguinte,
deve ser utilizado para indicar pacotes a serem importados no
). Assim, devemos indicar por meio desse
Servlet que ser gerado (via declarao
atributo todos os pacotes que estaremos utilizando na programao de nossa pgina
do pacote
JSP. Se quisermos utilizar a classe
, e as classes que esto no
, por exemplo, poderamos declarar a diretiva
pacote
com os seguintes
atributos:
* ("-
/&',(-
&! (
! $
&0 /
<O#
?
<O#
#DQ8
?
Finalmente, o atributo
serve para indicar a pgina JSP a ser exibida em caso de
erro no processamento da pgina corrente. A pgina JSP que for exibir o erro deve, por
com o atributo
definido explicitamente como
sua vez, declarar a diretiva
.
- $ /
&0/
.0 /
?
<O#
?
?
<O#
<O#
?
?
9#=E!=5F!
?
?
?
>?BAC
*
C P
EQF:DQ2$#!9F#
-
- >?
,
#>@?):9#
+EE
- AA
O&#/! ?
A0C
&0 /
%' $ ./
Essa diretiva deve ser utilizada para incluir o contedo de outro arquivo na pgina JSP
corrente, sendo que esse arquivo tanto pode conter um contedo esttico, como uma
pgina HTML (ou pedao de uma pgina HTML), como um contedo dinmico, ou
seja, uma outra pgina JSP.
Sendo assim, podemos reescrever a pgina JSP anterior da seguinte forma
#>@?):9#
EQF:DQ2$#!9F#
?
?)
+EE
- AA
O&#/! ?
?
?
<O#
?
?
<O#
?
<O#
?
9#=E!=5F!
?
?
?
>?BAC
C P
,
, e o contedo do arquivo
- ( &&/"! *
- >?
A0C
A vantagem de utilizar essa diretiva est no fato de que voc pode manter contedo
esttico ou dinmico comum a diversas pginas JSP em arquivos separados, includos,
atravs dessa diretiva, conforme a necessidade. Podemos, por exemplo, construir novas
: se for necessrio
e
pginas JSP que incluem o arquivo de cabealho
mudar o contedo do cabealho ou do rodap, no precisaremos editar todas as
nossas pginas, apenas o contedo desses arquivos.
) ++%(*) +
- %"0
?
Obviamente, esse elemento pode ser utilizado para imprimir o contedo de uma
varivel do tipo , ou at mesmo de uma constante . Supondo que seja
uma varivel , por exemplo, poderamos incluir o seguinte elemento em uma pgina
JSP para imprimir o contedo da varivel:
- %0
- %&0
- %"0
/ (
Por outro lado, podemos formar expresses mais complexas, como na pgina JSP que
imprime a data corrente, desde que o resultado dessas expresses sejam Strings.
E!E - AA
&#/
?
# !" ) +
Uma expresso JSP possibilita o processamento de uma expresso Java, e a impresso
de seu resultado junto com o contedo da pgina JSP. Embora esse recurso seja
bastante poderoso, ele no serve para situaes quando precisamos efetuar um
processamento mais complexo, utilizando, por exemplo, diversos blocos de cdigo
Java.
Um Scriptlet permite a insero de um bloco de cdigo Java diretamente no corpo
da pgina JSP. Sua sintaxe a seguinte:
N' !D7E6#7D
E <$;
?
?)
?
/ & 9<
/ & 9<
&*
,8
,
-
' =8#
8 / 5%E!DQQ>
&*
(-
' @
F#QQ8
#' M3*9
/ 5EDQQ>& 6#!' M
&BQ9
&B
F' 9 8
?-
*
EQF:DQ2$#!9F#
?
&#Q8 / 5EQDQ
?
?
Nesse exemplo de pgina JSP, utilizamos um Scriptet para definir variveis cujos
contedos so posteriormente impressos por expresses JSP. De fato, podemos
combinar o uso de Scriptlets e expresses, desde que, obviamente, seja preservada a
semntica Java (ou seja, variveis sejam utilizadas somente aps serem declaradas, por
exemplo).
Construmos, a seguir, um exemplo um pouco mais elaborado de pgina JSP utilizando
Scriptlets: trata-se de um formulrio HTML para input do ms do aniversrio do usurio,
sendo que Scriptlets so utilizados para construir os meses possveis da caixa de seleo
do formulrio.
?
*
PA
?BH &
9&)#7D%
/ 6
C
"
>
-.I
/ ?
E6#7" #!5
& * 3
A +A
?
?)
?
-.-/ D!.
&' #Q!K8M#9E756
K8
9
K8
$7 F#%)!
"$%N$#7"
#"$#!"4EJ9
((/
?-@
-.-
" 96E:E
-.-
I?BH
&
#"$8;Q& DQ"
/ I
* C(" ,?H 9!&#Q<O#! & / .. 9<. .-? ?:H 9%8#Q<@#!$ 8 / &. 9<B ? - I? H &
?
-.-
#J' F9E
$75
.
K8#!D*64> K8
0
-.-
9' M9EJ> K8 F" ! 9E7E" D!. &' # !$7 ! 1#' #!J#98"
-.-
?-
-./
C
? P
? (
I /
- PA
?
?
2 ) + ! . # ! +
No nosso primeiro exemplo de pgina JSP (veja seo 7.2), fizemos referncia a um
objeto que no foi declarado em nenhum ponto da pgina: na expresso JSP dessa
pgina, existe uma referncia a um objeto .
-/ .$ /&#
-
- >?
?
A0C
Classe
request
javax.servlet.h ttp.HttpServletRequest
javax.servlet.jsp.JspWriter
session
javax.servlet.h ttp.HttpSession
application
config
javax.servlet.ServletContex t
javax.servlet.ServletConfig
Voc deve utilizar esses objetos implcitos da mesma maneira como voc utilizaria os
objetos das respectivas classes na programao de seus Servlets. Em particular, o
objeto implcito , da classe , prov funcionalidade semelhante a da classe
que utilizamos na maior parte dos exemplos com Servlets desse livro.
(&$
# - /"-
("$
*
PA
?BH &
9&)#7D%
/ 6
C
"
>
-.I
/ ?
E6#7" #!5
& * 3
A +A
?
?)
?
-.-/ D!.
&' #Q!K8M#9E756
K8
9
K8
$7 F#%)!
"$%N$#7"
#"$#!"4EJ9
((/
?-
-./
C
? P
? (
I /
- PA
?
?
"- ("'.* /#)"% ! #, que far o tratamento dos dados
(-* *4/.#)"% ! # , utilizando os objetos implcitos -/ .$ /&# e
- /#, (%&# /
Pgina JSP que faz o tratamento dos dados submetidos pelo formulrio
formmesaniv.jsp (procmesaniv.jsp)
?
H 98#<(#
&$
' J#"
7956' '
R
' J#"3J9#
DQ&D*
8A
!+
/
'
#"2 9
,
' 5#
+'
#"2 9
' 5#
,
?-@?
?
K!+' J#"2 9
' 5#/
9
"
%'! (
"
>.
9 &#
"
E#7" #!5
(>"%
& !+
?-
?
?
) #
"$ $ & (*) +
Esse tipo de elemento dinmico especial de uma pgina JSP serve para definir cdigos
Java que devero ficar fora do mtodo de atendimento das requisies (o mtodo
, no mais alto nvel). Assim, esse elemento serve para declarar variveis de classe
(estticas), variveis de instncia, ou at mesmo novos mtodos.
# /"- ',/
#"
?
# %
Em particular, esse elemento deve ser utilizado para definir os mtodos ! e
(mencionados na seo 7.4) caso voc opte por incluir um cdigo de inicializao ou
finalizao da pgina JSP.
?)
?9
* F$
-.-
D%
":9!J#"
"*
E":J#!"$#"
/ )$ 9<
8#"FFQ& D
#".#"
;O59* , 6
; 5' *
-.-
/ & 9<
8#
N&#
K" 965A
#"
$#Q.5.9JD
#' " #
$#Q.5.9
9J#7E
9#" A
+
"
9567A4#"@ R
95JA4#"
965' '
0
?-
*
PA
9&)#7D%
/ 6
C
?
?
?BH &
"
E6#7" #!5
& * 3
A +A
/
!
>
-.I
/ ?
NQF#!
K8
$7 F#%)!
"$%N$#7"
#"$#!"4EJ9
((/
IQ?BH
&
&
!J#A4#"
(> -
I? H
& !+
?-
-./
C
? P
? (
I /
- PA
?
?
)*- ! +
2
Existem, na verdade, dois tipos de comentrios que voc poder utilizar em sua pgina
JSP.
Um primeiro tipo o comentrio HTML: independente de ser uma pgina JSP (ou seja,
mesmo sendo uma pgina HTML esttica), voc pode utilizar esse elemento para incluir
um texto que no aparecer diretamente para o usurio que estiver visualizando sua
pgina. O usurio poder, por outro lado, ler o comentrio caso visualize o fonte da
pgina.
A sintaxe de um comentrio HTML a seguinte:
O outro tipo de comentrio que voc poder utilizar um comentrio JSP: ao contrrio
de um comentrio HTML, o texto escrito por voc no aparecer para o usurio mesmo
que ele visualize o fonte da pgina. A sintaxe de um comentrio JSP a seguinte:
Pgina JSP com exemplo de uso dos dois tipos de comentrios (HTML e
JSP)
>?BAC
#!
' :E#5".E"
. "
6"."
-
#7D!
- >?
$ ,$ *)'$ -
+
6
JavaBeans so, na verdade, classes Java reutilizveis que seguem algumas regras bem
definidas para nomeao de seus mtodos e variveis. A idia por trs do uso desses
JavaBeans em nossas pginas JSP, que eles encapsulem a lgica de nossa
aplicao, separando-a do restante da pgina.
Embora a definio exata de JavaBeans fuja ao escopo desse livro, para efeitos de uso
do uso dessas classes em pginas JSP, necessrio que se siga algumas regras bsicas
no seu desenvolvimento:
1) O construtor da classe, se declarado, no deve receber nenhum argumento.
2) Podem existir um ou mais mtodos pblicos para a definio de valores de
propriedades do Bean; esses mtodos so chamados de mtodos
.
# /&/"-
0/ /-
Temos, a seguir, uma exemplo de classe JavaBean que implementa uma lgica bsica
de nossa aplicao:
-.-
;6
O#9J"2
-.-
8#
-.A
9
=
#QFE .LD;' D5' 7EJ!' 1&8'E#5' F#!OF#D#!N%#7D! !J#Q.F7J359!& EQE#:E# FE5F"09%
' QF#
R
0
0
Uma vez construdo o JavaBean, para referenci-lo em nossa pgina JSP, devemos
, que tem a seguinte sintaxe:
utilizar o elemento dinmico
.( "/& %
Na sintaxe anterior, deve conter o nome do JavaBean como ele ser
deve conter o nome da classe incluindo
referenciado na pgina e
informaes sobre seu pacote (como por exemplo,
).
JavaBean ser visvel. Assim, se o escopo de um JavaBean for de sesso, ele ser
armazenado como um atributo de sesso, podendo ser referenciado em todas as
requisies dessa mesma sesso.
- / '( - ( /& %
>?BAC
"Q
5"$# #9 E I!$#D!IFE58
D!' "."DQ!
?=,
(
F#GL&8'E
' Q8#E#
.E5&"
#(
.?
-
A0C
- >(?
- /&'( - ( /" %
# /./-
0/& /-
-.-
;6
O#9J"2
-.-
8#
9
#QFE/ <#88#
-.A
=
1 $:
F#G7EJ59 EQE!#JE
.E58
$ I.#DQ!"B9 E%
0
#QFE/+"
-.A
#+F#! 1 $:
F#DQ("=9 E R
0
#QFE
.LD;' D5' 7EJ!' 1&8'E#5' F#!OF#D#!N%#7D!
-.A
-.-
$E58"096
' &#
=359&IFE" B
R
0
0
0/ /-
;6
#EQE# -
F#G
$! #F
$ F#DQ!"
D!' "."DQ!
-
96J# IF#D!I$E58
-
- >(?
A0C
0 /. /-
# /./-
Podemos, ento, modificar o exemplo de pgina JSP anterior para definir o valor do
preo unitrio do produto antes de exibi-lo:
F#G
9J#8I)#DI.E%5!8
$! #F
D!' "."DQ!
$ F#DQ!"
9 E -
F #!)
!' 5#
%
-
96J# IF#D!I$E58
-
- >(?
A0C
Nessa sintaxe, o valor que ser recebido pelo JavaBean para a propriedade em
, conforme recebido pela requisio
questo, ser o valor do parmetro
HTTP.
4
Existe um ltimo tipo de elemento dinmico que pode ser utilizado em uma pgina JSP:
um elemento de referncia a uma biblioteca de Tags.
Uma biblioteca de Tags permite que voc tambm separe a lgica de programao
de sua aplicao do contedo da pgina JSP, assim como JavaBeans se prope a
fazer.
No entanto, ao contrrio de JavaBeans, uma biblioteca de Tags oferece um acesso
nativo aos objetos da pgina JSP, como por exemplo, o objeto que encapsula a
resposta do Servlet correspondente a pgina JSP.
Nessa seo estaremos explorando algumas caractersticas bsicas de biblioteca de
Tags. Uma explicao mais detalhada e aprofundada sobre TagLibs pode ser obtida
) .
em
! #)$ %! ')("* &- ( "$',# #) )$("- &0 -"- /&# ! *
'!%#$"2 !9
B#9DQE 9<
8H /
9 ? (IL& <=' N7I " C6H -$-2/ 59A: D$" $".8#J"'6H 96D -F-
?-
*+&
-F- % "2569 DQ -
## - EFE" -
#N! "2
8Q<@' N$ $
/ I7?
EFE
,
<
C6 NF$
!
-&- &
8Q<@' N
<@"
- 9K+
$FQ<
Q9J#,?
<
NE$DQ!9%8#!9%
#!
$
- NE$D!9!&#!9!
- FQ<
- &<(' N
% (
.0 $&% .(
',(&*4! * %/"* "- /#"! 0 $ % .(
( '(%& /%&
Embora em nosso exemplo haja somente um elemento do tipo tag, pode haver mais
de um elemento desse tipo no mesmo Descritor de Biblioteca de Tags.
O componente seguinte por trs do uso de uma biblioteca de Tags, o Deployment
Descriptor, j apresentado no Captulo
2 Instala oe Configura odesse livro. Para
que se possa utilizar uma biblioteca de Tags, necessrio incluir um mapeamento de
uma URI, referenciada na pgina JSP, ao arquivo .tld com a biblioteca de Tags
correspondente.
Assim, poderamos incluir as seguintes linhas no Deployment Descriptor de nossa
aplicao:
? (
I$
I "
CH
#N!
,
-.- / 59
8*%+& ( -F@
A0 D!F"#$"$8#J"
H 9D! -.- (
?-/
- E8E -
#N 8
#!N$*
%
-F-
)&
%@ E8E!
#!N( !
8Q<@' N
$FQ<(' N(52
& !9
-
(+H &
- &<(' N
-
#!N+!
.0 % /"-
0.' # #
&0
"( .0
"&0
-.-
-.-
? <.
<
<
' A059E7
' #J#9&"? <
98#Q$ IQ<#
98#2&
=F < R
0
-.-
!9%8#QQ+I<#
!9!&#QQ J <#
98# <#
!9F#QQ&
!98# B
R
0
H
!' #!J#98QG 7E#K85'
-.-
5N' DO! E
$#' #Q".#> R
0
H
!' #!J#98QG 7E#K85'
-.-
5N' D
? Q<
.#)5$9
<#&IF#9
! R
95' '
0
, ' 7A59%E!9 B3O59E77? < ##9DQ9&$QE
E#9%#! $35#JD98# E:E:?B
".E/8 99".".D".6
L? < J
# M
-.-
H !$ JQ"
-.-
:K&569G7$#QF%$9
-.-
JF#QQF
/
H I
,+R
$
R
$ I <#
<
D&D*
.#)5$9
!9F#QQ& <O#! 5 ,+ . 9&' 9 ' 7A459E9 !
(
0
$#8.9=
-.-
-.-
*
C
I *
E!#
J96#! F:356#:
! R
0
0
&( )% &0
- / /"# /
$"% .(
( &- .0
Finalmente, o componente final de nossa biblioteca de Tags a pgina JSP em si. Para
# , podemos elaborar a seguinte pgina JSP de
utilizar a biblioteca de Tags
exemplo:
* % & (&0 # !
?
Q
8<(' NJ5. -
-
- >(?
A0C
.0
$&-
&-/
* %". &0 $ % .(
equivalente
se
escrever
. Caso houvesse algum contedo para essa tag,
teramos que utilizar um valor diferente para o atributo
no descritor de
bibliotecas de Tags, e poderamos considerar a implementao da interface em
vez de para a classe
+ .
* %". 0 $ % .(
* %". 0 $ % .( ,* %". "&0 $ % .(
0
.0 $"% .(
( ("%. /%&
"( .0
' 7A59%E!9
-
- >(?
A0C
Embora voc possa construir suas prprias bibliotecas de Tags, normalmente mais
prtico e fcil utilizar uma biblioteca j pronta, como o Apache Jakarta Struts,
disponvel no site http://jakarta.apache.org/struts/.
$ .$,& ) "$
34
Embora j tenhamos visto nesse livro algumas tcnicas que auxiliam na separao entre
lgica da aplicao e apresentao, apresentaremos nesse captulo uma tcnica
muito mais eficaz e que pode ser utilizada de maneira complementar as apresentadas
anteriormente.
. ,! ) $ 2
+ !"# $
&
%
O
32
Figura 8.1
Toda vez que uma requisio recebida, o Servlet de controle repassa a requisio
para a pgina JSP responsvel pela apresentao da resposta, sendo que JavaBeans
so utilizados pela pgina JSP para obter os dados dinmicos da aplicao.
"1
$ ) )
! + ! & ( ),+
00
(%&- ( /-
&*+
Esses mtodo retorna uma referncia para um objeto que implementa a interface
e que atua como um wrapper para o recurso indicado no path
)
passado como parmetro para a funo. Assim, se voc passar como parmetro, por
exemplo, o caminho relativo de uma pgina JSP, esse mtodo retornar uma
referncia a um wrapper dessa pgina JSP.
(- -
Podemos, dessa forma, implementar um Servlet de exemplo que no faz nada, apenas
repassa todas as requisies recebidas para uma pgina JSP.
-.-0/ #(' #1"2
!' #"43%56#7$#
"." 7.#35 "2 G #"0$#D#!N E"
-.-
$:
5N' D
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
-.)
R
.#3%56#")& <O#Q&P#35#")= "
8D*#
! -
!FE+
F#35#"F
D&D*
/
#(' #Q !
DQ#%
& !9
B# B
R
0
0
No Servlet anterior, existe um ponto importante que deve ser observado: o path
)
referencia um recurso
passado como parmetro para a funo
contido na mesma aplicao Web do Servlet, e, dessa forma, deve excluir a parte
referente ao diretrio virtual da aplicao (ou seja, esse path no deve ser escrito
+
). Alm disso, importante observar que o mtodo
como
poder lanar uma exceo: uma das causas pode ser uma exceo lanada pelo
prprio recurso referenciado pelo
.
("- &-
A59%E!9 ,8?
-
- >(?
A0C
$ % (! #
' 7A59%E!9
-
- >(?
A0C
! 2 + , ) ) ,! + ! &
(*),+
4
Existe ainda um outro recurso da API de Servlets que iremos utilizar no desenvolvimento
de nossas aplicaes Web no modelo MVC: esse recurso a definio / obteno de
atributos da requisio.
A classe
possui quatro mtodos que podem ser utilizados para gerenciar os
atributos de uma requisio.
' 9<( N! #D <(#!*B8& N58#+ ' !9< / & 9<
!5ON' D
!5ON' D
! E
$#!J#*
&
J#"
!+
:#+
! EJ"2#* +.. N58# + ' !9<( / &2 9<
!5ON' D
=Q+.. N5%8#
N #D
' 5#8
/"- /
(% /
- %"0
Para exemplificar o uso dessas funes, vamos implementar novamente nosso Servlet
da seguinte forma:
Segunda verso para Servlet que repassa requisies para uma pgina
JSP
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-0/ #(' #1"2
!' #"43%56#7$#
"." 7.#35 "2 G #"0$#D#!N E"
!5ON' D:D' "."
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
O#K
-.-
9 J"
5
-.)
*
$#"
0
/
D&D*
!
#!9FA
#(' #Q !
DQ#%
& !9
B# B
R
0
0
A pgina JSP
"- /# /%. /%&# &0/&* ! #) , por sua vez, pode ser implementada como:
/
9 L95' '
?-
-
- >(?
A0C
Dessa forma, alm de repassar a requisio do Servlet para a pgina JSP, estamos
tambm passando objetos, definidos no Servlet, para a pgina JSP. Esse mecanismo
funciona graas aos atributos de requisio.
-
$*-
$'+ ,$ ) +
Servlet Login
! "$#%&(' #)
! "$#%&(' #) *!+)
,
-.-
>(8&
/ !
# (' #R
-.-
-.-
-.-
8#
9
& %#' *
,
.J9 #!'E6#
DQ#"."2 "@"256.
!D
-$-
#"$#%96*:E
-$-
+
E6##
/ &2 9<
".#9*BR
/ ) 9<
+ ="
#!96*
!' #!J#98
56"25;. J#E#K& 9
.' E!
' Q<= 9
0
.#)5$9
5N' D
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
-.-
O#K
!
!+I6F
D*6#!
-.-
O#K
&B #!' *
9 9E:Q& N5F"
K"+' 9 #!' *
DQ#"."2/9
8C
BH &
9 #'E#QD#"."
!'
".#9*6<
5",5%;. K8
O;' E
' B".#"."2Q ".#* +). N58#8C
BH &
!+
A0?-!+
/ (
&B>*
!
/
$ ".8#
5%"25;$ J#!N!8#!9EJ".#5
;65'
CQ".,AE K8 #E
#' " #
<(J!896!DQD*#!+
M#9EJ5	) DQGJE
/ &2 9<
-.-
H&
!'
!+
)
R
K!+' 9 #' *
R
DQ#"." /
"@"
-.-
5;!.
-
-.-
' <( 9
-.-
K8! 5' ;. /+"2 ' #"2J#!9!8#:D#" "25 ;<( 9% +#N"4"D"."'
-.-
K8,M#J"05
".#9*7 9D2F#8"
K8
5
FE $
!8A4#9".
+' ="
#!9*%
9 +
$#356#"F& <#&P#3%5%#"F "2 8D*#!@ - 6!.C%Q<( 9 "2 !+ K
FE + $#35#"F
.#", 9"2#+
0
#' "2#R
-.-
"@"
-.-
D2)#!"Q !9E#98#JQ"2#5
9 #!'6E#JD#" "2
! - "
#' " #
! - *
DQ#"."
"25.
0
0
D&D*
#/
R
0
&B#"
-.-.-
I
/ ?
5N' D
&*OF
EJ#" J
9#! .
0
0
PA
*
?BH &
8C<
? (
I+?
&
I "@?
? (
II*
? (
I /
!?B> I
9 BA
6?-&
//
* 3
A 8C
P. & *
/ ?
? P
,
BH &P
/
&
> *
,P
* (
!(&=?
P *
P
C " !69&F! !P
- PA
-
- >?
A0C
8#
D#"." 7D!
5!/9
-
- >(?
A0C
8#
D#"." 7D!
7QE 9 ")&.QE!@9
-
- >(?
A0C
Essas pginas JSP podero ser trabalhadas pelos responsveis pelo layout e formatao
de nossa aplicao, sem afetar a lgica e o trabalho de desenvolvimento.
, ,! + /1
%4
J apresentamos, na seo 2.2, uma maneira atravs da qual voc pode instalar uma
aplicao Web em um servidor de aplicaes: voc pode fazer essa instalao
, uma pasta com o nome de sua aplicao, com o
criando, abaixo do diretrio
contedo dessa pasta obedecendo a um formato especfico (veja seo 2.2).
/ #
-(# /- /#
Com um arquivo .war, podemos instalar nossa aplicao Web em qualquer servidor
de aplicaes: basta copiar esse arquivo para a pasta
do servidor. Obviamente,
devemos tomar cuidado para no instalar o arquivo .war mais o diretrio com toda a
nossa aplicao juntos em um mesmo servidor de aplicaes.
/ & #
, *) - !"# $'&
&
55
>8
$ /%& ' /
Ao retornar uma resposta com esse cdigo de status e esse header de resposta
contendo um valor , onde ! deve ser substitudo por um nome do
domnio no qual estamos fazendo a autenticao (cada domnio deve proteger um
conjunto de recursos de sua aplicao), faremos com que o browser do usurio de
nossa aplicao mostre uma caixa de dilogo pedindo um usurio e senha de acesso.
&(&* % (
(&* % (
O usurio e senha digitados nessa caixa pelo usurio sero enviados, por outro lado,
junto com uma nova requisio a nossa aplicao, atravs do header
. O valor
desse header estar codificado no formato Base64, sendo necessrio utilizar um
decodificador para ler, efetivamente, seu contedo: esse contedo ser um texto no
! .
formato
$ (- (%
/ #!)' #!*
>(?=?
E7E6B#Q + >68& / #(' #Q.P#35#"F F#3%5%#"$>O+. / #F' #Q&P#"2 9".# F#"2 9".#
5N' D
&*OF
O#K
-.-
!
!+I6F
D*6#!
-.-
NQF#!9EJJ' !4E
-.-
E#K8 9O J"
-.-.-
' DQG
5",5%;2 "@E
<(J!896!DQD*#!+
*#E#%
K"+' *#QE#!
/
$ ".8#
A0?-!+
!+
' *#E#!
;65'
CQ".,AE K8 #E
/ &2 9<
/
N.
F##9D* J#98LE#
E
#
*#QE#!
+
5)*&J95' '
R
.#",
!9%"2# " #Q&>@#QE#!
*
/ H
C6A3
'"& * "(?
>
PH
.+
$#Q.5.9
0
-.-.-
O#DQ!E K8 DQ96E7DQ9F# EJE*#QE#! O
$7 " " 5. ' MJ" D' Q"2".#
!
"$# %
; BE "2
9 #'# *8&
-F- *%!FE#. " !56FD#K8!)<# 9# - NQ".# (-
/ # 9%#!D#"
#!' #"4D9#!
-.-.-
-.-
"
D!FDQ8#F#"
E
*%#E#
Q"Q D/!
/ &2 9<
5.*O#DJ9#
/ &2 9<Q"2#
/ &2 9<
/ &2 9<
I2 9
'
J
.#",
9"2# <@#Q
. F#!
'
'
'
'
'
K8' 56"2*/+
)(
-.
'
*#QE!#*
(
!+
+
8
. 8#!8
P+
- >?BAC,
0
0
("0 % '(% 0
#N(8$#".5$DQ#
@
Q5$'
-
F#7P#"F)$ & -
5%8#!9%& DQDQ>?=?
#!N(.#"25)D#!F9
I
#
- "2#D5O.
DQ
$)8D!96"F))! 9!
5&*)J#&*E*
/ H
- 5%&*(J#&*%E
9J#
% * /
-( /
Se voc optar por utilizar esse mtodo de autenticao, voc deve chamar em seu
e
* , da classe , para obter o
cdigo os mtodos
nome do usurio e seu grupo.
,
1
8
(.(
(%
A classe
!
-.-
B#F#!96D QE!
A49#!
-.-.-
56
E6#7D%9%# %#"4
N9D7E6#7EE"
D!
F#D#%N E
-.-
I'E6#7D%9%# %#"4E#
-.-
" "2 /
DEJ!
' DQG&
+DQ"2JD9.F;!. &E"4"
-.-
-.-
#%NJ E#
J9%8#!45
J#"2
5J:
7I!' +
' D
&.* ' D
/ &2 9<
#DQF!$ I'
-.-
"=.' 5%",5
/ &2 9<
J95' '
7956' '
&
-$-.-
!
I!'6E#D9# #"
#"2J
-.-
-.-
5
-.-
#JE#..5ON
E#
-.-
?B J#!5
35%# 6D"$
*!
N9DQE#JEQE",
B
9QOQ"0DQ9# %#"
B
!9%"*
' DQEQ"=
-.-
. O#! END
& J#F:D%
-$
-.-
-.-
NF#J
#! $D9# 7D%
2
I!' !9
5N' D
"
#! F
*
/ &2 9<
@. J#5
N"$#7E#EQE"
=
!' D / ). 9<
9!J#.
&*$
R
K!+
=!
' D=9 :
9O5' ' BR
&.*
5$'
&JA
' D
& I' J
9#
#D &3,+
&'"=$'7
52'
&'"@" 5. /J
5"Q5.
& / #9*
J
".#9*6
-.-
)
F#<9E
DQEQ"..F96E!JE. #%
;6END
R
+ Q#2 ; E2N D
0
+ Q#2,
DQQFD*
.*F
I!' !9.QD# Q. 9+ = ' DF9 LK8 "2" #'
9#
D..#<( - DQE!"F)$
0
-.)
5JD!96#Q
'&
DQQFD*
5
!9"*
' !DQQE6Q"3
E#"..F! I'
.*F
9#
D!
!96#QQ/!+
+
I!' !9.QD#
Q. 9+
=
' DF9 LK8
"2" #'
(
0
0
#' " #:.*F
9#
,+
!
0
0
-.-
-.-
/
#"." #
-.-
.N' #JQ"
NQ" #JE#7E6QE!"
.
9#Q !.*F
I'
DQFD*
)*6F
9#
(+1
D!96#Q
)M JK+%
)(
9
%',!8
0
$#Q.5.9' DQ9
0
-.-
P#QF!.96" #
-.-
!5
#!98#JE
-.-
-.-
.N' #JQ"
E% F#8
/
#"." #
'5
5
9%JDQ9#%
I'
9#,
&*$
9 7965' '
R
K"+
R
%'6E#DQ9# %#":9 #".& #1,M% O
E#!J"
-.-:/ #
-.-
F#) )!
E6#!' #
' =D!9+
0D!96#Q
5
%969#D& 9B$
)
+
DQQFD*
!96#QQ/8
0
#' " #
K5+$'&B5
9"*
' DQE!Q"=J$ ?
,A4 I!'
R
-.-
-.-
J; ! J:E
#"$8!N#' #DQ#
!96#QQ/!+
0
#' " #:.*F
9#
E#JD9# #"
0
K!+' DQ!9+9 J95' ' B&'&B5
9"*
' DQEQ"=((
$#Q.5.9' DQ9
0
-.-
C N#F756J:DQ9#%
-.-
-.-
DQ9D.
5N' D
/
#"." #
F#8%$9:#"."
" 6
$ 96D*$!9 M#E: E
K"+
'
E#
I'
' N%#!F
!9%#Q
R
9 J95' '
I!'
R
),$
R
K!!9
DQ9 "
DQ&D*
&'&B5
96"*
' DQEQ"
,:
0
0
-.-
9 6
J#!FJDQ2F#98#E#JD9# #"
P#QF!.96
9
&B5
N8#!
9"*
' DQEQ"
' DQE!Q"
!
'&
$#Q.5.9
56
!9"*
' DQE"2
0
-.-
O#"F)FO !'E6#7D!96#Q
K+#!D*9EL&E6Q"0Q"D!96#Q
#"
&*$
#"4!N#&Q"
R
K!+$ I'
9 7965' '
R
K8
+ 9% .
=O 7$
)
R
K+' BDQ9/9 L95' ' B' BDQ9 D' ".#/!+
DQQFD*
0
& I!' .#JQ#*
),$
,+
=. #!
0
DQ&D*
)*F
9#
E#"2DQEQ"F.F!
0
0
0
0
-.-
>@"2*&N' #7D!
' DQ"
9J#"
79%#
+
-.-
59
' )&
-.-
5N' D
EE" O
9!J#JE:
' DG %
E6"".#<(5 98#"
-.-
"$8Q& D:"
$ 9D*OF9 M#EJ ED!$ I%!' *
BE% #;%END / )$ 9<
"2#9*%
5" 5;!.
I!' 9*
K!+'
'
&+I'
'
!' 7
9%#
9
I%' 9*
+
0
0
-.-
5N' D:"$8Q& D
R
I!' !9*
K"+'
!'
#' " #
$#Q.5.9
&+I!'
!9*
9#Q>+
965' '
0
-.-
&B5
&
5
!9"
9"
' DQE"
/
' DQE"
6' D
& 9<
R
I!' !9*
K"+'
!'
#' " #
$#Q.5.9
&+I!'
!9*
&=5
9"*' DQE!"
!+
0
-.-
' N#!$
' D
R
I!' !9*
K"+'
!'
&+I!'
!9*
!96#QQ + =D!9+
0
-.-
5N' D
"$8Q& D:"
$ 9D*OF9 M#EJ EE#".&$! I' / &2 9%<
&*OF
"0I!' !9
QD#!
& !9
' D
R
I!' !9*
K5+'
'9 :
956' '
R
'
!' E#".&F I!' +
&+I!'
!9*
$ I!' "
0
0
0
interessante observar que a classe anterior permite que sejam configurados / utilizados
no apenas um nico pool de conexes a base de dados, mas sim diversos pools:
como so declaradas variveis estticas, todas as aplicaes Web sendo executadas
na mesma instncia da mquina virtual Java iro compartilhar esses mesmos objetos.
Sendo assim, necessrio prever a alocao e liberao de conexes por aplicao,
de forma que o funcionamento de uma aplicao no interfira no funcionamento de
outra.
Esse gerenciador de conexes ao banco de dados utiliza tambm uma classe do tipo
para indicar falhas em seu funcionamento. Segue a implementao dessa
classe
, :
'/& (%
-.-
E#JD9# #"
N"$#7E#JEQE"3FI' !9.
"25O #
, (
' D
(+ (
J"F<BR
J"F<+
0
0
-.-
.
&#"$8#E
/ #!)' # ?
!'E6#7D%9%# %#"4
#"$8#!I!'6# 	E"
NQ" #JE#7E6QE"
5N' D
&*OF
"
"
B"2#F' #Q
!9%K8 <
!9%K <
9Q ' N' #QD# ) 9 / #(' #%QD#! . !9R
.
E
!9!K& <
!9%K <+
9 7965' '
R
I!' !9
@ D I' *
' DC () / #!@' #QF" DQ $".3' END @$ # ,
&' ()" #!)6' #8"', END $O".3' -$-
=
%% (- ' @F" #!@' #8"
8QE 9! %
!
DQFD*
)*6F
9#
" 9 ! ' N' # QD#
& 9 ,.F(9 LK8!@
"2" #!'6D!
(
=# <O#&A4#"."2 <O# )(> %'!+
!'
%
0
0
E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
5N' D
&*OF
O#K
-.-
!
!+I6F
D*6#!
I2 9
'
)
. F#!
CQ".,AE K8 #E
'
J
.#",
9"2# <@#Q
A0?-!+
!+
. 8#!8
-$-
6#,#D5%8:35#. #!"
'
D&D*
'
9
N"$#7E#EQE"0
P ,+
R
'
/
$ ".8#
<(J!896!DQD*#!+
'
'
K8' 56"2*/+
-.
- >?BAC,
9 +
) + )*- ,! ) -
,)
+ + ! # ) ! # $'&
(*),+
2
IIS, etc) e uma banco de dados (PostgreSQL, Oracle, etc). Quando um usurio
acessasse um servidor via um navegador (Netscape, Opera, Microsoft Internet Explorer,
etc), este servidor retornaria uma pgina, esta pgina conteria contedo em HTML, que
mais tarde evoluiu para outros formatos.
No incio os servidores de pginas na Internet, hospedavam apenas pginas em HTML
com figuras (gifs, jpegs, etc). Pginas HTML no poderiam gerar dinamicamente dados,
tal como obter, inserir e alterar informaes em um banco de dados. Neste momento
houve o desenvolvimento de CGIs (Common Gateway Interfaces). Os CGIs eram
pequenos programas em linguagens como por exemplo C. Estes CGIs eram chamados
pelo servidor Web para acessar um banco de dados ou executar qualquer tipo de
tarefa que deveria ser dinmica, e no esttica, tal como so as pginas HTML.
Servidor Web
CGI
Servidor
Figura 10.1
Os CGIs eram mais difceis de se desenvolver (nesta poca se utilizava linguagem C),
ento diversos desenvolvedores iniciaram a criao de suportes modulares nos
sevidores Web para permitir a integrao direta com linguagens de desenvolvimento.
Os CGIs eram executados como processos parte do Web Server, o que necessitava a
alocao de mais memria e sobrecarregava o sistema, em casos com muito acesso.
Diversas linguagens de script se desenvolveram aps os CGIs, tais como PHP, ASP, Perl,
Phyton e JSP. A execuo de scripts (pequenos programas) criados nestas linguagens
era feita como observado na figura 10.1, o que diminuia o consumo de memria do
servidor, gerando menos atrasos no tempo de resposta do cliente e minimizando a
sobrecarga do servidor.
Servidor Web
Script
Servidor
Figura 10.2
Suporte a M
dulos.
, ! + ).$'+ ! + ! 2
&
Computador
Virtualmente nico
Figura 10.3
Servidor
Computador Virtualmente
nico
Sistema
Centralizado
Sistema
Distribudo
X
Workstation
Figura 10.4
PC
PC
PC
Economia de Recursos
...
Workstation
Workstation
Workstation
...
Servidor
Servidor
Figura 10.5
Servidor
Google.
Mdulo A
Mdulo B
Servidor
Servidor
Figura 10.6
Mdulo C
Servidor
Alta Disponibilidade.
Mdulo A
Mdulo B
Servidor
Figura 10.7
Mdulo C
Servidor
Mdulo A
Servidor
Servidor
Figura 10.8
Mdulo B
Mdulo C
Servidor
Sistema Distribudo
Mdulo A
Mdulo B
Servidor
Mdulo C
Servidor
Figura 10.9
Subdivis o de M dulos.
Observando a figura 10.9 pode-se pensar: caso a aplicao fique muito carregada
posso redistribuir os mdulos B e C, conforme a figura 10.10.
Sistema Distribudo
Mdulo A
Mdulo B
Servidor
Figura 10.10
Servidor
Mdulo C
Servidor
Contudo, se o mdulo A tornar seu computador muito carregado como resolver tal
questo? Pode-se tentar subdivid-lo, mas se a rede ficar muito sobrecarregada com tal
diviso pode ser necessrio comprar um computador de alto desempenho somente
para executar este mdulo. Os sistemas distribudos minimizam em cerca de 95% dos
casos que envolvem aquisio de hardware, contudo h problemas que se resolvidos
de forma distribuda podem tornar a rede sobrecarregada e gerar um pior
desempenho final.
* /01
32
%.
1
%
O
+ - ) # $
41$
CORBA (Common Object Request Broker Architecture) um padro que definido pela
OMG (Object Management Group), organizao que rene cerca de 800 empresas
do mundo todo. Este padro foi desenvolvido para a construo de aplicaes
distribudas. Por ser um padro, para aplic-lo, deve-se ter acesso a um suporte ou
ferramenta que o implemente. Diversas empresas e interessados desenvolveram suas
prprias verses seguindo o padro Corba, dentre estas pode-se destacar o Mico
), OmniOrb (), Visibroker (), Jacorb () entre outros.
(
Middleware CORBA
Servidor
Servidor
Figura 10.11
Servidor
Corba.
Chamada
Objeto
Cliente
Stub
Cliente
Retorno
Figura 10.12
Stub
Servidor
Objeto
Servidor
Java/RMI.
RMI contou com o apoio de diversas empresas, que interessadas na plataforma Java,
desenvolveram uma srie de IDEs (Integrated Development Environments), aquelas
ferramentas grficas que simplificam o desenvolvimento, prontas para implementar
usando a nova tecnologia. Isto agregou muito e diversos desenvolvedores voltaram sua
ateno para Java.
RMI possibilitava as mesmas funcionalidades que Corba, contudo, com o apoio de
fabricantes, em pouco tempo surgiram boas ferramentas e aplicaes neste suporte.
Alm disto, a Sun Microsystems criou o suporte Java/IDL para comunicar Java com
Corba, isto permitia que desenvolvedores utilizando Corba pudesse at mesmo migrar
para Java e continuar o desenvolvimento em RMI.
Observando o lado promissor da tecnologia Java/RMI a Sun Microsystems desenvolveu
um padro chamado J2EE (Java 2 Enterprise Edition). Com isto, a empresa segmentou
a tecnologia Java e comeou cada vez mais a se preocupar com o mercado de
aplicaes distribudas.
J2EE uma arquitetura que utiliza a mesma pilha de protocolos de Java/RMI o que
permite comunicao com Corba, e alm disto, permite continuidade aos
desenvolvedores Java/RMI. Nesta tecnologia uma srie de suportes foram oferecidos.
Programar para um ambiente distribudo tornou-se mais simples, pois uma base slida
de componentes haviam sido desenvolvidos para isto.
Diversos fabricantes se interessaram pela arquitetura J2EE, mais ferramentas de
desenvolvimento foram lanadas e o mercado aumentou sua aceitao para esta
tecnologia. Dentre os fabricantes destaca-se a Oracle, IBM, Sun Microsystems, Bea
Systems, etc.
&
0
) # $
$ $ $ ' ! + ) .$'+ !+ ! 2
O mercado atual tem se voltado cada vez mais para a tecnologia Java, e dentro deste
enfoque a arquitetura para sistemas distribudos a J2EE. Apesar da grande evoluo
desta arquitetura, o projeto de aplicaes distirbudas ainda exige conhecimentos
adicionais dos desenvolvedores. Cada vez mais desenvolver torna-se uma tarefa que
exige estudos sobre conceitos e novas tecnologias, ao contrrio de estudar uma
linguagem comum.
O mercado tem optado por tecnologias baseadas em plataformas abertas e isto pode
ser cada vez mais notado. Empresas como IBM e Oracle voltaram-se muito para este
segmento de mercado, suportando sistemas operacionais livres como o Linux e partindo
para a tecnologia Java. Aos poucos as empresas notam que tecnologias fechadas, tais
como o Microsoft .NET, limitam o cliente, pois h a dependncia nica e exclusiva da
Microsoft, ao contrrio do J2EE que oferecido por vrios fabricantes.
No se encontrar neste mercado promissor algo que preocupa muitos projetistas e
desenvolvedores. Portanto, conhecer uma tecnologia como J2EE necessrio e abre
caminhos, no s no cotidiano de escrita de cdigo, mas sim nas tcnicas e escolha
das melhores arquiteturas e opes para desenvolvimento.
)6
6
! +
)
Camada Web: esta camada implementada por JSPs e Servlets, que fornecem a
lgica para a camada cliente ( ou de apresentao ) do negcio. JSPs e Servlets
residem no Web Container. JSPs oferecem a facilidade de utilizar algumas lgicas de
apresentao em uma pgina web sem muitas dificuldades tecnolgicas. O Servlet
apresenta-se como um controlador das aes executadas pelos usurios nas
pginas de apresentao, e fornece recursos para obtr dados dessas aes e
realizar as operaes desejadas. Os componentes Web residem no Web Container
que pode ser um servidor TomCat ou outro similar.
Cliente
HTML
Container
Servidor J2EE
Pgina
Html
Servlet
JSP
Container Web
App-Client
Container
EIS
Stand
Alone
EJB
Container EJB
Applet
Container
Figura 11.1
" - + $*$ -
1
Applet
6
Para obter o kit de desenvolvimento para J2EE, acesse o site da Sun MicroSystems em
J2EE e faa o download do J2SDKEE e de suas documentaes. A sua
instalao segue praticamente o mesmo esquema da verso J2SE. Por fim se faz
necessrio a criao da varivel de ambiente . Inclua tambm o diretrio
na varivel de ambiente PATH. Para acessar a biblioteca J2EE, aponte o
classpath da sua aplicao para o diretrio *
. Os pacotes desta API tem
o prefico javax e nele podem ser encontrados todos os recursos disponveis para a
especificao J2EE.
) /&/! "-
0
0
Servidor
Cliente
RMI
Skeleton
Stub
RMI
Figura 11.2
Objeto
. - )*-
)
+
)6
Message-Driven Bean
Um EJB Session Bean prov servios, isto , define mtodos de negcio que podem ser
acessados remotamente e que disponibilizam operaes relevantes aplicao. O tipo
Session Bean Stateless no apresenta um estado como o prprio nome j diz, e fornece
servios para clientes locais e remotos. O EJB Session Bean Stateful, tambm fornece
servios localmente ou remotamente, mas apresenta uma relao forte com um
cliente, isto , mantm o estado que um cliente define, assim este cliente pode
configurar e recuperar dados deste EJB.
Os EJBs Entity Beans representam entidades, objetos que so persistidos. Podem
apresentar a manipulao e persistncia do objeto de duas formas: BMP ou CMP. No
tipo BMP (Bean-Managed-Persistence), o cdigo de persistncia e manipulao do
objeto deve ser fornecido pelo Bean, isto , deve ser programado. J o tipo CMP
(Container-Bean-Managed) provido pelo prprio container, no tendo a necessidade
de escrever linhas de cdigo para estas operaes.
Message-Driven-Bean so EJBs que fornecem servios assncronos e podem ser
comparados a Session Beans Stateless, que tambm fornecem servios aos clientes
locais e remotos, mas de forma assncrona. Um EJB do tipo Message-Driven-Bean se
comporta como um listener que aguarda o recebimento de mensagens atravs de um
MOM (Middleware Oriented Message).
Detalhes de cada tipo de EJB sero vistos na Parte II Tipos de Enterprise JavaBeans.
Cada tipo de EJB deve implementar interfaces diferentes e definidas pela API J2EE.
Estas interfaces definem o comportamento que o EJB deve apresentar.
Alm de implementar uma interface definida pela API, devemos criar duas interfaces
que sero utilizadas pelos clientes para acessarem os EJBs. Estas interfaces so
conhecidas como
e devem ser definidas para os EJBs do tipo
e
(Stateless e Stateful) e Entity Bean (BMP e CMP).
(&'.
&/&* ( /
/# # (% "/" %
(&* /
"( * /
("* /
<<Interface>>
javax.ejb.EJBHome
java.rmi.Remote
Figura 11.3
getE JB MetaData()
getHomeHandle()
remove()
remove()
java.rmi.Remote
Figura 11.4
/"* (& /
No acesso local, o cliente e o EJB devem estar na mesma JVM. O acesso ao EJB no
transparente, dessa forma devemos especificar que o acesso local. O acesso local
pode ser usado em vez do remoto para melhora no desempenho do negcio, mas
deve-se fazer isto com cautela, pois um EJB definido como acesso local no pode ser
executado em container em forma de cluster, isto , no pode ser acessado
remotamente de forma alguma.
Para criarmos um Enterprise JavaBean com acesso local, devemos implementar a
interface Local e a interface
. A interface define os mtodos de negcio
especficos do EJB (assim como a interface Remote) e a interface !
define os
mtodos do ciclo de vida do EJB (assim como a interface
). Para os Entity Beans a
interface
tambm define os mtodos de busca (finders).
("'. ("* /
(&'
(&'. (&* /
(&* /
("', "(&* /
<<Interface>>
javax.ejb.EJBLocalHome
remove()
<<Interface>>
javax.ejb.EJBLocalObject
getEJBLocalHome()
getPrimaryKey()
remove()
isIdentical()
/&# #).0 /
- ,/% /&"%
Figura 11.7
2 ) # )
)6
)6
Como podemos observar ao longo dos tpicos explicados at este ponto, vimos que os
componentes EJB no so acessados diretamente, isto , no acessamos a instncia
do Bean diretamente, mas fazemos o acesso aos servios disponveis por eles atravs de
interfaces que so disponibilizadas para acesso remoto ou local.
Outro detalhe que pode ser observado, que apesar de utilizarmos as interfaces de um
componente EJB para acessar seu mtodos, vimos que a implementao dos seus
servios oferecidos, isto , o Bean no implementa as interfaces oferecidas por ele.
Bem, conhecendo a definio de interfaces e herana devemos nos perguntar:
Por que o Bean no implementa as interfaces locais e remotas? E no implementando
estas interfaces, como possvel acessar os mtodos contidos no Bean?
Esta pergunta pode ser respondida simplesmente pela explicao de como o container
se comporta com os componentes EJB. Cada fabricante de servidores de aplicao
prov a implementao para as interfaces remote e home definidas para o
e .
componente e que so respectivamente as classes
/&'
/ '
("* /
A classe
implementa a interface remote para os acessos remotos e locais e
criado
encapsula (wraps) a instncia do EJB que foi solicitada pelo cliente. O
baseado nas informaes contidas nos arquivos de deploy e na classe de Bean.
/&',
/&'
No caso da classe EJB Home, esta se comporta da mesma forma que a classe
.
Ela implementa todos os mtodos da interface home para os acessos remotos e locais
e ajuda o container a gerenciar o ciclo de vida do Bean, tais como sua criao,
remoo etc.
Quando um cliente solicita uma instncia de um EJB atravs da interface home pelo
que faz referncia
cria uma instncia da classe
mtodo
, a classe
' -/&/
("* /
/&',
/&',
/, - / /
(&* /
- /"* (./
/"'
/"')
Servidor J2EE
Container EJB
Cliente
Home Interface
EJBHome stub
Home Interface
EJB
Home
EJBObject stub
Remote Interface
Remote Interface
Bean
EJB
Object
Figura 11.8
# -
+
! *) *) # $ )$ # ) + + $ + # - ) - ),+
%
1
Construir um EJB pode parecer difcil, mas apesar de ser uma tarefa demorada, no
apresenta uma complexidade muito elevada. Esta demora pode ser diminuda
utilizando de ferramentas que propiciam a sua criao de uma forma automatizada.
Primeiro se faz necessrio identificar qual tipo de EJB, ou quais tipos de EJB sero
necessrios para uma determinada aplicao. Definido os EJBs que faro parte da
aplicao, deve-se definir os mtodos de negcio de cada um deles, ou seja, definir o
comportamento de cada um. Aps isso, comeamos o desenvolvimento do EJB.
Com os EJBs definidos, e assim, com seus mtodos de negcio definidos, devemos criar
as interfaces necessrias que sero usadas pelos clientes para o acessarem. No caso de
Session Beans ou Entity Beans, devemos definir a interface
(ou Local caso o acesso
seja somente local) com os mtodos de negcio do EJB. Logo aps, definimos a
interface
(ou
para acesso local) com os mtodos do ciclo de vida do EJB,
isto , normalmente com os mtodos de criao do EJB e mtodos de busca (utilizados
em Entity Beans e conhecidos como finders).
"( * /
("', (&* /
/&* (/
Como j foi dito, para o EJB Message-Driven Bean no precisamos definir as interfaces
Home (ou
)e
(ou Local), pois o mesmo se comporta diferentemente dos
outros EJBs.
("'. (&* /
/&* ( /
Por fim, devemos criar o EJB propriamente dito, implementando a interface especfica
de cada tipo de EJB e codificando cada mtodo de negcio.
Depois de ter construdo os EJBs necessrios para uma aplicao, devemos empacotar
os mesmo em um arquivo, ou em arquivos separados.
Para empacotar um Enterprise JavaBeans, devemos utilizar do utilitrio jar, que
fornecido juntamente com o JSDK e que facilita a criao do Java Archive (JAR). Com
uma linha de comando e alguns argumentos, empacotamos os EJBs em arquivos JAR.
Observe que um arquivo JAR pode ser instalado tranqilamente em um servidor de
aplicao, mas h um outro tipo de arquivo, que empacota todos os recursos da
aplicao alm dos EJBs, em um mesmo arquivo. Este arquivo conhecido como EAR
(Enterprise Archive) e contempla arquivos JAR, arquivos WAR (Web Archive), arquivos
RAR (Resource Adapters Archive), arquivos de configurao, figuras entre outros
recursos.
extremamente aconselhvel o uso deste tipo de arquivo, para a instalao de
aplicaes Enterprise, conforme especificado pela Sun MicroSystems.
Estas operaes sero descritas com mais detalhes na Parte III Instalando e
Executando EJB.
Aps ter feito isso, podemos instal-los em um servidor de aplicao. Note que o
processo de instalao de um EJB nos servidores de aplicao variam de acordo com
cada fabricante, ento sugerido uma leitura da documentao do servidor de
aplicao especfico.
Para acessar um EJB, precisamos criar um cliente que consiga localizar o EJB onde ele
est residindo (servidor de aplicao - container), obtr uma referncia ao EJB remoto
ou local e obtr uma instncia para acessarmos os mtodos de negcio do EJB. Claro
que para o EJB do tipo Message-Driven Bean, como apresenta um comportamento
diferente e se prope a solucionar um problema diferente, utilizamos seus servios de
forma diferente tambm.
No caso mais comum devemos realizar um lookup, isto , procurar pelo EJB no
servidor de aplicao que ele est instalado. Quando criamos um EJB, definimos um
nome para ele, e este nome ser utilizado pelo cliente para localizar o EJB. Com a
(ou
),
referncia do EJB em mos, podemos acess-lo pela sua interface
) e executar os mtodos de negcio
obtr uma referncia para a interface
(ou
desejados.
&/&* ( /
(&'.
(&* /
( '. ("* /
(&* /
Lembre-se que o acesso ao EJB pelo cliente realizado atravs das interfaces
e
, sendo que o acesso diretamente instncia do EJB propriamente dito de
responsabilidade do container, que opera sobre o Enterprise JavaBean e executa seus
mtodos e retorna valores, atravs das solicitaes dos clientes, por meio das interfaces
(stubs e skeletons).
/"* (& /
' ')+
4
),+ + ! - ) $,- +
Session Beans so componentes que apresentam servios para seus clientes. Estes
servios so fornecidos para o cliente pelas interfaces do EJB Session Bean e
implementadas pelos mtodos de negcio no prprio Bean. O estado do objeto Session
Bean consiste no valor da instncia de seus atributos, sendo que estes no so
persistidos.
Imagine que uma aplicao necessite realizar alguns clculos e retornar este valor para
o cliente, sendo que deseja-se que este servio seja remoto para ser acessado por
vrios clientes pelo pas. Isto pode ser implementado por um EJB do tipo Session Bean e
disponiblizado em um servidor de aplicaes para todos os clientes. Este um exemplo
de utilizao de um Session Bean.
Mais adiante veremos os cdigos fonte de Session Bean exemplo.
Home
Remote
SBExampleHome
SBExample
c reat e()
<<instantiate>>
<<EJBRealizeHome>>
<<EJBRealizeRemote>>
<<EJBSess ion>>
SBExampleBean
EJB_Context : SessionCont ext = null
SBExam pleBean()
ejbCreate()
ejbRem ove()
ejbAct ivate()
ejbPassivate()
setSessionCont ext()
Figura 12.1
Analisando o diagrama de classes acima temos uma classe e duas interfaces. A classe
do EJB Session Bean
( ) e as interfaces (
) e !
e
(Home). Para cada classe do Bean devemos definir as interfaces (
e/ou
e/ou
). No exemplo acima, foram definidas as interfaces
e
, mas
poderiam ter sido definidas as interfaces ! e !
ou todas elas (com isto teramos
acesso local e remoto ao mesmo EJB).
(&'. (&* /
/# # (%
&* / &( * /
(&'. &( * /
(&* /
O Bean deve conter os mtodos definidos para um EJB Session Bean conforme a API
, , e . Tambm devem
J2EE que so:
,
,
apresentar os mtodos de negcio com suas devidas implementaes que sero os
servios disponibilizados pelo EJB.
/, - / / /. /&* (./ / ') / /, ## /
(&* /
' - /"/
!5ON' D7 9%8#!)K8QD#
5N' D
&*OF
"
;>OJ#JR
/&* (&/
/&* (./
Na interface
do EJB devemos definir os mtodos de negcio que fornecero ao
cliente os servios disponibilizados pelo Bean. Estes mtodos tem a mesma assinatura
tanto na interface
quanto na prpria implementao do Bean.
/"* (./
A seguir veremos como poderia ser definido esta interface, com um exemplo de servio
fornecido pelo Bean, para calcular o valor de um desconto informando alguns
parmetros.
!5ON' D7 9%8#!)K8QD#
$9<# &*OF
"P#!
Bean: SBExampleBean.
DQ<#JD N #,
' #! #! N ".#"2"2 !9
8#
!9!&#Q
"
/ #"2" 9#9R
!9%8#QQ&
0
5N' DO! E# NP#!J# !BR
0
5N' DO! E# N* DQ& Q8# ,BR
0
5N' DO! E# NIQ".", 8#BR
0
5N' DO! E" # / #" "2 !9
&* ", ".#"."2 !9
9"2#"."Q 9
98#Q R
9&#Q&
0
0
$9<# R
Para obter este servio, o cliente deve realizar a localizao do EJB no servidor de
aplicao utilizando a API JNDI, solicitar uma referncia para a interface
do EJB e
. Assim, o cliente ter acesso
com ela executar o mtodo de ciclo de vida:
interface Remote que apresenta os mtodos de negcio, isto , os servios disponveis
para o EJB e dessa forma, poder execut-los para as operaes desejadas.
("* /
' - /"/
3
3
' $ - ,+ $
) + + ! - * ) $
Deve-se utilizar um Session Bean quando deseja-se prover servios a seus clientes, sendo
que estes servios sejam transacionais e seguros, rpidos e eficientes. Session Beans
apresentam uma forma de executar a lgica de negcio do lado do servidor, com
todos os ganhos que um servidor de aplicao apresenta e vistos nos captulos
anteriores dessa segunda parte do livro.
-.-
-.-
6".8#"4".#F G"
-.-
;:EL)
-.-
-.-.-
&*F
"
!9!&#Q
# N
E#
E:.
/ 8Q8#K85'
!9%8#QQ&
#Q&E!"
#D!58E
"0
-.-* !9%8#2F7E
8#
' #!L#!9!&QE"4Q&$
# "E#E"
#QD#!G9LD!. GE#
"
5J#%9!) EQE#LE
;
-.-
"
-.-
IFJ> ;
-.-
;
& ' MQEJ
#!' JD!9%8! 9#!4
FJE#!"$&.5 1 9"F 9%D! LE
/ #"."Q 9>#9
' N#!F
"
$#D5)"."
!' DQE"
0
-.-
"
-.-
-.-
EJ)
-.-
-.-
! #"2
/ & &#K&5'
/ #"."Q 9>#9
8!N#!/
0
-.-
"
-.-
&B#"$8#/#Q8EJE!##
-.-
-.-
-.-
! #"2
/ #"2" 9/#9
'E#/ ;",
N #QF7Q
8E"
":.#D!5$"."
EJ)
/ & &#K&5'
/ #"."Q 9>#9
8!N#!/
0
-.-.-
/ #".", !9+#9
9K& <(5$0D98#Q87E
F
"2#"."Q 9
98#
D98# &JE
/
9"2#"."Q 9
98#Q R
9&#Q&
0
-$-
-$-
35#J
F;K8.96#D#!4""2#5"
#6"0"
#!) G"
D' #!9%8#"Q
Instncia do EJB
Session Bean
Stateless ainda no
existe
1. Class.newInstance()
2. setSessionContext()
3. ejbCreate()
ejbRemove()
Session Bean
Stateless pronto ou
mantido no pool de
objetos
Figura 12.2
Execuo dos
mtodos de negcio
)
+ + ! - * ) $ - $ ) 1
O
EJB Session Bean Stateful so componentes que mantm o estado dos seus atributos e
um relacionamento forte com o cliente que o utiliza. Se a execuo termina ou se o
cliente solicita a remoo da instncia deste EJB para o container, a sesso finalizada
e o estado perdido, isto , o valor dos atributos configurados pelo cliente para este
EJB so perdidos e em uma prxima utilizao estaro com seus valores nulos.
Este tipo de Session Bean, diferente do Session Bean Stateless, mantm os valores dos
atributos entre vrias chamadas aos seus mtodos de negcio (ou servios), sendo
assim, o cliente pode configurar os valores dos atributos do Bean atravs dos mtodos
setters e assim o EJB pode utilizar estes valores para os mtodos de negcio.
-.-
-.-
6".8#"4".#F G"
"
' #!L#!9!&QE"4Q&$
# "E#E"
E#
-.-
;:EL)
-.-
' #
-.-
EL)
#Q&E!"
"0
8#
!9!&#Q
-.-
-.-
&*F
"
!9%8#QQ&
35#J".#
J9!) E"
#!963598
N#)8
96J#!
#D!58E
-.-
56
/ & 9<
8#
/ #"."Q 9>#9
98#Q8JE
-.-
/ 88#K 5O'
# N
B $
#QD#!G9LD!. GE#
"
5J#%9!) EQE#LE
;
0
"
;
& ' MQEJ #!' JD!9%8! 9#!4 FJE#!"$&.5 1 9"F 9%D! LE
-.-
0
-.-
"
-.-
-.-
EJ)
/ & &#K&5'
0
-.-
"
-.-
&B#"$8#/#Q8EJE!##
-.-
'E#/ ;",
N #QF7Q
8E"
/ #"2" 9/#9
":.#D!5$"."
EJ)
/ & &#K&5'
0
-.-
/ #".", !9+#9
9K& <(5$0D98#Q87E
-.-
F
"2#"."Q 9
98#
D98# &JE
!98# /
# "."Q 9
/
9"2#"."Q 9
98#Q R
9&#Q&
0
-.-
-.-
9J#+R
0
-.-
N#
-.-
F#&5.9L'
5N' D
EJQ.. N658
EJQ.. N5!8
.#)5$9
J'
9J#
9%J#%
9
#!
D9K& <(5$QE!
-.-
-.-
35#J
$;K8.96#D#!4"0" #!5%"
#6!"".#) G"
D!' #!9%8#"Q
!# ) , ! $
,) + + ! - * ) $,- $ ) 1 ,
@
Instncia do EJB
Session Bean Stateful
ainda no existe
1. Class.newInstance()
2. setSessionContext()
3. ejbCreate()
ejbRemove()
ejbPassivate()
Execuo dos
mtodos de negcio
ejbActivate()
Figura 12.3
"!
#%$&'#)(+*,.- /1032"465879:7<; =>-?356/A@
Entity Bean so Beans de Entidade, isto , representam entidades persistentes. Em outras
palavras, so componentes de negcio com mecanismo de persistncia de dados.
O estado do Entity Bean pode ser persistido em um banco de dados relacional, arquivo
XML alm de outros tipos de repositrios de dados. Isto quer dizer que o estado do
Entity Bean mantido alm do tempo de vida da aplicao ou do servidor J2EE. Esta
uma caracterstica muito til em situaes onde deseja-se utilizar os dados desta
entidade em momentos que seria invivel mante-los em memria.
Existem dois tipos de Entity Beans:
Bean-Managed Persistence.
Container-Managed Persistence.
Home
Remote
EBExampleHome
EBExample
<<inst antiate>>
create()
findByPrimaryKey()
<<EJBRealizeHome>>
<<EJBRealizeRemote>>
<<EJBEntity>>
EBExampleBean
EJB_Contex t : Ent ityContext
<<EJBPrimaryKey>>
EBExampleBean()
ejbCreate()
ejbPostCreate()
ejbAc tivate()
ejbPassivate()
ejbLoad()
ejbSt ore()
ejbRemove()
setEntityContext()
unsetEntityCont ext()
Figura 13.1
<<EJBPrimaryKey>>
EBExamplePK
hashCode()
equals()
toString()
Deve-se utilizar o EJB do tipo Entity Bean quando seu estado precisa ser persistido. Se a
instncia do EJB no estiver ativa ou se o servidor de aplicaes for derrubado, pode-se
recuperar o estado do mesmo, pois estar persistido na base de dados. O que torna os
Entity Beans diferentes dos Sessions Beans que primeiramente o estado do Entity Bean
salvo atravs de um mecanismo de persistncia, alm disso possui uma chave
primria que o identifica.
8.8 R
8.8
% H62A5)DS@EC+"
9Q <"#
9 + ,- ,0/=<"+$<">?"T , :)D$ U:- V;:)D"2P- NW $XG )2JH'- HJ,F"+"- K:)
)%"* ,"Y0T2L! NW ETE,@Z( - BNW D ,#[:" 5H.)2- !$"( "!+ ,G:)+) H.,G"H !\ ,G :)HPT
] )2.!K:"
] B)2- H6H.)#
] - )( :fcE1
] - )( :)gi1
8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)* ,G)!k!l!U"2.- Km )2JH- HL,GDH6@ZH:" :"HP#
8.8
8.8
8.8
2J!
8.8
2J!
+)- KS@"$- :Z+ ,- ] - ;$E%"* ,JC )2JH- HL,- :)"#)" :)DH62+)@Z( ( #
2J ,@)2.+^Z65
,^)2J dH
* 65# ( +
V# e,A2.- +
m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +
] - )( :fcZT
* 65# ( +
V# e,A2.- +
] - )( :EgiYi,^)2L
H ` .
2 "6,J 9 &'
,- +$_
"@)%)( -
8.8
9Q <)#
8.8K9 & @ ,G :"C )( )+ ,G"- +")2M U"H26- N'WED:)
8.8
8.8
9)Q <"#
,^)2J dH
"@)%)( -
8.8K9 & @ ,G :"C )( )+ ,G"- +")2"2LD2L!$5)E2$%)* ,JC""2.H6- HA,A- :""#
] - )( :EgiY
8.8
,^)2J dH
8.8
] - "( :fcE#
"2J!
,^- H'# ] - "( :fc
] - )( :fc"1
8.8
] - )( :)g
"2J!
] - "( :)gi#
8.8R
%,\"!
8.8
] - )( :)g 1
] - )( :fc"#
] - E( :fc"#
8.8R
%,\"!
8.8
] - "( :icE1
] - )( :)g #
] - ( :)g #
"@)%)( - D* 5# ( +
V# e,A2.- +
$
, [- ( :g X0Y _
2.,A@)2L+
] - "( :icEY _
] - "( :Egi1
] - "( :EgiY _
!$( !"+
,GNW
D:)$!\
,G:);:)DH6)( "N'WED:"$)%"*
,G$"( KHP@ZK^Z5)G)2L- !2L- #
2J! ] - "( : cD^"5E3)2.- !2.- ;: 9"Q <"#
8.8 2J
,@)2.+^Z65$)2.- !
2.- ;: 9"Q <"#
8.8 ,^)2JdH
- +":")2 9 &,- "+262.m( "( - B"2 9Q <"#
"@)%)( -
* 65# ( +
V# e,A2.- +
m)* %)
- +":)</E?)2L- !23/Z /X0* 65# ( +V# e,26- +
] - ( :fc"Y
,^[2J H)
- +):""2 9 &"
,- "+$_
8.8
8.8
8.8
8.8
2.,A@)2L+m+)@)( ( 1
8.8
8.8
8.8
8.8
8.8
8.8
8.8
9 + ,- ,0/=<"+)#
K+[@)( ( 1
8.8
9 + ,- ,0/=<"+)#
"@)%)( - 5[- :$H6 , 9 +E,- ,G/ ` + ,G &6,AX 9 + ,- ,G/ ` "+ ,&P,ME+,A- ,0/ ` +,G&6,AY _
` + ,J&6,A1
k
A figura 13.2, representa o ciclo de vida dos Entity Beans BMP. Todos os mtodos so
chamados pelo container para o bean. Para criar um novo Entity Bean utilizado o
mtodo create e para remov-lo necessrio executar o mtodo . Pode-se
carregar um Entity Bean usando os mtodos de busca do entity bean ( ! "#$% , '&)(*+ ",#
1. Class.newInstance()
2. setEntityContext()
unsetEntityContext()
ejbHome()
ejbFind()
Entity Bean BMP no
pool de objetos
1. ejbCreate()
2. ejbPostCreate()
ejbRemove()
1. ejbPassivate()
2. ejbLoad()
1. ejbStore()
2. ejbActivate()
ejbStore()
Executa os
mtodos de negcio
ou ejbFind()
C
#%$& 485679 7 ; = - ?35 2 587 ?39 5 - ? 58? .- >- 1/ 9 / 7<->5 1Figura 13.2
E
Entity Beans CMP (Bean de Entidade com Persistncia Gerenciada pelo Container)
oferecem mais rapidez e facilidade no desenvolvimento de objetos persistentes pois o
desenvolvedor no precisa escrever os comandos para persistir e manipular os dados.
O container se encarrega de realizar estas operaes e retornar os valores desejados.
Ele faz isso para as operaes triviais tais como insero do objeto, remoo,
atualizao e seleo pela chave- primria ( , , $ , % e ) ",#
)
respectivamente).
9Q <"#
8.8
- !$"( "!+ ,G:)HE( CZ2JU)2L- ;)+ ,- +")2.T"H6+Z:"DS)@ZKm)2J V2L!:"E2+"W $)2J"- HP
8.8
8.8
8.8
9
` >?#
9 < ` >? 9 &!$"( <
"+$- !m"( !+,GH
"26- 56,G
8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)* ,G)!k!l!U"2.- Km )2JH- HL,GDH6@ZH:" :"HP#
8.8
8.8
8.8
2J!
8.8
2J!
+)- KS@"$- :Z+ ,- ] - ;$E%"* ,JC )2JH- HL,- :)"#)" :)DH62+)@Z( ( #
2J ,@)2.+^Z65
,^)2J dH
"@)%)( -
* 65# ( +
V# e,A2.- +
m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +
] - )( :fcZT
* 65# ( +
V# e,A2.- +
] - )( :EgiYi,^)2L
H ` 2."6,J 9 &'
,- +$_
8.8K9 & @ ,G :"C )( )+ ,G"- +")2M U"H26- N'WED:)
8.8
8.8
9)Q <"#
,^)2J dH
"@)%)( -
8.8K9 & @ ,G :"C )( )+ ,G"- +")2"2LD2L!$5)E2$%)* ,JC""2.H6- HA,A- :""#
8.8
,^)2J dH
9 &",.- "+$_
] - )( :EgiY
8.8` )+ ] - V@)2L 5[( )2:)D6,.2P- %"@
,
8.8R
] - "( :fcE#
8.8
8.8
9)Q <gi#
] - "( :)gi#
8.8
8.8
9)Q <gi#
"@)%)( - K%EH.,2L, 5[E- :$HP, )- )( :)g X0* 65# ( + # e,2.- +
8.8R
%,\"!
8.8
] - ( :fc"Y01
] - )( :fc"#
] - E( :fc"#
"@)%)( - K%EH.,2L,4* 5E# ( + V# e,2.- + $ , Z- "( :fc"X0Y01
8.8R
8.8
%,\"!
] - )( :)g #
] - E( :)g #
"@)%)( - K%EH.,2L,4* 5E# ( + V# e,2.- + $ , Z- "( :)g X0Y01
8.8
8.8
8.8
8.8
8.8
8.8
8.8
9 + ,- ,0/=<"+)#
K+[@)( ( 1
8.8
9 + ,- ,0/=<"+)#
` + ,J&6,A1
A Figura 13.3, representa o ciclo de vida do Entity Bean CMP. Ele praticamente o
mesmo de um Entity Bean BMP, sendo que a nica diferena que pode-se chamar o
mtodo ejbSelect(), tanto nos beans que esto no pool quanto nos que esto ativos.
1. Class.newInstance()
2. setEntityContext()
unsetEntityContext()
ejbHome()
ejbFind() e
ejbSelect()
ejbRemove()
1. ejbPassivate()
2. ejbLoad()
1. ejbStore()
2. ejbActivate()
ejbStore()
Executa os
mtodos de negcio
ou ejbFind() e ejbSelect()
C
%# $& - ? 9:2>5.? -587<2 4 = 465879:7<; >= -?35
Figura 13.3
+
) &
/0
1$
Um entity bean pode se relacionar com outro, como um relacionamento entre duas
tabelas de um banco de dados relacional. A implementao de um relacionamento
para entity beans BMP feita por meio da codificao na classe de negcio do EJB,
enquanto para os entity beans CMP o container se encarrega de oferecer os
mecanismos de relacionamento atravs dos elementos de relacionamento definidos no
deployment descriptor.
+
)
" )
".
,%) -&
(
,
1$
B
B
*%
&
,
) &'
.
$.
0
1$
.
, caso o
da interface local do objeto relecionado sendo um relacionamento
relacionamento seja o tipo retornado pode ser ou & , " ou & , .
Sempre que tivermos campos de relacionamento no entity bean no devemos invocar
o seu mtodo set no +&)( , ele deve ser invocado no mtodo $& ( % ou atravs dos
mtodos set e get que estiverem disponveis na interface local. Exemplos:
Relacionamento bidirecinal:
Esposa
Marido
marido
esposa
Figura 13.4
Neste caso podemos ver que os dois entity beans podem navegar e acessar as
informaes sobre o entity bean relacionado, s para visualizar iremos agora mostrar
como ficariam as configuraes no deployment descriptor.
"* % J2J)( ,- )+"HP^Z- G2L( J+Z'!l 9 H H6 "( ,- +EHP^)- ""(
!$2
!$2
] - "( :
8 !$2
"* % J2J)( ,- )+"HP^Z- G2L( J+Z'!l>2.- :" ""( 6,- +EHP^)- ""(
8 )* % 3+)!
!$2
] - ( :
8 "* % 3+"!
] - ( :
8 !$2
Na verdade no ser precisa digitar todo esse cdigo xml para criarmos os
relacionamentos pois existem ferramentas que fazem isso por voc, mas voc deve ter
idia de como funciona e o que configurado nesse arquivo.
A tag $ )) #" configura o nome do campo do ejb nos quais sero criados os
mtodos get e set que estaro disponveis na interface local, caso configuramos a
multiplicidade , se fssemos configurar
por exemplo deveramos trocar a tag
para many e acrescentaramos a tag $ )) #
como o exemlo mostra a
seguir:
] - ( :
!$2
!$2
Neste caso voc pode escolher se o tipo retornado ser & ,
Esposa
.
Marido
marido
Figura 13.5
* % G2LE( ,- E+EHP^)- 32J)( J+"! 9 HP" H. ""( ,- +ZHP^)- ""(
!$2
!$2
'
* %G 2L)( ,- )+"HP^)- G2J)(
8 "!$2
8 * % G+""!
' ] - "( :
] - ( :
* % G2LE( ,- E+EHP^)- 32J)( J+"!>2L- :" Z( 6,- "+"HP^)- "(
8 )* %32.)( ,- )+
8 )* % G+Z!
#%$& 4 A=
D
(
)
Devemos utilizar EQL para implementar os mtodos de busca de seus Entity Beans CMP
que no seja a partir de sua chave-primria ( ! ",#
), pois este j oferecido
automaticamente pelo container.
Um comando EJB-QL contm trs partes:
&)
) 3+
!
A clusula * ela define o domnio de uma consulta, indica qual parte de uma base
de dados voc ir consultar. No caso de uma base de dados relacional, a clusula *
tipicamente restringe quais tabelas sero consultadas. Por exemplo:
e 9
9"`dR
b
R >
e
Aqui estamos declarando uma varivel na clusula * . Esta varivel o pode ser usada
posteriormente em outras clusulas desta mesma consulta, neste caso estamos
reusando a varivel na clusula .
Algumas vezes precisamos declarar variveis na clusula
conjunto de valores:
e 9
9"`dR
R >
*!
que representa um
eET
X # - ,G"!$HPYi
&%
A frase #" o declara a varavel o que representa os entity beans , e a frase $ %' a
declara a varivel a que representa uma coleo de items do entity Bean . Ento AS
usado quando a varvel declarada representa um nico valor e $ usado quando a
varivel representa uma coleo de valores.
&)
) +
e 9
9"`dR
R >
? "H.H6D
)# +E!
fc
Esta consulta recupera todas as pessoas que possuem o atributo nome igual ao
parmetro que ser passado no mtodo. Por exemplo, o mtodo poderia ser
construdo da seguinte forma:
] - +":)< /
clulua * :
e 9
9"`dR
R >
? "H.H6
emT
Algumas vezes voc pode declarar mais de uma varavel que representa o mesmo
entity bean. Quando fazemos comparaes este artifcil muito til:
e 9
9"`dR
R >
9
< Q)9E` X
c"Y
? "H.H6KfcET? "H.H6K)g
;g
fc"# - :):"
# - :":)
"g # +""!
Q 'W
&)
)
A clusula
e 9
9"`dR
R >
&
? "H.H6DZT
X # "2J+,H6Y
e 9
9"`
( # "2J":)@ ,G"H
R >
9
HK2.T
X32.# - ,"!HPY (
Como voc pode ver podemos utlizar o ponto para acessar relacionamentos na
clusula . Este cdigo interpretado para um SQL-padro onde um JOIN feito
para recuperar os dados desejados.
Perceba que nest exemplo no utlizamos a notao (& ' , ele apenass utilizado
quando se trata de uma varivel simples que no faz uso do ponto para acessar
informaes por meio dos relacionamentos entre entity beans.
%
e 9
9"`
R >
2P# - ,G"!H
Z
2.
em2
9"`dR
Z
R >
2.
em2.T
X02.# - ,!lHPYi
9"`
i`
e
( # 2L:)@ ,G"H
R >
em2.T
X02.# - ,"!HPY
&
que no
Agora a seguir temos um exemplo de como um mtodo definido no arquivo +&)( &
pode ser acessado por meio das interfaces e/ou do EJB. Na interface o
mtodo estaria assim:
@[%"( -
H )- +":""2 9
Este mtodo vai retornar todas as pessoas que tem o nome passado como parmetro.
No arquivo +&)( & temos:
## #
S)@")23/
!$,^"": 3"2L!H
8 !$,^) : G 2L!H
`
8 )* % 0S(
[b
fb
e
9
9"`
!
!l,^"": G "2.!
S)@")23/
## #
8 !,^" : G "2J!
R >
? "H.H6
e$
9
+Z!
c
! !
) "!
So um tipo de componentes EJB que recebem mensagens por meio de um JMS (Java
Message Service).
Enquanto tradicionalmente os outros Beans so acessados atravs de interfaces (RMIIIOP) com acesso sncrono, os Message-Driven Beans, tambm conhecidos pela sigla
MDB, so utilizados por meio de mensagens, com acesso assncrono.
Isso se d por meio de um middleware orientado a mensagens (MOM), localizado entre
o cliente, % %
# , e o bean, $% %
+ "% . Este middleware recebe mensagens de
um ou mais clientes e envia as mensagens para os Beans destino.
JMS a API utilizada para receber as mensagens dos clientes e enviar as mensagens
aos Message-Driven Beans.
O estado do objeto muito simples e semelhante a um EJB Session Bean Stateless que
no mantm o estado para um cliente em particular. Quando enviamos uma
mensagem para invocamos um Message-Driven Bean, o estado de suas variveis se
mantm apenas durante a invocao. Quando o processamento requerido
finalizado o estado no retido. So componentes que no esto associados a um
cliente especfico e, portanto, implementam comportamentos que atendem a
necessidade de muitos cliente.
<<EJBMessage>>
MDBExampleB ean
EJB_Context : MessageDrivenContext = null
MDBExampleBean()
ejbCreate()
onMessage()
ejbRemove()
setMessageDrivenContext()
Figura 14.1
'
8.89 .
H ,G 9)Q <;
&'"!$)( ;:)K,.- "$>"H.H.[
2P- 5+$<E+)TZ)2J"H.)+
,GK"HK!\
,G:)
H J":)2W
8.8 :)- ( :)K5 - :)K)* % ` 2.
,G)X0Yi$)* % ""!5)X3Yi$m!\,G
:)K)+)>H6H.6 X0Y
8.8
)2.- 5),G$>H.H66
8.8
8.8
<"#
9Q <"#
,^)2J dH
8.8
9)Q <#
8.8
<#
R >#
_
8L8
,^
8.8
"@)%)( -
2L- 5)"+$<"+)#
2J!I!$H6H.6
!$ H.HP6
<"#
m
Esta prtica desaconselhada pela prpria Sun MicroSystems Inc., pois recai em vrios
problemas, um deles a falta de controle dessas execues por parte do container,
perdendo assim as facilidades e ganhos que o container oferece.
Para sanar este problema, foi criado o EJB Message-Drive Bean que pode ter vrias
instncias de um mesmo componente sendo executados em paralelo, para realizar a
mesma operao.
k
m
A Figura 14.2, representa o ciclo de vida do Message-Driven Bean. Ele bem simples
comparado aos outros beans, pois o container instancia um determinado nmero de
beans e os mantm no pool de acordo com as necessidades e removidas quando o
container decidir, da mesma forma que o Session Bean Stateless. Assim que uma
mensagem recebida pelo JMS, ela redirecionada para um bean especfico, para
que seja tratada.
Instncia do EJB
Message-Driven Bean
ainda no existe
1. Class.newInstance()
2. setMessageDrivenContext()
3. ejbCreate()
ejbRemove()
Message-Driven Bean
no pool de objetos
Figura 14.2
onMessage()
P1
MOM
Figura 14.3
P2
MOM.
A arquitetura JMS composta por cinco partes que so: Provedor JMS, que
implementa as interfaces definidas na API JMS e prov recursos para administrar esse
servio; os clientes JMS que podem ser programas ou componentes que agem como
produtores e consumidores de mensagens; as mensagens propriamente ditas que so
objetos que transportam os dados do cliente para o receptor; os objetos de
administrao do servio JMS que so utilizados pelos clientes para enviar as
mensagens; e os clientes nativos que so clientes que usam produtos de Messaging
nativos e no da API JMS.
A seguir vamos detalhar os dois tipos de postagem de mensagens e enteder as
diferenas entre eles.
B
B
Point-to-Point
Publish/Subscribe.
$
O conceito de mensagens Point-To-Point PTP de enfileirar as mensagens para
serem consumidas. Os produtores enviam as mensagens para uma determinada fila
(Queue), que so consumidas por um destinatrio. Assim que receber a mensagem, o
destinatrio avisa ao MOM que a mensagem foi recebida e processada corretamente
(sinal de acknowledge). A fila armazena todas as mensagens que so enviadas, at o
momento que so consumidas pelos receptores, ou at o momento que forem
expiradas.
Observe ainda, que vrios consumidores de mensagens (muitas instncias do mesmo
consumidor) podem consumir mensagens do MOM. Este recurso normalmente
Producer
QUEUE
Figura 14.4
1
1
Consumer
M OM
Point-To-Point (Queue).
&
1
"
&
Consumer 1
Producer
TOPIC
Consumer 2
M OM
Consumer 3
Figura 14.5
Publish/Subscribe (Topic).
"
A seguir apresentamos um exemplo simples do envio de mensagens por um cliente
" e o recebimento das mensagens por um Message-Driven Bean % .
""2JKH6)2)+"H6@)!$- :"K"2@)!I>
,A23/
<"#
] - ( DX S)@Z@""Y
"2J[HPY _
+)@( ( 1
+"
` +E,G &P,a,G&
8L8
( "( - BK"+)+Z,- )+
] 6,)23/
8L8
X
@Z@"S)@"@Z
@"@"
! GY01
8L8
26- K+Z&'W
S@""@"
S)@Z@" ` "+)+",- +
8L8
8L8
9
9 Y01
26- K$H6+":)"2
8L8
&,> HPHL6VD!lH6H.6
] )2X0- +E,a-
i1-
&,> HPHL6V"X0Y01
1[- )Y _
,^
X 9 &",A- "+)Y _
2J EX0Y01
X S)@""@) ` +[+",- )+
,A2/
+)@)( ( Y
_
_
SE@Z@E ` "+)+""6,- +)# ( H6X0Y01
,^
Y01
8.8
8.8
<"#
&,>H6H.6V
+)@)( ( 1
8.8
8.8
8.8
9)Q <>
2J!,G&+E,G &P,JD:"m>
;,G&1
<"#
<"#
8.8
8.8
_
-]
&6,>HLHP6"Y _
<
)( HP$_
,^
X 9 &",A- "+)Y _
2J EX0Y01
"!
"!"#%$&
ZH ! ` `#" ` ` $%
& '()+* `
+)-$. _
$% DH&0/ KH& DH,$ +
$
$H1
`
,%+"H *
/ 3
e "H,$4 5 " b $
H, 7 '8$$H$% 1 9)-$ .;:
'2) " )+<=$.;:
+ '()
6-
A necessidade da primeira propriedade pode ser logo vista nas duas ltimas operaes
do mtodo de transferncia entre contas correntes. Caso logo aps a primeira
operao ser processada ocorra uma queda do sistema, por falta de energia eltrica,
por exemplo, o montante ser reduzido da primeira conta mas no ser creditado na
segunda. Isto significa que o montante iria simplesmente desaparecer, tornando a base
de dados do sistema bancrio inconsistente.
A segunda propriedade diz respeito demarcao dos limites da transao. Ela
garante que uma transao conter um mtodo de negcio completo. Assim, no caso
do mtodo de transferncia entre contas correntes, no seria possvel inclir a operao
de dbito em uma transao e a de crdito em outra, pois neste caso ao final da
primeira transao o sistema estaria inconsistente.
O isolamento diz respeito a tornar a execuo em paralelo de transaes
independentes. Como a consistncia s garantida no trmino de uma transao,
possvel que durante sua execuo o sistema esteja num estado inconsistente (no
exemplo esta situao seria atingida no momento aps a operao de dbito e antes
da operao de crtido). Assim, caso uma outra transao seja iniciada enquanto
uma primeira ainda no terminou, possvel que seus resultados no sejam corretos,
uma vez que a premissa da consistncia que o sistema estaria inicialmente
consistente.
A ltima propriedade trata da confirmao dos resultados efetuados pelas transaes.
Neste caso, aps a confirmao das operaes, seus resultados so efetivamente
armazenados em meios persistentes. Assim, garantido que em caso de falhas no
sistema aps o encerramento da transao, seus resultados ainda podero ser vistos
aps o restabelecimento do sistema.
O uso de transaes traz muitas vantagens e garante a integridade dos dados, mas h
um custo alto em utiliz-las. Os controles que so utilizados para garantir as
propriedades ACID podem tornar uma aplicao lenta de tal forma que se torne sua
utilizao invivel. Assim, este recurso deve ser usado de forma consciente, ficando a
cargo dos desenvolvedores determinar as operaes de negcio que necessitam de
transaes e as que no. Ele tambm deve determinar a melhor forma de agrupar as
operaes em transaes.
Na especificao J2EE h duas formas do desenvolvedor informar aos containers EJB
quais so as operaes transacionais e como elas devem se comportar com relao s
outras: uma forma programtica e outra declarativa. A primeira forma consiste na
incluso no cdigo fonte dos EJBs instrues para que as transaes sejam iniciadas e
terminadas. Uma vez que o controle todo de quando as transaes iniciam e so
concludas faz parte da especificao do bean, este tipo de delimitao chamada
de BMT (Bean Managed Transaction).
A forma declarativa de determinar os limites das transaes feita atravs de
instrues nos arquivos descritores dos EJBs. Desta forma, o prprio container fica a par
da existncia das transaes no momento do deploy e capaz de controlar sua
execuo. Este tipo de transao chamado de CMT (Container Managed
Transaction) e permite um elevado grau de flexibilidade para mudanas na poltica de
controle de transaes da aplicao. Os dois tipos de transaes sero discutidos com
detalhes nas prximas sees.
Transaes BMT (Bean Managed Transactions) ou programadas permitem maior
controle por parte do desenvolvedor, pois ele que insere em seu cdigo instrues
que indicam o momento em que a transao foi iniciada, o momento em que ela foi
concluda com sucesso ou que ocorreu um erro e a transao deve ser abortada.
As instrues para o controle das transaes so disponibilizadas numa API chamada
JTA (Java Transaction API). Ela permite o acesso transparente aos mais variados
gerenciadores de transaes disponveis nos containers. A implementao da Sun para
tal API o JTS (Java Transaction Service).
A comunicao com um gerenciador de transaes se inicia com a obteno de uma
referncia para a interface javax.transaction.UserTransaction, que feita atravs do
contexto do EJB. Esta interface permite enviar comandos para delimitar o incio de uma
transao (begin), concluso com sucesso (commit) ou solicitar que as operaes
realizadas sejam descartadas pela ocorrncia de falhas (rollback). Abaixo um exemplo
de uso de uma transao gerenciada pelo bean em um mtodo que realiza a
transferncia de um montante de uma conta corrente para outra.
( !%)H!% $ 2$H &$"H " &$-$% ')+*
&-H% >*$ )-.
&(&5 "H& H ZH & 9 ;H,"H.H 2<5 '2 H, %"H& " .;:
!
/(!
$
" .;:
Este tipo de transaes pode ser utilizado apenas Session Beans e Message Driven
Beans. Os Entity Beans exigem um maior controle do container sobre suas aes e
portanto no tem disponvel o gerenciamento de transaes feito por ele prprio.
>)-
$
)
) /$)- ) /)
)+< /
Transao do Cliente
Transao do Bean
Nenhuma
T2
T1
T1
Nenhuma
T2
T1
T2
Nenhuma
Exceo
T1
T1
Nenhuma
Nenhuma
T1
Nenhuma
Nenhuma
Nenhuma
T1
T1
Nenhuma
Nenhuma
T1
Exceo
Required
Requires New
Mandatory
NotSupported
Supports
Never
!"#%$'&())*(&%+&($-,+./&.0 &'$(%*'(1,2-*%-,30
&$
"!
Em uma aplicao J2EE, h duas formas que os clientes devem ser avaliados no acesso
ao sistema e aos componentes que ele utiliza. Para um cliente acessar um sistema,
inicialmente ele dever estar autenticado no mesmo. Autenticar um cliente significa
que o sistema deve verificar se o cliente quem ele diz que . Para isso o mesmo
dever fornecer algumas informaes como usurio e senha, ou algum cdigo de
acesso ou algo parecido. O sistema autenticar o usurio e sendo assim, associar o
mesmo a uma identidade de segurana pr estabelecida, tal como um perfil de
administrador, coordenador ou atendente por exemplo.
Assim que o usurio autenticado e acessa o sistema, este ltimo dever apresentar
formas de autorizar o usurio a acessar operaes do sistema vlidas para o seu perfil
de usurio. Por exemplo, se o perfil do usurio de atendente, o mesmo no poderia
acessar a operao de relatrios gerenciais.
A autenticao feita antes de realizar as operaes nos EJBs e veremos mais adiante
as formas que podem ser utilizadas para tal. J a autorizao realizada durante a
chamada de mtodos dos EJBs, que permitem ou negam o acesso de determinado
perfil de usurio.
Veremos a seguir uma breve explicao da API JAAS e como utiliz-la
JAAS (Java Authenticated and Autorizated Service) apresenta interfaces que
possibilitam que usurio sejam autenticados e autorizados em aplicaes J2EE. Com
isso, permite que o usurio acesse sistema e operaes dele, no importando como
implementado pelo fabricante do servidor J2EE. E assim, o servidor J2EE se encarrega
de localizar os dados dos usurios que esto aptos a acessar o sistema, o perfil de cada
um, possibilitando os mesmos de acessarem operaes especficas oferecidas pela
aplicao em questo.
Um usurio poder acessar um sistema e estar autenticado para o mesmo, sendo ele
uma aplicao Web ou uma aplicao standalone. Isso dever ser transparente para o
usurio, sendo que a aplicao J2EE poderia prover as duas interfaces para o usurio
com as mesmas funcionalidades.
Em verses mais antigas da especificao EJB no havia uma API que definia os
servios necessrios para operaes de segurana. Com a criao da API JAAS isto foi
possvel e autenticar um usurio ficou mais simples e portvel.
Com foi dito anteriormente, um usurio poder acessar um sistema por uma interface
Web ou standalone, sendo que a aplicao dever prover os mesmos recursos para o
usurio. Em interfaces standalone, a autenticao parece ser mais simplista, tendo a
aplicao que utilizar a API JAAS para autenticar o usurio, a partir das informaes
fornecidas pelo mesmo.
Em interfaces Web isto tambm necessrio, sendo que o usurio tambm dever
fornecer informaes como usurio e senha para o servidor Web que ir verificar a
autenticidade da informao. Para fazer isso, o navegador poder apresentar quatro
>/
)
H
/
"H,$)-
H.H
...
Estando cliente autenticado, ele dever ser autorizado a realizar certas operaes
fornecidas pelo sistema, de acordo com o seu perfil de usurio. Para isso, a aplicao
deve estar configurada com security policies ou regras de segurana para cada servio
fornecido por seus componentes, isto , para cada mtodo de cada EJB.
A autorizao pode ser apresentada de duas formas: Autorizao Programtica ou
Declarativa. Na Autorizao Programtica o programador deve implementar a
verificao de segurana no EJB, isto , deve verificar qual usurio est acessando o
servio e validar o mesmo. Na Autorizao Declarativa o container realiza toda a
validao de segurana, no sendo preciso implement-la. Para isso, deve-se
configurar no deployment descriptor as propriedades de segurana para cada EJB e
para cada mtodo do mesmo.
Em um mundo perfeito, o melhor forma a utilizar a Autorizao Declarativa. Haver
casos que ser necessrio mesclar as duas formas de autorizao, sendo que somente
a declarativa no ser suficiente. Por exemplo, se em uma rede de lojas um usurio
com perfil de gerente pode acessar o servios de obteno de relatrios gerenciais,
sendo somente permitido acessar esses dados das redes de uma determinada praa
(regio de So Paulo, por exemplo), se faz necessrio incluir uma validao
programtica da regio da rede de lojas que o gerente em questo atua.
+
$!
( H, % & $ ' > " .;:
+ H 2 " !% ' )-. :
O mtodo
fornece informaes do usurio atual, autenticado no sistema.
Este mtodo retorna o objeto ! "# $ #
% no qual pode-se obter informaes
importantes do usurio, utilizadas para a sua autorizao.
O mtodo & ' ()* verifica se o usurio atual est dentro de uma security
role especfica. Dessa forma, pode-se realizar a autorizao para um determinado
servio do EJB de forma programtica.
Vejamos a seguir um exemplo de deployment descriptor, configurando secutiry roles e
links para as security roles reais. Esta ltima propriedade pode ser configurada, pois em
tempo de desenvolvimento o programador pode definir uma security role dentro do seu
cdigo e depois no momento da instalao do sistema, a security role real tem um
nome diferente, ento cria-se um link para o nome correto.
H&"H.H=
H
% %
%
H% < ! $0EH, % %' H& ,
>)- ,)->&'( % )-
H
HPH%)0 4"
H % <
, HZH
H&"H.H=
% %
H% < ! $0EH, % %'
H& ,
>)- %'(% )
H
)+< / ?%)0 HLH,
) /
)+< / ?%)0 HLH,
) /
?)-
) /
?)-
) /
?)-
)-< /)- % '( $ )- /$?)-
) /
?)-
)-< /)- & #ZH )+<
/ ?)-
) < /%)H '2 )-/$)H
)-< /%)H '2 )-/$)H
)+< /)+ H.H,
"H % < "H+)+H,-5= $ H& ,
)+< /
>)- >
H
)-
) /$)- & "H )-/>)
)+< /
HPH%)0 4"
H % <
, HZH
Em uma aplicao J2EE, teremos com certeza casos em que servios de alguns EJBs
utilizam servios de outros. Dependendo da aplicao, poderamos querer que a
identidade do usurio (perfil) seja propagado para os mtodos que esto sendo
chamados pelos prprios EJB para outros EJBs, ou em vez disso, definir um perfil para
executar um determinado mtodo em um EJB especfico.
H&"H.H=
)-
)-
!
ZH;
?
H
H&"H.H=
H
!
4H
H
%
ExampleLoginModule.java
$
5)+ 7)
+ <'8 ++ B N -0EH, %
ZH HPH%0-%H& )+ )-N*)H)- KH&>7>) -+
- &
N -+) ) $>
+ '
H.H
5)+ <' )+ )-H ' 1>
'
>7 )-NO"H % >H1+)-
" .
> :
,
"H
)
"H
+
)H=/% &
H- )+$?! /- ) $ "H )
H
) $< ZH1"NO"H "H= 4
H '2N -0 <'
)
H%+) 0! B7%
$$ 10ZH,%
( %DH&- N $DH%0 B<1 )IH,>
H.H,*
H,-
H,- ,
<!%- >:
<'
H
( % H,0/$ ;H, "H6H+-! *$ H&- H%+ !
dH <' >5 - H&- /$7-?
/
<!%- >:
(> %- H%+0 <'($ $ )IH
HPH&*$ H+
H+
/ dH <' >5 -5 "N - H&-0 <' /
<!%- >:
>'
ExamplePrincipal.java
>'
)
<
)
<!%0)-:
( % H,++ H, ' > "H*$ H&- H&- !
+ H " & .
"
!/ H,.
% :
% H%$:
<!%0)- H ;" ";" 5)+ . $ . ' #)- " . .;:
<!%0)-:
ExampleRoleGroup.java
>"H$
+"H + 7 )+ )-< N
+)
'
>7ZH, "H
H.H
5)+ % 5)H $5)+ & )9 )-GH
0"H
)
)
<!%- >:
H, "H6H*
)-( 0
)H, '
) )
H "H,
DH&1$ $
-'
(> %H+0)H&
2)- )IH,> "HPH%$*
H,-
H,- ,
<!%0<
(> :
DH+0ZH, 0)-)+- '8%
) )+)+1)H, -$ KH, (
& H, 0)-)+
( %DH&-0)H, 0)-)+%* H&- H&+ $
<!%- >:
ExampleTest.java
5
N + )IH%'2(EN
+ ;)-N7>
+)
>7 >
"
< ,> .
!
ExampleMain.java
H.H
5)+
'
>'2
!
#"
N PO =QMQ7Q SR
para realizar testes e executar exemplos. Assim, a fase de configurao tambm est
completa sem muita dificuldade.
Para executar o servidor de aplicaes Jboss tambm uma operao muito simples.
Execute o prompt de comando do seu sistema operacional e acesse o diretrio de
instalao do Jboss. Entre no diretrio , isto , , e execute o comando
run.bat para iniciar o servidor. Ento deve-se ter o seguinte:
$ . Com
isto, o servidor de aplicaes inicializar, gravando vrias mensagens no console, at
aparecer a ltima mensagem informando que o servidor foi inicializado com sucesso.
Assim, poderemos realizar a instalao da aplicao exemplo que veremos logo a
seguir, que tambm no apresentar muita dificuldade.
R R
:R R
%$ +, M.10 B K
,;0
-8 8 $F($
$& %$
Neste tpico sero analisadas as partes da codificao do EJB Session Bean Stateless,
que faz parte da aplicao exemplo. No detalharemos as interfaces, pois elas s
apresentam o contrato dos mtodos de negcio e ciclo de vida. Os mtodos de
negcio sero brevemente explicados.
O EJB Session Bean utilizado como exemplo, apresenta servios de clculo do desconto
concedido ao usurio e clculo de parcelas para um produto em venda. O nome
deste EJB SalesSupportBean.
dH
Observe que o mtodo ao ser executado, solicita ao container que crie uma
instncia do EJB SalesSuuportBean. Dessa forma o container cria a instncia do objeto,
IR
&( '
(
/ ! H
&( '
/(!
<' 6 H& " '(6 * '( %' .
) $5 < :
<' 6 " <'(6 * $'2 ! )-
H=.
) $5 < :
SR
Os mtodos de negcio
$ e
%
apresentam operaes simples para o
clculo do desconto concedido na venda do produto e clculo do valor de parcelas
de acordo com o valor da venda.
&( ' <' 6 H& " '(6 * '(
.
+>
$'2 " > " . " " .
%
&( ' <' 6 " <'(6 * $'2 ! )-
H=.
+>
$'2 " > " . ! )-"H " ?. . :
)
e o nome da classe que implementa o EJB em questo. Depois informado o tipo
de EJB Session Bean, que pode ser Stateless ou Stateful e por fim o tipo de transao,
isto , se ser gerenciada pelo Container ou pelo Bean. Por fim definido o tipo de
transao utilizada para cada mtodo especfico do EJB. Deve-se fazer referncia ao
EJB que se est definindo as propriedades de transao, pelo seu nome anteriormente
definido e a seguir, definir para cada mtodo o tipo de transao que este se
enquadrar. No nosso caso utilizamos um asterstico, com isso todos os mtodos do EJB
informado utilizaro o mesmo tipo de transao que foi definida como Required.
H"H.H
( H= >)- H (! H, ?)-
>)- H ! >)-
/>)- ) % & H"H.H,
H )- /$)-
%) & ) & H
HPH,
H ! )-
; H6H ) % & HH6H, H >
; H6H
,H "H.H
) /
Z
H
?& & > )H&? ,
!%)H% &!
%$ +, M.-0 B K
&$
,0
%$ %
Iremos agora detalhar um exemplo de EJB Session Bean Stateful, utilizado na aplicao
exemplo. No sero detalhados os mtodos de ciclo de vida da interface )
'
)* neste tpico, pois o mesmo j foi abordado no tpico anterior e o seu
comportamento o mesmo. A nica exceo se faz para o mtodo ! , por um
pequeno detalhe que ser mostrado.
( + H " ) & H
"H&&.
/(! H ) $5 < :
&( '
B " .8 / H )-5 (:
( - > & " ) &
> &
% & .
/(! H ) $5 < :
&( '
+)- % < " ) < ( ! &
.8/ dH $)-5 < :
&( ' <' 6
H , " . /% H >)-5 $< >:
(
H " . / H >)+<$5= <! :
& &
H&
"H&:
O mtodo ! do EJB SalesBasketBean somente inicializa a Map que contm os
produtos comprados por um determinado usurio.
( - #& " . !/ H #5 <!
/ H H
2
H,/ " ;. :
O EJB SalesBasketBean dispe de um mtodo utilizado par ainicilizar a venda. Para isso,
configura o usurio que estar realizando a compra. Observe que esta operao
poderia ser executada no mtodo ! , passando o objeto & como parmetro
no momento da criao da instncia do EJB.
ZH.
utilizaro. No o intuito deste livro detalhar Design Patterns utilizados nos cdigos. Para
maiores detalhes consulte as referncias bibliogrficas.
Aps os detalhes deste mtodo, apresentamos a implementao do mtodo do
SalesServiceLocator que localiza o EJB e retorna a referncia para os seus clientes.
Com a referncia da interface &)
$ ) , podemos realizar a execuo do
mtodo create() para cada produto contido na cesta de produtos. Persistimos cada
produto da cesta do usurio, fazendo isso por meio de um iterador. Este iterador ir
obter cada produto contido na Map e criar uma instncia do EJB ProductBean.
<( '
B " . / dH 5
% & $ )- )+
"
$> & )-.
H ? <$ '2 ZH> " .
' < )- " H ( > &
<!%0
" !%.;:
"
/ #& $5 -5.
/(!
$
5 $ " %
#.;:
" & -H < ! < " . & " .;: /H 5& " .;:.
" $ (.# 5& " .;:
$> &
"
( &
(
. $> & '( > " .;:
"
)- & ( '(< )- " .* ' " .;*( '( H% < " .*
$
<'( " ( '( " .?.;.;:
-5.;:
A seguir vemos a implementao do mtodo
) , da classe '
'
"
, na qual
obtido referncia para as interfaces dos EJBs contidos no servidor de aplicao. Veja
que a operao simples, somente realizando um lookup (localizao) do EJB
solicitado pelo seu nome JNDI. Para efeito de melhora de desempenho, a referncia
para as interfaces Home solicitadas so armazenadas em um cach e podendo ser
utilizadas futuramente em outras chamadas a este mtodo.
> )-.
/(!
<!% " >
)-$. )- 2 / '( " )-.;:
/ " 5 <! -5.
H (> /% B<+
8)- '2 > 2)- " <! '
/(! H )-5 <
$
)-5= " !$
% )- +5<.;:
/
'0-'( + (/$)+ $ <
( + $> & " ) & ($ &
/ H H " $> & *%> &!.;:
&( '
+)- % < " )
.
" / H H < ) " %> & . - .
+>
" .;:
+>
O EJB tambm apresenta o mtodo de clculo do preo total dos produtos contidos
na cesta. Esta tambm uma operao simples, que consiste em iterar todos os
produtos contidos na cesta, acumulando os valores dos produtos e retornando este
valor.
#(
:
" <
H " . <$ " .;:( />H #5& " ;. : .
" > (.# <5 " .;:
0 $
( > ";" ( &
.# '( " .;. '(< & " .;:
+>
%H HLH=
%$
$&
O prximo EJB a ser comentado ser o EJB Entity Bean BMP UserBean. Neste EJB foi
implementado toda a lgica de persistncia e manipulao do objeto. Para realizar a
persistncia em um banco de dados, no precisaremos instalar e configurar um. O
prprio servidor de aplicaes Jboss fornece um banco de dados como padro, que
pode ser utilizado para executar exemplo de aplicaes J2EE. Ento utilizaremos esse
recurso para manter os EJB Entity Beans.
Veremos as interfaces )* ,
)* , &) e que so respectivamente ) ,
& ) , & e
. No iremos detalhar todas, somente a )* e )
, pois as
interfaces utilizadas para acesso local apresentam os mesmos mtodos, somente
suprimindo a exceo.
A seguir temos o contrato da interface )* & )* que apresenta os mtodos de ciclo
de vida do EJB. O mtodo utilizado para solicitar-se uma instncia do EJB para
o container. Neste mtodo so informados os valores do objeto que sero persistidos.
Este mtodo declara as excees
utilizada em caso de erro na persistncia
do objeto, sendo uma exceo de $
) e a )
utilizada para outros erros que
poderiam ser tratados. Veremos mais detalhes deste mtodo, isto , da sua
implementao no prprio EJB UserBean.
O outro mtodo de ciclo de vida definido nesta interface o mtodo
)
& .
Este mtodo utilizado para localizar um objeto persistido atravs de sua chave
primria, que no nosso caso ser o CPF do usurio. Na execuo deste mtodo, no
necessrio utilizar o mtodo
, pois no iremos criar um novo objeto e sim localizar
um objeto anteriormente persistido. Com isso, o mtodo
)
tambm retorna
uma referncia para a instncia do EJB. Declara as excees FinderException utilizada
caso no consiga localizar o objeto atravs da chave-primria informada, e a exceo
)
para outros erros na execuo do mtodo.
$!
H
a interface
&
- apresenta os mesmo mtodos e a nica diferena que os
mtodos no declaram exceo necessariamente.
Vemos os mtodos de negcio do EJB UserBean. So definidos nesta interface os
mtodos getters e setters para o objeto em questo. A nica particularidade da
interface ) em relao a
como dito anteriormente a exceo )
,
sendo que no acesso remoto utilizado em caso de erro na execuo dos mtodos de
negcio que seguem.
$!
H
<!& '+'2 )- " .8!/% dH >)-< 5 :
$H& )+ " <! ' )-.8 /(! dH )-$5 < >:
$H&
HPH " & '0>$%H6H,. / H )-$5= <! :
$H& )+ " <! '0)- .8/ H >)-5 :
" )-*
*
(!H6H,*(>)+ .
#
" *
* * . :
*()-
2 #
$
2
:
?:
:
)+*
< *
("H.H,*
#,
)- $$5 - ) 0 +"H $$
% - >5 -+> -
H
& &
> -'( $> < " .
/(!
$
? .;:
)-5= " ' "H.H' " .. :
$'2 % " <! ' )-* <'(6 * , ' (!HLH=* $'0) .
(
/ ! H % 5 <!
!
.;:
JH!
/(!
$
H)-
" )- .;:
!
MH%
dH
/(!
$
2.;:
O prximo mtodo !
) apresenta a localizao do objeto por meio de sua
chave-primria. A chave deve ser informada para o mtodo e o objeto localizado no
meio persistente e uma instncia sua criada no container do servidor de aplicao.
ento retornado sua chave primria que ser tratada pelo container que disponibilizar
para o objeto chamador a referncia para interface )
ou
, para a execuo
dos mtodos de negcio. A implementao deste mtodo tambm muito parecida
com os anteriores, obtendo uma conexo, preparando o comando ' , realizando o
bind da varivel tida como chave-primria, executando o comando, configurando
cada atributo com os valores localizados no meio persistente e por fim, retornando para
)-
" <'(6 . /(
$'2
dH
!
"H, 1JH
H%
.;:
KH%
!
>
JH!
/(!
$
+ .;:
O mtodo ! executado pelo container quando este deseja carregar os dados
do objeto do meio persistente e mant-lo em memria. Tambm no retorna nenhum
valor, somente atualiza os dados do objeto atual. A implementao tambm trivial
realizando as mesmas operaes dos mtodos de persistncia anteriores.
!
) H% " * /( H $ " .;.;:
"H, 1JH KH% ) 5 " .;:
H%
!
2. :
>
JH!
/(!
> 5 <! " > '0 GH ?.;:
$
SR
O mtodo ! ' tambm no apresenta nenhuma complexidade e muito parecido
com o mtodo anterior. Este mtodo responsvel por atualizar os dados do objeto em
memria no meio persistente, isto , para cada atributo configurado no objeto em
memria, este objeto executado para manter o sincronismo com os dados
persistentes. Observe que este mtodo executa a operao contrria do mtodo !
.
SR
!
.;:
H%
JH!
/(!
$
> 5 <! " > .H& H! <'0 JH ?.:
SR
SR
Observe que a tag posterior a enterprise-beans a tag entity, informando que os dados
que seguem iro informar detalhes de um EJB Entity Bean. As linhas iniciais so as
mesmas, definindo o nome do EJB a ser mostrado e o nome utilizado pelo container
para referenciar o EJB.
%H EH%)lH,*
$ H,
>=)
?)+
/>)- ) & H )- /)-
)- ) & H )-
/) & ) $ H $ )- /)
) H%
>)-
H
H
%$
Vamos agora analisar os detalhes da implementao do EJB Entity Bean CMP ProductBean. Este EJB apresenta as interfaces ) , )
,
)* e
que so
$ ) ,
$
,
$
) e
$
, alm da classe de implementao do EJB
ProductBean e seu deployment descriptor. H uma novidade para este EJB.
Implementamos a classe da chave- primria que se chamada
$
. Como vimos no
exemplo do EJB Entity Bean BMP - UserBean - este no implementava uma classe para
a chave primria, utilizando uma classe da API Java. Faremos diferente neste EJB para
exemplificar o seu uso.
A seguir vemos um trecho do cdigo da interface )
$ )* . Ela define os mtodos
de ciclo de vida do EJB tais como o
, que recebe como parmetros os valores a
serem persistidos no bando de dados e tambm declara as excees
,
quando ocorre algum erro na persistncia do objeto e a ) para outros erros.
Define tambm os mtodos conhecidos como finders, utilizados para localizar objetos j
A interface
) tambm define os mesmos mtodos, tendo a nica difereno de
no declarar as excees remotas - ) .
$> & " , ' )-* , ' "H * $'2 *
$> & 0%> & (. /> H %& $5 * )+<$5= $:
$> & (
% )- > "
> & 0 . / H
( &5 *
) 5 :
A interface )
$
- apresenta os mtodos de negcio do EJB. Neste somente
declaramos os mtodos getters e setters para o EJB Entity Bean CMP - ProductBean.
No iremos detalh-los, pois so muito simples. A interface
$
- tambm
define esses mesmos mtodos, com a nica diferena de no declarar as excees
remotas - ) .
Logo a seguir apresentamos a implementao da classe de chave-primria, utilizada
para o EJB ProductBean. Esta classe tambm no apresenta nenhuma complexidade,
somente apresentando os atributos de chave-primria que no caso somente um id.
Importante salientar que como esta classe ser utilizada pelos clientes remotos, ela
deve implementar a interface ' .
H.H & 0
)+ )-GH B<
O prximo cdigo apresenta a implementao do EJB Entity Bean CMP - Product Bean
- propriamente dito. Veremos que tambm no apresenta muita complexidade, pois os
mtodos de persistncia e manuteno do objeto so implementadas pelo container
do servidor de aplicaes, tirando essa responsabilidade do implementador, assim no
havendo cdigos para estes mtodos.
A classe deve ser declarada como abstrata, pois o container ir implement-la quando
esta for instalada no servidor de aplicaes na aplicao exemplo.
H % 1 H6H ( &
+ )9 )-GH ( (
Observe que o mtodo ! somente configura os atributos do objeto e retorna o
valor da chave-primria. A persistncia dos seus dados fica a cargo do container.
$> & + & " &$ ' ' >)-* $' <'0H& % < >*
&( ' <' 1 * ) < $ !
&
.8!/ H #5 <!
H #)- " )-.;:
H% < " H& < .;:
H %
" .;:
H ! & " $> & (.;:
'2 % < " .;:
H
Veja tambm que os mtodos de manipulao do objeto tais como ! ) " , ! e
! '
so desprovidos de implementao, ficando tambm a cargo do container esta
tarefa. Os mtodos de negcio tambm no apresentam implementao, mas a
diferena para os mtodos de ciclo de vida que devem ser declarados como
abstratos, pois sero implementados pelo prprio container novamente.
dH
H% < ( $H& )- " &$ ' <! ' )-.;:
H% < ( $H& H% < " ' & '0"H .;:
H% < ( $H& % " ' <' 1 .;:
H% < (
$H& ! < " ) & ! &
.;:
H% < <' < $'+'( )+ " .;:
H% < <' < $'+'(
H, & < " .;:
" .;:
O deployment descriptor do EJB Entity Bean CMP - Product Bean - no traz muitas
novidades em relao ao EJB Entity Bean BMP - UserBean. Uma das poucas diferenas
deste que o tipo de persistncia do EJB deve ser configurado como Container, pois
ficar a cargo deste realizar a persistncia. Informamos tambm a classe da chave
primria, que neste caso ser a classe que implementamos exclusivamente para esse
propsito. A seguir vemos a definio da verso de CMP que no nosso caso utilizamos a
verso 2.x e a seguir o nome abstrato do esquema, utilizado para as consultas EQL. Por
fim definimos cada campo CMP. Estes campos devem ter os mesmos nomes dos
contidos na implementao do EJB. A ltima linha define qual o nome do atributo
que ser utilizado como chave para a persistncia do objeto.
A configurao dos tipos de transao para cada mtodo, segue a mesma
configurao utilizada para os outros EJBs anteriores.
)
4 H6H
$)-
H, & <! 4 $)-
)+
)+ $
)+
)+ $
)+
%$ +, M.10 B K
, )
,;*
H.H
H&#
SR
( + H6H&' " <$<5 )H H.H&'2 )lH' .
H
H6H&'2.
"?" H& "H.H&'2.#)lH' . '2
H.H,&' " .;:
"" H, H6H&' . )H' . ' < H " .;:
H,
"H,
"
/ H H%()- "H '(8H% " .;*(EH '2 )- " .;*
H &! *)-
HPH%&' .;:
& ' ) H.H&&'2
5.:
) ,
no qual
H#
"H! &! ( &&5 )H "H & >$
H,>"H % $ ;% #
% H,H% < (>
Utilizaremos um arquivo de build do ANT para realizar tal operao. Observe que o
intuito deste tpico no de explicar as particularidades dessa ferramenta. Para
maiores detalhes veja no tpico
as referncias para o ANT.
A seguir apresentamos o arquivo $ # ) , utilizado como makefile para compilar a
aplicao, gerar documentao, criar os pacotes (jar) e a aplicao Enterprise (ear).
%?
%?
)-
%?
)-
%?
%?
%?
$
%?
H,
$
$
%?
%?
%?
)- $
)- H=
%?
$
$ 4$
$ )+
$
)- "H "H
$
)- <&'
H (
'H
)-
$
>
4
)- &
$
> 4
%?
? %
)-
$ ?5)+
$
%?
$
( )-
%?
%?
%?
%?
%?
%?
%?
$
< /+
; H6H,& /
H6H"H
! 6 "H ,<
$ '2
+ HLH= /+$H7>H "H1+
$
)-H!
0/$$
>7>
) H.H&&'
/
) H.H&&'
/
) H.H&&'
4 )-
H,
/
) H.H&&'
/
/
) H.H&&' ;
/
/
)
/
?'2
/
) <$ 6(
?'2
&'("H
"H, H
N $
+ H&% "H
"H !
H, H
"H
!
?'2
+
H + <
BN $
7 0 N
?'2
? )+ '
(H
ZH
)0 <
H
H "H + ' NO
H $H& H! )-
'H ? %H&% "H
!4
)0 <
H H6H,
H ) "H1H 0>
?
!4
$ 'H 5)0 ;
)+> ;H!
H& $AH ?
HPH
H
7$)- 4 )
$
&) ) , ! H;6H0H ,
; , ? ,&%, JHGH
?'2
!4
5)+
4 H%6$
?'2
N
)+ H "H -
N $
5)0
&'H ? 5)+
4
5+
)
#5=
H
5)+
!4
"H
?'2
+ (
<'(H
B 0> -
N
'(
(
N
>"H ? )+
&
) <$ 6(
) <$ 6(
(H
B D
B 4
B
?'2
&
R R
=R R
:R
I
I
/4 67($)K $&78 0 .10.&$ (;0 K $ 783.&$ E , 8 0 $ SJFK (
-
( %H EH%)lH,*
/; < $ H,> )
O elemento-raiz do deployment descriptor ejb-jar.xml o elemento
iremos detalhar seus atributos e elementos.
. A seguir
?'2?
% H%ZH > H&?ZH
'(
! !
; $
; $
SR
O elemento
define informaes de cada tipo de EJB, tais como, Session
Bean, Entity Bean e Message-Driven Bean, e no possui atributos. A seguir iremos
detalhar seus elementos.
$& H)H
H&"H.H= H&H.H
) H.H&&'
;(%
, HZH
O elemento define informaes para os EJBs Session Bean contidos no arquivo
de deploy, sendo assim, podemos ter vrias ocorrncias deste elemento. A sua
declarao apresenta alguns atributos e elementos.
H"H.H
'(
?'2?
)-
>)-
/>)- /)-
%) %)-
/)-
/$)+
H.H
H&"H.H= H"H.H= $
"H& >$ !"H, < (
4! 4$!
; H6H
%
%
%
H& ( < H& ?
H& ( H&
%
%"H ?
%"H ?$ ; %H& ?$?
%"H
,H "H.H
$
'(
H )-
?'2?
>)- )-
/>)- /)-
%) %)-
/$)+ /)-
H.H
JH H! $ 4 JH H! $ 4 $
% ) ?
H.H ) ? HLH
% !
; H6H
4!
& ) <
4$!
4
%
%
H& ( < H& ?
H& ( H&
%
%
%"H ?
%"H ?$ ; %H& ?$?
($$
%"H
!
'(
>)-
; H6H
?'2?
)-
H.H
'()
>
' )
)+
H.H<'(?, (;"H &
%
%
%
H > $ H, & ?
%"H %"H ?
%
%"
H ?$ ;
)-"H.H,&' 4(
%H& ?$?
!!
=N
SR
O elemento apresenta o relacionamento entre EJBs Entity Bean CMP, sendo
que podem ocorrer nenhum, um ou mais relacionamentos entre EJBs deste tipo. Define
outro elemento, !
, no qual so configurados cada relacionemento entre dois
EJBs.
< "H,/>
H
)+44
)+
:N
A seguir vemos uma breve explicao dos atributos do elemento .
<description> : descrio do relacionamento entre EJB Entity Bean CMP.
<ejb-relation> : define o relacionamento entre dois EJB Entity Bean CMP.
SR
=N
Sub-elemento !
do elemento
que define define o relacionamento
entre dois EJB Entity Bean CMP.
<description>: descrio do relaciomento entre dois EJB Entity Bean CMP.
<ejb-relation-name>: nome do relacionemnto.
<ejb-relationship-role>: elemento que deve ser configurado para cada um dos dois
EJBs que possuem o relacionemnto.
:N
!
!
MR
O elemento ) define as regras de segurana, a permisso de acesso
(execuo) dos mtodos dos EJBs, atributos de transao para cada mtodo de cada
EJB e a lista dos mtodos excludos do deploy.
H& (
!$ )
) /
) /
<security-role> : define a regra de segurana utilizada para acesso aos EJBs. Como
atributos define uma descrio da regra de segurana e o nome da regra
propriamente dita.
<method-permission> : quais mtodos podem ser acessados por quem a partir da
regra de segurana definida em %$ . Para cada mtodo, informa-se o nome
do EJB que o contm, alm de informar se este mtodo acessado para alguma
interface, o seu nome e os parmetros que ele recebe. Pode-se definir uma regra
para todos os mtodos de um EJB, utilizando o asterisco (*) no elemento <methodname>, por exemplo. Este elemento pode aparecer quantas vezes for necessrio,
para configurar uma regra de segurana para um mtodo de um EJB.
<container-transaction> : define atributos de transao para cada mtodo de cada
EJB. Pode conter um atributo que descreve a transao e deve conter para cada
mtodo o nome do EJB e o nome do mtodo que ser utilizado um tipo de
transao, configurada no elemento $
.
!
#"
@ C8 +H -E
#
# !
$ $
A interface
extendida pelos contextos de cada tipo de EJB, isto , pelas
interfaces '
, e "
. Fornece informaes de segurana,
transao e dados sobre as interfaces ) (
e ) ) do EJB, sendo possvel utiliz-la
para criar, destruir ou localizar um objeto por exemplo.
5,
>
2)- ' >
)- " .;:
+'( " .;:
& '2 $ " .;:
#
Esta interface deve ser extendida pelas interfaces ) (acesso ) ) ) dos
componentes EJBs implementados. Ela oferece servios para criao, remoo e
localizao de objetos EJB. Oferece informaes sobre o metadados do EJB e o handle
do EJB, que pode ser utilizado para futuras chamadas de mtodos ao objeto, sem a
necessidade de realizar a sua localizao por exemplo.
#
dH
Deve ser extendida pelas interfaces )* (acesso
) ) dos componentes EJBs.
Apresenta servios de criao, remoo e localizao dos objetos EJB.
#
IR
A interface
! deve ser extendida pela interface
(interface )
%
)
para os EJBs que provm acessos locais. Apresenta mtodos para obter referncia para
a interface LocalHome e obter a chave-primria (Primary Key) do objeto caso o mesmo
seja um EJB Entity Bean. Alm de prover um mtodo para destruir a instncia do objeto
e um servio que avalia se o objeto atual, isto , o
!
idntico a outro
informado.
IR
2)- '(!>
)- " .8 /(! H >
$5 $< >:
< ' )+ > " .8! /> H &>
5 :
0%) " .8!/% dH >)-<(5= $< >*>
5 :
9 H " > & .8!/%
#
dH
R
Permite que o cliente acesse informaes dos metadados do EJB. Esta interface no
muito utilizada, mas pode ser obtida atravs da chamada ao mtodo ! ) #
. As informaes contidas nesta interface e fornecidas ao cliente remoto em forma de
um objeto serializado, pode ser utilizado para obter dinamicamente informaes sobre
o EJB.
$! +&>
1
<
>
2)- ' >
)- " .;:
#
Esta interface deve ser extendida pela interface )
(acesso remoto) dos
componentes EJBs. Apresenta uma viso dos servios oferecidos pelo EJB para o cliente
remoto. A interface )
definida para cada EJB, deve conter as assinaturas dos
mtodos de negcio que o EJB implementa e as quais o cliente remoto ter acesso.
Por esta interface, o cliente pode ter acesso a referncia para a interface ) do EJB,
obter a chave-primria no caso de EJB Entity Bean, remover a instncia do objeto,
obter o Handler deste objeto que contm informaes sobre ele e verificar se algum
objeto idntico ao objeto atual.
#
!"
#
A interface
a interface genrica de cada tipo de EJB. Ela extendida pelas
interfaces ' , e % "% . Alm de ser serializada utilizada como uma
interface ) , isto , informa que a interface realmente um EJB.
$! +( % H& 5"H & B
#
/
5& " 8
. !/% H
>
5 < * )-5 < :
)-< " .8 / H )-5 *
5 (* >)-< 5 $< >:
" . /% H >
5 * )-5 < :
HPH, (& " . /% dH >
5 * )- 5 < :
#
#
" .8!/%
#
Tal como o Handle uma referncia persistente para a interface ) de um EJB, a
HomeHandle uma referncia persistente para interface Home de um EJB. Tambm
til para manter a referncia da interface ) de um EJB, persistente em algum meio e
recuper-la posteriomente para acessar a interface Home.
#
! !
#
Esta interface deve ser implementada por cada EJB Message-Driven Bean. Define os
mtodos de ciclo de vida deste tipo de EJB. Observe que estes mtodos no so
executados pelos clientes, pois como este componente tem um comportamento de
execuo assncrona por meio de mensagens (JMS), os mtodos so executados pelo
container no recebimento de mensagens dos clientes.
Observe que o nico mtodo de negcio que a implementao de um EJB MessageDriven Bean deve oferecer o mtodo , implementado da API JMS. Este
mtodo ser invocado pelo container no recebimento de mensagens dos clientes e
deve executar a lgica de negcio para o EJB em questo.
#
!"!
dH
dH
#
#
! !
Deve ser implementada por todo EJB Session Bean. Apresenta os mtodos do ciclo de
vida do EJB, tais como associao do contexto ao EJB, remoo da instncia do
objeto, ativao e passivao do objeto pelo container, alm de definir o mtodo
! que criar uma instncia do objeto pelo container.
#
#
! !
dH
#
#
#
! !
Esta interface pode ser implementada por EJB Session Bean Stateful, quando deseja-se
sincronizar o estado transacional do objeto. Cada mtodo executado a cada etapa
das fases de transao.
! !
Exceo lanada caso o chamador no tem acesso para executar o mtodo. Utilizado
para objetos locais.
#
Deve ser definida no mtodo de criao da instncia de cada EJB. Ela lanada
quando ocorrer uma falha na criao da instncia de um objeto EJB.
#
Esta exceo lanada quando no pode-se criar um objeto, pois a sua chave j
existe e est sendo utilizada por outro objeto. Normalmente utilizada no mtodo
do EJB Entity Bean.
#
N
N IR
PR
SR
Deve ser utilizada em todos os mtodos finders, normalmente usados em EJB Entity
Bean. So lanadas quando um erro de localizao do objeto ocorre.
Parecida com a exceo ('$
, diferindo que esta lanada para objeto
locais que no exitem mais.
!"
!"
Indica que a transao foi marcada com rollback ou estava sendo executado o
rollback, mas ocorreu algum erro nesta operao.
A
I
!
SR
Observe que existe um deployment descriptor ! ! # ) para cada EJB nesta aplicao
exemplo. Isto no necessrio nem possvel em uma aplicao J2EE, na qual faam
parte dela todos esses EJBs. Para isso preciso criar um nico deployment descritor !
! # )* , no qual inclumos todas as informaes de todos os EJBs contidos na aplicao
J2EE em questo. Este arquivo mostrado no final deste apndice.
+R
/
$)
(
H.H "H ?
+ )+ )-H
HPH,
& +)-
"H$ + + -
%< $5 < 5 N + N +7 )H >
+ & " . / H !<5
/
dH
) H,"
H.H 25& 5& -7
H6H= 9
$H& H6H, 5& " "H.H 2 <5,MH,"H.H 2<5 .
/( H H"H.H, 5& ;H,
HPH& <5 :
> >) "H $ ( )-*4 # )
) (
1H, -+"H& $
)
$'2 " $ " . $! 6 $ " .;.;:
<!%0
>
>
)
)
(
6 $$
%H EH%)lH,*
H"H.H
%H HLH=
)-< /
%ZH
?&!% !"H
?& $
ZH <!
/$;
,H )
> & " ) & &
>$> & . /
$)+<$5= :
&( '
+%)- % " ) ( $> &
%($ .8!/% H )- 5 < :
&( ' '26
H < & " . /> H )-5 < :
%
H < " . /
)+? )
)+? )
)+? )
(
:
:
:
"H&&.
>"H$
$H!> N - ,% />*> +
) ) H
) >
+) )+ $-)H,
ZH"H HH $7)
H1) >)+ *>0)H,1< B<H,*
%) (
H 0 "H H & /
> )+H
"H, )+ ) 0%' H% - )-+%> % H%
)+!
H.H "H,
H <
+ )+ )-H
HPH,
"H% +("H
& (&
H,
EH,:
%< $5 < 5 N + N +7 )H > 7 >
+ & " . / H !<5
/( H H -
H,/ " .;:
/
dH
- )+
"H %H 0"H, $)-
) )H "H, (+
- )0% > H (H
( % H,+- )+KH% 7 ) H, "H6H
)H%$%.
H
0"H,-+>
( '
B " . /( dH 5 <
$> & )-+ 2)
"
($ & )-.
H ? $ < '2 "H> " . '(< 2)+
" H ( > <
#.;:
!
5.;:
%+>
" !.;:
< / " &$5= -5.
/
5 " ?%
" %& -H < ! " . %& " .;:( />H #<5, " .;: .
> 0 < " (. 5& " .;:
( &
"
!( & . ( & '(<
" .;:
"
"
"
)- %& ( '(< )- .;*$ '( .;* '( "H < " .;*
'( " ( '( " .;.;.;:
%($ .
" /( H
H %)-< " ( & .
> .
%+>
" !.;:
<!%0
$
:
" & -H < ! < "
"
0
";" > & .#!
>
<!%0
)H&
+
0ZH,& *, DH%+0)+H&)- 0
)
)
H%
N-( KH&$ )+ H )+ <*) H $ +0 > -H% 5)+
( H%
N*"H&> H6H= )+*"H $
N
H&$ 7H%$DH, )+
H
) )H "H,
DH&1
<!%0
%H EH%)lH,*
/$;
H, )
H"H.H
%H HLH=
) /
ZH
?& & > )H&? ,
!%)H% &!
Vemos a seguir os cdigos do EJB Entity Bean BMP - UserBean. Para este, alm das
interfaces ) e )
para acesso remoto, dispomos das interfaces para acesso local.
Ento seguem as interfaces ) , % , %
)* e
. Depois a implementao
do EJB UserBean e por fim o seu deployment descriptor.
$!
H
? >)-< 0+-$ >+"H $ B<> !
"H.H&7%) )F-
HPH&-"H H >H! -$
$!
H 5,ZH &5
$H& )+ " <! ' )-.8 /(! dH )-$5 < >:
$H&
HPH " & '0>$%H6H,. / H )-$5= <! :
$H& )+ " <! '0)- .8/ H >)-5 :
H
)-
5"H 5 >
$ )-
H, > > %< " & ' )+* $'2 < * $'0
HPH&* & '0)- .
/ H #5 <! :
" '1 . !/% H %5 :
H, > $ >
)-
$!
>
$
*;"H,EH &()+GFH2"H "H, , ) ) )- LH, H%$
>"H$
"H ) H > $ ' %N +< "N >H1 "H H !% "H
$! * &
N $*)+N *< BN -0 B<N $ -$
>7)-
+LH, HF
H.H
H&% +
5
- )
0 2
& (&0$
*
( HPH,*)- .
#
2 #
#
2 #
*()-
" *
.:
?:
$
:
) * #< *
(!HLH,*
:
:
)-*
< * 6
"H.H=*
+
>7ZH,&
)
)
)
%< $5 < 5 N + N +H% "H
<' 1 " ' >)-* '$6 * & ' (
"H.H* <! '0)+ .
/ H #5 <!
dH
!
!
H
>
JH
H,<!)-
5
H
N $ + ZH>
H, B<
% % B< '2)- N+"H0)-)-
.;:
)
)
)
%< $5 < 5 N + N +H% "H
H & " , ' )+* $ '2 < * $'0%H6H,* & '0)- .
/ H #5 <!
/
dH
!
>
JH
/
)
H
(.;:
<!%0)-:
+ < +)
H,
- 67ZH,
<' 6'( # " .
<
)
<!%+ :
<
)
<!%+"H.H:
<!%+)- :
B +
B<N >
+ KH
/(+ )
) +)H,
- />&(+ ) +
-) ) )
/ dH ( 5 -5 N -) H& > %+0 B1
<' 1
)- > " $'$6 .# / H %5
!
!
H
!
(
.;:
JH
>
/
.;:
B<- - $ - &<' "H "H -+)+
+LH= HF %
+)-)
+ " .
!
.;:
) H " * / H 6 $ " .;.;:
"H, JH ;H ) <5
" .;:
H
!
>
JH
/
> 5 < " % '0 GH .;:
B<- - $ +$LH, H 1"H H )H
H )
! () )+ -7JH H%GF>
+ " .
)-)
!
!
H
$)-.;:
H
(!H6H,.;:
)- .;:
6 $ " .;.;:
#
(.;:
MH
/
> 5 < " % LH, H <'0 H .?:
H
>
/( H
<5
:
)
5&!.
!
> :
/
.;:
)-5 " '(< "H.H%'( " .. :
<!%+ :
%H EH%)lH,*
/$;
,H )
H
H
; H6H < ) % & H
H6H
$AH= H ; (
JH H 4 (
) ? H.H &( ' ' ) ; HPH
$ H, $
H
) /
>)-
) < /)- )-<!/ ?)-
-
)-
)+ />
H
Z
H
?& & > )H&? ,
!%)H% &!
O prximo cdigo apresenta o EJB Entity Bean CMP - ProductBean. Este EJB apresenta
tambm as interfaces ) , )
,
e
) que so respectivamente,
$ ) ,
$ ,
$
e
$
) . Neste Entity Bean usamos uma classe de chave-primria
especfica, isto , definimos uma nova classe para este fim que a
$
e segue na
seqncia. Em seguida temos a implementao do EJB ProductBean. Observe que
como definimos este EJB como Entity Bean CMP, a implementao do EJB
ProductBean no apresenta codificao para os mtodos de persistncia do objeto.
Como sabemos, isto feito pelo prprio container do servidor de aplicaes. Bem, por
fim apresentamos o deployment descriptor deste EJB.
)-
? >)-< 0+-$ >+(+! B7$
"H.H&7%) )F-
HPH&-"H H >H!
$H&
H, & " '0"H .8 /( dH $)+<$5= <! :
$H& , " <'(1 . / dH ) 5 :
$H& $> &
"
% & 0
>$$ (
.8/
dH
"
%> &
% )- >
! 9 .8!/> H
( 5 :
" .;:
"
% & 0
>$$ (
.;:
PrimaryKey : ProductPK.
)+? <( :
/( H
(:
<
)
<!%-
/ H :
&- H&-+$ DH& ' > * H& H+ $!
+ H " & .
"
<!%-; H:
- .
"
/ H '( HPH " . H " ' < HPH " .?.;.
( & 7 /
"
! & (. :
;
"
;
"
"
%!>
/ H - . " /<
/ H H " /& .;.;.;:
>
0) < +/H&/ 2 " .
- />&(-7/>H,/
(
<!%0 /H,/
$
)
H ) < "H <' "H >
iH 6 )+ )-
H( # $ $>
H )>H
JH $H& )H&1 H )+ >7 9 > )+ "H& , <
H&! ($ 0)> >
)- > + - )-7$(
& (&0$
)
)
)
dH
%< $5 < 5 N + N +H% "H
% > & %& " & $' < ' )-* ' < $'7>H% < *
&( ' '21> *> ) $> &
%($ (.8 / H %<5
H,<
5
H N $ + ZH>
H, B< % % B< '2)- N+"H0)-)-
B<- '2 H
%$ $)-"H %
0
-$
)
)
)
)
/
dH
H & " &$ <' & ' $)-* $' <'0"H % < >*
&( ' '21> *> )
$> &
%($ (.8 / H %<5
B<- - $ - &<' "H "H -+)+
+LH= HF %
+)-)
+ " .
B<- - $ +$LH, H 1"H H )H
H )
! () )+ -7JH H%GF>
+ " .
/( H
<5
:
)
)-)
<
)
0%N-7>$
<
)
- /$7> )
0%(
- />&(+ ) 0%(
H % ) & ! &
<
)
'(
" .;:
%H EH%)lH,*
/) & ) $ < 2)- ?/)-
) <
; H6H < ) % & ( &
4
H.H
$AH= H ; ( 2$ $ LH, H%> ; 2
) ? H.H ) <
$ H, $
)
H6H
/$;
,H )
)- < H, & < ?)-
)+
)+
)+
ZH
?& & > )H&? ,
!%)H% &!
H.H H&#
+ )+ ) GH "H.H&&'(
5- H.H&&' $+
(
5,1)-HLH'(
(
5& :
>)-<(
+ EH
+ +H,(
( + )- " .
)
H
H6H&'2.
"?" H& "H.H&'2.#)lH' . 2
'
H.H,&' " ;. :
"" H, H6H&' . )H' . ' < H " .;:
H,
"H,
/ H H%()- " "H '(8H% " .;*(EH '2 )- " .;*
H
&!
*)-
HPH%&' .;:
& ' ) H.H&&'2
5.:
( ) )- + 4
N +%
0"H
) >
/ H% /"H +ZH,%
) +)+ -H% >&
)H
> <! 4 N
)
/!
7> N $
dH
& (&- $H&>)- " !% ' /"H * ! '0* ! '=H, &!* '0 <5 .
/(! H 5
!
%"H " ?)- H,) />H ?*/
H .;:
%
< ) D
H&H6H
5 ) ;; 0H H iH 0H H 5 ) ; 0H H ' ; G H ? ; " ; 0H *. :
% > +)-EH&' )
>
)- H.H%'( " H,
H.H= .;:
"
)-"H.H&&'( H% >)
$
"H.H " / ?.;.;:
"
)-"H.H&&'( $ & (&5 )-
H.H,&' > (
% $! HLH " .;.;:
)-"H.H&&'( H% & " H& &!.;:
/
.:
*
2 5& $ 5-
$H& HLH'( ( 5& " H6H&'2 2 5& )+
H.H&&'(
/( H )-"H.H%'( $ 2 <5
) H.H&&' 25 :
)
)+H6H&'2
Mensagem : UserMessage.
)+? <( :
)+? ) ( :
DH&1' %
0ZH,
+ >H%
H.H
H&
H,% -
& (&
7) "H&'2)
$>"H&
H,
EH,:
H, $>
%
0ZH,
)
)
)+H6H&'2 +
) "H&'2) DH&
0)H,
"
H, "H.H'
H
)H%$%* & ' ) H.H&&' .
<
)
+)-ZH&'()
+)-"
H,&')
<!& '+'2 H6H&' " .
<!%0)-H6H&'2:
(
+)+"H&'2)
+"H
)H&
+)+"H&'2)
H,
'( H% " .
<
)
<!%0"H:
' % 0ZH, - EH, 2 -7)-)H%&'()
%H EH%)lH,*
/$;
,H )
$
H, >)-
>)- H#
? )-
; H6H < ) % & )
H#
H6H
ZH < $ !ZH &!
H >)-
H#<
"H & ( &5 )H $ H!! $&! (
H&"H ;%
H,
H < 4
)-
)+ />
H%
ZH
?& & > )H&? ,
!%)H% &!
>
H6H, +
$ < <$ H6H $ B<>
)-H,( N-H=?
- N -5)+
!)FH,?2 NH -
N -+)+
H.H !
+ )+ )-GH "H.H >
/
%< $5 < 5 N + N +7 )H > 7 >
+ & " . / H !<5
dH
EH%)
!
>
H
"
.;*
" >. ..;:
H
/
EH%)
> 5 < " % , '0$( %)-
;. :
EH%)
!
>
?.;:
H
/
> 5 < " % & ' )-$
EH%)
H
>
;. :
%H EH%)lH,*
H"H.H
)+ />
%ZH
?&!% !"H
?& $
!%)H% &!
/$;
,H )
%H EH%)lH,*
H"H.H
%H HLH=
H"H.H
H"H.H
H"H.H
H >)- & ? ( H, )
>)- ! & ? ?)+
/>)- ) & H"H.H,
& ? )- /)-
)- ) & H
HPH& & $ )+<
H
$ H,
>=)
?)+
/>)- ) & H )- /)-
)- ) & H )-
/) & ) $ H $ )- /)
) H%
>)-
H
H
/$;
H, )
; H6H < ) % & ( &
4
H.H
$AH= H ; ( 2$ $ LH, H%> ; 2
) ? H.H ) <
)
$ H, $
)- < H, & < ?)-
)+
)+
H#<
H#
) /
Z
H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z
H
?& & > )H&? ,
!%)H% &!
H6H
) /
>)-
) < /)- )-<!/ ?)-
-
)-
)+ />
H
Z
H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z
H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
)-
)+ />
H%
Z
H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z
H
?& & > )H&? ,
!%)H% &!
"H.H
>
H"H.H
%H HLH=
H"H.H
%H HLH=
H"H.H
>)- !
& ? ?)+
$)-
&
$)-
%H HLH=
/;
?)+
)- ( ;)-
( ) H $)-
>)-
!
H
H
!
H#
?)-
H!! $&! ) % H! H% < ?)-
>)-
"H.H
(
&(
>
)+
)+
)- <
H, & < ?)-
)+;)-
)+$)-
)+
)+
)+
)+
)+
!
H
/$;
3
@
ACB-"D,
E-GFEH3 =-I"!#$!#/!%7"$&
"!##!(-0')J#$&J
!I!
!*$L K,M+,
.-#-08N$P/#O#Q1"2,3!H)4-5'#'"+6')R67#'J#89#!#3
S :
T*/U8%Q $<;"8#=?>
*V6W1`-X*"*:8"M`-YEH:*="MY-*8*-M6-[ZD9"
"#=#-
7D*9[-*"8"GI$<="#^"7"\G3*=
8""9Y389#::H8"M]Y
Ha^#7"
H-MYW8""-][_^"3*3
:E#E"UDG2-#=U9bH> U-,M
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other functional and useful
document "free" in the sense of freedom: to assure everyone the effective freedom to copy
and redistribute it, with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way to get credit for
their work, while not being considered responsible for modifications made by others.
This License is a kind of "copyleft", which means that derivative works of the document
must themselves be free in the same sense. It complements the GNU General Public
License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because
free software needs free documentation: a free program should come with manuals
providing the same freedoms that the software does. But this License is not limited to
software manuals; it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License principally for
works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that contains a notice
placed by the copyright holder saying it can be distributed under the terms of this License.
Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The "Document", below, refers to any such
manual or work. Any member of the public is a licensee, and is addressed as "you". You
accept the license if you copy, modify or distribute the work in a way requiring
permission under copyright law.
A "Modified Version" of the Document means any work containing the Document or a
portion of it, either copied verbatim, or with modifications and/or translated into another
language.
A "Secondary Section" is a named appendix or a front-matter section of the Document
that deals exclusively with the relationship of the publishers or authors of the Document to
the Document's overall subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in part a textbook of
mathematics, a Secondary Section may not explain any mathematics.) The relationship
could be a matter of historical connection with the subject or with related matters, or of
legal, commercial, philosophical, ethical or political position regarding them.
The "Invariant Sections" are certain Secondary Sections whose titles are designated, as
being those of Invariant Sections, in the notice that says that the Document is released
under this License. If a section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero Invariant Sections.
If the Document does not identify any Invariant Sections then there are none.
The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts
or Back-Cover Texts, in the notice that says that the Document is released under this
License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at
most 25 words.
A "Transparent" copy of the Document means a machine-readable copy, represented in a
format whose specification is available to the general public, that is suitable for revising
the document straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available drawing editor,
and that is suitable for input to text formatters or for automatic translation to a variety of
formats suitable for input to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart or discourage
subsequent modification by readers is not Transparent. An image format is not
Transparent if used for any substantial amount of text. A copy that is not "Transparent" is
called "Opaque".
Examples of suitable formats for Transparent copies include plain ASCII without markup,
Texinfo input format, LaTeX input format, SGML or XML using a publicly available
DTD, and standard-conforming simple HTML, PostScript or PDF designed for human
modification. Examples of transparent image formats include PNG, XCF and JPG.
Opaque formats include proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or processing tools
are not generally available, and the machine-generated HTML, PostScript or PDF
produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself, plus such following pages
as are needed to hold, legibly, the material this License requires to appear in the title page.
For works in formats which do not have any title page as such, "Title Page" means the text
near the most prominent appearance of the work's title, preceding the beginning of the
body of the text.
A section "Entitled XYZ" means a named subunit of the Document whose title either is
precisely XYZ or contains XYZ in parentheses following text that translates XYZ in
another language. (Here XYZ stands for a specific section name mentioned below, such as
"Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the
Title" of such a section when you modify the Document means that it remains a section
"Entitled XYZ" according to this definition.
The Document may include Warranty Disclaimers next to the notice which states that this
License applies to the Document. These Warranty Disclaimers are considered to be
included by reference in this License, but only as regards disclaiming warranties: any
other implication that these Warranty Disclaimers may have is void and has no effect on
the meaning of this License.
2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either commercially or
noncommercially, provided that this License, the copyright notices, and the license notice
saying this License applies to the Document are reproduced in all copies, and that you add
no other conditions whatsoever to those of this License. You may not use technical
measures to obstruct or control the reading or further copying of the copies you make or
distribute. However, you may accept compensation in exchange for copies. If you
distribute a large enough number of copies you must also follow the conditions in section
3.
You may also lend copies, under the same conditions stated above, and you may publicly
display copies.
3. COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have printed covers) of
the Document, numbering more than 100, and the Document's license notice requires
Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these
Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back
cover. Both covers must also clearly and legibly identify you as the publisher of these
copies. The front cover must present the full title with all words of the title equally
prominent and visible. You may add other material on the covers in addition. Copying
with changes limited to the covers, as long as they preserve the title of the Document and
satisfy these conditions, can be treated as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit legibly, you should put the
first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto
adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100,
you must either include a machine-readable Transparent copy along with each Opaque
copy, or state in or with each Opaque copy a computer-network location from which the
J. Preserve the network location, if any, given in the Document for public access to
a Transparent copy of the Document, and likewise the network locations given in
the Document for previous versions it was based on. These may be placed in the
"History" section. You may omit a network location for a work that was published
at least four years before the Document itself, or if the original publisher of the
version it refers to gives permission.
K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the
Title of the section, and preserve in the section all the substance and tone of each
of the contributor acknowledgements and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document, unaltered in their text and
in their titles. Section numbers or the equivalent are not considered part of the
section titles.
M. Delete any section Entitled "Endorsements". Such a section may not be
included in the Modified Version.
N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict
in title with any Invariant Section.
O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or appendices that qualify as
Secondary Sections and contain no material copied from the Document, you may at your
option designate some or all of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice. These titles must be
distinct from any other section titles.
You may add a section Entitled "Endorsements", provided it contains nothing but
endorsements of your Modified Version by various parties--for example, statements of
peer review or that the text has been approved by an organization as the authoritative
definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to
25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified
Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be
added by (or through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or by arrangement made
by the same entity you are acting on behalf of, you may not add another; but you may
replace the old one, on explicit permission from the previous publisher that added the old
one.
The author(s) and publisher(s) of the Document do not by this License give permission to
use their names for publicity for or to assert or imply endorsement of any Modified
Version.
5. COMBINING DOCUMENTS
You may combine the Document with other documents released under this License, under
the terms defined in section 4 above for modified versions, provided that you include in
the combination all of the Invariant Sections of all of the original documents, unmodified,
and list them all as Invariant Sections of your combined work in its license notice, and that
you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and multiple identical
Invariant Sections may be replaced with a single copy. If there are multiple Invariant
Sections with the same name but different contents, make the title of each such section
unique by adding at the end of it, in parentheses, the name of the original author or
publisher of that section if known, or else a unique number. Make the same adjustment to
the section titles in the list of Invariant Sections in the license notice of the combined
work.
In the combination, you must combine any sections Entitled "History" in the various
original documents, forming one section Entitled "History"; likewise combine any
sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You
must delete all sections Entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents released
under this License, and replace the individual copies of this License in the various
documents with a single copy that is included in the collection, provided that you follow
the rules of this License for verbatim copying of each of the documents in all other
respects.
You may extract a single document from such a collection, and distribute it individually
under this License, provided you insert a copy of this License into the extracted document,
and follow this License in all other respects regarding verbatim copying of that document.
7. AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate and independent
documents or works, in or on a volume of a storage or distribution medium, is called an
"aggregate" if the copyright resulting from the compilation is not used to limit the legal
rights of the compilation's users beyond what the individual works permit. When the
Document is included in an aggregate, this License does not apply to the other works in
the aggregate which are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document,
then if the Document is less than one half of the entire aggregate, the Document's Cover
Texts may be placed on covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form. Otherwise they must
appear on printed covers that bracket the whole aggregate.
8. TRANSLATION
Translation is considered a kind of modification, so you may distribute translations of the
Document under the terms of section 4. Replacing Invariant Sections with translations
requires special permission from their copyright holders, but you may include translations
of some or all Invariant Sections in addition to the original versions of these Invariant
Sections. You may include a translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include the original
English version of this License and the original versions of those notices and disclaimers.
In case of a disagreement between the translation and the original version of this License
or a notice or disclaimer, the original version will prevail.
If a section in the Document is Entitled "Acknowledgements", "Dedications", or
"History", the requirement (section 4) to Preserve its Title (section 1) will typically require
changing the actual title.
9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except as expressly
provided for under this License. Any other attempt to copy, modify, sublicense or
distribute the Document is void, and will automatically terminate your rights under this
License. However, parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such parties remain in full
compliance.
10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions of the GNU Free
Documentation License from time to time. Such new versions will be similar in spirit to
the present version, but may differ in detail to address new problems or concerns. See
http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. If the Document
specifies that a particular numbered version of this License "or any later version" applies
to it, you have the option of following the terms and conditions either of that specified
version or of any later version that has been published (not as a draft) by the Free
Software Foundation. If the Document does not specify a version number of this License,
you may choose any version ever published (not as a draft) by the Free Software
Foundation.
How to use this license for your documents
To use this License in a document you have written, include a copy of the License in the
document and put the following copyright and license notices just after the title page:
FU-&D#:M
M
"*8`4:=]MC 43V Q8U#-"9[:"GT="UQ*O?V $> 9::M6.*^#7U#-03#8"9 #PD*#9#*16\":M 9#="7DH-8"
2(7
8"L9#3-]08 [8"GEHU-Y3";"#8 W
--3 &WD:U3-M`8"M
1 /"-80=""#-#
7#
#^U*E*8*Ta#MMH$L+("-
8Z-#9[- ^+([
".#8"=#7UD*- R4#-*8"+W".-#-3#-0: B/#-8 *1U,
2,HMN3="$ -#Z-3*8*8"M9a-I+_$ 7#8",[8U9#-3
K
:3#M
=UU(88[R4" 'W >-
B -
**TGMI+,> .-#Q-
#=U*=#7D
-108U##3#"#-\UE
8 *="
-**8*=U-M-\8HM#- M0 > *8#=E:7U9#-"9a
80"-\M-=U:U8C-8:
HEH-"9
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the
"with...Texts." line with this:
2(+, .##08"R4 U-a W ;#-]8 W B3-&* ,3*8"MY0^/#-:-*H="8":U";"8H/MYB ^$ -:3*H8"8"9 2(" ;"/B0 B*U-\V ;K 3*B=;(B R4" V W/I-$ 2]B-0:#M "-^U-: 8"";"/ B >
If you have Invariant Sections without Cover Texts, or some other combination of the
three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing
these examples in parallel under your choice of free software license, such as the GNU
General Public License, to permit their use in free software.