Escolar Documentos
Profissional Documentos
Cultura Documentos
Livro JSP Servlets J2ee PDF
Livro JSP Servlets J2ee PDF
CPqD Telecom & IT Solutions.
!
#"$%&
Departamento de Cincias da Computao
Instituto de Cincias Matemticas e de Computao.
Universidade de So Paulo
'(*) +,+-.0/(1
CPqD Telecom & IT Solutions.
"2.34657*
859*:;
Telecom & IT Solutions.
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
11.7 Classes e interfaces..................................................................................................................138
11.8 Acesso local e/ou remoto......................................................................................................138
11.9 EJBObject e EJBHome.............................................................................................................140
11.10 Como construir, executar e acessar os componentes....................................................141
Captulo 12........................................................................................................................................143
Session Beans.....................................................................................................................................143
12.1 O que so Session Beans?......................................................................................................143
12.2 Quando usar um Session Bean?............................................................................................146
12.3 Session Bean Stateless..............................................................................................................146
12.4 Ciclo de vida - Session Bean Stateless..................................................................................147
Session Bean Stateful........................................................................................................................148
Ciclo de vida - Session Bean Stateful............................................................................................150
Captulo 13........................................................................................................................................151
Entity Beans........................................................................................................................................151
13.1 O que so Entity Beans?.........................................................................................................151
13.2 Quando usar um Entity Bean?...............................................................................................152
13.3 Entity Bean Bean-Managed-Persistence..............................................................................152
13.4 Ciclo de vida Entity Bean BMP............................................................................................154
13.5 Entity Bean Container-Managed-Persistence......................................................................155
13.6 Ciclo de vida Entity Bean CMP...........................................................................................158
13.7 Relacionamento EJB Entity Bean CMP.................................................................................158
13.8 EJB-QL........................................................................................................................................162
Captulo 14........................................................................................................................................165
Message-Driven Beans.....................................................................................................................165
14.1 O que so Message-Driven Beans?......................................................................................165
14.2 Quando usar um Message-Driven Bean?............................................................................166
14.3 Ciclo de vida - Message-Driven Bean..................................................................................167
14.4 O que e para que serve o JMS?........................................................................................167
Captulo 15........................................................................................................................................173
Transaes e Segurana.................................................................................................................173
15.1 Transaes.................................................................................................................................173
Segurana.........................................................................................................................................179
Captulo 16........................................................................................................................................190
Descobrindo Enterprise JavaBeans ..............................................................................................190
16.1 Qual servidor J2EE utilizar?......................................................................................................190
16.2 Instalando, configurando e executando um Servidor J2EE..............................................190
16.3 Criando um Session Bean Stateless.......................................................................................191
16.4 Criando um Session Bean Stateful.........................................................................................193
16. 5 Criando um Entity Bean BMP................................................................................................197
16.6 Criando um Entity Bean CMP.................................................................................................203
16.7 Criando um Message-Driven Bean.......................................................................................206
16.8 Empacotando a aplicao...................................................................................................207
16.9 Instalando a aplicao no servidor J2EE.............................................................................211
Apndice A.......................................................................................................................................212
Deployment Descriptor....................................................................................................................212
A.1 O que um deployment descriptor?....................................................................................212
A.2 Elementos do deployment descriptor ejb-jar.xml.................................................................212
Apndice B........................................................................................................................................221
API Enterprise JavaBeans................................................................................................................221
B.1 Interfaces.....................................................................................................................................221
B.2 Excees.....................................................................................................................................225
Apndice C.......................................................................................................................................228
Aplicao J2EE Exemplo..............................................................................................................228
Apndice C.......................................................................................................................................260
"!"#%$'&
(*),+.-
$0/1)'2
Se um dia a Internet era composta, principalmente, de pginas estticas com
contedo institucional, hoje ela oferece uma infinidade de aplicaes com contedo
dinmico e personalizado.
Diversas tecnologias possibilitaram essa revoluo: seja para construir um simples site
com contedo dinmico ou para construir um complexo sistema de Business-To-
Business, necessria a utilizao de ferramentas que possibilitem consultas a bancos
de dados, integrao com sistemas corporativos, entre outras inmeras funcionalidades.
Dentre as diversas tecnologias disponveis atualmente para o desenvolvimento dessa
classe de aplicaes, destaca-se a de Servlets e a de pginas JSP (Java Server Pages).
A utilizao de Servlets e de pginas JSP oferece diversas vantagens em relao ao uso
de outras tecnologias (como PHP, ASP e CGI). As principais vantagens so herdadas da
prpria linguagem Java:
3 Portabilidade: a aplicao desenvolvida pode ser implantada em diversas
plataformas, como por exemplo Windows, Unix e Macintosh, sem que seja necessrio
modificar ou mesmo reconstruir a aplicao.
3 Facilidade de programao: a programao orientada a objetos, simplificando o
desenvolvimento de sistemas complexos. Alm disso, a linguagem oferece algumas
facilidades, como por exemplo o gerenciamento automtico de memria (estruturas
alocadas so automaticamente liberadas, sem que o desenvolvedor precise se
preocupar em gerenciar esse processo).
3 Flexibilidade: o Java j se encontra bastante difundido, contando com uma enorme
comunidade de desenvolvedores, ampla documentao e diversas bibliotecas e
cdigos prontos, dos quais o desenvolvedor pode usufruir.
Alm dessas vantagens, a arquitetura de Servlets e pginas JSP possibilita alguns
benefcios adicionais:
3 Escalabilidade: na maior parte dos servidores de aplicaes modernos, possvel
distribuir a carga de processamento de aplicaes desenvolvidas em diversos
servidores, sendo que servidores podem ser adicionados ou removidos de maneira a
acompanhar o aumento ou decrscimo dessa carga de processamento.
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:
Exemplo de Servlet
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9" " #!5 #%9%E!#F#G H I$#&%'!)(
F#35#"$& <#&P#JQ8#* EE%
(+ %',!+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
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.
>?BAC
"2#5#9E#F#GH I=#>@?
:$#356#"$& <#&P#JQ8#* EE%?
.
-
- >(? A0C
' 8
) ,! + ! +
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.
O outro componente necessrio para o desenvolvimento de Servlets e JSP um
servidor que implemente um Servlet Container. Esse servidor ser responsvel por prover
um framework bsico para as diversas aplicaes desenvolvidas, inicializando-as,
distribuindo as requisies entre elas e tratando os resultados do processamento de
cada aplicao.
Apesar de existirem diversos servidores disponveis no mercado, para efeito dos
exemplos apresentados neste livro, utilizaremos o Apache Tomcat, disponvel no site
&+,"- &! &.' /"! ("-0
. Esse servidor de aplicaes atende s especificaes mencionadas
anteriormente e pode ser utilizado sem nenhum custo para o desenvolvedor.
Um ltimo componente normalmente utilizado para o desenvolvimento de Servlets e
pginas JSP um ambiente grfico de desenvolvimento (IDE). Porm, a escolha e
configurao de um ambiente desse tipo foge do escopo deste livro, sendo deixado
para o leitor a tarefa de escolher a ferramenta que melhor atenda s suas
necessidades.
'
- + $ "$,& ) - 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:
QE "Q ' $)9J#P#:8#!H I - E "2 ' *$+896Q#
-
#!N+!
9 I$
? ( #N!
CH
I " , -.- / 59 A0 D!F"#$"$8#J"
H 9D! -.- (
?-/ #!N$*
' DQQ& !9
% -F- )&
*8&
-F- % "2569 D! - E&E -
#!N +
'
%B E8E!
@
#!N( !
-
#!N+!
# /# # (% '(% 0 / ')("* / / )# /-- (- & 0/ # / - / # / - / * & %"0
, ! , , , e ! .
O elemento #) % .* / deve conter um nome da aplicao a ser apresentado por
!
QD9&#Q,F
./
Q
F +96J# QH I96DQ OQE6" -
%. 9J#
Q
F O!' 5%#
=
-
. ' 5#
- D9F#QQ,F
$/
#' D!J# K& ' #Q 9E#Q *!&' -
#!' DJ#! K& ' #
#' D!J# K& ' #Q 9E#Q "2
-
#' DQJ#( K& ' #
-
#!' DQJ#! K& ' #(8' "$
Q' DQQ& !9 - .)%$ *&' - ' D ) !9
<#
- #2F F
<#
- #2F F
" #(' #,D' "." D 9*Q#!
.#". QEQ"$&. ' #!9%8#"Q IFD QE".&$ - " #!)' #Q D!' Q" "
Q 9 8
./Q
$ +96J# J ' / #F E / A ? I -
%F + 96J# Q
F
' 56# "QL&
9*%Q#!
F#"$ DQ N! -
!F ' 56# - 9 ,8
F>
Q 9 8
./Q
$ +96J# J ' P%#!J#Q8#98# -
!F 9J#Q
!)
' 56# "Q F# 9*Q#!
F#". D! N -
!F !' 5# - 9O ,
$/
Q 9 8
./Q
$ +96J# J ' #"F& 9 8. -
$ 89 # Q
)
O#!9E" 9*%Q#
!$#"$ DQ N -
%F! ' 5# - 9 8
$/
' 56# $
Q 9 8
./Q
$ +96J# J ' * "."259F -
$ 89
# Q
$ ' 5#& QLDE"F)$7E#
D!' #9&# -
!F !' 5# - 96 ,
$/
No exemplo anterior, todos as requisies com URLs iniciadas por # - ( /%./.# - ( '/#)# &* /%.(
sero mapeadas para o Servlet cujo nome . - ("')/&# #) & # - (
Outros mapeamentos interessantes podem ser obtidos atravs de padres de URL do
! / & /%.# (
tipo , como por exemplo, ou , de maneira que o acessos a todas as !* !
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.
Juntando ento todos os elementos apresentados anteriormente, temos o Deployment
Descriptor de exemplo apresentado a seguir:
9 I$
? ( #N!
CH
I " , -.- / 59 A0 D!F"#$"$8#J"
H 9D! -.- (
?-/ #!N$*
' DQQ& !9
% -F- )&
*8&
-F- % "2569 D! - E&E -
#!N +
'%B E8E!
@
#!N( !
E ", ' $)896J# EQ".&$JE!# ' #!9!&#"@ - E " !' *$+9#
D!9!&#QQ,F
!$/
!)! 89%J# *&BJ#Q".# OQE6" -
. 9#
!)! ' 5# EN!
' D -
$ ' 5#
./
- D9 &
QD!9F#QQ,F
$/
!)! 89%J# QH I9%DQ OE"' -
$ 89J#
!)! ' 5#
-
$ !' 5#
./
- D9 &
@
#' D!J#! K& ' #Q 96E#Q *&' -
#!' DQ!J#( K8 ' #
@
#' D!J#! K& ' #Q 96E#Q "Q
-
#!' DQ! #! K& ' #
-
#!' DQ! #! K& ' # ' "$
Q<O#
- # F F
Q#D#!
!& 9( $
# D! 9*Q#
!)#". #QDQ#
) !9" . 99QD#
Q. 9 - #QD#!
) !9( (
$
#
' !DQ& !9 - .
O.F. *&' - ' D ) 9
Q<O#
- # F F
Q".#@' #,D!' "."QDQ! 9*%Q#!
F#"$! EQ".&$ ' #98#", IFD QEQ"$&. - " #%&6' #,D' Q"2"
9 8
$/
$ 89J#JQ ' / #!) E / A ?BI -
$ +9J#Q
!) ' 5#
" J&
9!*6 #!
F#" D! N! -
F !' 5# - 9
./
9 8
$/
$ 89J#JQ ' P#J#Qb# -
F 9J# Q
!F ' 56#
"Q F#1 9*Q#7
)#". DQ! N -
$ ' 5# - 9 ,
!)>
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
Q".#@' #,D!' "."QDQ! 9*%Q#! F#"$! EQ".&$ ' #98#", . EQ"$&F - " #!)6' #,8D' "."'
-
#!N+!
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:
3 PUT: transfere um arquivo do cliente para o servidor
3 DELETE: remove um arquivo do servidor
3 OPTIONS: obtm a lista dos mtodos suportados pelo servidor
3 TRACE: retorna o contedo da requisio enviada de volta para o cliente
Alm do mtodo, path e verso, uma requisio pode conter parmetros adicionais,
chamados headers. Dois headers comuns so, por exemplo, o header , que # /- 0 /%&
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.
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.
!9%8#!9%,8C6#!9!<&*) %
>?BAC
-
- >(? A0C
Assim, no exemplo anterior, o cdigo de status indica que houve sucesso no
atendimento da requisio enviada pelo cliente, os headers indicam o tipo, tamanho e
data e hora de ltima modificao do contedo requisitado, e por fim, temos uma
pgina HTML em branco, com o contedo propriamente dito.
Outros cdigos de status bastante comuns so o , que indica que o recurso no foi
localizado no servidor, e o cdigo ! , que indica que houve erro no processamento da
requisio enviada.
! ) $ ,!$ )
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 . &! # /- /! /"- /.
Existem duas classes, na biblioteca de Servlets, que implementam essa interface:
! # /- /.! /%&/- ' /- /
e sua sub-classe,
. A classe , como o &! # /"- /&! &! " /- /& /% /"- ' /"- /
prprio nome indica, serve para atender requisies genricas (utilizando qualquer
protocolo), e a classe
, para atender requisies HTTP. /- /.
!"#
) , ! $ , )
1
) )
Todo Servlet segue, por outro lado, um ciclo de vida composto de 3 fases: inicializao,
atendimento de requisies e finalizao.
A inicializao ocorre quando o Servlet Container carrega o Servlet: se o parmetro (
(% # &- $&
, do Deployment Descriptor (vide seo 2.2), estiver presente e contiver um
inteiro positivo, essa carga ocorre quando o prprio servidor iniciado; caso contrrio,
essa carga ocorre quando recebida a primeira requisio a ser mapeada para a
aplicao que contm o Servlet.
Aps a inicializao, o Servlet pode atender requisies. Assim, enquanto o servidor
estiver ativo, e a aplicao que contem o Servlet estiver carregada, este permanecer
na fase 2 de seu ciclo.
Um ponto importante com relao a essa fase, e que na verdade constitui uma
vantagem da tecnologia de Servlets e pginas JSP com relao a outras tecnologias,
que o fato do Servlet permanecer carregado permite que dados armazenados em
variveis de classe persistam ao longo das diversas requisies recebidas. Assim,
possvel manter um pool de conexes ao banco de dados, por exemplo, de maneira
que no seja necessrio iniciar e estabelecer uma nova conexo ao banco de dados a
cada requisio recebida.
Finalmente, quando o servidor finalizado, ou quando a aplicao tornada inativa
pelo Servlet Container, o Servlet finalizado.
1 " -
!"# ! $, ! ,$,&
Conforme apresentado nos pargrafos anteriores, a inicializao do Servlet ocorre no
instante em que feita a carga da aplicao pelo Servlet Container.
Nesse instante, o Servlet Container executa o mtodo init do Servlet, dando chance
ao Servlet de executar quaisquer passos necessrios para sua inicializao, tais como:
1) leitura de parmetros de configurao
2) inicializao de variveis de classe (variveis estticas)
3) inicializao de conexes ao banco de dados, etc.
Assim, podemos ter implementado em nosso Servlet ProcCadastro, por exemplo:
0
As assinaturas do mtodo %
! so:
!5ON' D! E 9 Q ! ".#' #Q) / #(' #Q %9!K < =D%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 &! # /- /! /"- /. (% 0
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
/"- /& (% 0
referncia para o objeto # por meio da chamada , da prpria classe 0/. /"- /. (% 0
! # /- /.! /%&/- ' /- / $& %(.#)#)2' # # /2/&# /"% /
* .
Para obter um parmetro de inicializao do Servlet usando o objeto # , deve-se /"- /.
(% 0
utilizar o mtodo ! 0/. % " -.* /./"-
, passando como parmetro o nome do parmetro que se
deseja obter.
/ & 9< ' =" #%&6 E! / A ? I=7 ".#(' #Q !9!K <( <#&H 9 &I$J#Q8# ,J ' / #%&6 E! / A ?BI!+
0
0
Obviamente o mtodo ! pode retornar um valor nulo caso o parmetro 0 / % "&- * / /"-
inicial a ser obtido no tenha sido definido, e por isso importante que voc faa a
verificao do String retornado pela chamada do mtodo antes de utiliz-lo.
possvel tambm, a partir de um objeto da classe , percorrer a lista dos /"- /& (% 0
parmetros de inicializao do Servlet, bastando utilizar o mtodo . 0/ % - * /./-
* /#
Assinatura do mtodo getInitParameterNames ()
!5ON' D7 5& ' 95J#F & !9L<#&H 9 &I$J#Q8# & J#"@+
0
0
0
Assim, em nossa aplicao de exemplo &# - ( /%& /# , podemos implementar o mtodo
de inicializao do Servlet como: -(&' "# -(
Inicializao do Servlet ProcCadastro
-.- P#J#QF#!98#E#".& 9Q8; J#Q" "259!87E#! 'J" #% #9( QE6:7DEJDQEQ"$&.
8#"FFQ& D / )$ 9< P#J#8#!9F# 79O5' ' #!")) 9% &. J956' ' * "2" 59&&795O' '
5N' DO! E 9 / #%&6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
-.- P#D5 #F9E7" J#Q.F" E# 96 D ' MGE / #(' #
/ #%) E / A? I=J =" #!)6' # !9%K8 <( <#)H 9O &IFJ#8#! ,!J ' / #!) E / A ? I ,+
P#J#QF#!98#/7
="2#F' # !9%K <( <#Q&H 9 &I)#Q8# !,J ' P#!J#	%8# ,+
-O#"F. 9 F.
".#(' #Q %9!K& <( <#&H 9 &IFJ#QF#! ,J ' O#"F& 9Q8. !+
* " "259F
".#(' #Q !9!K& <( <#&H 9 &I$J#Q8# ,J ' * "$"2598!+
0
-.-0/ #(' # . #! K& D4D9# 7D%N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%# #. E DQ#9F#
!5ON' D:D' "." #. K& D 9 .L#QQF#!9E" >(+) / #!)' # ' #!L#!9!&" P5969N' #7R
-.- P#K8#!
96D :J&*)#!QE35# .; K8M# L#. K DQG JE:D!96#
5N' DO! E 9
/ %
# &6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
-.- #D!5GJEJ&*F#QE
5N' DO! E 59BR
* ' # ?B*)#QE #. K59 J95' ' BR
0
0
0
-.- P#D!5 #F9EJ#J' E9EJ J#)F" E# 9 D ' MQG JE / #' #
/ #( E! / A ?BI&7 " #!)' # 9K8 <@ <@#Q&H 9O &IFJ#&# ! , ' / #F E! / A ?BI!+
P6#!J#&#!9!8# J
=" #!(' # !9%K8 <( <#&H 9 &IFJ#QF#! ,J ' P#J#Q8#98#!+
#!")) 9% &. J
"$#%&6' # 9K& <@ <#&H 96 &I.J#8#!@!J ' O#"$& 9 F. !+
.* " "259!& J "$#%&6' # 9K& <@ <#&H 96 &I.J#8# !J ' * " "259!8 !+
K! / #!@ E / A0? I&L95' ' P6#!J#8#!9%8# J95' ' * "."2569& 7965' '
&*)
9%#
"=96 ' N' #QD#
Q. 9!O.F(
J#Q.F" E# 96 D! ' MG 9
#9D!9.FQE" 9 +
1 #
"$,++ ) , ) ) - )
!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.
Exemplo de uso do mtodo getInitParameter do objeto ServletConfig
e do objeto ServletContext
!5ON' D! E 9 / #' #Q 9K8 <
".#)6' # !9%K8 < &*OF
" ,D#%
& !9R
/ #!)' #Q !
/ & 9< ' $/Q#!D&7 " #!)' # 9K8 <@ <O#Q&H 96 8IFJ#&# 8I)J#&) %,#D5DQ +
-.-/ # 9 J#Q! "F& 18' %! J#&FJE / #' #F#!9FJ"4D!J J#&.:E67D%9!&#QQ8
/ #!)6' # 9 ' B".#(' #Q 9F#Q <# / #!)' # 98# 58
'
F/%,#D ' B".#(' # !98# ) <O#&H 9 &I$J#Q8# I$J#Q&$ !#D56DQ +
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:
!5ON' D 5. ' 95J#F ) !9L<@#Q!*B&2 N!5!8# & J#" +
!5ON' D ! E.##*B8& N5F# + ' !9<( / &. 9<
B 8& N58#(& J# +
!5ON' D ! EJ"2#* +.. N58# + ' !9<( / &2 9<
8& N5F#&BJ#
' 9<( N! #D
=Q+.. N5%8# ' 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.
!5ON' D:D' ".":I2 J#! F / #!)' # # &#!9%E" >O& / #(' #R
5N' DO! E 9 / #%&6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
-.- "@".9E7 .. N587E6#7D!9%8# & $7 9%E DQ "$8Q&56" E 9 D ' MQG
/ #!)6' # 9 ' B".#(' #Q 9F#Q <# / #!)' # 98# 58
' ="2#F' # !9%8# & ".#Q,*B8& N58#8I. J#! ) / #!@' #!O9#
!' #9+' ="25D#"2"$ 8
? *)#!QE "2' ##! + -.- 6"2 #. ".#<(5O9E" #J#. K8 D:"$8Q&5"9J#!9!8#
K"' " 5D#"."2/ K+!' ".#@+' = "$8Q&5%" / #Q<(59%E! / #!(' #& N!' #9 !' 5%# K8' "2#
&*OF
9#
"=9% ' N!' # %,D#!
) !9,$F!6":E " / #)6' #&"09
!5%E#!$, " #
D!.$#Q<@QE" D"256D#"2".9 !+
!5ON' D:D' "." / #Q<(5O9E / #' # #2F#!9E6" >O+) / #!)' #R
5N' DO! E 9 / #%&6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
-.- "@".9E7 .. N587E6#7D!9%8# & $7 9%E DQ "$8Q&56" E 9 D ' MQG
/ #!)6' # 9 ' B".#(' #Q 9F#Q <# / #!)' # 98# 58
' ="2#F' # !9%8# & ".#Q,*B8& N58# / #Q<(59%E! / #!)6' #!96#
!' #98' =" 5D#"."28
* ' # +' "FF &5"2I$ J#! F / #(' #5J95' ' R
? *)#!QE "2' ##! + -.- 6"2 #. ".#<(5O9E" #J#. K8 D:"$8Q&5"9J#!9!8#
-.-:/ # *6!5#LK&.QD"." 97 9 D ' M!QG 7E#".8# / #(' # 5E
# F
-.- ' 96GJ"05J:#D#G
K"' " 5D#"."2/ K+!' ".#
@+' =
"$8Q&5%"2I. J# ) / #!@' #Q. N!' #!9 ' 56# K8' ".#
&*OF
9#
"=9% ' N!' # %,D#!
) !9,$F!6":E " / #)6' #&"09
!5%E#!$,
" #!4D!.$#Q<@QE!"@9 ,+
Por fim, h um outro mtodo da classe que vale a pena conhecer: o mtodo /- /
(%& /
("0
permite que voc adicione mensagens em um arquivo de log do Servidor de
Aplicaes. Voc poder utilizar esse mtodo para depurar seus Servlets, gerar alertas
de problemas na sua execuo etc.
-.-0/ #(' # . &#"$8#E#J<#.QG JE##!9%". <(#9" E#' Q<
-.- ' E#K85' $7 !)#Q&$7 9 D! '6E / #)6' #
8#"FFQ& DK& 9' / .. 9</ ' ! #QK85' &I.JH 96 D '&
5N' DO! E 9 / #%&6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
-.- P#D5 #F9E7" J#Q.F" E# 96 D ' MGE / #(' #
0
0
1 %! - $ !
$'&
A finalizao de um Servlet deve ser tratada atravs da implementao do mtodo
/# - (
: no instante em que o Servlet descarregado, seu mtodo
, se tiver sido /# - (
implementado, chamando, permitindo a execuo de rotinas de finalizao (como
por exemplo, o encerramento de conexes com bancos de dados, finalizao de
threads que tenham sido lanados etc.).
A assinatura do mtodo ./# - (
a seguinte:
-.-0/ #(' # . #! K& D4D9# 7D%N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%# #. E DQ#9F#
!5ON' D:D' "." #. K& D 9 .L#QQF#!9E" >(+) / #!)' # ' #!L#!9!&" P5969N' #7R
-.- P#K8#!
96D :J&*)#!QE35# .; K8M# L#. K DQG JE:D!96#
5N' DO! E 9 / #%&6' # !9%K8 <
B".#F' # !9%K < &*OF
" QD#
& !9R
/ #)6' #
? *.#QE
# 2 K& "FFF5
-.- #D!5GJEJ&*F#QE
5N' DO! E 59BR
* ' # ?B*)#QE #. K59 J95' ' BR
0
0
0
0
No exemplo, o mtodo
./# - (
serve para indicar que o thread deve ser finalizado: a
1 ) -
! )*-
) ) ,! + ! &
(*),+
!5ON' D ! EJE!I%"F + Q ! ".#(' #) *+)
>6&
/
# ' #Q&P#35#")
$
#35#"F
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#"2
!9%".#
!5ON' D ! EJE #!' #Q8# QQ " #!)' #& *%+&
>(+&
/ #(' #&P#35#"$
F#35#".
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#"2
!9%".#
!5ON' D ! EJE!I5%+ ".#!)' #Q& *+&
>(+&
/ #F' #)P#35#"$
F#35#".
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#"2
!9%".#
!5ON' D ! EJE1
Q. 9" + Q " #!(' #Q. *+&
>6+)
/ #F' #Q&P%#!35#"F
$#356#"F
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#"2
!9%".#
!5ON' D ! EJE? FDQ#+ "2#F' #& *8&
>(+&
/ #F' #&P%#35#"F
)#!35#".
! ".#@' #Q. *+.
>68&
/ #%&(' #)P#"2
%9%".#
F#"2
!9%".#
Quando uma requisio HTTP recebida por uma classe que estende HttpServlet, seu
mtodo # /- ',/
chamado, sendo que a implementao default desse mtodo ir
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. &( /.
Geralmente, desenvolvedores de Servlets implementam somente os mtodos e &( /.
( (&#
; os mtodos restantes s so implementados em casos especiais, e requerem um
Servlet HelloWorld
!5ON' D:D' ".":>@#' ' .' E7# &#!9%E" >O+. / #F' #R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9>@#!' ' .' E 9 ,+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
!5ON' D:D' "." / #!)' # 98E! #Q8#9E"0>6) / #(' #Q ' #J#!9!&" / 9<@' #? *)#QEA4!E#'R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
.#",
!9%"2#@.*$
"0H QD#
& 9R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9P#35 "2 G #"0$#D#%N EQ"
( H 9!&#Q<O#%$ & / .. 9< (($ 98E! +
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
.#",
!9%"2#@.*$
"0H QD#
& 9R
'
. 9!)' 9Q>? AC!+
-.- * 2J,M!#!99EL!' E7D!9%8E! # 5J4 ;Q#'' DQ!'O5"$9E7"Q 9DF!9O MG
9%' BDQ98E!
-.- J#!FJE#
H
. 9E:9 6 $#3%56 "2 G !#"0$#D#N E6Q" # FE
#
'
. 9!)' 9P#35 "2 G #"0$#D#%N EQ"
( . 9< + ' =D!98QE6!
H 9!&#Q<O#%$ & / .
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
1
) -
$*- ! - 1 .$'&
(*),+ + *2 ) ,) )
Alm dos mtodos , &( % ! e /&# - (
, voc tambm pode implementar o mtodo
0/ /- / % (
de um Servlet.
!5ON' D:D' ".":>@#' ' .' E7# &#!9%E" >O+. / #F' #R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9>@#!' ' .' E 9 ,+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
Caso voc no implemente esse mtodo, um texto vazio ser retornado pela
implementao default desse mtodo.
Embora a anlise dos mtodos dessa classe fuja um pouco ao escopo deste livro (trata-
se de uma classe do prprio core Java), interessante apresentar alguns de seus
mtodos aqui.
"- %
Os mtodos e , dessa classe, por exemplo, podem ser utilizados para &- %& %
adicionar Strings ao stream de sada do Servlet; como a sada mantida em um buffer
por questes de performance, voc pode tambm utilizar o mtodo para forar a $#)
liberao desse buffer de sada, fazendo que o contedo da resposta definido por
voc seja imediatamente enviado para o cliente.
!5ON' D:D' ".":>@#' ' .' E7# &#!9%E" >O+. / #F' #R
'
. 9! !Q>@?BAC+
'
. 9! 8>O#' ' = .' E9 +
'
. 9!)' 9 ! -
- >?BAC 8
'
K8' 56"2*/+
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 &( &(
/
declarado de maneira a possibilitar o lanamento de uma exceo : essa "! (! "'/ (%
exceo pode ser lanada pelo mtodo caso haja algum problema gerao 0 /. - /"-
de sada do Servlet.
Outra opo de implementao para o Servlet / ( ("-
! seria, portanto:
#!
' :E#L<#.QG JE#J"2 E:"Q
' #" E# / #%&(' # DQD
&5):E#J#QD#G!
-.-0/ #<(59E: ' #!J#98QG 7E / #!)' # F7 ; <= 9% > #!' ' !$' E
!5ON' D:D' ".":>@#' ' .' E7# &#!9%E" >O+. / #F' #R
'
!$ 9&' 9! - - >? AC!
'
K ' 5"2*/+
' =D!9F#QQ& ' <!O.F(F9 K8! "." #'=5. ' M )#K8#
Dessa forma, podemos capturar e tratar a exceo "! (! "'/ (%
caso ela ocorra,
gerando, por exemplo, uma mensagem de log.
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.
!9%8#!9%,8C6#!9!<&*)
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 ().
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:
$#"Q !9" #! "2#&>@#QE#! D*# !9%&$!' , 9 +DD*6# O5".,.#!' E 8#
!9%8#!9%,8C6#!9!<&*)
-.- ? #FD# $7 ' #!J#98QG 7E / #!)' #Q $7 ; <= 9% > #!' ' %$' E
!5ON' D:D' ".":>@#' ' .' E7# &#!9%E" >O+. / #F' #R
) $ R
.#", !9%"2# " #Q&>@#QE#! ! D*# %9!)F' , 9!DD*6# O5"F.#' EQ8#!+
'
!$ 9,8>O#!' ' ! ' E9 ,+
'
!$ 9&' 9! - - >? AC!
'
K ' 5"2*/+
' =D!9F#QQ& ' <!O.F .9 K82 "2" #'!N8# F#K8#!
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.
!5ON' D! E"2#&H 9&>O#QE# + % ' 9<( / ). 9< *#E# & J# ' 9< 9+
O segundo parmetro do mtodo deve conter o nmero de milisegundos # / / "/& ./"-
desde epoch (meia-noite, do dia 1 de Janeiro de 1970); o mtodo ' do '.$&- -/%& * / #
objeto
&! %0&! # /&*
retorna esse valor para o instante corrente.
Alm dos mtodos anteriores, existe o mtodo '(%. % # / /- , para verificar se um header
/& &/"- / "/& ./"- e %& /" /- que permitem a adio
!5ON' D! EEE>O#E#!@+ % ' 9<( / ). 9< *#QE#!*& J# F ! ' 9<@ / &. 9!< *#QE#! ' 5#+
!5ON' D! EEEO F#!>@#QE#! 8 ' 9%< / &. 9< *6#QE# & #' !9%< EQ8#8
!5ON' D! EEEH 9&>O#QE!# + Q ' 9<@ / .. 9!<
*#E#% =
& J#' 9<
9!+
-.- 5%F87 ' #J#!98QG JE / #F' #Q .J ; < 9:>@#' ' .' E
$#"Q !9" #! ".#)>O#E#! , 98#!9%, ?'$ #! &#Q - *&' !+
'
!$ 9,8>O#!' ' ! ' E9 ,+
'
!$ 9&' 9! - - >? AC!
'
K ' 5"2*/+
) $'& ,)
&
+ "! + , ) + $ $,+
Conforme mencionado no na seo anterior, o header serve para indicar o (%. /"% /
tipo do contedo contido na resposta do Servlet. Dessa maneira, o valor indica / *
uma pgina HTML, o valor indica uma imagem JPEG, e assim por diante. * &0/ /&0
Devido a sua importncia, existe uma funo especial utilizada para a definio do
valor desse header.
Servlet ImageServlet
-$- N	E7F35 7D! J <@#! ;6I F& E" J#)F"
-$- E7E#5
C%#!9EJD!9%8# 6 !$35 JDQ9	E 56J <# #
-$- E7DQJ.#",
"FF
)#8.969E:#"$8#D!9%8# 6
/ #F' #Q 5!&
!5! / &$#' ="3J
$#"Q
9" #! <O#! 5&
5 / &$# 8
$ F#
N ' N5K+K+# J9#
N$F#
+
*O ' # +' N !
$ F#" 7' J <@# 6 ' # $#QE + ' N5K+K # 9
' ="2
. 8# +' N5K K8#!@) ' N
$ &#"'+
. $ R
K"' <# ' # 9 7956' ' B' J<# 6 ' # D' ".#/!+
' =D!9F#QQ& ' <!O.F(9 %:K8@
" " #!'O' # J <# E#7F35 ,+
0
0
0
No exemplo anterior, voc poder observar tambm a utilizao do mtodo
0/ $ &$ - / &*
. Esse mtodo deve ser utilizado, em substituio ao mtodo que 0 /. - /"-
foi usado nos exemplos anteriores, para obter uma referncia a um stream de sada
binria do Servlet.
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
0/ $ &$ - / &*
, e obter uma referncia a um objeto da classe ! # /"- /! /"- /. $$ - /&*
.
Esse stream ServletOutputStream extende, na verdade, a classe ! (! $.$ -/ * e,
sendo assim, herda os diversos mtodos - / e o mtodo $#) da classe-me.
) $ - # -
)
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, ), ) ! . (-$.*4! ("-0
apresentamos abaixo o cdigo de um Servlet que gera uma pgina WML apenas para
exemplificar a gerao de um documento XML.
Servlet HelloWorldWML
-.- 5%F87 ' #J#!98QG JE / #F' #Q .J ; < 9:>@#' ' .' EE6#!")&#!MJD!L<#$QG JE7$#"2 ".8:# K8. 8$ AC
!5ON' D:D' ".":>@#' ' .' E AC:# &#!9%E" >O+.
/ #F' #R
-.- * 	E J#987E# $#35 "2 G!#">(?=? I:D! #Q8E %?
5N' DO! EE6B#Q>68&
/ #(' #Q&P6#35#".
$#35%#"F
>O&
/ #(' #&P#",
9"2#J
.#"2
9".# R
) $ R
- ' ,8
'
K ' 5"2*/+
/ #F' #Q !9!&#Q ' DQ98# <# / #!)' # 98# 58
' =D!9F#QQ& ' <!O.F()(
B#! <(#&A #"2"$ <(# ,+
0
0
0
$ ,+
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.
Um Servlet pode definir esse status atravs do mtodo da classe
, # / $# /- /& /#, (%&# /
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.
!9%8#!9%,8C6#!9!<&*)
Temos, a seguir, uma tabela com alguns dos cdigos de status HTTP existentes e seus
respectivos significados:
Cdigo de Status Mensagem Significado
200 OK Requisio foi processada com sucesso.
302 Moved Temporarily O documento solicitado encontra- se disponvel em outra
URL.
404 Page Not Found O docum ento solicitado no foi encontrado.
500 Internal Server Error Erro no processamen to / obteno do documen to
requisitado.
503 Service Unavailable O servio no se encontra disponvel.
/ & 9< ' K ' #9#= <(# / #!)' # 9K8 < 8 <#&H 9 &I$J#Q8# ;6 #< ' #9J#!
K",9 ' =K8 ' #! # "$8"3, ' K ' #!9J#/7965' '
0
K!+' =K8 ' #!9J#&:9O5' ' BR
$#"Q
!9" #! ".# / 8&5"@+
$#"Q
!9" #! / '& ? "& .+
$#Q)56.9
0
-$- N	E7F35 7D! J <@#! ;6I
F& E"
J#)F"
-$- E# 9 D !' MG E / #(' #
-$- E7E#5
C%#!9EJD!9%8# 6 !$35 JDQ9	E 56J <# #
-$- E7DQJ.#",
"FF
)#8.969E:#"$8#D!9%8# 6
/ #F' #Q 5!&
!5! / &$#' ="3J
$#"Q
9" #! <O#! 5&
5 / &$# 8
$ F#
N ' N5K+K+# J9#
N$F#
+
*O ' # +' N !
$ F#" 7' J <@# 6 ' # $#QE + ' N5K+K # 9
' ="2
. 8# +' N5K K8#!@) ' N
$ &#"'+
K"' <# ' # 9 7956' ' B' J<# 6 ' # D' ".#/!+
' =D!9F#QQ& ' <!O.F(9 %:K8@
" " #!'O' # J <# E#7F35 ,+
0
0
0
Podemos ver, nessa implementao, que o cdigo de status definido pela constante
numrica da classe
. /"- /. /.#) (%# /
Utilizao de constante SC_NOT_FOUND da classe
javax.servlet.HttpServletResponse
.#",
9"2# " #Q / 8Q&5%" 8
F#"2
9".# / '& ? '" & .+
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 Mensagem Constante
200 OK SC_OK
302 Moved Temporarily SC_MOVED_TEMPORARILY
404 Page Not Found SC_NOT_FOUND
500 Internal Server Error 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.
Outro exemplo o cdigo de status (
): ao definir esse cdigo de
status, voc deve definir tambm o valor do header para indicar a URL onde o ("', (%
novo documento pode ser encontrado.
Temos a seguir o exemplo de um Servlet que, dependendo do endereo IP do cliente
que envia a requisio, redireciona o acesso para uma nova pgina contendo uma
mensagem de acesso negado.
Servlet CheckIPAccess
-.-0/ #(' #
. #! K& DQG JE H IJED' #9&#L35#LK8ML.#35 "2 G
-.- " #
.#K8 QJE H IJ9 LK8.#D!9O*#D! EE F#D 97
.756J
%;Q<( 9
-.- D%5OJ:J#!9" <#! E#D#" ". 9#<QE
!5ON' D:D' "." *%#!DH I* DDQ#!" " # 	E" >O& / #F' # R
K!8'
&9 J95' ' +'
"F8!&&" .* .* ' '
#E%H II!)#K8 !B'
/J95' '
$#"Q
!9" #! ".# / 8&5"@+
$#"Q
!9" #! / A A0I P*
? 6 PH C+
$#"Q !9" #! ".#)>O#E#! ,8CD & !9, - DD#" "2E#9 #E *&' !+
$#Q)56.9
'
!$ 9&' 98IFN#9"
" #!5 D#!"$"2LK8
#. & E9 ,+
'
!$ 9&' 9! - - >? AC!
'
K ' 5"2*/+
/ #F' #Q !9!&#Q ' DQ98# <# / #!)' # 98# 58
' =D!9F#QQ& ' <!O.F()(
B#! <(#&A #"2"$ <(# ,+
0
0
$#"Q !9" #! "2#&>@#QE#! CDQQ& !9! - DD#" ".E#9 #E *! ' !+
F#&5O.9
0
Pelo cdigo:
$#"Q !9" #! "2#9EP#E F#D - DD#"2"$E#!9 #E *&' !+
F#&5O.9
0
-.-0/ #(' #1"2
!' #"43%56#7$#8%$9:
; <= 9:>@?BAC:D! L#F:E#.#35 "2 G #"
9
-.- $#D#!N EQ" #J !J#98!6.#E $#D !96: ' #"Q J:D#"."
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- * 2J,M!#!99EL!' E7D!9%8E! # 5J4 ;Q#'' DQ!'O5"$9E7"Q 9DF!9O MG
-.-:/ ##"FF#:K84 ' #" J:D#" ".O.#E F#D !9%7 $75J: ; <= 9:#", #D '
$#Q.5.9
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9P#35 "2 G #"0$#D#%N EQ"
( H 9!&#Q<O#%$ & / .. 9< + ' =D!98QE6!
'
K8' 56"2*/+
0
0
! ,) $ '+ ) )
4
!5ON' D! E"2#9E F + 9 =".F &5" E# Q ' 9%< / &. 9< ")& &56"2A4#"." <#
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 $ ,) + + $
Um ltimo recurso interessante relacionado ao processo de gerao de resposta do
Servlet o buffering do contedo dessa resposta.
Esse buffering controlado atravs dos seguintes mtodos da classe /- //&#) (%&# / :
#6D9K+.J#7DQ"2
-.-0/ #(' #13%56#7$#' M75
$D#" ".!J#987356' 35#
-.- 9
5' 0 N5%K K8#4E!# $#"Q
"F&
!5ON' D:D' "." / #!)' #5K K8#!.P6#" "FF:#2F#!9E6" >O8& / #!)' #R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- H . 9EJ& 9*:EN5K K8# E#$#"Q "FF79' Q< E:! ' DQG
<(# / #%&(' # 9 + ' < & 9*:E#K85' E N5K+K #4E# F#"2
".8&#&% )(
H 98#<(#. 8 / & 9<+
$#"2
%!9".# <@#Q5%K K+# / M#>(+% !+
'
. 9!)' 9Q>? AC!+
-$- *
#"2 E#J8#.J" E#K 9 E:#!
!' D 8J#9&#LJ&J9*JE N65K+K # #"$#%
F#
-$- N O#%$ K8 DQ!4".#" #!5 E
D!9%8# 6 ; 9 :K8@F#
"." QE
%!F:D' #!9%8#
-$-
J# :E &#QFE " ! 8#E/!
0
0
'
. 9!)' 9 / 5%DQ#" ". 9%
$D#" "2J#9&9 - - >? AC+
'
K8' 56"2*/+
0
0
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).
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< >O&
/ #(' #&P#35#"F& <@#Q / #!)# & J# !+
!5ON' D7 9% >O8&
/ !
# )' #&P#3%56#")& <@#Q / #!)#%$I 8
Em particular, os mtodos e 0/& /- ./-
* /
devem ser chamados a partir do 0/ /"-./- &("-
/- /. / $/#
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.
!5ON' D:D' "." / #!)' #&H 9%K / #%&( E1#Q8#%9%E!">68& / #(' #R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9+?B#28JE# H E#9) K DQG JE / #!)6 E!* ( <(# / #@' #Q 98#2
<# / #%&#! H 9K8/(+P
'
. 9!)' 9 =
& J#:E / #( E!*)(
F#35#"$& <@#Q / #!&#! & J#
(+!P !+
'
. 9!)' 9I&E / #( E (
)#!35#".& <# / ##2IF5 (>P!
-.- H . 9E: 9K8!. QG %#"4"2NF#J / #%&(' # #" #!5 D!9%8#2F
'
. 9!)' 9 =
& J#:E / #(' #, )(J<@# /
# F' #Q !9%K < <# / #@' #,& J#
)(>,P,+
'
. 9!)' 9 #F" JE=* IH6"25
%!FQE7
#!' / #F' #Q 98! 9#!
( H 9%8#Q<@#!. 8 / & 9!< <# / #@' #Q 9,+ <@#Q&A4! ! #!)", !9> (
( H 9F#Q<#. & / ). 9< <@#Q / #!&(' # 9 + <#Q&A 9! #!$"2 %9/ (>P!+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
-.- H . J#J 9%K .JQG #" " !N$#JDQE7$#35 "2 G7$#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
"0H
DQ#
& 9R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9,9E#!$#G7E#J"2567J;35 96 (
$#356#"F& <#&P#J8#* EE%
(+!P!8
'
. 9!)' 9 =
& J#:E#"25J;Q35 9
(
F#35#".& <#&P#!J&#!>O".
,(>P!+
'
. 9!)' 9A #8ELE7F#35 "2 G )(
F#35#"$& <#&A4#Q&*%E>(+P,+
'
. 9!)' 9I &*JE.#35 "2 G ( (
F#3%5%#"$& <#&P#3%56#"),"=PH (>P!+
'
. 9!)' 9I!)Q&D' JE )#!35 ", G %! (
.#35#"F& <#Q / D*6#!J# )(/P!+
'
. 9!)' 9 #F" JE
F8DQ' E )#!35 ", G %!
(
$#35#"F) <#Q&I$QFD'! (>P!+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
!5ON' D:".8& D 5K K8#!4>68&
" & ' "2 <#Q&P6#35#"F,"=PC+>6+&
/ #(' #&P#35#"$
/ ). 9<
.#35#"F +
Os mtodos , 0/
(%& / & 0 /& /"- /
e retornam, respectivamente, o caminho 0 /. " % (
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
subdiretrio criado abaixo da pasta
, ou seja, o subdiretrio da aplicao Web. / &"#
Por outro lado, o caminho do Servlet, corresponde ao mapeamento (servlet-
mapping) que originou a chamada ao Servlet.
/"- / % ( &/
Se o Servlet anterior, , estivesse instalado junto a uma aplicao Web , .- (&# /"- /.#
por exemplo, e, no Deployment Descriptor dessa aplicao Web, houvesse um
/"- /& % ( /
mapeamento da URL para esse Servlet, teramos os seguintes resultados para
cada requisio recebida:
Entra tabela
0 /. " - %&# /
A funo seguinte, , tenta traduzir a informao de path da requisio
para o caminho real do recurso no disco. importante observar que essa funo s
funciona caso a aplicao web no tenha sido implantada como um arquivo WAR
(explicado mais adiante no Cap tulo 9 T picos Adicionais).
A ltima funo, 0 /. &/ $/.#
, serve para construir a URL que gerou a requisio ao
Servlet, incluindo as informaes de esquema, protocolo, mtodo etc. Essa funo
deve ser chamada diretamente a partir da classe
, do pacote , pois # ! # /"- /.!
trata-se de um mtodo esttico dessa classe.
Agregando, ento, essas novas funes ao Servlet /- / % (&/
, temos o cdigo a seguir:
-.- H . J#J 9%K .JQG #" " !N$#JDQE7$#35 "2 G7$#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
"0H
DQ#
& 9R
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9,9E#!$#G7E#J"2567J;35 96 (
$#356#"F& <#&P#J8#* EE%
(+!P!8
'
. 9!)' 9 =
& J#:E#"25J;Q35 9
(
F#35#".& <#&P#!J&#!>O".
,(>P!+
'
. 9!)' 9A #8ELE7F#35 "2 G )(
F#35#"$& <#&A4#Q&*%E>(+P,+
'
. 9!)' 9I &*JE.#35 "2 G ( (
F#3%5%#"$& <#&P#3%56#"),"=PH (>P!+
'
. 9!)' 9I!)Q&D' JE )#!35 ", G %! (
.#35#"F& <#Q / D*6#!J# )(/P!+
'
. 9!)' 9 #F" JE
F8DQ' E )#!35 ", G %! (
.#35#"F& <#Q&I)Q&D'
(+!P!8
'
. 9!)' 9P!+
'
. 9!)' 9 9*6E7D!9%8#2F!
(
F#35#".& <# !9!&#Q )I &*/,(>P!+
'
. 9!)' 9 9*6E / #F' #Q, (
$#356#"F. <# / #!)6' #&I&*/
(+!P!+
'
. 9!)' 9H 9K+.JQG %#"4QE D 9 " E#JD 9*()(
$#35#"F& <#)I &*H 9!K /
(+!P!8
'
. 9!)' 9 9*64)FE%5M E (
$#356#"F& <#&I &*!? .Q9" ' &#E>
(+!P!8
'
. 9!)' 9 "=PCBD!
' #QF E $#35 "2 G! ( >(8&
"O& ' " <#&P#3%5%#"$,"=PC+
.#35#"$
(+!P!8
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
-.- &B#" ".# / #%&(' #6
":/# &E" !? # I / ? " L)$ &QE" EJ#" J 9#! .
-.- 8
#' J#"2J))#!D*6JE!#DE <(
5N' D E7E6!I"F + >6&
/ #(' #)P#35#"$
F#35#".>(+)
/ #!)' #&P#"2
!96".#7
F#"2
9".#
&*OF
"0H
DQ#
& 9R
Com essas novas funes, uma possvel sada para esse Servlet passaria a ser:
-
- >? A0C
1 * ! +
2 5
.)*$ ) +
$ ) !+! &
4
Se voc j construiu pginas HTML, ou at mesmo navegou na Internet, voc j deve
ter se deparado com formulrios HTML.
Formulrios HTML possibilitam, por exemplo, que digitemos textos ou selecionemos
valores em campos de uma pgina HTML, sendo que, ao final, normalmente clicamos
em um boto para que essas informaes sejam enviadas para o servidor.
Ao fazermos isso, h, na verdade, uma requisio que gerada pelo browser, sendo
que as informaes digitadas e selecionadas por ns so anexadas como parmetros
dessa requisio.
Temos, a seguir, um exemplo de pgina HTML com um formulrio de cadastro.
I?BH & * C(" ,M5' ,M5' - I? H & @ I?BH '& * C(" #%F #!' *% !$O#!.J#' * - I,? H &
I?BH & * C(" #%)E!#$#!FE6# - I?BH '& I? H & *C" +JF#' !JF#!' - I? H &
I?BH & * C(" NF9DQQN!$9D - I?BH & I? H '& * C" 8
F#8 Q
.#8 - I? H &
C
-./
? !PP
- PA
-
- >? A0C
Nesse formulrio, existem 3 parmetros que sero enviados junto com a requisio ao
servidor quando clicamos no boto Enviar: , e . Em particular, o parmetro % (&* / ')(- /# /%&
')(- /#
pode estar associado a mais de um valor, dependendo de quantas cores forem
selecionados pelo usurio que visitar essa pgina.
Uma outra forma de enviar parmetros a sua concatenao diretamente no path da
requisio, bastando para isso acrescentar o caractere ao final do path, seguido de
pares %.("* / &( &&- .* / - (
(- ( &- .* /&-(
, separados pelo caractere . Poderiamos, por
exemplo, simular um envio de informaes do formulrio anterior atravs do seguinte
de requisio:
- (&# /"- /&# /"- /& -.* #/ . % (&* / * /&$ %.("* / ',("- /&# .$ '("- /&# "- /.( /%& ) %& -
*
*
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
A API de Servlets disponibiliza diversos mtodos para capturar os parmetros de uma
requisio:
!5ON' D7 5& ' 95J#F & !9>68&
/ #' #Q&P6#35#"$& <O#&I$J#Q8# & J#" ,+
!5ON' D / .2 9< >O&
/ #(' #&P#35#"F& <@#Q 5# $ / &2 9< 8
de parmetro.
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 '("- /&#
exemplo). Nesses casos, devemos utilizar o mtodo , que ir retornar no 0 /& - * /./- $/&#
um nico valor, mas sim um array de valores.
O mtodo seguinte, 0/ -.* /./"- * /#
, retorna uma lista enumerada com todos os nomes
de parmetros recebidos. Dessa forma, possvel iterar nessa lista e obter os respectivos
valores de parmetros.
Por fim, o ltimo mtodo,
, retorna justamente o texto da query explicado 0 /. $/- - %"0
na seo anterior, ou seja, a parte do path de requisio que vem aps o caractere
(se existir).
O Servlet /"- /& &- &* # /
usa os mtodos apresentados anteriormente para capturar os
parmetros enviados pelo usurio e apresent-los em sua sada
-.- H . J#J J#)F" E#JDE F#35 "2 G F#D#N E6
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
'
. 9!)' 9Q>? AC!+
/ & 9< '
$ & J# = / & 9!<B'
F &BQJ#"Q 9#2' #!J#95+
/ & 9< '
$ ' 5# J
$#35#"F& <#&IFJ#QF#! '
!) &=J#+
'
!$ 9&' 98I J#&F )( '
$ & J#<(+P!+
'
!$ 9&' 9 ' !* )( '
!) ' 5# (/P!+
/ & 9< ' !) ' 5#" 7 $#35#"F& <#&IFJ#8#! ' 5#" + ' $ & ,J#+
'
!$ 9, ? E" "!' %)#!"* +
K!+'
F ' 5#"39 J95' '
K8 8 9H =6H Q' !) !' 5#"2 ' #!9<&*6H (( R
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
-.- &B#" ".# / #%&(' #6
":/# &E" !? # I / ? " L)$ &QE" EJ#" J 9#! .
-.- 8
#' J#"2J))#!D*6JE!#DE <(
5N' D E7E6!I"F + >6&
/ #(' #)P#35#"$
F#35#".>(+)
/ #!)' #&P#"2
!96".#7
F#"2
9".#
&*OF
"0H
DQ#
& 9R
?
E"4!"4' .#" #!59%!J# P
M5O' P
' %
? M5' #FE#P
E"4!"4' .#"
)'$ ) + $ ) ,! + ! &
0
55 >8
!5ON' D7' 9< >(8& / #!(' #&P#35#"F& <#@ 8#>O#E!# / &. 9< *6#QE# & J# +
!5ON' D7 5& ' 95J#F & !9>68& / #' #Q&P6#35#"$& <O#&>O#QE# & J#" +
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.
Por fim, o mtodo 0/& /& ./"- * /#
retorna uma lista enumerada de todos os nomes de
headers recebidos. Com isso, voc pode usar essa funo para iterar na lista de todos
os headers recebidos.
Um uso frequente para esses mtodos o de verificao do header , que indica $# /- .0 /%&
o tipo e verso do software do cliente que enviou a requisio. Por meio desse header,
voc pode gerar um documento diferenciado para cada tipo de browser que acessa
a sua aplicao.
O header &','/"
tambm bastante importante: ele indica os tipos de contedos aceitos
pelo cliente. O Servlet a seguir verifica o contedo desse header e, /- /.
/- '.'/
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
-.- #. K DQJJ%' ! E6 *6#QE# DQD#!
B# $#8.96:
; <= 9:>(? AC
-.- 5& E
ACLE#!
#9E#!9EJE#".#5D98#
/ &2 9< ' QDD#!
&>O#QE# J
$#35#"F& <#Q&> #QE# ! QDDQ#
,+
K"' QDDQ#
Q.>O#E!# 9 :9O5' ' ' QDD#
&>@#QE#!. #3%5%' " 8#2 - 696E
' ,=R
-$- LD' #98# QD# &:D!9%8# 6E!$ ALC!6
. J# F:8#" 35#JE#K 9 DQ9	 (
$
#
.#",
!9%"2# " #Q 98#9 ?$
#! 8# - 9E
!
' !+
'
!$ 9&' 9! Q
'QO#%)", !9 %'
% ,+
'
!$ 9&' 9!9 ? (I !'I " !CH '% - - 7* I P "=A -F- ?-+ A C
-F- (& %
"% &*!+&
( -.-
K+! 5J < - @? -
'
' % ,+
'
!$ 9,!
' DQFE !+
'
!$ 9,!Q
L!' <(9'% DQ#98#,%',@ ' ; -
!+
'
!$ 9,! - DQFE -
' ,8
0
#' " # R
-$- E
D' #!9!O 7D# F:D98# AC<@#!$J"5J:
; <= 97>? AC
'
!$ 9&' 9!Q>@? A0C,+
'
!$ 9&' 9!QI@ ' ; - I!+
'
!$ 9&' 9! - - >? AC!
0
'
K8' 56"2*/+
0
0
* $ ) $ ! +
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
- - >? 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 .
A maneira mais fcil de se tratar esse tipo de parmetro de requisio em um Servlet
utilizando classes prontas de terceiros. Um exemplo de uma biblioteca que pode ser
utilizada para esse tipo de tratamento pode ser encontrada no endereo
# (&$"-',/ (-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#"$&
!5ON' D:D' "." / #!)' #,"= ' QE* F3# 	E" >O& / #F' #Q R
5N' D E7E6!I"F + >6&
/ #(' #)P#35#"$
F#35#".>(+)
/ #!)' #&P#"2
!96".#7
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.-
. J#! $7
#&.$#3%56 "2 G % 6".#<(59E&# 9!J#JE# 5
E $#Q 2
-.- 8#!
.;$ !96E!# E#Q# 1" #!@$,M#9QE"="=$35 %"=D!.$#Q<@QE!"=96 " #!) E
-.- J8#FD# $&#J&J!9*67J; ! L:#N$8#"0
%#!. & E"'#356F8
E!#
-.- E#K8 9O #!9DE 9< J"2#05!) ' M!QE!
#'
!F" #!+JE#K 5' )#>&H /
,
A5' &
)P%#35#")'
F" #! 9%#
/ #!)' #&A:5' &
)P%#35#") +
7 .#35#"$
%%.&#
!A:5' &
)&P#35#"F& A * P *
6? / 95' '
/ &2 9< ' 9J#* .3/J'
F"2#2 <#".# ' #!9%:#+)3%56 !+ -$- &=J#:E67F35 %
/ &2 9< ' =8&* F3>JC9<( 8 / &. 9< + ' !F".#. <# ' # / M!# !F35 %,+
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9 =
& J#:E.35 ! )( ' 9!J#* F3/(>P,+
'
. 9!)' 9+?BQJ9*E$35 O! ( ' @F$*F3/(>P
'
. 9!)' 9 =
& J#BE!F35 :8#
F;2 ' D' ( ' 9J#*)3%C%D' (>P
'
. 9!)' 9 - -. - >?BAC,+
'
K8' 56"2*/+
0
0
No Servlet anterior, usamos alguns dos mtodos disponveis na biblioteca . $ "- / &$ /#
Para conhecer todos as suas funcionalidades, voc deve fazer o download da
biblioteca, e observar a documentao de sua API.
! 2 + $ )
! + !&
4
Finalmente, alm de todos os mtodos apresentados anteriormente, existem mtodos
para definir e recuperar atributos da requisio. Esses atributos funcionam como os
atributos do contexto do Servlet apresentados na seo 3.6, exceto que seu escopo
est limitado requisio.
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.
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 '(% .("- do tipo hidden.
H &
I "@? I ",56N
? ( & * 3
A *B)5' M *C(" *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.
Assim, podemos construir o Servlet a seguir para contar o nmero de requisies
recebidas de cada cliente:
Servlet ServletContadorReq
-.- %9!&: 96J#!FJE# F#3%5O " G #"0$#!D#!N E" E#JDE!JD!' #98#
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
' =D!9FQE!7H 98#<(#.
$".#H 9!+
$#35#".& <#&I.J#8#% +D9&QE ,+
(( ' BDQ!9%8E!
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9 PA A !? > % I / ? %' * ? H & % - ' .".#(' #Q&"
/ #F' #Q !9!&QE.P#3 - % !
'
. 9!)' 9 !9!&QE! E# $#35O "2 G #" (H 98#<#! 8 / & 9!<+' =D!9FQE!
(P,+
'
. 9!)' 9QH & I "(? I
? = % &* EE6#!9% & * A '% D9&QE,%' *C(" @% ,
( H 9%8#Q<@#!. 8 / & 9!<+' =D!9FQE! ( %!PP
'
. 9!)' 9QH & I "(? I
? = % 8" 5N % & * A @% * &5' M %
* C(" % * &5%!' M% !
'
. 9!)' 9 - PA !+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
O Servlet /- /
(%& .(- /
anterior usa o campo escondido para armazenar o valor ' (%. (-
do contador na ltima requisio recebida, sendo que esse valor repassado de volta
para o Servlet cada vez que o cliente pressiona o boto ! . $. -
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.
Servlet ServletContadorReqMod
-.- %9!&: 96J#!FJE# F#3%5O " G #"0$#!D#!N E" E#JDE!JD!' #98#
!5ON' D:D' "." / #!)' # 98E!2P%#3A4EJ# 	E" >(8& / #!(' #R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- Q&$ 9EJ 9%K .JQG #" E D !9%! "4E#7D! 96*
/ &2 9< ' 9!K I &*/
F#35#"$& <O#&I &*OH 9K+ ,+
K" +' 9K+!IQ&*/9 :
965' ' ' 9K8!IQ&*6 "FF&" )* - ,
+' 9K+!IQ&*6 ' #9<&*/
' 9K8I )*/:' 9K+!I &*O "256N")&. 9%<
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9 !9!&QE! E# $#35O "2 G #" ( H 9%8#Q<@#!. 8 / & 9<.+' DQ9&QE
(+!PP !+
'
. 9!)' 9 * >@P %' - ' ()!"$#!)6' #8" -2/ #(' # 9FQE!.P%#3A4E -
'
K8' 56"2*/+
0
0
'
! ),+
Para resolver esse problema da persistncia das informaes associadas a um cliente,
necessria a utilizao de Cookies.
Cookies so pacotes de dados, gerados pelo servidor, e que so enviados junto com a
resposta de uma requisio, ficando armazenadas pelo browser do usurio.
Posteriormente, a cada requisio enviada, o browser anexa tambm as informaes
desses Cookies, permitindo que o servidor recupere os valores definidos anteriormente.
Um estudo completo de Cookies foge ao escopo desse livro; para obter mais detalhes
sobre eles, deve-se consultar a RFC 2109 (mais informaes no site
! ."#,! / ! ("- 0 - ' - ' ! *
), que contm sua especificao.
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 Comentrio (Comment): deve conter um texto descrevendo o propsito e funo
do Cookie;
3 Perodo de expirao (MaxAge): determina por quanto tempo (em segundos) o
Cookie ser vlido;
3 Domnio (Domain): por default, uma vez definido, um Cookie s retornado junto
com requisies para o mesmo servidor que o gerou. Esse atributo permite, por outro
lado, que esse Cookie seja enviado para todos os servidores abaixo de um mesmo
domnio (conforme especificado na RFC 2109);
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.
!5ON' D! E"2# !J 9 / )$ 9< =EJ 9+
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.
Finalmente, o Cookie deve ser adicionado ao objeto para que seja /- /. /&#) (%&# /
enviado para o browser do usurio.
#
98QE6! +
# ".#
' =D J#!9 #:E6#7##!
' - &#"F&#+
# ".#&A4
' =D *B<# +
No cdigo anterior, estamos gerando um Cookie de nome , com o valor , e que (%. .(-
ter validade de 60 segundos a partir do instante em que for recebido pelo usurio;
passado esse perodo, o Cookie automaticamente descartado pelo browser. Um
valor negativo para o perodo de expirao indica que o Cookie deve ser vlido
enquanto o browser no for encerrado, e o valor indica que o Cookie deve ser
removido imediatamente pelo browser.
importante observar tambm que, a menos que voc esteja fazendo o controle do
buffer de resposta conforme descrito na seo 4.6, esse procedimento de criao e
adio de Cookies a resposta do Servlet deve acontecer antes de gerar o contedo
da resposta propriamente dito, de forma a preservar a ordem dos elementos HTTP da
resposta do Servlet.
Aps gerarmos todos os Cookies desejados, podemos recuper-los nas requisies
seguintes atravs do mtodo da classe . Esse mtodo retorna se 0 /
(.(&+ /# /"- / / $/#) %$
no houver nenhum Cookie na requisio recebida, ou um Array com os Cookies
recebidos.
Infelizmente, no existe um mtodo para a recuperao direta de um Cookie
especfico; necessrio utilizar esse mtodo para recuperar todos os Cookies, e, ento,
iterar nessa lista at acharmos o Cookie que estamos procurando.
Assim, podemos utilizar o trecho de cdigo a seguir para obter o valor do Cookie ("%. .("-
definido anteriormente.
-.- %9!&: 96J#!FJE# F#3%5O " G #"0$#!D#!N E" E#JDE!JD!' #98#
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
K",+' BDQ!
#" + <#& J# 9 :965' ' ' BDQ! #"
+ <#& J#
,+ #35' " 98QE !,
) $ R
# #
' =D J9#
# !9%8QE! H 98#<(#. 8 / & 9<+' DQ9&QE +
# " #Q
' =D !J#!9! #JDQDQ9&QE
%. / #F' #Q %9!&QE.P#3+
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9 !9!&QE! E# $#35O "2 G #" ( H 9%8#Q<@#!. 8 / & 9<.+' DQ9&QE
(+!PP !+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
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.
!5ON' D7 ! ".#' #Q. *+& 6 >6+& / #" "2 9L<# / #".", !9+N!' #9 BD!F# F# / #".", !9+
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:
>O+&
/ #!"$"2 !9' ="2#"."Q 9/7
F#35#"$& <O# / #".", !9 K8' " #
K!+' ="2#"2" 9/9 J95' '
0
#%' "2#
-.-/ #!"$" 9E79 %:K8OD!. QE# 9#DQ#"2"$;!. :" #D2 5J:96Q:" #" " %!
O cdigo anterior utiliza a segunda assinatura do mtodo para obter a sesso 0 /. /&# # (%
corrente. Uma alternativa melhor de cdigo apresentada a seguir, utilizando a
primeira assinatura do mtodo : 0/ /&# # (%
Cdigo para obteno do objeto HttpSession para a sesso corrente
>O+&
/ #!"$"2 !9' ="2#"."Q 9/7
F#35#"$& <O# / #".", !9+
0
#%' "2#
-.- * " #" " ; *%Q :"Q E67D. QE:#! 5J:.#35 " G79 !
-.-
D E <@
..FQ8 #"." #!5%&.JD".
!5ON' D= N #D <@#* +). N58# / &$ 9< B 8& N58# &B:#+
!5ON' D! E .#%#*B8& N58# / ). 9< Q+.. N5%8#!& J# +
!5ON' D7 5& ' 95J#F & !9L<#!*B&. N!5!8#!& J#" 8
!5ON' D / .2 9<<(#&H E>8
>O+& / #!"$"2 !9' ="2#"." Q/7 $#3O5#"$& <# / #!"$"2 !9 ..5# +
' =" #" ".Q " #Q,*B8&. N58# , 98QE !O9#
H 9!8#<O#% + ' DQ98QE6!
Para recuperar o valor desse atributo posteriormente, podemos utilizar esse outro trecho
de cdigo:
>O+& / #!"$"2 !9' ="2#"." Q/7 $#3O5#"$& <# / #!"$"2 !9 ..5# +
Servlet ServletInfoSessao
-.- H . J#J 9%K .JQG #" " !N$#J7".#" " JD F#98#JE 56"25;.
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
'
. 9!)' 9Q>? AC!+
'
!$ 9&' 98H EJ"2#"2" !.)( ' " #" ". <@#Q&H E/(>P ,+
'
!$ 9&' 98H 9"F8!9!8#:E#D G E1"2#"2" +#! ' ".#Q<@59E"E#" E# #
D*
( C6!9!<( 8 / .. 9!<+' =" #"." Q <# F#Q& 9%? J# ! (>! P !+
'
!$ 9&' 98H 9"F8!9!8#:E# ' & D#"." #! E#" E#7#
D*
' "$#<59%E" %
( C6!9!<( 8 / .. 9!<B' =" #" ".! <#Q&C6Q"F,* DDQ#"2".#E!?B J# ! (>!P!+
695J#!$ & 9' 9J#"* & N" J' ".#"." Q <#*B8& N58#(& J#"
*O ' # B' 9J#"* & N"2 *Q"2A4F# 6' #! #9&" ,
R
/ &2 9< ' 9J#* &$ N/& / & 9!<B' 9%!J#"*B). N"2 96#Q
' #!J#9
!+
N #D ' B!N / #".". J' ="2#"." Q! <#!*B+). N58#+' 9%!J#*B& N+
K"' =N / #" ".Q 9".896DQ#QK Q! ' 9<= / &2 9%<
'
. 9.' 9 & J#:E#&* .. N58( ( ' 9J#*B). N/(>, !' E#
* & N5%8!
(+ / ). 9<B' =!N6 / #"." Q/(>P+
-.- QF#!>?BAC
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
!5ON' D! E"2#&A4QH 9%D & #!H 9%8#!)' 9 9&#' +
-.- * 6F#".#!9%87 ; <( 9:>? A0CJD! K8.56' ;. :E#' Q<= 9
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
'
. 9!)' 9Q>? AC!+
-.- * "2#"." &#D!$ QE679#"." # / #!)' #Q)6".#"E#!J! " / #%)' #8"E:!
' DQG
-.- F#D#N#!$#!F#35 "2 G !#!"4".#! %N #8E#J"2#"." JD!$ QE6 6E#Q#.#E F#D !9%!
-.- )#!35 ", G %7
!):#"2".# / #F' #Q
/ & 9< ' J"$< / ' =" #"."2Q <#Q,* &2 N58# ,8A
.. 9< = / C BH & !+
K!+' J"F< 9 :956' ' B'
. 9&' 9+' J"F< (+P
' =" #" ". $#!J#* +& N58#C H& !+
0
'
. 9!)' 9 PA * ? H & % C<( 9 *8' %' A !? > .@% 8I / ? % !+
'
. 9!)' 9CQ<( 9(H & I"=? I
? ( % -
? %? %' & * 3
A @% 8C BH & % P,+
'
. 9!)' 9 / #9*QH &BI!"@? I
? = % 8I* // P % & * A %' / (
&B>*% ,P!+
'
. 9!)' 9QH & I "(? I
? = % / " A H? %' & * A '% ,(&=?BP*
P % * C)" %',9&$% !P!+
'
. 9!)' 9 - PA !+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
Servlet Login
-.- %K8#Q.5:J58#9& DQG 7E6 56"25;. - " #!9O*: F##!96D* E!" 96:K8256' ;. :E#' Q<= 9
-.- #. K8 DQ7".##! ".8#5" 5;!. 7D! ' <( 9J#" #!9*6: "$"2QE" D!J ! J#&F
8# N!' #9 !' E!C6Q<@ 9 / #!9* / ). 9< ' <@ 9 / ) 9< ".#9*BR
0
.#)5$9 ' B"25D#" ".
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
-.- P#D5
#F9E7E6QE!"4E:".#" " " #7" #" " % 9 J& %# ", E!D QE:! 9E
-.- F#E )#!D !96J" .#35 ", G
!FJ / #@' #58C6Q<@ 9 ./!%3%56#=#
98JE#
-.- #!9.FE:EJ!
' DQG D".D!9%&.; $#!J#!J" &2 N!5!& FC H & BE
-.-
".#"." O
"#!' #J" JE##%);:#".8 E#K8 9 E7DQ"2
$D#" ".E#J!58#9& DQG
-.- ".# N#! ",56DQ#EO E!
>O+& / #".", !9' "$#!"$"2Q/ F#35#"$& <O# / #".", !9 K ' ".#+
.#", !9%"2# " #!9EP#E% F#D CQ<= 9 %!.J *&' !+
$#Q.5.9
0
' ="2#"2".! F#J#* +&2 N58# CBH & +
/ &2 9< ' ' < 9/7
F#3%5%#"$& <#&I.J#8# 8C BH & !+
/ &2 9< ' ".#9*=J
$#35#"F) <#Q&IFJ#QF#! , /
&
> *
+
' =" #" ". " #Q,* &2 N58# ,8C H& ,' ' <( 9+
.#", !9%"2# " #!9EP#E% F#D A #95IF 9D ' *&' +
0
#' " # R
' =" #" ". " #Q,* &2 N58# ,8A / C BH & !CQ<= 9J# - !5 "2#9*% 9O;' E" 9 !8
.#",
!9%"2# " #!9EP#E% F#D CQ<= 9 %!.J *&' !+
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
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
-.- P#D5
#F9E7E6QE!"4E:".#" " D#"." 7J#"2".# / #F' #Q " /#
#. & E7"$#
-.- ".#"." ; ) O#!4"2 E7D. E:#D9& #! ' Q<= 9JE5"256;. 7DQJJQ& N5F:E#
-.- ".#"." !6" # 5OJE#" "."4D9E G %#"4K ' *6 #
!$35#7 5%"25;!$ JD.$#!9F# 9 %
-.- #QK8#&55JJ!58#9& DQG
>O+& / #".", !9' "$#!"$"2Q/ F#35#"$& <O# / #".", !9 K ' ".#+
K"+' =" #" "./9 J95' ' ' ' < 9/ / & 9<. ' =" #" ". <@#Q* +.. N5%8# C H& ,+
K"+' ' Q<( 9/J95' ' BR
.#", !9%"2# " #!9EP#E% F#D CQ<= 9 %!.J *&' !+
$#Q.5.9
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9" ' ; )( ' ' <@ 9/(>,O#"$8#/# J#!95
9D
!'%E#7" 5
' DQG P !+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
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.
Assim, podemos criar uma classe abstrata que faz a validao da sesso do / - / ("0. &(
usurio, verificando se o usurio j efetuou o login, e, se isso no tiver acontecido,
redirecionando a requisio para o Servlet . (-* ( 0 %
Servlet ServletLogado
-.- ' Q" ".#N"$&$ &7 $#2 K& D! " #5"25%;!. ;:#K+#&56!5J ' < 9
!5ON' D:N"$&.QD D!' Q" " / #(' #&C<(QEJ#QQF#!9E" >(+) / #!)' #R
-.- C<( 9JE6 56"25;. ".#J!5!&#!9!& DQG % ;:& # "Q ELK8#! 8
-.- D' DQJ!" 96#" ".O!. ; #' ' <@ 9JE5" 5;!. 7356#K8#!MJJ5%8#!9%& DQG
-.-/ #%&(' #8" 3O5# 9%#!DQ#" "2 F.# E:5%8#!9%& DQG JE#QO#! #Q8#%9%E!#
-.- #"2".JD!' "." #J#
' #!J#!9!8 EL!N! ,
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE7 ; <@ 9%
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
-.- P#D5
#F9E7E6QE!"4E:".#" " D#"." 7J#"2".# / #F' #Q " /#
#. & E7"$#
-.- ".#"." ; ) O#!4"2 E7D. E:#D9& #! ' Q<= 9JE5"256;. 7DQJJQ& N5F:E#
-.- ".#"." !6" # 5OJE#" "."4D9E G %#"4K ' *6 #
!$35#7 5%"25;!$ JD.$#!9F# 9 %
-.- #QK8#&55JJ!58#9& DQG
>O+& / #".", !9' "$#!"$"2Q/ F#35#"$& <O# / #".", !9 K ' ".#+
K"+' =" #" "./9 J95' ' & ' <@ 9/= / & 9!<B' =" #" ".! <@#Q* 8&. N58# C H& ,+
K"+$ ' Q<@ 9/J95' ' BR
.#", !9%"2# " #!9EP#E% F#D CQ<= 9 %!.J *&' !+
$#Q.5.9
E!C%<6<#EB#Q+
)#!35#"F 6
.#",
9"2#+
0
0
0
-.- J7#"." # / #(' # #"$	E#:JD!' Q" ".#> / #(' #Q)C%Q<QE!6QD!*#<49#"2"$#:..#D* -$- E#
D EO < ;K8K8# 8:L!' EQG J# ; K8!$E#QK& 9 E" ":*#QE!#F"
-.-
2 9D
"'!K& DF#"$8!9EJ"
!$ 1
; <( 9D! J#95
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9" ' ; )( $ ' <( 9/(+6#"$8#/# J#!965
. 96D
'6E#J"25
' DQG P !+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
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.
.$ $'&
# -
) $ ) + + $ # , ) ) +
Em nossos Servlets de exemplo apresentados nos captulos anteriores, geramos, como
resposta, pginas HTML simples, sem nenhuma formatao.
O primeiro Servlet apresentado (seo 1.2), por exemplo, pode gerar a seguinte pgina
HTML ao receber uma requisio:
>?BAC
" #!5 #%9%E!#F#G H I$#>
@
-
- >? A0C
- > *
C P !
H A &.* =
A 8C / P - D9" - ' Q<O%
<( 9
< P.P ,P
QI &=? * * !' / H
1C P!C(" !
" QI; <( 9E##Q#
' *
)#!"$#!9%89E:#9E#!$#GH IJEJD!' #!9F# - " -
&=?-
- - I
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9" " #!5 #%9%E!#F#G H I$#&%'!)(
F#35#"$& <#&P#JQ8#* EE%
(+ %',!+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9Q>.*
.!+
'
. 9!)' 9 A3? * >(?=? I ! "BH '% 98#9,+? (
$
#% &=? (&=?-@% F#QQ - *&'
" !
D*!)"2# Q
% ,8
'
. 9!)' 92?BH ? C9%E#!F#G7H I - ?BH ?BC!+
'
. 9!)' 9 - >.*5.,8
'
. 9!)' 9> C P %' % !!+
'
. 9!)' 9QH A & * A3@% 8C % / P @%' - D!96" - ' Q<@!
< 96
<%'
P .P % % !P!+
'
. 9!)' 9QI&=? * %' * . ' %' / H %'
% C P % !C(" %'!,+
'
. 9!)' 9" Q
I; <( 9E#7#Q#!
!' *
.#"2#9&9%E!J#!9%E#!F#G H IJE
D' #!9!&# - " -
)+
'
. 9!)' 9 - &=? - I,+
'
. 9!)' 9QI&=? * %' * . ' %' / H %'
% C P % !C(" %'!@ ".#5
#9E#F#G!H I&#> %'
@
% , - - &=? - I ,+
'
. 9!)' 9 ! -
- >?BAC 8
0
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9Q>.*
.!+
'
. 9!)' 9 A3? * >(?=? I ! "BH '% 98#9,+? (
$
#% &=? (&=?-@% F#QQ - *&' D*6.".#Q ".(
% !!+
'
. 9!)' 92? H ? C9%E!#.#G H I - ? H ?BC!+
'
. 9!)' 9 - >.*5.,8
'
. 9!)' 9> C P %' % !!+
'
. 9!)' 9QH A & * A3@% 8C % / P @%' - D!96" - ' Q<@!
< 96
<%'
P .P % % !P!+
'
. 9!)' 9QI&=? * %' * . ' %' / H %'
% C P % !C(" %'!,+
'
. 9!)' 9" Q
I; <( 9E#7#Q#!
!' *
.#"2#9&9%E!J#!9%E#!F#G H IJE
D' #!9!&# - " -
,+
'
. 9!)' 9 - &=? - I,+
'
. 9!)' 9QI&=? * %' * . ' %' / H %'
% C P % P & % ,@ " #!5
#9E#F#G!H I&#> %'
@
% , - - &=? - I ,+
'
. 9!)' 9 - -. - >?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
Se em um Servlet a incluso e a modificao da formatao da resposta precisam ser
feitas pelo desenvolvedor diretamente no cdigo da aplicao, em uma pgina JSP a
idia que esse processo possa ser feito diretamente pelo responsvel pelo
looknfeel (layout) da aplicao.
Assim, uma pgina JSP nada mais , na verdade, que uma pgina HTML, com
elementos especiais onde o desenvolvedor pode programar o contedo dinmico da
aplicao. Porm, ao contrrio de uma pgina HTML cujo nome de arquivo tem
extenso .htm ou .html, arquivos com pginas JSP devem ser nomeados com
extenso .jsp.
A primeira verso do Servlet apresentado na seo anterior (sem nenhuma
formatao), por exemplo, poderia ser reescrito como a seguinte pgina JSP
PrimPag.jsp
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:
- > *
C P !
QH A & * 3
A 8C / P - DQ9" - ' <!
% <( 9
<
P .P !P
" QI; <( 9E#7##
!' *
F#".#989%E:#!96E#!$#GH IJED!' #9&# - " -
- &=? - I
QI&=? * "* ' / H
C P,!C" !@ "2#5#9E#F#GH I=#>
?:$#3%5%#!")& <O#Q&P6#!JQ8#* EE
? ! - - &=? - I
-
- >? A0C
*-
#%! -'$ )*-
! - ) -
!1
A mgica por trs de uma pgina JSP a seguinte: existe um Servlet especial,
chamado ".0/
(&* /-
, que intercepta requisies direcionadas a recursos com extenso
.jsp.
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.
A primeira verso de nossa pgina de exemplo "- * "0 ! #) , por exemplo, transformada
no seguinte Servlet
"FFQ& D7R
0
5N' D7
<
"2
R
5N' D E= "2
/ #F DQ#+>6+)
/ #@' #&P#35#". >(+)
/ #(' #Q&P6#"2
%!9".#
$#3%5%#!")
$#"Q
!96".# &*F
"0 Q ! H
QDQ#
Q& 9 / #!)' #DQ#
& !9R
$ 96D*$!9 M#E
" 6 &* "BR
0
0
0
"Q
6QDQ8 $ =;6"2
$ <#Q O
6QDQ8 ( #K+5' D &!$ +
$#"Q
!96".#! ".# !9F#!9 ?'$
# 8#QQ - *%&' H /
!+
<# !9!&#Q 5< "2
D &!$ <@#Q&IQ<O# 9 & $#356#"F
* " .#"2
%!9" #
!%&25%#
& 5#+
!' DQQ& !9/J
<# 9. <# / #%&(' # 9 +
D!9%K < J
<@# 98#Q& <@#Q / #!)' # 9K8 < +
" #" "2 !9/
<@# !9%8# & <@#Q / #"2"2 9+
-$- #9E
-$- #9E
-$- #9E
0 D&D* ?B*$
N' #:1R
K5 5
9 :
9O5' ' 5. <#5K K8#! / M# 9
5!K K8#
5& D' # +
K5+
<# !9%8# 59 :
95O' ' B
<@# !9%8#QQ& *9E' #!I <# %QDQ#%
& !9 8
K5 "2 ! D &#$ 9 :95O' ' " Q %D &#$ .#' #Q"2#IQ<# !9!&#QQ+ <@# !9F#Q +
0
0
0
!"#
) , ! $
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.
No existem mtodos equivalentes ao ou de um Servlet para a etapa de ( /. ( (#
atendimento de requisies, j que o prprio contedo da pgina contm o cdigo a
ser executado e retornado para o browser a cada requisio.
Por outro lado, existem os mtodos ! e
que possibilitam a implementao # % #) /#)- (
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.
) )*-
+ ! - . !"# +
! ) ! ,$'+
O atributo seguinte, * (-
deve ser utilizado para indicar pacotes a serem importados no
Servlet que ser gerado (via declarao ). Assim, devemos indicar por meio desse * ("-
atributo todos os pacotes que estaremos utilizando na programao de nossa pgina
JSP. Se quisermos utilizar a classe do pacote , e as classes que esto no /&',(- ! $
pacote &! (
, por exemplo, poderamos declarar a diretiva com os seguintes &0 /
atributos:
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
pginas JSP que incluem o arquivo de cabealho
e : se for necessrio '. /&' (! #) - ( & /! *
mudar o contedo do cabealho ou do rodap, no precisaremos editar todas as
nossas pginas, apenas o contedo desses arquivos.
) ++%(*) +
Obviamente, esse elemento pode ser utilizado para imprimir o contedo de uma
- %&0
varivel do tipo , ou at mesmo de uma constante . Supondo que seja - %"0 / (
- %0
uma varivel , por exemplo, poderamos incluir o seguinte elemento em uma pgina
JSP para imprimir o contedo da varivel:
Exemplo de incluso de uma expresso JSP para a impresso do
contedo de uma varivel do tipo String
?:' =8# &&?-
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.
# !" ) +
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:
?-
* EQF:DQ2$#!9F# #>@?):' =E &=?)!P @?:' &#Q8 / 5EQDQ ?
? 9D' 5E#K8 ' #FFE
%#! *!&' ?
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.
C
/ 6 ? & * 3
A +A / !
?
-.-/ D!.
&' #Q!K8M#9E756 K8
$7 F#%)! "$%N$#7"
#"$#!"4EJ9
9
K8
((/
-.- " 96E:E / D2
&' #
F
. 1!"4#' #J#!9F" #"$8;Q& DQ"
-.- E7
;Q<@ 9:#Q"#
F#"." #" ; / I
?-@ I?BH & * C(" ,?H 9!&#Q<O#! & / .. 9<. .-? ?:H 9%8#Q<@#!$ 8 / &. 9<B ? - I? H &
?
-.- #J' F9E
$75 / D!$
&' #Q
. K8#!D*64> K8
0
-.- 9' M9EJ> K8 F" ! 9E7E" D!.
&' #
!$7
! 1#' #!J#98"
-.- #".8;& DQ"4E7
; <= 9
?-
C
-./
? P
- PA
? 9D' 5E#K8 ' #FFE
%#! *!&' ?
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 . -/ .$ /&#
Primeiro exemplo de pgina JSP
>?BAC
"2#5#9E#F#GH I$#>@?
:$#356#"F. <#&P#JQ8#* E!E ?
- - >? A0C
Esse objeto equivale, na verdade, a instncia da classe passada como /"- / / $/#)
parmetro para o Servlet quando esse recebe uma requisio, conforme estudamos no
Cap tulo 5 Captura de par metros da requisi odesse livro.
Alm desse objeto, que representa a requisio recebida pela pgina, a API de
pginas JSP disponibiliza outros objetos implcitos que podem ser utilizados nos
elementos dinmicos programados pelo desenvolvedor.
Segue uma lista dos principais objetos implcitos, com suas respectivas classes:
Objeto Classe
request javax.servlet.h ttp.HttpServletRequest
response javax.servlet.h ttp.HttpServletResponse
out javax.servlet.jsp.JspWriter
session javax.servlet.h ttp.HttpSession
application javax.servlet.ServletContex t
config 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.
No exemplo seguinte, reescrevemos o formulrio de input do ms de aniversrio do
usurio utilizando o objeto implcito : ("$
Segunda verso para pgina JSP de input do ms de aniversrio do
usurio (formmesaniv.jsp)
? 9D' 5E#K8 ' #DN#D' *%! "2
?)
PA * ?BH & 8
$D#".9 "2
A=!? > -.I / ?
9&)#7D%
" E6#7" #!5 9 %#F" ;. !
C
/ 6 ? & * 3
A +A / !
?
-.-/ D!.
&' #Q!K8M#9E756 K8
$7 F#%)! "$%N$#7"
#"$#!"4EJ9
9
K8
((/
!5%&
$ 9&' 9 @ I?BH & * C(" % ( H 9%8#Q<@#!$ 8 / &2 9<B.(>"%
( H 9%8#Q<@#!. 8 / & 9!<B
)(> -
I?BH &
?-
C
-./
? P
- PA
? 9D' 5E#K8 ' #FFE
%#! *!&' ?
Podemos tambm construir a pgina JSP "- ("'.* /#)"% ! #, que far o tratamento dos dados
submetidos pelo formulrio da pgina (-* *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#
H 9!&#Q<O#% + .#3%5%#"$& <#&I.J#8# 8A / !+
0 DQ&D* DQ#
& !9
=#BR
' J#"3J95' '
0
K!8' J#"3J956' ' ' #"2 9 ' 5# ,
+' #"2 9 ' 5# ,
.#",
9".# ".#!96E!P#E )#DQ K+.J#".96 "2
!+
?
K!+' J#"2 9 ' 5#/ ' #9E. <#&H 9"$89DQ#/8 <# ' #!9%E!$ A& ? >. (
!5%&
$ 9&' 98IFN#9" 6
#" ".#/#
" E#".#596 #.".;. 9 !+
#' " #J!5%& . 9&' 98H 9!K #' MJ#!98##"2"$# 9 &#
) #
"$ $ & (*) +
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
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.
A pgina JSP seguinte aperfeioa um pouco mais nossa pgina input do ms de
aniversrio do usurio, imprimindo o nome do ms por extenso na caixa de seleo do
formulrio. O array de mapeamento do nome do ms declarado em um elemento
de declarao JSP, para evitar a alocao de memria adicional a cada atendimento
de requisio.
0
?-
PA * ?BH & 8
$D#".9 "2
A=!? > -.I / ?
9&)#7D%
C
/ 6 ? & * 3
A +A / !
?
-.-/ D!.
&' #Q!K8M#9E756 K8
$7 F#%)! "$%N$#7"
#"$#!"4EJ9
9
K8
((/
!5%&
$ 9&' 9!@ IQ?BH & *C" %',
( H 9F#Q<#. & / )$ 9<B.)(/"%'!
( NQF#! &
!J#A4#" (> -
I? H
& !+
?-
C
-./
? P
- PA
? 9D' 5E#K8 ' #FFE
%#! *!&' ?
)*- ! + 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" .
" E#JDJ#!9!&;. "4E# 5J:
; < 93; / I
? : 6"." #7D! #!98;. 9 F;: .#D#09%:K898#EJ ;<( 96:3?
-
- >? A0C
$ ,$ *)'$ -
+
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 . # /&/"-
3) Podem existir um ou mais mtodos pblicos para a obteno 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 ' #"0 $:DQ;' D5O' JE# F#GJE#5 FE5&
-.- A #QFE .LD;' D5' 7EJ!' 1&8'E#5' F#!OF#D#!N%#7D! !J#Q.F7J359!& EQE#:E# FE5F"09% ' QF#
Uma vez construdo o JavaBean, para referenci-lo em nossa pgina JSP, devemos
utilizar o elemento dinmico , que tem a seguinte sintaxe: # $ # / &/ "%
Sintaxe de um elemento para incluso de um JavaBean
"Q
5"$# #9 E , EJE/#9 B" D
#!Q#"2DQ
JE %#9 BD!' Q" "
,QD' Q"2"$#7E/#9 -
Na sintaxe anterior, deve conter o nome do JavaBean como ele ser.( "/& %
referenciado na pgina e deve conter o nome da classe incluindo ' # # / &( /" %
informaes sobre seu pacote (como por exemplo, '("* ! * %&./"* "- /&#) ! - / '( -( "/ &%
).
O atributo #)'(&/ , por outro lado, deve conter um dos seguintes valores: .&0 / (pgina; o
valor default caso esse atributo no seja explicitamente definido), - / &$ /&# (requisio),
# /# # (% (sesso) ou & '. (% (aplicao); esse valor indica o escopo dentro do qual o
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.
Se quisssemos utilizar o JavaBean em uma pgina JSP, por exemplo, - / '( - ( /& %
poderamos incluir as seguintes linhas de cdigo:
- >(? A0C
-.- ;6 O#9J"2 ' #"0 $:DQ;' D5O' JE# F#GJE#5 FE5&
Para referenciar o mtodo de um JavaBean, a API de pginas JSP disponibiliza o 0/ /-
elemento
#) 0/& - (" /-
, cuja sintaxe :
Da mesma forma como existe um elemento dinmico para referenciar mtodos de 0 /. /-
JavaBeans, tambm existe um elemento dinmico para os mtodos . A sintaxe # /./-
desse elemento :
Podemos, ento, modificar o exemplo de pgina JSP anterior para definir o valor do
preo unitrio do produto antes de exibi-lo:
Esse elemento de referncia a mtodos # /& /"- de JavaBeans admite, ainda, outra sintaxe
de uso:
Nessa sintaxe, o valor que ser recebido pelo JavaBean para a propriedade em
questo, ser o valor do parmetro , conforme recebido pela requisio % (&* / ( "- .* /-(
HTTP.
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 -"- /&# ! *
) .
Existem 4 componentes principais por trs do uso de uma biblioteca de Tags.
O primeiro componente um arquivo chamado de Descritor de Bibliotecas de Tags
(Tag Library Descriptor): esse arquivo, nomeado com extenso .tld e colocado no
diretrio
, contm as configuraes das bibliotecas de Tags utilizadas pela
aplicao.
$FQ<
Q9J#,? < ' A459E - 96,J#
- FQ<
- &<(' N
? ( #N!
CH
I " , -.- / 59 A0 D!F"#$"$8#J"
H 9D! -.- (
?-/ #!N$*
' DQQ& !9
% -F- )&
8*%+&
( -F- Q! "259 D - E8E -
#N 8
%@ E8E!
@
#!N( !
8Q<@' N
$FQ<(' N(' D & !9 - (+H & - 9*N N!' & <"2 &' E - & <(' N(' D . !9
- &<(' N
-
#!N+!
-.- ' Q" ".#356#<(#F#9D ? < ? <. ' A59E5%& ' MQE# ; <= 9Q" ; / IJE#9"."2L ' DQG
$ I <# !9F#QQ& <O#! 5 ,+ . 9&' 9 ' 7A459E9 !
0 D&D* # R 0
D#
) 9
.#)5$9 H I
/ @ (
0
Os mtodos mais importantes dessa classe so os mtodos , chamado quando &( &- &0
a Tag encontrada, , chamado aps o processamento do contedo da Tag, e &( )% &0
- / /"# /
, chamado ao trmino de todo o processamento devendo liberar quaisquer
recursos alocados durante o processo. interessante observar que no mtodo ( &- .0
obtemos uma referncia ao stream de sada da pgina, e utilizamos esse stream
para imprimir nosso texto . $"% .(
Finalmente, o componente final de nossa biblioteca de Tags a pgina JSP em si. Para
utilizar a biblioteca de Tags
# , podemos elaborar a seguinte pgina JSP de * % & (&0 # !
exemplo:
? 8<(' NJ5. - 9*N N' QF <" 1 F#K8 7 9*C N?
' 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/.
. ,! ) $ 2
+ !"# $
& % O 32
"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.
Esse wrapper, por sua vez, disponibiliza um mtodo que permite que voc (- -
repasse a requisio para o recurso encapsulado pelo wrapper.
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"
$:
-.-
; <= 9%; / I&! ' A0569E! "2
!5ON' D:D' "." / #!)' #&P# ".".P6#3"4# 	E" >(8& / #!)6' #R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- P#!
%Q"."29%E:.#3%5O " G
.:
;Q<( 93; / I= ' A59E! "2
) $ R
.#3%56#")& <O#Q&P#35#")= "
8D*# ! - ' A59E! "2
K+,
!FE+
F#35#"F
$#"Q
!9" # +
No Servlet anterior, existe um ponto importante que deve ser observado: o path
passado como parmetro para a funo ) referencia um recurso 0/& / &$/# #)& '. /-
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
como + -(# /- /# $ % .("! #)
). Alm disso, importante observar que o mtodo ("- &-
poder lanar uma exceo: uma das causas pode ser uma exceo lanada pelo
prprio recurso referenciado pelo . / $/&# #)'. /-
Podemos tambm implementar a pgina JSP referenciada no Servlet anterior como:
-
- >(? A0C
Assim, a cada requisio recebida, o Servlet repassa a requisio para a /"- /. &/&& # # / #
pgina JSP $ % (! #
, que por sua vez retorna para o Browser a seguinte pgina HTML
-
- >(? 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.
!5ON' D 5. ' 95J#F ) !9L<@#Q!*B&2 N!5!8# & J#" !+
!5ON' D ! E $#!J#* +). N58# + Q! ' 9<@ / .. 9!<
=Q+.. N5%8#!& J# +
!5ON' D ! EJ"2#* +.. N58# + ' !9<( / &2 9<
8& N5F#&BJ# Q ' 9!< N #D
=Q+.. N5%8# ' 5#8
Esses mtodos funcionam de maneira semelhante aos mtodos da classe /"- /
(% /
apresentada na seo 3.6: eles permitem definir, remover ou obter valores de atributos
de uma requisio. Esses valores de atributos no precisam necessariamente ser objetos
- %"0
, eles podem ser objetos quaisquer Java.
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" $: ; <= 93; / I
!5ON' D:D' "." / #!)' #&P# ".".P6#3"4# 	E" >(8& / #!)6' #R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- P#! %Q"."29%E:.#3%5O " G .: ;Q<( 93; / I * $#" #!9!&A4#!9"$ <#! ".
) $ R
A pgina JSP
"- /# /%. /%&# &0/&* ! #) , por sua vez, pode ser implementada como:
K!+' J#9". <@#! 9 L95' ' !5%& 6. 9&' 9+' J#9". <#/+
?-
-
- >(? 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.
-
$*-
$'+ ,$ ) +
6
Juntando os recursos apresentados nas sees anteriores, podemos finalmente
apresentar o modelo MVC com todos os seus componentes.
Para fazer essa apresentao, reimplementaremos e estenderemos a aplicao de
login da seo 6.4 desse livro. Agora, a aplicao de login passar a prever tambm
um nvel de acesso associado a cada usurio que efetua a autenticao: se o usurio
tiver nvel de acesso administrativo, ser apresentada a interface do administrador,
caso contrrio ser apresentada a interface do usurio comum.
Assim, o Servlet de Login ser:
Servlet Login
-.- * 6F#".#!9%8:JK8.5' ;. :E#' < 9J#JK8,MJJ!5!&#!9!& DQG EJ! ' DQG
-.- #. K8 DQ7".##! ".8#5" 5;!. 7D! ' <( 9J#" #!9*6:
"$"2QE" D!J
! J#&F(" #
-.- #! "F. @.#8.9J9 #!'E6#7D#" " 7E56"25;!$ J#!356#"F ,
.J9 #!'E6#
-.- 5" 5;!. 7D!5/
.J9 #!'E6#7E% 9 "$&FQE + 6D"$D!9%&$;. O.#&! 9
8# 9 & %#' * DQ#"."2 "@"256. / &2 9< ' <@ 9 / ) 9< ".#9*BR
E6##
!' #!J#98 3%56D E <
.' E! ' Q<= 9
-$- #"$#%96*:E 56"25;. J#E#K& 9 L2 ;Q#' ' 9O #!' * D#"2"$
-$- +
#Q#!
' D9"25O' 89EJ5J7N".#E#JEQE"'
0
.#)5$9 ' 9O #' * D#" ".
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE# ; <( 9
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
/ &2 9< ' ' < 9/7
F#3%5%#"$& <#&I.J#8# 8C BH & !' ".#9*6<
.#3%56#")& <O#Q&I!FJ#&# / (
&B>*
!
9%' 9O #' * D#" ".> &B #!' * DQ#"."2 "@"Q5. +' ' <( 9
' B".#!9O*+
-.- O#K 9 9E:Q& N5F" E#" #" " > " #J 5",5%;. K8 O;' E
>O+&
/ #".", !9' "$#!"$"2Q/
F#35#"$& <O# / #".", !9 ..5#8
#' " # ' =" #" ". )#!JQO#*B8& N58#8C BH & !+
) $ R
0
#' "2#R
-.- "@" 5;!. 7D!96".#<(5 5J#K+#&5 58#9& DQQG
6F#".#!9%89E: 98#K8QD#
-.- D2)#!"Q
!9E#98#JQ"2#5 9 #!'6E#JD#" "2
#' " #
.#35#")) <O#Q)P%#35#"$@ "
8D!*#
! - * E 9 "F.FQE. "2
!+ K8!
.E+
.#35#"$
F#"2
!9%".#
0
0 D&D* / #(' #D#
Q. 9
#/ R 0
0
0
0
/ #9* Q
H &
I "@? II*
? ( // P. & * A /
&
> *
,P
- PA
-
- >? A0C
-
- >(? 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
criando, abaixo do diretrio / #
, uma pasta com o nome de sua aplicao, com o
contedo dessa pasta obedecendo a um formato especfico (veja seo 2.2).
Embora essa forma de instalar a aplicao funcione, considerado mais elegante
distribuir sua aplicao no formato de um arquivo WAR, ou Web Application Archive.
Um arquivo WAR nada mais que um arquivo .jar, nomeado com a extenso .war.
Assim, voc deve gerar o arquivo WAR utilizando o aplicativo jar para juntar todo o
contedo do diretrio de sua aplicao (retirando, obviamente, os arquivos fontes
.java).
Assim, poderamos, por exemplo, remover os arquivos .java de dentro do diretrio
-(# /- /#
(que contm a nossa aplicao), e, a partir de um PROMPT DOS e de dentro
desse diretrio, digitar a linha de comando &- ' ! - (&# /"- /# ! &-
.
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
-.-0/ #(' #35%# 5& ' MB!5F#!9& DQG >(?=? I !F1D9&$!' !OD#" " E# 5",5%;2 "@E ' DQG
!5ON' D:D' "." / #!)' #!* 58#9& DQD!>?B? IL#Q8#9E">O+& / #%&(' # R
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE# ; <( 9
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
/ &2 9< ' *#E#! * 5&*/7
.#3%5%#!")& <O#Q&>@#QE#!@ * 5&*%!. MQ& !9 +
K"+' *#QE#! * 5)*&J95' '
-.- 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#" ".;!$ E#".D9"2 E#%)! "
$ J#! ." D!FDQ8#F#" E *%#E#
-.- #!' #"4D9#! / &2 9< Q"Q D/!
/ &2 9<0' *#E!#,* 5.*O#DJ9#
/ &2 9<Q"2# E#DQE# ' *#E#! * 5&* " 5N"F). 9< !+
/ &2 9< ' ".#9*=J' *#QE!#* 5.*O#D "256N")). 9<+' *%#!QE#* 5&*O#D 9E#Q K! (
8
'
. 9!)' 9Q>? AC!+
'
. 9!)' 9CQ<( 9(%'
( ' ' <( 9/(+"% P+
'
. 9!)' 9 / #9*% )( ' B"2#9* (+ %',P ,+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
@
#N &)#!" !56.DQ#(F9J# '* F#7P#"F)$ & -
#!N(.#"25)D#!F9 #
Q5$' 88#.9 -./ #!)6' #* 5%8#!9%& DQDQ>?=? I - 5.' 8 +&#! 9
-
#!N(.#".5FD#!D' ' #DQ& !9
5&*) D9"F.F! 9Q)%' #!F9J#$8! DQ - $!' #!F96J# - 5&*(+D9".&$ 9!
- "2#D5O. $)8D!96"F))! 9!
' < 9(+D!9%K <
5&*)J#&*E* / H - 5%&*(J#&*%E
Se voc optar por utilizar esse mtodo de autenticao, voc deve chamar em seu
cdigo os mtodos e * , da classe , para obter o 0 / /&* (&/ # /- 0/ # /- - %"' & /"- /. / &$ /&#
nome do usurio e seu grupo.
Mais detalhes com relao a autenticao baseada em elementos de segurana do
Deployment Descriptor da aplicao podem ser encontrados na especificao de
Servlets.
,
1
8 "+ , ) # - ) (*),+ $ 2*$ + ) , ) $ +
-.- A49#! 56
%!'E#DQ9# #"4Q& " D! N9DJE#JE!E!"4E#J9# F:35#9
-.- " # 796#D#!"$"2; J"2#J#".8N#%' #D#%45J:9:D!96#Q J7DE $#35 "2 G F#D#%N E
-.- I'E6#7D%9%# %#"4E# 56 ' DQG J#"Q #D K& D
. &# / &2 9< &.* ' D J95' ' -$- & ! #:E: !' DQG %
. &# #DQF!$ I' 7956' ' -.- I!'6E#D9# #" E#"2"$:! ' DQG
. &# 9%$'&B5 !9%"* ' DQEQ"= -$- & J#F:D% F#98#JE#DQ9# %#"0' DQEQ"
5N' D I!' !9 *
' D / ). 9<
=
!' D / ). 9<
=E #;%END / ). 9<
9!J#.
/ &2 9<
5O.' / .. 9<
5"Q5. / ). 9<
" #!9*6 9
=87A4 I' 9
@. J#5 &*$
"0I' !9.DQ#
& !9
&'"=$'7 52'
+ Q#2 ; E2N D
+ Q#2, & .4#
EQ+ #2 ,; E,N$D 9 #
. #!@+$ @
. %#.A49 <O#%$ F#<( "F&# @ . #!;%END+
0 DQQFD* !D#!
. !9
=# R
.*F
9#
I!' !9.QD#
Q. 9+
=
' DF9 LK8
"2" #'
D..#<( - DQE!"F)$ EO. %# END+
) $ R
-.- #"." #
/ &#QFE
F#D ".7"$#%"
$ 9D*OF!9O M#E
!):#( F
-.-
.N' #JQ" E#DQ9D.
$ 96D*$!9 M#!E
. &#J" 996#DQ& 9J!' DQ &= 9#Q
!.*F
"=I' 9.DQ#
& 9R
. $ R
' =D9>&=. #! A49 <#. <O# 99%#DQ& 9 $'" .' 6&'"@" 5. $ / #9* +
)*6F
9#
I!' 9.QD#!
. !9+$.*
' D&9 :K8O
" " #!'6!N2 9
D!96#Q
(+1 )M JK+% )(
#! <#&A4#"." <#/
(+ %',!8
0
$#Q.5.9' DQ9
-.- #"." #
/ &#QFE
F#D ".7"$#%"
$ 9D*OF!9O M#E
!):#( F
-.-
.N' #JQ" E#DQ9D.
) $ R
0
#' " # K5+$'&B5 9"* ' DQE!Q"=J$ ? ,A4 I!'
R
-.- 6D".D9&$; 6" # 9%E!J9 J& %#.J" & 9!<( EJJ8!J9*
-.- J; ! J:E
!' O
E!#J" #"$8!N#' #DQ# 56J79QO:D9#
0
#' " #:.*F
9#
I' 9.QD#
) 9+$.*
' D96J#!$7J;Q J
E#JD9# #" & 9<( E+
-.- C N#F756J:DQ9#% )# J#!9!8#:!' DQE F#8%$9:#"." :D9# .L '
-.- #"." #
/ &#QFE
F#D ".7"$#%"
$ 9D*OF!9O M#E
!):#( F0
$!N' #!JQ" E#
-.- DQ9D.
),$ R
K!!9 DQ9 " ' " #E>, $ I!' QE!EO' #J#!9+ =D9+
0
0
5N' D:"#$(96D*$!9 M#E 9 N8#! &B5 9"* ' DQE!Q" !
R
K8 + 9% .
=O 7$ I!' " M#/!+O ((
) $ R
0 DQQFD* # R 0
D#
Q. 9
0
),$ R
0
0
0
0
-.- >@"2*&N' #7D! J #J#!9F:#!9%&F# 9J#" EQ"! ' DQG #" #" #!56"0$#"Q #D ) "0 %!' "
-.- E#JD9#% %8!J9*%7; J:E6 '#J& J#5 E#D9# 7NQ" #7E6#7EQE6"2
'
!' 7
9%#
I%' 9*
' D+
B
!' D
=E. #! %
; ENDO
9J# .
56.'
5"Q5.
=" #!9*
=8A4 I'
@. J#!5+
$ I!' " * ' DQ"2 5+ =! ' DO' !' +
0
0
-.- # 7I' !9 * ' D ' D !9#Q
5N' D:"$8Q& D 99#D & !9J!' D 9#Q / )$ 9<
=
' D &*OF
"I!' !9.DQ#
& !9
I!' !9* ' D7' !' &+I!' !9* ' D $ I!' " * ' DQ"2 <# + = ' D8
K"+' !' 9 L95' ' F#&5 9' ' ' DQ 9#Q>+
-.- # 7I' !9 * ' D !N8# & 5 9" * ' DQE"
5N' D:"$8Q& D7 91%N8# &B5 !9" * ' DQE" / & 9< 6' D
I!' !9* ' D7' !' &+I!' !9* ' D $ I!' " * ' DQ"2 <# + = ' D8
K"+'
!' 9 L95' ' F#&5 9'
' !N&# &=5 9"*' DQE!" !+
#' " # $#Q.5.9
-.- # 7I' !9 * ' D ' N#F !96#QQ
5N' D:"$8Q& DO% E ' N#!$ 9#, / &2 9<
' D 99#D & !9
DQ!9
R
I!' !9* ' D7' !' &+I!' !9* ' D $ I!' " * ' DQ"2 <# + = ' D8
K"+' !' 9 L95' ' ' ' ' N#F !96#QQ + =D!9+
I!' !9* ' D7' !' &+I!' !9* ' D $ I!' " * ' DQ"2 <# + = ' D8
K5+'
'9 :
956' '
R
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
, :
!5ON' D:D' ".":I!' !9.%,DQ# & !9J# &#!9%E" DQ# ) !9R
5N' D7I!' 9.DQ# Q& 9 / .. 9< "F<BR1",56 #! + J"F<+ 0
5N' D7I!' 9.DQ# Q& 9 / .. 9< B ' D / )$ 9< J"F<BR
0
0
!5ON' D:D' "." / #!)' # ? #"$8#!I!'6# 	E" >(8& / #!(' #R
I!' !9 @ D I' *
' DC () / #!@' #QF" DQ $".3' END @$ # ,
&' ()" #!)6' #8"', END $O".3' -$-
=
%% (- ' @F" #!@' #8"
8QE 9! %
!
0 DQFD* DQ#
) !9
=# R
)*6F
9#
" 9 ! ' N' # QD#
& 9 ,.F(9 LK8!@
"2" #!'6D!
!' %
(
=# <O#&A4#"."2 <O# )(> %'!+
0
0
5N' D E7E6B#Q + >68&
/ #(' #Q.P#35#"F
F#3%5%#"$>O+.
/ #F' #Q&P#"2
9".#
F#"2
9".#
&*OF
"0H
DQ#
& 9R
-.- O#K 9 9E7*#QE#!)"05!! ' !F#" F:#( &4DQD*#J#!98JE# ; <( 9
$#"Q 9" #! " #Q&> #QE# ! D*6#! 9))%' ! 8 9 DD*6# O5"F 8 $#Q' E!8# +
$#"Q
9" #! " #Q&> #QE# !,
! .#" 8A49
;65'
A0?-!+
'
. 9!)' 9Q>? AC!+
) $ R
'
!$ 9&' 9
* ' DQ96E:D9# JD! NQ" #JE#7E6QE!" P,+
!996#D& 9' BD9>JI' 9 = ' D 9#, FC F / #!)6' #8"',+
'
!$ 9&' 98C N#!F9E6:D9# 7D% N"$#7E#EQE"0 P ,+
I!' 9@ ' N#!) !96#QQ8C F / #F' #Q8"!O' BDQ9+
'
. 9!)' 9 - -. - >?BAC,
'
K8' 56"2*/+
0
0
) + )*- ,! ) -
,)
+ + ! # ) ! # $'&
(*),+
2
Servidor Web
CGI
Servidor
Figura 10.1 Servidor WEB com CGI.
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.
O desenvolvimento nas linguagens de script o mais comum at hoje para sistemas na
Internet. Contudo, desenvolver neste modelo tem diversas limitaes tais como
escalabilidade, comunicao entre processos, acesso simultneo a bancos de dados,
transaes entre bancos de dados que esto localizados em diferentes computadores
e distribuio de carga.
Para solucionar as limitaes das linguagens de script diversos trabalhos estavam
paralelamente em desenvolvimento. Estes projetos visavam a construo de suportes
para a construo de sistemas distribudos. Os sistemas distribudos permitem que
computadores executem computaes de forma cooperativa, e alm disto oferecem
um grau de transparncia para o usurio final. Contudo, desenvolver neste tipo de
arquitetura distribuda no era uma tarefa simples, alis, o desenvolver precisava ter
altssima especializao. Para isto empresas tais como a Sun Microsystems se uniram em
torno de um padro chamado J2EE (Java 2 Enterprise Edition) para o desenvolvimento
de aplicaes distribudas, oferecendo aos desenvolvedores uma base slida e mais
simples (no que seja to simples assim) para desenvolvimento.
, ! + ).$'+ ! + ! 2
& +
Antes de aprofundar em qualquer arquitetura de sistema distribudo, deve-se aprender
mais sobre sistemas distribudos. A definio mais simples de sistemas distribudos um
conjunto de computadores interligados em rede, que executam operaes
computacionais de forma cooperativa e transparncia para o usurio final. Ter uma
rede o primeiro passo para a construo destes sistemas, o prximo passo criar um
sistema que seja modular, onde cada mdulo execute em um computador distinto.
Estes mdulos trocam informaes entre si para executar determinada operao
computacional. O termo transparncia se refere a criar um nvel de abstrao entre o
usurio e o sistema, desta forma o usurio no sabe que seu sistema executa uma parte
em cada computador, simplesmente para ele, o sistema esta sendo executado. Este
usurio enxerga o conjunto de computadores interligados em rede para execuo
cooperada de computaes tal como um nico computador virtual (maiores
informaes no livro Distributed Systems, autor Andrew S. Tanembaum).
Computador
Virtualmente nico
Sistema Sistema
Centralizado Distribudo
Workstation PC PC PC
Figura 10.4 Economia de Recursos
A velocidade outra questo de interessante anlise. A velocidade de um hardware
chega a limites da prpria fsica, contudo como ultrapassar estes limites impostos pelos
materiais existentes? Utilizar um ambiente distribudo pode colaborar neste sentido, pois
subdividir uma aplicao em mdulos, que executem em paralelo, cada um em um
computador distinto, divide a carga e permite que a aplicao tenha maior
desempenho final. Contudo, subdividir uma aplicao em mdulos no uma tarefa
trivial.
Um exemplo de aplicao prtica para atingir alta velocidade na execuo da
aplicao o site de buscas Google ( ) ! 0(.(&0 /! '(&*
). Imagine buscas muito
complexas, existe um computador nico que conseguiria atender a este sistema? No.
Construir um hardware para isto seria vivel? No, pois o custo seria proibitivo. Para
resolver este tipo de problema, os envolvidos criaram uma aplicao que executa
sobre diversos computadores, particionando as operaes de busca e indexao das
informaes.
Google (Sistema Distribudo)
...
Workstation Workstation Workstation
...
Servidor Servidor Servidor
Servidor Servidor
Servidor
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
Aplicao Distribuda
Middleware CORBA
&
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
! +
) $ $ $21 .$
A arquitetura J2EE se apresenta em vrias camadas, sendo que cada camada
composta por componentes e servios que so providos por um container. A idia de
container e componentes pode ser facilmente entendida por meio de um exemplo.
Imagine uma colmia de abelhas, que contm abelhas obviamente, pulpas, zanges,
a abelha rainha, o mel real etc. Podemos fazer um paralelo e entender como container
a colmia, que fornece recursos para as abelhas sobreviverem. Por sua vez, as abelhas
em suas diferentes funes, tais como as operrias e as reprodutoras, podem ser vistas
como os componentes que sobrevivem dentro do container, isto , a colmia.
Podemos ainda expandir esse exemplo em um apirio, imaginando que cada colmia
seja um container e todas as colmias juntas, ou seja, o apirio, represente o servidor
J2EE.
Outro exemplo um pouco mais tcnico, o uso de pginas HTML em um Web Browser
em uma simples navegao em um site qualquer. Podemos entender como container,
o prprio navegador que fornece recursos e facilidades para o componente, neste
caso as pginas HTML. O componente por sua vez, pode oferecer diversos servios ao
usurio, atravs do suporte do container, tais como facilidades visuais como botes,
hiperlinks, figuras e tabelas, e o prprio servio de navegao.
Em um servidor J2EE, podemos ter diversos containers interagindo entre si.
Veremos a seguir uma breve explicao de cada camada da arquitetura e de seus
componentes.
3 Camada cliente: acesso por meio de interfaces stand-alone (aplicaes Java),
pginas HTML ou Applets. Nesta camada os componentes residem em um Applet
Container, em um HTML container (Web browser) ou em um Application Client
Container. O Applet container, fornece recursos para um componente Applet
executar e se tornar funcional para o usurio. O Web Browser apresenta recursos e
funcionalidades para o uso de pginas HTML e por fim o Application Client container
fornece recursos para a execuo das classe stand-alone utilizadas pelos usurios
para interagirem no sistema.
3 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.
3 Camada de Negcios: esta camada trata da lgica de negcio da aplicao.
nela que implementa-se todas as regras de negcio, alocao de recursos,
persistncia de dados, validao de dados, gerencia de transaes e segurana,
providos por componentes conhecidos por EJBs. Este por sua vez residem no EJB
Container.
3 Camada EIS - Enterprise Information System, ou Sistema de informaes empresariais:
nesta camada que se encontram os sistemas de banco de dados, sistemas
legados, integrao com outros sistemas no J2EE etc.
Cliente
Servidor J2EE
HTML Pgina
Container Html
Servlet JSP
Container Web
EJB
Container EJB
Applet Applet
Container
" - + $*$ -
1 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.
Utilizaremos para a execuo dos nossos exemplos, o servidor de aplicaes da Sun
MicroSystems, que tambm faz parte do kit J2EE e pode ser acessado no diretrio
% //!
. Um outro aplicativo muito til a ser utilizado para realizar a instalao
dos componentes no servidor ser o deploytool, tambm disponvel no kit e acessado
no mesmo diretrio.
Servidor
Cliente
RMI Skeleton
Stub
RMI Objeto
<<Interface>>
javax.ejb.EJBHome
java.rmi.Remote
getE JB MetaData()
getHomeHandle()
remove()
remove()
<<Interface>>
javax.ejb.EJBObject
java.rmi.Remote getEJBHome()
getHandle()
getPrimaryKey()
is Identical()
remove()
<<Interface>>
javax.ejb.EJBLocalHome
remove()
<<Interface>>
javax.jms.MessageListener
onMessage()
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
componente e que so respectivamente as classes
e . /&' ("* /
A classe
/ '
implementa a interface remote para os acessos remotos e locais e
encapsula (wraps) a instncia do EJB que foi solicitada pelo cliente. O
criado /&',
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
mtodo ' -/&/
, a classe ("* /
cria uma instncia da classe
que faz referncia /&',
instncia do EJB solicitado. A instncia do EJB associada com a classe eo
/&',
mtodo /, - / /
implementado no Bean chamado. Depois que a instncia criada,
a classe (&* /
retorna uma referncia para a interface (o stub) da classe - /"* (./
/"'
para o cliente.
Com a referncia da interface remota, o cliente pode executar os mtodos de negcio
do Bean. Estas chamadas so enviadas do stub para a classe
que repassa as /"')
chamadas para os mtodos corretos na instncia do Bean. No caso de retorno de
valores nos mtodos, o mesmo faz o caminho de volta pelo mesmo caminho utilizado
na chamada do mtodo, retornando os valores para o cliente.
Servidor J2EE
Home Interface
EJB
Home
EJBObject stub
Bean
EJB
Object
Figura 11.8 Cliente acessando o servidor EJB, com as classe EJB Home e EJB
Object (encapsulando o EJB).
# -
+
! *) *) # $ )$ # ) + + $ + # - ) - ),+
% 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
referncia do EJB em mos, podemos acess-lo pela sua interface (&* /
(ou ( '. ("* /
),
obtr uma referncia para a interface &/&* ( /
(ou (&'.
) e executar os mtodos de negcio
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 ),+ + ! - ) $,- +B
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
<<EJBRealizeRemote>> <<EJBRealizeHome>>
<<EJBSess ion>>
SBExampleBean
EJB_Context : SessionCont ext = null
SBExam pleBean()
ejbCreate()
ejbRem ove()
ejbAct ivate()
ejbPassivate()
setSessionCont ext()
$
!5ON' D7 9%8#!)K8QD# / %Q
!' #!>O##Q8#%9%E!" ! # N ;>OJ#JR
5N' D / Q
' #LD!F#Q8# &*OF
" F#Q8#DQ#
) 9P6#!J&# !DQ#%
& !96
0
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# / %Q !' #:#Q8#9E"0 ! # N ; N #D R
5N' D7H 98#<(# DQ' D@ " DQ59+H 9!&#Q<O#!1' 56# H 98#<# $9<# &*OF
"P#! Q8#QDQ#
Q. 9
Bean: SBExampleBean.
DQ<#JD N #,
' #! #! N ".#"2"2 !9
!5ON' D:D' "." / , ' ##9 ' #L#!98" / #"2" 9#9R
8# / #" "2 !9 !9!&#Q " #" ", !9 !9%8#QQ&
5N' DO! E" # / #" "2 !9 !98# / #"."Q 9 9"2#"."Q 9 98#Q R
5N' D7H 98#<(# DQ' D@ " DQ59+H 9!&#Q<O#!1' 56# H 98#<# $9<# R
' $ - ,+ $
) + + ! - * ) $ -
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.
-.- %#! ' LE# / #"."Q 9>#9J35#J! .#"2#9&"".#F G""" #!5"4D!' #98#",
-.- ;:EL) / #"."Q !9+#!9J F#".#98 "0 #Q&E!" # N F# 8#B## NP#JQ#!' #
-.- E"E"4#! N* D ) &#B## NI"." F# $ / #" "2 !9/%#96" E:. / 8Q8#K85'
8# / #" "2 !9 !9!&#Q " #" ", !9 !9%8#QQ&
-.- #D!58E #' JD98 9#1! " JD! G %7EJ 9%"F 9D :E> ;
-.- &*F
" $#&# %QD#!
. !9 #QD#!G9LD!. GE# 5J#%9!) EQE#LE ;
5N' DO! E# N F# 8# &*OF
" )#!8#DQ#
Q& 9R
0
-.- " & ' MQEJ
#!' JD!9%8! 9#!4
FJE#!"$&.5 1 9"F 9%D! LE ;
-.- IFJ> ; / #"."Q 9>#9 / F &#' #"2"@E##!".# ' N#!F " $#D5)"." !' DQE"
-.- " & ' MQEJ #!' JD!9%8! 9#!4 FJQ& ! %N #8JE !'6E#> ;"Q
-.- &B#"$8#!J#98:E##! " #!$#!D5O #!$QE" &E"4!":$#D5."$":5) ' MQE" #!' / ;!
-.- H ".8&#JK8# &J" !#98# . / #"2" 9/#9 EJ) / & &#K&5'
-.- "$8#/#Q8EJE!##J".#4E#QK& 9 E !FJ> ; / #"."Q 9>#9 / F &#' #"2" 8!N#!/
-.- ! #"2 E#9 J"2#45& ' MQE 6 ! " #".F#:. JE#> ;79 LK& DQ Q" ", %
-.- " & ' MQEJ #!' JD!9%8! 9#!4 FJE#' O#! N #QF7Q 'E#/ ;",
-.- &B#"$8#/#Q8EJE!## ".#0' N#.QE" 8E" ":.#D!5$"." ' DQE"0 #' /;
-.- H ".8&#JK8# &J" !#98# . / #"2" 9/#9 EJ) / & &#K&5'
-.- "$8#/#Q8EJE!##J".#4E#QK& 9 E !FJ> ; / #"."Q 9>#9 / F &#' #"2" 8!N#!/
-.- ! #"2 E#9 J"2#45& ' MQE 6 ! " #".F#:. JE#> ;79 LK& DQ Q" ", %
5N' DO! E" # / #" "2 !9 !98# / #"."Q 9 9"2#"."Q 9 98#Q R
1. Class.newInstance() ejbRemove()
2. setSessionContext()
3. ejbCreate()
Session Bean
Stateless pronto ou Execuo dos
mantido no pool de mtodos de negcio
objetos
)
+ + ! - * ) $ - $ ) 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.
-.- %#! ' LE# / #"."Q 9>#9J35#J! .#"2#9&"".#F G""" #!5"4D!' #98#",
-.- ' # E!"/#QFE"4# N* DQ& Q8#! ## NIQ"."Q 8# B $ / #"."2 !9+#!9%"
!5ON' D:D' "." / / & F#QK&5' ' ##9 ' #J#!9%8" / #" "2 9#9R
8# / #" "2 !9 !9!&#Q " #" ", !9 !9%8#QQ&
-.- 7" #"." E!# 56 D' #!9!&#:#"2 #D K8 DQ#".. # N#)8
-.- #D!58E #' JD98 9#1! " JD! G %7EJ 9%"F 9D :E> ;
-.- &*F
" $#&# %QD#!
. !9 #QD#!G9LD!. GE# 5J#%9!) EQE#LE ;
5N' DO! E# N F# 8# &*OF
" )#!8#DQ#
Q& 9R
-.- " & ' MQEJ
#!' JD!9%8! 9#!4
FJE#!"$&.5 1 9"F 9%D! LE ;
5N' DO! E# NP#!J# !BR
-.- " & ' MQEJ #!' JD!9%8! 9#!4 FJQ& ! %N #8JE !'6E#> ;"Q
-.- &B#"$8#!J#98:E##! " #!$#!D5O #!$QE" &E"4!":$#D5."$":5) ' MQE" #!' / ;!
-.- H ".8&#JK8# &J" !#98# . / #"2" 9/#9 EJ) / & &#K&5'
-.- " & ' MQEJ #!' JD!9%8! 9#!4 FJE#' O#! N #QF7Q 'E#/ ;",
-.- &B#"$8#/#Q8EJE!## ".#0' N#.QE" 8E" ":.#D!5$"." ' DQE"0 #' /;
-.- H ".8&#JK8# &J" !#98# . / #"2" 9/#9 EJ) / & &#K&5'
-.- F9J#O!' E!&2 N5&:J" #% D9K& <(5$QE!
0
-.- 6!N ,JE#K 9":E"
E#9#Q< D "FF #6!"".#) G"
-.- 35#J / #" "2 9/#9 $;K8.96#D#!4"0" #!5%" D!' #!9%8#"Q
!# ) , ! $ ,) + + ! - * ) $,- $ ) 1 , @
Instncia do EJB
Session Bean Stateful
ainda no existe
1. Class.newInstance() ejbRemove()
2. setSessionContext()
3. ejbCreate()
ejbPassivate()
ejbActivate()
Figura 12.3 Ciclo de vida de um Session Bean Stateful.
"!
Home
Remote
EBExampleHome
EBExample
create()
<<inst antiate>> findByPrimaryKey()
<<EJBRealizeHome>>
<<EJBRealizeRemote>> <<EJBEntity>>
EBExampleBean
EJB_Contex t : Ent ityContext
<<EJBPrimaryKey>>
EBExampleBean()
ejbCreate()
ejbPostCreate() <<EJBPrimaryKey>>
ejbAc tivate() EBExamplePK
ejbPassivate()
ejbLoad()
hashCode()
ejbSt ore()
equals()
ejbRemove()
toString()
setEntityContext()
unsetEntityCont ext()
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.89 &!$"( ;:) 9 + ,- ,0/=< "+$<>?@ ,A- ( - B :"C "2.D!+E,GF2H:):) H)!I@)!I!$"-
8.8 R % H62A5)DS@EC+" 9 + ,- ,0/=<"+$<">?"T , :)D$ U:- V;:)D"2P- NW $XG )2JH'- HJ,F"+"- K:)
8.8 )%"* ,"Y0T2L!
NW
ETE,@Z( - BNW
D
,#[:"
5H.)2- !$"( "!+
,G:)+)
H.,G"H !\
,G
:)HPT
8.8] - +E:)K2V:)$)2J
V2L!:)2M:) ] - +)- 2M$!$"( ^""2 ] )2.!K:" ] B)2- H6H.)#
@[%"( - K( H.H 9 <"<">? 9 &!$"( < "+- !$"( !+,GH 9 + ,- ,0/< "+$_
8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)*
,G)!k!l!U"2.- Km
)2JH- HL,GDH6@ZH:"
:"HP#
8.8
2J! ] - "( : cD!$"KH6E2")2JHP- HJ,.- :"#
8.8 2J
,@)2.+^Z65 +)- KS@"$- :Z+
,- ] - ;$E%"* ,JC
)2JH- HL,- :)"#)"
:)DH62+)@Z( ( #
8.8 ,^)2J dH ` 2L, 9 &,.- +l&
NW"$+);2.- NW
$:"$E%"* ,G"#
"@)%)( - * 65# ( +
V# e,A2.- +
m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +
] - )( :fcZT
* 65# ( +
V# e,A2.- +
] - )( :EgiYi,^)2L H ` . 2 "6,J 9 &'
,- +$_
HP, )- )( :fc"X ] - ( :fcEY01
HP, )- )( :)g X ] - ( :)giY01
2.,A@)2L+m+)@)( ( 1
8.8K9 &
@
,G
:"C
)( )+
,G"- +")2M
U"H26-
N'WED:) 9)Q <"#
8.8
2J!I@)+",- ,( : )- )( :ic
!m
C
)2JH- HL,- :)"#
8.8 ,^)2J dH ` 2L, 9 &,.- +l&
NW"$+);2.- NW
$:"$E%"* ,G"#
"@)%)( - 5))- :D)* %)? HJ, ` 2J"6,"X0* 65E"# ( +V# e,26- + ] - ( :fc"T)* 65# ( + V# e,A2.- + ] - )( :EgiY
8.8` )+ ] - V@)2L 5[( )2:)D6,.2P- %"@
, ] - "( :fcE#
"@)%)( - 5[- :$H6
, - ( :icEX0* 5E# ( +
V# e,A2.- +
] - "( :icEY _
8.8` )+ ] - V@)2L 5[( )2:)D6,.2P- %"@
, ] - "( :)gi#
"@)%)( - 5[- :$H6
, - ( :EgiX0* 5E# ( +
V# e,A2.- +
] - "( :EgiY _
8.8R %,\"! 5)"( "2:),.2.- %Z@
,G ] - )( :fc"#
"@)%)( - D* 5# ( +
V# e,A2.- +
$
, [- ( : c
X0Y _
8.8R %,\"! 5)"( "2:),.2.- %Z@
,G ] - )( :)g #
"@)%)( - D* 5# ( +
V# e,A2.- +
$
, [- ( :g X0Y _
8.8 !$( !"+
,GNW
D:)$!\
,G:);:)DH6)( "N'WED:"$)%"*
,G$"( KHP@ZK^Z5)G)2L- !2L- #
8.8
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
5E$)+
,J2D- !$"( "!+
,GNW
:)KEE2AN'WED:"m(
( - B
NW"
8.8 :"D)%"* ,$+"$!$"- $"2LHP- HJ,G+E,G#
2.,A@)2L+m+)@)( ( 1
8.8 ,- ( - B:)"2.;262J
"2$)%"*
,GCEE2AHP- HJ,"+
,K:ZC!)- :)$
E2LHP- H.,GF"+)-
8.8 $,@Z( - B2"H:":)H:)$HP@"$- +EH.,Gj+Z- #
"@)%)( - 5[- :$H6 , 9 +E,- ,G/ ` + ,G &6,AX 9 + ,- ,G/ ` "+ ,&P,ME+,A- ,0/ ` +,G&6,AY _
,^- H'# + ,- ,0/ ` "+ ,&, )+ ,.- ,G/ ` + ,J&6,A1
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 ( ! "#$% , '&)(*+ ",#
#% ). Quando o bean ativado, ele carrega o dado do meio de persistncia e
1. Class.newInstance() unsetEntityContext()
2. setEntityContext()
ejbHome() ejbFind()
Entity Bean BMP no
pool de objetos
1. ejbCreate()
2. ejbPostCreate() ejbRemove()
1. ejbPassivate() 1. ejbStore()
2. ejbLoad() 2. ejbActivate()
Executa os
mtodos de negcio
C
ou ejbFind()
Figura 13.2 Ciclo de vida BMP Entity Bean.
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).
Para as operaes especficas de consulta a objetos persistidos, se faz necessrio o uso
de uma linguagem de consulta conhecida como EQL (EJB Query Language). Os
detalhes desta linguagem sero vistos a seguir.
Estas operaes devem ser definidas no arquivo de deploy do componente ( $& ( & l)
utilizando-se de EQL para cada operao desejada. Neste arquivo define-se os
campos que sero persistidos e os relacionamentos entre Entity Beans.
Detalhes de implementao de um EJB Entity Bean CMP, assim como os deployment
descriptors sero vistos no
Ap ndice A.
8.89 &!$"( ;:) 9 +
,- ,0/=<
"+$@",- ( - B:)D""2JD!l+
,GF)2MH:":""H"! @)!I!- DEE2AHP- HJ,"+
,
8.8 $")2J"H.+E,G2
HE
)2J
NOEHHP)%"2."H,A2.- %"@
,G"H:)"HJ, 9Q <"#
8.8 H.$:"m@"H.$:) 9 +E,- ,0/=<" + ` >?"T) H)""2.NO "H:)CE2LHP- HL,GF+Z- KH.W"
8.8 - !$"( "!+
,G:)HE( CZ2JU)2L- ;)+
,- +")2.T"H6+Z:"DS)@ZKm)2J
V2L!:"E2+"W
$)2J"- HP
8.8 H6m"2.""@
2)!HL,GH)"2LNO
"H,26- 5Z- - HP#
8.8 ?"2LKH)"2LNO
"H"HPE ] -
HPTZ"!C@)!l+ZHP@)( ,)!)@
,A2AH"2Lj!,A2AH EE2
8.8
&!$"( ETEHA,D"
:)H.)2:Z ] - +Z- :"K,2L65\"H:Z 9
+"D:Z)( /)!$"+
, :"H62P- ,2:)
8.89 +
,- ,0/=<
+ ` >?#
% H.,2L,)@)%"( - ( H6H 9 < ` >? 9 &!$"( < "+$- !m"( !+,GH 9 + ,- ,0/< "+$_
8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)* ,G)!k!l!U"2.- Km )2JH- HL,GDH6@ZH:" :"HP#
8.8 2J
,@)2.+^Z65 +)- KS@"$- :Z+
,- ] - ;$E%"* ,JC
)2JH- HL,- :)"#)"
:)DH62+)@Z( ( #
8.8 ,^)2J dH ` 2L, 9 &,.- +l&
NW"$+);2.- NW
$:"$E%"* ,G"#
"@)%)( - * 65# ( +
V# e,A2.- +
m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +
] - )( :fcZT
* 65# ( +
V# e,A2.- +
] - )( :EgiYi,^)2L H ` 2."6,J 9 &'
,- +$_
HP, )- )( :fc"X ] - ( :fcEY01
HP, )- )( :)g X ] - ( :)giY01
2.,A@)2L+m+)@)( ( 1
8.8K9 &
@
,G
:"C
)( )+
,G"- +")2M
U"H26-
N'WED:) 9)Q <"#
8.8
2J!I@)+",- ,( : )- )( :ic
!m
C
)2JH- HL,- :)"#
8.8 ,^)2J dH ` 2L, 9 &,.- +l&
NW"$+);2.- NW
$:"$E%"* ,G"#
"@)%)( - 5))- :D)* %)? HJ, ` 2J"6,"X0* 65E"# ( +V# e,26- + ] - ( :fc"T)* 65# ( + V# e,A2.- + ] - )( :EgiY
,^[2J H ` 2.
,G 9 &),A- "+$_
8.8K9 &
@
,G
:"C
)( )+
,G"- +")2"2LD2L!$5)E2$%)* ,JC""2.H6- HA,A- :""#
8.8R %
HP"2J5)S@"$+"K"HP""- ] -
NW
9)Q <gi# T"
H.,JHK!\
,G:)
HHWEm- !$"( !+
,J:"H
8.8 "( $)2JU)"2.- K)+
,J- +")2.#
8.8
2J! ] - "( : cK5( )2:ZD,A2.- %"@
,GDH.)2"+ ] - @)2J:Z#
"@)%)( - K%EH.,2L, 5[E- :$HP, )- )( :fc"X0* 65# ( +
# e,2.- +
] - ( :fc"Y01
8.8R %
HP"2J5)S@"$+"K"HP""- ] -
NW
9)Q <gi# T"
H.,JHK!\
,G:)
HHWEm- !$"( !+
,J:"H
8.8 "( $)2JU)"2.- K)+
,J- +")2.#
8.8
2J! ] - "( :g=5( )2:ZD,A2.- %"@
,GDH.)2"+ ] - @)2J:Z#
"@)%)( - K%EH.,2L, 5[E- :$HP, )- )( :)g X0* 65# ( +
# e,2.- +
] - ( :)g Y01
"@)%)( - K%EH.,2L,4* 5E# ( +
V# e,2.- +
$ , Z- "( :fc"X0Y01
"@)%)( - K%EH.,2L,4* 5E# ( +
V# e,2.- +
$ , Z- "( :)g X0Y01
8.8 ,- ( - B:)"2.;262J
"2$)%"*
,GCEE2AHP- HJ,"+
,K:ZC!)- :)$
E2LHP- H.,GF"+)-
8.8 $,@Z( - B2"H:":""H:)HP@ZD- +ZHJ,Gj+Z- "#
,^- H'# +
,- ,0/ ` "+
,&, )+
,.- ,G/ ` +
,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() unsetEntityContext()
2. setEntityContext()
ejbHome() ejbFind() e
Entity Bean CMP no ejbSelect()
pool de objetos
1. ejbCreate()
2. ejbPostCreate() ejbRemove()
1. ejbPassivate() 1. ejbStore()
2. ejbLoad() 2. ejbActivate()
Executa os
mtodos de negcio
C
ou ejbFind() e ejbSelect()
Figura 13.3 Ciclo de vida CMP Entity Bean.
+
) &
/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$
*%
&
,
) &'
.
$.
0 1$
.
relacionados a este campo. Os tipos que um mtodo get como esse retorna o tipo
da interface local do objeto relecionado sendo um relacionamento , caso o
relacionamento seja o tipo retornado pode ser ou & , " ou & , .
Esposa Marido
marido esposa
* % G2LE( ,- E+ G+"!6H
H6 J!2.- :
8 "* % 32."( ,A- "+ G+Z!
* % G2LE( ,- E+EHP^)- 32J)(
:""H.2L- ,- + 6H6"H. 8 :)H62P-
,- "+
"* % J2J)( ,- )+"HP^Z- G2L( J+Z'!l 9 H
H6 "( ,- +EHP^)- ""(
8 * % G2L( 6,A- +"H^)- 32J)( J+"!
2J)( ,- )+"H6^)- G2L( GH6@Z2.
* % G+Z! 9 HP
"H.
8 "* % 3+"!
8 2AE( ,- +EHP^)- 32."( 3HP"@)2.
"* % J2J)( ,- )+"HP^Z- G2L( J+Z'!l>2.- :" ""( 6,- +EHP^)- ""(
8 )* % G2L)( ,- )+"HP^)- 32."( J+"!
2J)( ,- )+"H6^)- G2L( GH6@Z2.
* % G+Z!>2L- :"
8 )* % 3+)!
8 2AE( ,- +EHP^)- 32."( 3HP"@)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 ] - ( :
:)"H."2.- ,- "+6"HP
H6 8 :""HP26- ,A- +
!$2' - "( : ,G/V
* 5)# @,- ( # "( ( ,- )+ 8 !$2 ] - E( :0,3/"
] `
8 !$2 ] - ( :
Neste caso voc pode escolher se o tipo retornado ser & , " ou & + .
Esposa Marido
marido
* % G2L)( ,- )+"HP^)- G2J)(
:)"H."2.- ,- "+6"HP
H6 8 :""HP26- ,A- +
* % G2LE( ,- E+EHP^)- 32J)( J+"! 9 HP"
H. ""( ,- +ZHP^)- ""(
8 )* % 32J)( 6,- "+"HP^)- 02."( 3+)!
!$@)( ,A- ( - - ,0/ R +" 8 !$@)( ,- "( - - ,0/
2L)( ,- +ZHP^)- 32J)( 3HP"@)2L
:""H.2L- ,- + 6H6"H. 8 :)H62P-
,- "+
"* % J+"! 9 HP
"H.
8 * % G+""!
8 2L)( 6,.- +ZHP^)- G2L( 3H.)@)2L
!$2 ' ] - "( :
:""H.2L- ,- + !2.- :) 8 :"H62.-
,- "+
8 )* % 32.)( ,- )+"HP^Z- G2L(
* % G2LE( ,- E+EHP^)- 32J)( J+"!>2L- :" Z( 6,- "+"HP^)- "(
8 )* % 32.)( ,- )+"HP^Z- G2J)( J+"!l
!$@)( ,A- ( - - ,0/ R +" 8 !$@)( ,- "( - - ,0/
2L)( ,- +ZHP^)- 32J)( 3HP"@)2L
:""H.2L- ,- + !2.- :) 8 :"H62.-
,- "+
"* % J+"!>"2.- :"
8 )* % G+Z!
8 2L)( 6,.- +ZHP^)- G2L( 3H.)@)2L
8 )* % 32.)( ,- )+"HP^Z- G2L(
#%$& 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.
&)
) 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 < Q)9E` X "Y
R > b 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 *!
que representa um
conjunto de valores:
e 9
9"`dR < Q)9E` X Y
R > b 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.
&)
) +
A Clusula restringe o resultado da consulta, voc escolhe os valores desejados a
R > ?
"H.H6D
9 9 )# +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:
] - +":)<
/ !X e
,2.- +
=+)"!Y
R > ?
"H.H6 b emT X0# "2J"+
,
HY
9 9 # ] - ( ^"# +"! ?"
:)2J
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 < Q)9E` X c"Y
R > ?
"H.H6KfcET?
"H.H6K)g
9 9 fc"# - :):" ;g # - :":) b "g # +""! Q 'W
&)
)
A clusula
& especifica o resultado retornado pela consulta. Por exemplo:
e 9
9"`dR < Q)9E` X "Y
R > ?
"H.H6DZT X # "2J+,H6Y
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.
Outra informao importante que a clusula
no trabalha com collections,
apenas aceita variveis simples, ou seja:
e 9
9"` 2P# - ,G"!H
R > Z 2. b em2
Voc pode tambm fazer que seu mtodo de busca retorne um &
que no
Este mtodo vai retornar todas as pessoas que tem o nome passado como parmetro.
No arquivo +&)( & temos:
## #
S)@")23/
* % 0S(
S)@")23/
## #
! !
) "!
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 (RMI-
IIOP) 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()
@[%"( - K( H.HK> < 9 &'!$"( < +$- !$"( "!+ ,GH> HPHL6V
)2.- 5),G$>H.H66 2.- 5)+ ` + ,J&6,4!$ H.H66V 2.- 5E"+ ` "+ ,&P,.1
8.8
,^)2J dH ` 2L, 9 &,.- +l&
NW"$+)- +ZHJ,G+"- NW
:)D"%)*
,G)#
8.8 ,- ( - B:)"( +E,G- +"2"2J$2J)!5"2 9)Q <#
,A23/ _
8L8 - !$"2.- !K$!)+"H.6"!I2.
)%"- :)
e
/)HL,GE!$# @
,# )2.- +
,( +)X3>"+"H.[! 2L
)%- :) X0X &,>H6H.6V"Y !HJVY0# V,
&6,XGY0Y01
,^ X Q >e 9 &,- +l&Y _
"@)%)( - 5))- :DH6 ,>HLH. 2.- 5+ ` +,G&6,X0> H.H.6 2.- 5)+ ` +E,G&,4! HPHL6V 2.- 5E"+ ` "+",G&,Y _
,^[- H# !"H.H.6 26- 5)+ ` +,&, !$
H.HP6 2L- 5)"+ ` "+
,&P,.1
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() ejbRemove()
2. setMessageDrivenContext()
3. ejbCreate()
P1 MOM P2
$
C
M OM
Figura 14.4 Point-To-Point (Queue).
1
1
&
1
"
&
No uso de ( % % (% , ( Publica/Inscreve os clientes enviam a mensagem para um
M OM
Consumer 3
"
@Z@" ` "+)+",- + ",G)23/mS@")@" ` E+"+Z6,.- + "6,J2A/
X @""@" ` +)+Z6,.- "+ "6,J23/ Y 6,G&# (
"@)"XG* 65)
!$ 8 +E5 8 * !$H 8
>/ @"@E ` "+)+"
,- )+ E,G2A/ JY01
8L8 ( "( - BKS)@)"@"DX ] - ( "Y
@Z@"S)@"@Z X @""@"Y 6,3&# ( "@)"XJ* 65) !$ 8 "+"5 8 * !H 8 @"@"
! GY01
8L8 26- K+Z&'W
-] X S)@""@) ` +[+",- )+
+)@)( ( Y _
,A2/ _
"@)%)( - 5[- :$H6 ,>HLH. 2.- 5+ ` +,G&6,X0>H6H.6 2.- 5)+ ` + ,J&6,a,3&Y _
,A23/ _
e
/)H.,G)!$# "@
,A# "2.- +
,( +)XG>+"H66"! 2L)%"- :"D
E( C>
<
mXGX
&P,>"H.H.6 Y !
HPHL"Y0#
,
&6,XGY0Y01
)( HP$_
"!"#%$&
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% >*$ )-.
&(&5 "H& H ZH & 9 ;H,"H.H 2<5 '2 H, %"H& " .;:
'2 " .;:
'2) " +) <=$.;:
H% > " -
) .?:
/(! $ )-5= " 5.;:
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.
Transaes CMT (Container Managed Transactions) ou declarativas podem ser
utilizadas com qualquer tipo de EJB. Neste tipo de transao no h a necessidade de
programao explcita das delimitaes das transaes, esta tarefa efetuada
automaticamente pelo prprio container. Para tanto, necessrio informar nos
descritores dos EJBs a necessidade de suporte transacional s operaes e como ele
deve gerenci-lo.
Uma vez que no h a necessidade de incluso de cgido especfico para gerncia
de transaes, a flexibilidade de mudana da estratgia de emprego deste recurso
muito maior, pois basta alterar os descritores dos EJBs para atingir este objetivo.
Abaixo est um exemplo de descritor que define a incluso de suporte transacional
num EJB pra gerenciamento de contas bancrias:
Atributo
Transao do Cliente Transao do Bean
Transacional
Nenhuma T2
Required
T1 T1
Nenhuma T2
Requires New
T1 T2
Nenhuma Exceo
Mandatory
T1 T1
Nenhuma Nenhuma
NotSupported
T1 Nenhuma
Nenhuma Nenhuma
Supports
T1 T1
Nenhuma Nenhuma
Never
T1 Exceo
!"#%$'&())*(&%+&($-,+./&.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
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
formas de realizar uma autenticao que so: Basic Authentication (Autenticao
Bsica), Form-Based Authentication (Autenticao baseada em Formulrios), Digest
Authentication (Autenticao com Mensagem Alterada) e Certificate Authentication
(Autenticao com Certificado Digital).
Iremos a seguir detalhar cada uma delas.
Basic Authentication - o navegador apresenta uma tela de login e fornece ao
servidor o usurio e senha para a autenticao. Esta tela depende do navegador
que est sendo utilizado.
Form-Based Authentication - a aplicao fornece uma pgina HTML (que poder
ser gerada por um JSP, por exemplo) com um formulrio no qual o cliente informaria
o usurio e senha. Para isso, h um padro utilizado pela API JAAS.
...
) )-<!/
H # H /
H, 45 6)- "H,$)-
>/ HPH 6)-
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.
+
O conceito de security roles simples, mas necessrio para o entendimento do uso de
autorizao. Uma security role um conjunto de identidades de usurios (identity). Para
um usurio ser autorizado a realizar um operao por exemplo, sua identidade dever
estar na correta security role (perfil) para a operao em questo. O uso de security
roles interessante, pois o desenvolvedor no precisa especificar o perfil do usurio no
cdigo do EJB.
$!
. Vejamos a seguir os mtodos desta interface.
5 >
2<5
( 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=
% %
H
>)- %'(% )
)-<'(
%H
&H "H.H,
%
H
H% < ! $0EH, % %' H& ,
%H
HPH%)0 4"
H % <
H&"H.H=
% %
H
)+< / ?%)0 HLH,
) /
)+< / ?%)0 HLH,
) /
) />
) /
)+ />
) /
)+ />
) /
)+ />
)+< /)+ H.H,
"H % < "H+)+H,-5= $ H& ,
)+< /
)+< /
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.
Imagine uma situao em que um cliente acessa um servio de clculo de um certo
imposto para a venda de um produto. Chamaremos este como servio do EJB .
Este mtodo chamaria outro mtodo do EJB , o mtodo
. Podemos definir na
aplicao, que este ltimo mtodo execute com a identidade do chamador, isto ,
utilize a mesma identidade do cliente que chamou o mtodo do EJB . Ou ainda
poderamos definir que o mtodo
do EJB rodasse com uma nova identidade,
definida pela aplicao. Essas duas opes podem ser configuradas no deployment
descriptor da aplicao. Vejamos um exemplo a seguir:
$& H)H
H&"H.H=
!
H
ZH;
?
H&"H.H=
H !
4H
HPH)+ 4H&
H %
H% < ! $0EH, % %'
H& ,
>)- %'(% )
%H
HPH%)0 4"H % <
Veremos a seguir, um exemplo de mdulo de segurana utilizando a API JAAS. Observe
que no provemos uma implementao especfica para o mdulo, sendo o intuito
mostrar somente um esqueleto com os mtodos principais que devem ser
implementados conforme o contrato estabelecido pelas interfaces. Fica a cargo do
leitor implementar os mtodos se desejado.
ExampleLoginModule.java
<'(- ) <5=)+ H (:
)+? <( ! :
)+? <(&5 H% / :
)+? <(&5 H% / H& :
)+? <(&5 H% / ' :
)+? <(&5 H% / :
$
5)+ 7)
+ <'8 ++ B N -0EH, %
ZH HPH%0-%H& )+ )-N*)H)- KH&>7>) -+
- &
N -+) ) $>
+ '
H.H
5)+ <' )+ )-H ' 1>
H,
) '
>7 )-NO"H % >H1+)-
" .
& (& ( &aH &
> :
B<
0) -0 <'
)H%+) +5 7 - 5-7 <'8 * "H H,> ZH> N
*
H,/>% * "H,.
B<-- B<1+ )+)+
N
( %DH&-$< (H "H.H&7$ $)-)+ * H,- H&+
/ dH <' >5 - H&- /$ + )+)+
+ )+)+ " .8!/>
<'
H >5
<!%- >:
B<- ! 0
HPH++$$
N
/$
/>)-7 - 5-7 <'8 H+ N
( % H,0/$ ;H, "H6H+-! *$ H&- H%+ !
dH <' >5 - H&- /$7-?
/
+? " .2/ H >' 5 <
<!%- >:
B<- 10 '$ >7ZH,& -
H )+ )-N-( "H% 6
% H $H, < " .
(> %- H%+0 <'($ $ )IH
HPH&*$ H+
H+
/ dH <' >5 -5 "N - H&-0 <' /
0 '( " .8/ H >' 5 <
<!%- >:
ExamplePrincipal.java
<'(- ) <5=)+ H (:
)+? <( &H :
>!H& 0ZH, -H, $$
H.H
5)+ > )+ )-GH & $
#)- 7ZH,
& (& & ' >)- -( :
"H% $1 )H! )+ B<
)- >)- 7ZH,
)
5)+ % " <! ' )+.
/( H >)- +)-:
% H%$:
<!%0)- H ;" ";" 5)+ . $ . ' #)- " . .;:
)+ )-N +)-/H,/ 2>
)--)- /<( 0/
H,/+$ B<
%
"H+
- />&(-7/>H,/
/>H,/ 2 " .
<!%0)- />H,/ 2> " .;:
<
) H!& '0 ) )+NO"H 0"H&
H% , '0 ) %)+NO$
H 0"H,
<!& '+ !% ' " .
<!%0)-:
ExampleRoleGroup.java
<'(- ) <5=)+ H (:
)+? <( ! :
)+? <( H& :
)+? <( H& :
>"H$
+"H + 7 )+ )-< N '
>7ZH, "H
+)
H.H
5)+ % 5)H $5)+ & )9 )-GH
"H% $1 )H! )+ B<
)- >)- 7ZH,
)
5)+ > %> " <! ' )-.
)+ )-N-- ZH
)-( 0 )H, '
) ) H "H,
DH&1$ $
-'
(> %H+0)H&
2)- )IH,> "HPH%$*
H,-
H,- ,
0)- )+ "
& > ZH.
)-)+JH )-( " "H.;:
& %
<!%0<
(> :
DH+0ZH, 0)-)+- '8%
) )+)+1)H, -$ KH, ( & H, 0)-)+
( %DH&-0)H, 0)-)+%* H&- H&+ $
0 H
)+
" % )+)+.
<!%- >:
<
)
H ) H )+) -' &
!H
+ H!
) " H ) )+
H -'
>)-! +)+)+JH " .
<!% 2 < "H )-!& " -
) )+JH
H " .;.;:
ExampleTest.java
<'(- ) <5=)+ H (:
)+? <( ! :
)+? <(&5 %)+ :
)+? <(&5 $)+ <' :
)+? <( H& :
)+ )-N-7>)-
N0& ( <'8
$5
)IH' "N
H.H
5)+ H% )0 )-GH '(6 &!
5
N + )IH%'2(EN
+ ;)-N7>
+)
>7 >
"
< ,> .
!
> 5& " .;:
$5, <5 -
&5 " (5)+ H% .;:
&
& 5=)+ H% )- />)- " ($5=)+ "H )-.
? )- & >% " * , (5)+ "H )-
H.H=.;:
& 5=)+ H% "H -/)+ " .;:
ExampleMain.java
<'(- ) <5=)+ H (:
)+? <(&5 $)+ <' :
)+? <(&5 H% / :
)+? <(&5 H% / ' :
H.H
5)+
KH% $ 0)- " ' '[H,. !/> H 5 <!
'
>'2
5& " 5=)+ "H .;:
5& '2 2$5 +
' 2<5 ' " .;:
&4H& - ' 2<5 '( & " .;:
Observamos que o uso de transaes inevitvel para que a aplicao apresente
eficincia e robustez. Agora sabemos que a arquitetura J2EE prov transaes do tipo
e que podemos utiliz-las, tanto como Container-Managed como Bean-Managed,
para gerenciar as transaes de nossa aplicao.
! #"
%$ +, 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.
O cdigo a seguir, pertencente a interface ) do EJB SalesSupportBean, apresenta o
mtodo que solicita a criao do EJB e retorna a referncia para a execuo dos
mtodos de negcio.
H $ < " . /(
dH
#5 < * >)-< 5 :
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
do tipo %!
que encapsula o EJB SalesSupportBean e retorna ao cliente chamador
uma referncia da interface ) , na qual se tem acesso aos mtodos de negcios ou
servios disponveis para o EJB em questo.
A seguir, observe os mtodos da interface &) do EJB SalesSupportBean, mtodos de
negcio utilizados pelo cliente para calcular o desconto concedido ao produto
vendido e clculo das parcelas a serem pagas.
&( '
<' 6 H& " '(6 * '( %' .
( / ! H ) $5 < :
&( ' <' 6 " <'(6 * $'2 ! )-
H=.
/(! H ) $5 < :
R SR
este mtodo no contm lgica. Isto tambm ocorreu para os mtodos ! ) " ,
! "
e !
"
, por no necessitar de executar operaes nos momentos de
R
criao e remoo da instncia do EJB, e na ativao e passivao quando ocorre a
liberao de recursos alocados, mas que no o caso.
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 " ?. . :
H"H.H
( H= >)- H (! H, ?)-
>)- H ! >)-
/>)- ) % & H"H.H,
H )- /$)-
%) & ) & H
HPH,
H ! )-
; H6H ) % & HH6H, H >
; H6H
H "H.H (
"H& >$ $ > !ZH &
,H "H.H
) /
Z H
?& & > )H&? ,
!%)H% &!
%$ +, M.-0 B K
&$ ,0
%$ % -8 18 $BH -(
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.
R
Este EJB, chamado de SalesBasketBean, ser encarregado de prover todos os servios
de venda dos produtos escolhidos. Para isso, fornece mtodos de negcio tais como
adicionar produtos na cesta de compras, remov-los, limpar a cesta, calcular o preo
total dos produtos etc. Assim, vamos analisar cada mtodo de negcio deste EJB. A
seguir segue a assinatura dos mtodos de negcio constantes na interface )
'
.
( + H " ) & H "H&&.
/(! H ) $5 < :
&( '
B " .8 / H )-5 (:
( - > & " ) &
/(! H ) $5 < :
> & % & .
&( '
+)- % < " ) < ( ! &
.8/ dH $)-5 < :
&( ' <' 6
H , " . /% H >)-5 $< >:
(
H " . / H >)+<$5= <! :
R
Na classe de implementao do EJB SalesBasketBean, criamos um atributo chamado
, que uma Map que mantm os produtos adicionados na cesta de compras.
Com isto, entendemos a diferena do EJB Session Bean Stateless do EJB Session Bean
Stateful, no qual este ltimo mantm os dados de um cliente especfico, isto , mantm
os produtos na cesta de um determinado cliente e no compartilha estes dados com
outros usurios.
& & +
H !:
R
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
R
poderia ser executada no mtodo ! , passando o objeto & como parmetro
no momento da criao da instncia do EJB.
( 0 H " H
ZH.
" & -H < ! < " . & " .;: /H 5& " .;:.
" $ (.# 5& " .;:
$> & (
"
( &
. $> & '( > " .;:
)- & ( '(< )- " .* ' " .;*( '( H% < " .*
"
<'( " ( '( " .?.;.;:
$
" !%.;:
<!%0
"
/ #& $5 -5.
/(! $ 5 $ " % /( ( $'+ - B< -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.
H (> /% B<+
8)- '2 > 2)- " <! ' > )-.
/(! H )-5 <
" )- 2 /$ $ ZH> " =)-.;.
" >
$ )-.2 <5 " )-.;:
)-- )-
)- 2 /$ $ " )-*> )-.;:
<!% " >
)-$. )- 2 / '( " )-.;:
/ " 5 <! -5.
/(!
$
)-5= " !$
/
'0-'( + (/$)+ $ <
% )- +5<.;:
&( '
+)- % < " )
< ( ! &
.
" / 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.
$'2
H " .
#( :
" <
H " . <$ " .;:( />H #5& " ;. : .
0 $
" > (.# <5 " .;:
( > ";" ( &
.# '( " .;. '(< & " .;:
+> $'2 " >.;:
H"H.H
H >)- H&
H H, $)-
ZH < $ !ZH &!
%H HLH=
%$
,
.10 K 6"G8 ,;8 $&
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.
)--5)H & (<5 >
)-
$! H
H,1 & " <! ' )-* '(6 * , '0(!HLH,* ' ) .
/(! H %5 <! * )-5 < :
H,6
% )- " <'(6 .# / H 5 (*
<!& '+'2 )- " .8!/% H )- 5 :
<' 6'( # " . !/% H >)-< 5 :
<!& '+'2 "H.H " .8/ H >)-5 :
<!& '+'2 )- " .8!/% dH >)-< 5 :
$H& )+ " <! ' )-.8 /(! dH )-$5 < >:
$H&
HPH " & '0>$%H6H,. / H )-$5= <! :
$H& )+ " <! '0)- .8/ H >)-5 :
-- 7>7
2
$ 00 )H%LN
& & 4 ! '
" )-* * (!H6H,*(>)+ . " * * * . :
$ 0+< BN -+ 7>7
2
& & 4 ! '
#
)+ * 6 %H6H
*()-
2 # ?:
$ 00%)-
N - < ++
2
& & 4 ! ' # $ 2 :
+ -7
2
$ 0+< "N $
& & 4 ! ' )+* < * ("H.H,*
)- :
H=$
/>&(+& ) &
$
! B - H "H
& & 4 ! '
( )-* < * ("H.H*
)- :
#, )- $$5 - ) 0 +"H $$
% - >5 -+> -
H
> -'( $> < " .
& &
> & - :
2$5, " .?:
2<5 ?5
>
" 2 $>. <5 " & ;
? .;:
/ " 5 <! -.
/(! $ )-5= " ' "H.H' " .. :
R
$'2 % " <! ' )-* <'(6 * , ' (!HLH=* $'0) .
( / ! H % 5 <!
'( 2$ " .;:
!
%! < & )- %H )- &! <)+ "
.;:
H% ) H% <! ' " *)-.;:
H% ) H% " $* " .;.;:
H% ) H% <! ' " *
HPH&.:
H% ) H% <! ' " *) .?:
> &! H% " .;:
/ " 5 <! -.
/(! $ %<5 " . :
R R
O mtodo a seguir trata da remoo do objeto do meio persistente. Como no mtodo
! , o mtodo ! ) "% tambm obtm uma conexo com o meio de persistncia,
prepara a execuo do comando ' , realiza o bind da varivel pelo chave-primria e
executa o comando. Assim, o registro definido com a chave-primria informada
removido do banco de dados. Esse mtodo no retorna nenhum valor, mas em caso
de erro na execuo do mtodo, a exceo ) " lanada e poder ser
tratada pelo objeto chamador.
( + )- " .8 /(
dH $)+<$5= <!
'( 2$ " .;:
!
%! < & )- %H )-
&! <)+ " #
2.;:
H% ) H% " * /( H $ " .;.;:
MH% )
H " .;:
6 H " .;:
/ " 5 <! -.
/(! $ )-5 " !)+< '0 )- .;:
R
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
o container a chave-primria do objeto. Em caso de erros na localizao do objeto,
uma exceo lanada.
$'2 )- " <'(6 . /(
dH > $$5= <!
'( 2$ " .;:
!
%! < & )- %H )- &! <)+ "
.;:
) H% " *$ " .;.;:
H%
!
" .H <5, " .;.
/ H H& )- " LH '( !% ' " ;. .;:
/ H H& "H.H " JH '( ' " ;. .;:
/ H H& )- " LH ' <! ' " .;.;:
/ H H& # " $ $'2 " JH ' < " .;.;.;:
> JH H% " .;:
JH! ) "H " .;:
> & "H " .;:
/ " 5 <! -.
/(! $ &5 " 6 '0 &
+ .;:
R
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.
( + " .
'( 2$ " .;:
!
%! < & )- %H )- &! <)+ "
2. :
) H% " * /( H $ " .;.;:
H%
JH! ) "H " .;:
> & "H " .;:
/ " 5 <! -.
/(! $ >
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
( + < % " .
'( 2$ " .;:
!
%! < & )- %H )- &! <)+ "
.;:
) H% <! ' " *< /( H )-.;:
H%
JH! ) "H " .;:
6 H " .;:
/ " 5 <! -.
/(! $ >
5 <! " > .H& H! <'0 JH ?.:
SR SR
Por fim observamos o deployment descriptor do EJB Entity Bean BMP = User Bean - o
qual apresenta algumas particularidades e diferenas em relao aos anteriores EJB
Session Bean e por isso sero detalhados.
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.
Aps so informados os nomes das interfaces ) , )
, ) e e o nome da
classe que implementa o EJB. A seguir o tipo de persistncia utilizado par aum EJB Entity
Bean que podem ser duas: Bean ou Container. No nosso caso, como implementamos
os mtodos de persistncia do EJB, esta deve ser configurada como Bean. Depois
devemos informar qual a classe da chave-primria do EJB. Vemos que neste caso a
classe uma classe da API Java, mas poderia ser uma classe definida para a
aplicao. Por fim, a tag reentrant define se o EJB pode chamar outro EJB.
Os atributos de transao no mudaram, sendo iguais aos dos EJB Session Beans.
5)0$LH, # ( '
$ H,
H >)- H >=)
?)+
>)- H
!
& H)H
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 ' . R
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 ( (
R
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 <!
&
R
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.
( + )- " .8 /( dH $)+<$5= <!
( + " .
( + < % " .
H% < ( $H& )- " &$ ' <! ' )-.;:
H% < ( $H& H% < " ' & '0"H .;:
H% < ( $H& % " ' <' 1 .;:
H% < ( $H& ! < " ) & ! &
.;:
H% < <' < $'+'( )+ " .;:
H% < <' < $'+'(
H, & < " .;:
H% < <' '(6'2 % " . :
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.
JH H! $ 4 2
.H& H%>
% ) ?
H.H ) $ % < ) 4 H6H
)+
)+ $
)+
%$ +, M.10 B K
$ $
"$% $& ,;*
O prximo EJB a ser comentado ser o EJB Message-Driven Bean - UserNotifierBean.
Como vimos nos tpicos tericos deste tipo de EJB, o mesmo no necessita da
definio de interfaces como nos EJB Session Bean e EJB Entity Bean. O que devemos
fazer implementar a classe do EJB que servir como consumidor de mensagens e a
mensagem propriamente dita, sendo que esta ltima pode ser utilizada como uma das
implementaes definidas pela API Java.
Vamos analisar o EJB UserNotifierBean, que nos apresentar algumas diferenas dos
outros exemplos apresentados anteriormente.
Vemos inicialmente que a classe deve implementar a interface " e a
interface % . A primeira interface utilizada pelo container para tratar do ciclo
de vida do EJB, tais como as interface ' e
. A segunda interface
utilizada para definir a classe como um consumidor de mensagens. Nesta interface est
declarado o mtodo , o qual veremos sua implementao logo a seguir.
H.H H&#
+ )+ ) GH "H.H&&'(
(
* "H.H' H
R SR
Os EJBs do tipo Message-Driven Bean somente definem os mtodos de ciclo de vida
! e ! ) " . Os mesmos no nosso caso esto desprovidos de implementao,
por isso no sero detalhados.
O mtodo de negcio importante para a execuo deste tipo de EJB o mtodo
. Este mtodo executado assim que mensagens so enviadas pelos
produtores de mensagens, isto , os clientes que realizam as chamadas assncronas ao
EJB. Estas mensagens so postadas em um MOM e logo em seguida consumidas pelo
EJB Message-Driven Bean. Para isto, a mensagem enviada como parmetro para o
mtodo , que valida a mensagem, recupera os dados contidos nela e realiza a
lgica de negcio necessria.
No nosso exemplo, a mensagem validada verificando se a mesma uma instncia
do tipo de mensagem que estamos esperando receber. Caso isto ocorra, obtemos a
mensagem atravs do mtodo
da interface e realizamos a lgica de
negcio, que neste caso ser enviar um email para o usurio que efetuou a compra
dos produtos. Observe que todas as mensagens customizadas, isto , definidas para
uma determinada aplicao, devem implementar a interface .
( + H6H&' " <$<5 )H H.H&'2 )lH' .
" )H' "H%
H
H6H&'2.
& ' ) H.H&&'2 "?" H& "H.H&'2.#)lH' . '2
H.H,&' " .;:
H,
"H, "" H, H6H&' . )H' . ' < H " .;:
/ H H%()- "H '(8H% " .;*(EH '2 )- " .;*
"
H &! *)-
HPH%&' .;:
Este EJB tambm apresenta um mtodo privado chamado
) , no qual
implementado a lgica de envio de emails. Ele no ser detalhado.
A classe que implementa a mensagem UserMessage tambm no ser detalhada, pois
no apresenta uma complexida extra. Somente define atributos que sero utilizados
para carregar os dados da mensagem do produtor para o consumidor, isto , do
cliente que est efetuando a chamada assncrona, para o EJB Message-Driven Bean
que executar a operao.
A seguir vemos o deployment descriptor do EJB Message-Driven Bean -
UserNotifierBean. Nele podemos observar algumas particularidades para este tipo de
EJB. Como define somente a classe de implementao do EJB, nele definimos somente
este atributo, alm do nome de visualizao e do nome utilizado pelo container para
referenciar o EJB. O tipo de transao tambm definida como nos outros tipos de
EJB. A particularidade do EJB Message-Driven Bean est em definir o destino da
mensagem. Devemos informar qual o tipo de destino utilizado para receber a
mensagem, se Queue ou Topic.
)+HLH,&'24(
H, >)-
( H= >)- H#
>)- H ?)-
; H6H ) % & )- H &
4 H6H
"H& >$ $ > !ZH &
) H.H&&' ;(% 4H% <
"H! &! ( &&5 )H "H & >$
H,>"H % $ ;% # % H,H% < (>
1)+ ;5=)+ H #< />
H,
? %
%? )- )- $ )-
)- HPH%H > 4 H6H"H
%? $
)- > 4
%? $
)- "H "H > 4
%? $
%?
)- <&'
H (
'H
> 4
%? )- $
%?
)- & $ > 4
)- $
%? $
%?
)- H=
! ; H,
$
)-
H
H $( 4 < !H&> "H
%?
)- "H LH ! ; "H < AH
%? $
! ;
%? )- $
! ; H,
%? )- $
%? )- ; &'("H $
$ '2
+ HLH= /+$H7>H "H1+
< /+ ; H6H,& /
H6H"H
/$$ )- & /
"H ! 6 "H ,<
$&!/
)-H!
0/$$
>7>
?'2 >)- ?/
/ ) H.H&&' 4 )-
/ ) H.H&&'
/ ) H.H&&'
/ ) H.H&&' ; H - <$ 7> " .
)+
H
H.H,
H 0%
/ ) H.H&&' ; )+
)+$ -"H!% !
' -
?'2 >)- ?
< -$
?'2
BNO$
H H H
?'2 >)- ?
?'2
BNO$
H >
HPH H $
- )0 N
?'2 >)- ? 4 )+ #"H
) <$ 6( H.H&H
&'("H
) <$ 6(
BN $
7 0 N
+ H&% "H
"H !
H, H
H + <
+
"H
?'2
)+
H H6H,
H -
N $
?'2 >)- ? )+ #>H > 4 )+
H ( H& "H H6H"H
H6H, /% ? H.H / #>'
? )+ '
?'2
(H ZH
'H ? %H&% "H
!4
H "H
4 H%6$
)0 <
H H6H,
H ) "H1H 0>
?
!4 $ 'H 5)0 ;
)+> ;H! H& $AH ?
HPH
H
4 H%6$
7$)- 4 ) $
7$)- 4 ) &H H6H,
! < > ?)- H.H
7$)- 4 ) &H H6H,
H
H < HPH
7$)- 4 ) H&H6H,
H
H < )-
H.H
7$)- 4 ) H& H6H,
H ? HPH
7$)- 4 ) H&H6H,
H ? )-
H.H
7$)- 4 ) -
) H H.H<'( H.H
"H
?'2
N
?'2 >)-
!4 &'H ? 5)+
5)+ 4
5+ )
4 H%6$
5)+
#5=
H
?'2
)+ H "H -
N $
5)0
?'2 >)- ?
!4 $ 'H ? 5)0 ;
H& $AH ?
)+> ;H!
HPH
H
4 H%6$
7$)- 4 ) $
7$)- 4 )
"H
?'2
+ (
&*
?'2 >)- ? #>"H %*
? <'(H 5)+ ;
?
5)+ H $AH ? & 5)+
<'(H
4 H%6$
"H
?'2
B 0> -
N
?'2 >)- ? "H 4 * ? * )+ *>
?'2
'(
(
N
?'2 >)- 4
H >"H ? )+
) <$ 6(
&
) <$ 6(
KH&% < / % H,%
H > &
H6H, /% ? H.H / # "H6H ? & JH= (
H 6"H,
(H
5 (
H
44 )- &
? =)- $ 2 ? )-
( ) $&(
; ) 4 )-
&'(0)- ; )
/> /? & ( H, ) H > H
/> /? & ( H, ) H /
H
? 44 )- < B
B D
B 4
&
R R
o Jboss com as configuraes padres, isto , executar o comando
=R R
$ ou $
$ , que inicializar o servidor em seu
modo de configurao padro. Sendo assim, podemos realizar o deploy da aplicao,
somente copiando o arquivo para o diretrio
"
$
.
:R
Algumas informaes sobre o deploy sero impressas no console do Jboss, detalhando
a instalao do pacote. Por fim, se nenhum problema no arquivo EAR for detectado
pelo servidor de aplicao, a mensagem de deploy realizado com sucesso ser
impressa no console.
Observe que o servidor de aplicaes Jboss pode ser configurado para inicializar com
servios e recursos a mais ou a menos. A instao padro sem configuraes
adicionais, nos apresenta trs modos de configurao fornecidos pelo servidor de
aplicao. A configurao recomendvel a ser utilizada para a execuo da
aplicao exemplo deste livro a configurao default. Para maiores detalhes sobre as
outras configuraes ou configuraes customizadas, consulte a documentao do
servidor de aplicao.
I
I
/4 67($)K $&78 0 .10.&$ (;0 K $ 783.&$ E , 8 0 $ SJFK (
O deployment descriptor de um pacote de componentes EJB, deve ter o nome de !
! # )* e estar no diretrio
(
R
da aplicao. Este arquivo ser empacotado
juntamente com as classes que os componentes utilizaro.
Este arquivo tem sua estrutura definida por um DTD (Document Type Definition). Iremos
apresentar uma breve explicao de cada elemento e atributo do deployment
descriptor ejb-jar.xml. Para maiores delhaes, consulte o DTD ejb-jar_2_0.dtd.
O arquivo em questo, deve ter como linha inicial com a seguinte declarao:
-
( %H EH%)lH,* , H $
"H
/; < $ H,> )
iremos detalhar seus atributos e elementos.
; $
; $
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
/$)+ /)-
; H6H
H.H
"H& >$ !"H, < (
%
%
H& ( < H& ?
H& ( H&
%"H ?
%"H
,H "H.H
?'2?
'(
/>)- /)-
%) %)-
/$)+ /)-
; H6H
H.H
"H!! & 3H& /)- >)- H % 3H& /)+ $)+
4$!
4!
%
%
%
%
H& ( < H& ?
H& ( H&
%"H %"H ?
($$
!
)-
>)-
%
%
H > $ H, & ?
<message-driven-destination>: define o tipo de destino da mensagem que pode ser
! " &# !) # $$ ou ! " # ! )*%# . Alm de definir a durabilidade do envio da mensagem que
pode ser Durable ou NonDurable.
<env-entry>: define propriedades de ambiente para o EJB em questo.
<ejb-ref>: declara referncias para outros EJBs.
<ejb-local-ref>: declara referncias locais paa outros EJBs.
<security-identity> : informa como propagar o contexto de segurana.
<resource-ref> : declara referncia para recursos que podem ser utilizados pelos
EJBs.
<resource-env-entry> : associa os recursos com nome JNDI.
!!
=N
O elemento apresenta o relacionamento entre EJBs Entity Bean CMP, sendo
SR
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
H <
"H <
< "H,/> % >=) ? "H&/ % >)-
)+
)+
$)- )+
4 )+
)+
; 2 )+
4 (
)+44
%$ $EH,/ ? )- % ZH,/ ? )+
)+
A seguir vemos uma breve explicao dos atributos do elemento . :N
<description> : descrio do relacionamento entre EJB Entity Bean CMP.
<ejb-relation> : define o relacionamento entre dois EJB Entity Bean CMP.
SR
Sub-elemento !
do elemento
que define define o relacionamento
entre dois EJB Entity Bean CMP.
=N
<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.
Sub-elemento ! do elemento
relacionamento dentre dois EJBs.
R :N R
! que descreve um regra de
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.
H6H)+ ;"H
!$ )
?)-
) /
)- /
) /
R
mtodo o nome do EJB e o nome do mtodo que ser utilizado um tipo de
transao, configurada no elemento $
.
<exclude-list> : lista dos mtodos excludos do deploy. Apresenta um atributo com a
descrio da lista de excluso e um elemento que contm o nome de cada
mtodo de cada EJB que ser excludo do deploy.
! #"
@ 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)- ' >
)- " .;:
>
8)- '
)- " .;:
%? H1'2 ( >)- " .;:
+'( " .;:
& '2 $ " .;:
" % .;:
9 H
9 H " ' %$ #)-.;:
H, )H% &! '2 H "H& " .8 /(
dH '2 &5 <! :
"
$H& 2 . / H '2 & 5 <! :
7'( " .8 /( dH '2 &5 <! :
#
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.
$! +&>
)- 5& )H >)-<
0%) " -/ .8!/% H )-
5 * )-$5 <! :
"
0%) &1 ) (. / H )+5 (* >)-<(5 :
>
& ' >
< " . /(! H )-$5 < :
)- > '28)- 2 " .8 /( dH $)+<$5= <! :
#
Deve ser extendida pelas interfaces )* (acesso
) ) dos componentes EJBs.
Apresenta servios de criao, remoo e localizao dos objetos EJB.
$! +&>
)-
0%) " &1 ) (. / H )+5 *
5 :
#
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
Quando definir a interface
para um componente EJB, a mesma deve conter os
mtodos de negcio que estaro disponveis para o cliente local.
$! +&>
&
2)- '(!>
)- " .8 /(! H >
$5 $< >:
< ' )+ > " .8! /> H &>
5 :
0%) " .8!/% dH >)-<(5= $< >*>
5 :
9 H " >
& .8!/% dH >
5= :
#
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
R
um objeto serializado, pode ser utilizado para obter dinamicamente informaes sobre
o EJB.
$! +&>
1
<
>
2)- ' >
)- " .;:
H6H " .;:
# HLH '8)- ?
# HLH ' >)+< ; H.H " .;:
# HLH ' )-
H.H " .;:
9 H "H6H, " .;:
9 H
HPH
H.H= " .;:
#
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.
$! +&>
& 5,ZH )-
) ' >
)- " .8 /( dH $)+<$5= <! :
< ' )+ > " .8!/> H )-5 < :
0%) " .8!/% dH >)-< 5 * )+5 :
'(2 " .8 / H )+5 :
9 H " >
& . / H )+5 (:
#
!"
#
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
#
/
DH& $
H
5 " <5,1 &5.
>
5= < * $)+<$5= <! :
5& " 8
. !/% H
>
5 < * )-5 < :
7"H<!
)-< " .8 / H )-5 *
5 (* >)-< 5 $< >:
" . /% H >
5 * )-5 < :
HPH, (& " . /% dH >
5 * )- 5 < :
" 2
>
5= < * $)+<$5= :
. / H
"
% . / H
5 <! * )+<$5= $>:
#
#
#
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.
$! 2)- $$
5>"H & ( B
) ' >
)- " .8 /( dH $ )+<$5= <! :
#
! !
#
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 Message-
Driven 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.
$! H6H&'2
>
5$$H
&% H%
( 25& " HLH&' 25 ?5<. /(!
$H& "H.H%'( >
$5 $< >:
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
R
objeto, ativao e passivao do objeto pelo container, alm de definir o mtodo
! que criar uma instncia do objeto pelo container.
$! HLH=
-5)H % H&
$H&
HPH& <5, " "H.H <5, <5. /
>
5 < * $)+<$5= <! :
H
#
#
! ! #
Esta a interface especfica de EJBContext para um EJB Session Bean. Tambm
associada a instncia do objeto aps a sua criao.
$! HLH= 2$5& 5& $)H &
>
5,
>
< '( &$
" . / H '2 & 5 <! :
>
& '2
" . / H '2 & 5 :
#
#
! !
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.
$! HLH= ( /> B<&
<; ,
' " . /> dH &>
5 * $)-5 < :
7$; )+ " ./% dH >
5= $* >)-< 5 :
<; 2)+ " - )+)+ ?.8!/% H
>
5 >*
$)+<$5= :
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.
#
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.
N
!"
Indica que a transao foi marcada com rollback ou estava sendo executado o
rollback, mas ocorreu algum erro nesta operao.
A !
I
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
2)-*> ) )-
%;.F
+ $ )+*"H
)-
$ " HH,? N"H >DH? -
"H %$"H
$! "H (!)- 5"H &&5
)-
H >? " . / H %<$5 * >)-5 :
? )--0
"H (!
>"H$KH&!> NH + ( +"H, -0% H
(
! ) $)
$! "H (! 5$$H <(&5
&
&( '
'26 H, ( " <'(6 * $'2 '2.
/ H )+<$5= <! :
&( ' '26 " $'( ( * <' 6 )-H.
& +)-
"H$ + + -
%< $5 < 5 N + N +7 )H >
/ dH
+ & " . / H !<5
)-N- ZH>
> + -
+ )-< " .
<+&!
B<- - $ HLH, $+)
+ H.H= (& " .
' % + 5 +
"H6H, +
H.H 25& 5& -7
H6H= 9
) H,"
$H& H6H, 5& " "H.H 2 <5,MH,"H.H 2<5 .
/( H H"H.H, 5& ;H,
HPH& <5 :
> >) "H $ ( )-*4 # ) $ )-
) (
1H, -+"H& $
% 7% $ (! B<+%
--"H& $
)
( 1-H& - >
( ' '$6 H, " <'( ( * $'2 % .
$'2 " $ " . $! 6 $ " .;.;:
<!%0
> -( $ H $ H=*$ - ) - $;$%)--+ )
> -
BH )+
) ;)-
(
6 $$
)
) ! )-"H ($! -0 H "H
( 1- +%
( ' '$6 " $'( ( * <'
6 )-H&.
<!%0 $'2 $ . ) H $ " .;.;:
" "
Deployment Descriptor : SalesSupportBean.
5)0$LH, # ( '
-
( %H EH%)lH,* , H $
"H /$;
,H )
H"H.H
H H6H, $ (
ZH < $ !ZH &!
%H HLH=
)-< /
%ZH
?&!% !"H
?& $
No prximo cdigo, apresentamos o EJB Session Bean Stateful - SalesBasketBean.
Inicialmente seguem s interfaces ) e ) , ' ) e ' respectivamente, a
implementao do EJB SalesBasketBean e por fim o deployment descriptor deste EJB.
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
>
? )-
- "H 7>$$H&*%H& H,?( NH (H 0 B"H
( "H !(
H 0"H=
ZH"HH( N"HH
( 1- $ B $* 60)+ %(
"H-0(H* )+ H% *> -$ 6>H
H
$! "H,
H 5$$H & (&5
&
7
H " ) & H "H,,.
/ H )+<$5= <! :
&( '
B " .8 /( H $$)-<$5= <! :
> & " ) & & >$> & . / H
$)+<$5= :
&( '
+%)- % " ) ( $> &
%($ .8!/% H )- 5 < :
&( ' '26
H < & " . /> H )-5 < :
%
H < " . / ) 5 :
H
+ /> & H& )
" & H "H&&.
)+? <(&5 :
)+? <( ! :
)+? ) ( :
)+? ) :
)+? )
:
>"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,
5- "H.H 0
& (& H6H,
5&aH&H6H= 2$5 :
+ & " . / H !<5
)-N- ZH>
>7 >
*> $ $$
+ )-< " .
+ . "
<+&!
B<- - $ HLH, $+)
+ H.H= (& " .
' % + 5 +
"H6H, +
)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 %H 0"H, $)-
) )H "H, (+
- )0% > H (H
( % H,+- )+KH% 7 ) H, "H6H
0
H " H
)H%$%.
!
" %& -H < ! " . %& " .;:( />H #<5, " .;: .
> 0 < " (. 5& " .;:
( &
"
!( & . ( & '(<
" .;:
)- %& ( '(< )- .;*$ '( .;* '( "H < " .;*
" " "
'( " ( '( " .;.;.;:
" !.;:
%+>
< / " &$5= -5.
/ 5 " ?% / ! ( '9 - $ B< 5.;:
) %+- , /-+ )+>H
+ )+H
) %$ H Z H& + & >/
+ > & " ) % & ( &
> $> & .
/( H H " ($ &!*! &.;:
)-(-)
> & />
+ )+H
H )-( -+ &, /
> )0
H
) %$
( % H,++)-NH,
(*$ H+ H&+ ,
&( '
+%)- % " ) ( $> &
%($ .
" /( H
H %)-< " ( & .
> .
" !.;:
%+>
)-( H
!"H1 "H-+ )+H
- %
H < " .
/( H H " .;:
+
0ZH,& *, DH%+0)+H&)- 0
)
)H&
) H%
N-( KH&$ )+ H )+ <*) H $ +0 > -H% 5)+
( H%
N*"H&> H6H= )+*"H $
N
H&$ 7H%$DH, )+
H
) )H "H,
DH&1
( % H,$H%
* H& H& !
- /> & H& " H&
ZH.
Deployment Descriptor : SalesBasketBean.
5)0$LH, # ( '
H"H.H
)- ) & H
HPH& H,
H < %)-
, H3H ,) %, , , ? H;.HGH , .H
JH %
%! JHGH
( & &H H6H, (
H"H.H
ZH < $ !ZH &!
%H HLH=
) /
ZH
?& & > )H&? ,
!%)H% &!
HPH%)0 4"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.
>
DH&
/+ )
)--5)H &(<5 >
)-
$! H
H,1 & " <! ' )-* <'( * , ' (!HLH=* $'0) .
/ H #5 <! * >)-5 $< >:
H,6
% )- > " <'(1 . / H 5 <! (*
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
? >)-< 0+-$ >+"H $ B<> !
"H.H&7%) )F-
HPH&-"H H >H! -$
H 5,ZH &5
$!
<!& '+'2 )- " 8
. !/% H )- 5 :
"
<' 6'( # . ! /% H >)-< 5 :
<!& '+'2 "H.H " .8/ H >)-5 :
<!& '+'2 )- " .8!/% dH >)-< 5 :
$H& )+ " <! ' )-.8 /(! dH )-$5 < >:
$H&
HPH " & '0>$%H6H,. / H )-$5= <! :
$H& )+ " <! '0)- .8/ H >)-5 :
)+? <(&5 :
)+? <( ! :
- < -&!%& H $H,>
/>7> )
$!
)-
5"H 5 >
$ )-
H
H, > > %< " & ' )+* $'2 < * $'0
HPH&* & '0)- .
/ H #5 <! :
H, > $ >
)-
" '1 . !/% H %5 :
)+? <(&5 :
)+? <( ! :
? >)-<
! B-
HPH%0 > (+)F "H
) H $
' > + $<1"H ( %H "H &, H 0"H=
H 5"H (&5 >
&
$!
<!& '+'2 )- " .:
<' 6'( # " .?:
<!& '+'2 "H.H " .;:
<!& '+'2 )- " .;:
$H& )+ " <! ' )-.;:
$H&
HPH " & '0>$%H6H,.;:
$H& )+ " <! '0)- .;:
)+? <( % )0 :
)+? <( H :
)+? <(&5 :
)+? <(&5 $)+ <' :
>
$
*;"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&%
+ )+ )-GH (
5-7 >
>! 0
& (&0$ 5& 25&!:
0
2
5
- )
& (&- %)H& & - & -( :
- ++
2
00 ZH.N
& (&- '
" )-* * (
HPH,*)- . " * * * .:
0+ $ BN -+ ++
2
& (&- '
#
)+
* 6%H6H *()- 2 # ?:
00)-N--$ 7$7
2
& (&- ' # # 2 # :
-+ +
2
0+< EN
& (&- ' $ ) * #< * (!HLH,*
)- :
B 1"H H DH
/&0& )
& (&- '
)-* < * 6
"H.H=*
+
>7ZH,&
<' 1 " ' >)-* '$6 * & ' ( "H.H* <! '0)+ .
/ H #5 <!
!
'( 2 " .;:
> <
& )-aH )7 $> &! ! <)- "
.;:
!
H ) H $' " *>)-.;:
) H " * " .;.;:
H
> JH ) "H " .;:
> &! H% " .;:
"
< / 5 <! -.
/ 5 <! " . :
H & " , ' )+* $ '2 < * $'0%H6H,* & '0)- .
/ H #5 <!
)-N- ZH>
>7 >
*> $ $$
/ dH )-(5 -5 N +-)-N >
+ )-< " .8 / H )+5
!
'( 2 " .;:
> <
& )-aH )7
$> &! ! <)- "
(.;:
!
H ) H " * / H 6 $ " .;.;:
> JH ) "H " .;:
> &! H% " .;:
< / " 5 <! -.
/ )-$5= <! " ? (% )+( '0 )- ; .;:
' % 0>)- 7ZH,
) )- >)- 7ZH,
$H& )+ " <! ' )-.
/( H >)- + )-:
' % + 0"H
+)H,
)
$H& " '2 .
/( H
:
' % +)- +"H
) $)- )- +)H,
$H& )+ " <! '0)- .
/( H )-
)+ :
<
) 0$)+ 7EH, %
+)- 0"H&
<!& '+'2 )- " .
<!%0)-:
<
) + < +) H,
- 67ZH,
<' 6'( # " .
<!%+ :
<
) +
N-0"H,
-%N-+"H,
<!& '+'2 "H.H " .
<!%+"H.H:
<
) +)- +)H,
-)+ $7ZH,
<!& '+'2 )- " .
<!%+)- :
B +
+ KH
/(+ )
B<N >
) +)H,
-) ) )
- />&(+ ) +
/ dH ( 5 -5 N -) H& > %+0 B1
<' 1
)- > " $'$6 .# / H %5
!
'( 2 " .;:
> <
& )-aH )7 $> &! ! <)- " (
.;:
!
) H " * " .;.;:
H
!
" LH 5& " .;.
!/ H H,< )- " LH '(< <! ' " ;. .;:
!/ H H,< "H.H " AH '( !% ' " ;. .;:
!/ H H,< )- " .H '( ' " .;.;:
!/ H H,< < " '( " LH '2 " .;.;.;:
%JH "H " .;:
> JH ) "H " .;:
6 > <
H " .;:
< / " 5 <! -.
/ >$5= <! " ? (%6 $$ '0 &
.;:
B<- - $ - &<' "H "H -+)+
+LH= HF %
+)-)
+ " .
!
'( 2 " .;:
> <
& )-aH )7 $> &! ! <)- "
.;:
!
) H " * / H 6 $ " .;.;:
H
%JH "H " .;:
> JH ) "H " .;:
> &! H% " .;:
< / " 5 <! -.
/ >
5 < " % '0 GH .;:
B<- - $ +$LH, H 1"H H )H
H )
)-)
! () )+ -7JH H%GF>
+ " .
!
'( 2 " .;:
> <
& )-aH )7 $> &! ! <)- " #
(.;:
!
) H $' " * / H $)-.;:
H
> MH ) H% " .;:
6 > <
H " .;:
"
< / 5 <! -.
/ > 5 < " % LH, H <'0 H .?:
HPH
B<- - $ - +$ (-"H -
+ " .
<+&!
B<- - $ HLH, $+)
+ H.H= (& " .
"H $4 ' (! + <5, +
-$
0"H 25& " .
/( H <5
:
/( H <5 5&!:
- > :
!
25& " .:
( 2$56 5 -
" 2 < . ?5 " &(
.;:
"
< / 5 <! -.
/ )-5 " '(< "H.H%'( " .. :
<!%+ :
Deployment Descriptor : UserBean.
5)0$LH, # ( '
-
( %H EH%)lH,* , H $
"H /$;
,H )
$ H, >=)
H >)- H
?)+
>)- H
$ H, $
!
) /
)-
>)- H
Z H
?& & > )H&? ,
!%)H% &!
HPH%)0 4"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.
#&$5= >* ) 5 :
% > &
)-
" > & 9 .
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
? >)-< 0+-$ >+(+! B7$
"H.H&7%) )F-
HPH&-"H H >H!
$! 5"H 5 >
&
<!& '+'2 )- " .8!/% H )- 5 :
H < " .8 / H )-5 <! (:
<!& '+'2 "
<' 6'( % " . / dH )
5 :
%> & 7' & " .8 /( dH $)+<$5= <! :
$H& )+ " <! ' )-.8 /(! dH )-$5 < >:
$H&
H, & " '0"H .8 /( dH $)+<$5= <! :
$H& , " <'(1 . / dH ) 5 :
$H& $> &
"
% & 0 >$$ (
.8/ dH >)-5 :
)+? <(&5 :
)+? <( ! :
)+? <(&5 :
)+? <( ! :
? >)-<
! B-
HPH%0 > (+)F "H
) H $
' > +$<1"H ( %H "H &, H 0
$! $ >5,ZH &5
&
<!& '+'2 )- " .:
<!& '+'2 "
H < " .;:
<' 6'( % " .;:
%> & 7
' & " .;:
$H& )+ " <! ' )-.;:
$H&
H, & " '0"H .;:
$H& , " <'(1 .;:
PrimaryKey : ProductPK.
<'(- ) $ (:
)+? <( :
# H6H >
4 -()- /$7> )
-$ >+(
H.H & 0 )+ )-GH B<
+ +
& (& & ' :
"H% $ $(
%> & " .
"H% $1 )H! )+ B<
) 0 +
%> & " < ' .
/( H (:
'2 H, )+$
)+ $ H&-+$ & 0
" / H '( HPH " . H " ' < HPH " .?.;.
( & 7 / "
! & (. :
%!> ;
" ;
" "
/ H - . " /<
/ H H " /& .;.;.;:
.;. " / H
(
<!%-; H:
Entity Bean CMP : ProductBean.
<'(- ) $ (:
)+? <(&5 :
$ *"HZH & (% )+GF>H
H
H %(H ) ) )+ +$AH= H
H ) < "H <' "H >
iH 6 )+ )-
H( # $ $>
H )>H
JH $H& )H&1 H )+ >7 9 > )+ "H& , <
H&! ($ 0)> >
)- > + - )-7$(
)-
H14 ( 6) >
)
H.H& ($ -
)
* $
-
*
- /&( ) 7
>)-"H H! + H%0>
- 5)+ 4 ) H1$H&9)H
HPH%++ /> )
0!(H& &
7>$
B<- - $ - +
) )- >)- 7>$
) 0 (> 7>$
) H& -"H, & N-+
) 0"N-+
- />&(+ ) 0%(
%< $5 < 5 N + N +H% "H
/ dH
% > & %& " & $' < ' )-* ' < $'7>H% < *
&( ' '21> *> ) $> &
%($ (.8 / H %<5
H,< )- " $)-.;:
H,< "H " H& , .;:
B<- - $ - &<' "H "H -+)+
+LH= HF %
+)-)
+ " .
B<- - $ +$LH, H 1"H H )H
H )
)-)
! () )+ -7JH H%GF>
+ " .
HPH
B<- - $ - +$ (-"H -
+ . "
<+&!
B<- - $ HLH, $+)
+ H.H= (& " .
"H $4 ' (! + <5, +
-$
5& " .
7"H<!
' % + 5 +
-$
$! 2$ 5& $ 5-+&>
- 0
)
5 " <5,1!
DH& $ 5 .
' % - />&0, ) >7!
) + /&0% ) +
%($ (.;:
H % $ $H,< " ) % & > &
0%N-7>$
<
)
<
)
- /$7> )
0%(
Deployment Descriptor : ProductBean.
5)0$LH, # ( '
-
( %H EH%)lH,* , H $
"H /$;
,H )
)+
)- )- )-
)+
)+
)- <
H, & < ?)-
)+
)+
)+
)+
)+
!
& H)H
) /
ZH
?& & > )H&? ,
!%)H% &!
+ ) )- %
0"H,
$) "H%7)-"H,&')
H.H H&#
+ )+ ) GH "H.H&&'(
(
* "H.H' H
5- H.H&&' $+
& (& "H.H<'( ( 5,1)-HLH'( ( 5& :
"H $ +$ +>DH!( -
+ & " .
>)-<(
+ EH
+ +H,(
( + )- " .
" )H' "H%
H
H6H&'2.
"?" H& "H.H&'2.#)lH' . 2 '
H.H,&' " ;. :
& ' ) H.H&&'2
H, "H, "" H, H6H&' . )H' . ' < H " .;:
/ H H%()- " "H '(8H% " .;*(EH '2 )- " .;*
( ) )- + 4
N +%
0"H
) > / H% /"H +ZH,%
) +)+ -H% >&
)H
> <! 4 N
) 5& )-)H%&'() 7> N $
/! dH $5 -5 "N+
H0$ ZH, '2 $ +$)-
& (&- $H&>)- " !% ' /"H * ! '0* ! '=H, &!* '0 <5 .
/(! H 5
!
% < ) H >& "H DH H )-
% ?! H
H
[H ) '( ? "H " .;:
% 2 ' %
$H? -)+
%"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.H&&'( H% >)
)-"H.H&&'( $ & (&5 )-
H.H,&' > (
" *
% $! HLH " .;.;:
)-"H.H&&'( H% & " H& &!.;:
)-"H.H&&'( H% 5, " 5& .;:
% > +)+"H')
Mensagem : UserMessage.
<'(- ) )-:
)+? <( :
)+? ) ( :
DH&1' %
0ZH,
(-
) 7) "H&'2)
+ >H%
"H, )+
)
H.H H& "H.H&&'(+ )+ )-JH B<
H,% - $>"H& ( +)-ZH&'()
& (& H, EH,:
<
) +)-ZH&'() DH& $( - 0"H,
DH%$ ( -0"H,
+)-"
H,&')
<!& '+'2 H6H&' " .
<!%0)-H6H&'2:
' % +)+"H&'2) H,
H&
0)
D
<
)
+"H
)H&
+)+"H&'2)
H, '( H% " .
<!%0"H:
Deployment Descriptor : UserNotifierBean.
5)0$LH, # ( '
-
( %H EH%)lH,* , H $
"H /$;
,H )
)+
H.H,&'24(
$
H >)- H#<
H, >)-
? )-
>)- H#
; H6H < ) % & )
H#
H6H
ZH < $ !ZH &!
) H.H&&'2 ; $ 4H% $
"H & ( &5 )H $ H!! $&! (
H&"H ;% H,
H < 4
) /
)-< /)- - ) <!/ ?)-
)+ />
ZH
?& & > )H&? ,
!%)H% &!
)+? <(&5 :
)+? <( ! :
)+? <( %)0 :
? )--0
% & ?
>"H$KH&!> NH $H,(?+!
N-5)+
$! ? 5,ZH <5
0>( %)- " .8!/% H >)-< 5 :
+ %( )- " .8!/% H )- 5 :
)+? <( H :
)+? <( %)0 :
)+? <(&5 :
)+? <(&5 $)+ <' :
>
H6H, +
$ < <$ H6H $ B<>
)-H,( N-H=?
- N -5)+
!)FH,?2 NH -
N -+)+
H.H !
+ )+ )-GH "H.H >
5- "H.H 0
& (& H6H,
5&aH&H6H= 2$5 :
&
N - "H%
H- <0$
%< $5 < 5 N + N +7 )H > 7 >
/ dH
+ & " . / H !<5
)-N- ZH>
>7 >
*> $ $$
+ )-< " .
HPH
B<- - $ - +$ (-"H -
+ " .
<+&!
B<- - $ HLH, $+)
+ H.H= (& " .
' % + 5 +
"H6H, +
)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 :
!
25& " .:
( 2$56 5 -
&(&5 H( ! -)H " &(&5 H < .
5 "
;( .;:
"H ' < &! " . :
> < -
& )-aH )7 $>
! < &)- " (
"
*
"
" .;* # " .;*
" .;*
" >. ..;:
.;*
!
>
H ) H " .;:
H " .;:
( )+ +)+ +5= ZN $ +5)+
N
"
+ %( )- .
% " & <'0 )-< .;:
EH%)
!
( 2$56 5 - 25& " .:
&(&5 H & -)H
" &(&5 H( & > .
5 "
;( .;:
"H ' <
&! " . :
> < -
& )-aH )7
$> ! < &)- "
> ?.;:
!
>
H ) H " .;:
( H& " .;:
Deployment Descriptor : ProjectSupportBean.
5)0$LH, # ( '
-
( %H EH%)lH,* , H $
"H /$;
,H )
H"H.H
H"H.H ( & HLH H%H6H, $ (
ZH < $ !ZH &!
%H HLH=
& H)H
) /
%ZH
?&!% !"H
?& $
-
( %H EH%)lH,* , H $
"H /$;
H, )
H"H.H
H H6H, $ (
ZH < $ !ZH &!
%H HLH=
H"H.H
)- ) & H
HPH& H,
H < %)-
, H3H ,) %, , , ? H;.HGH , .H
JH %
%! JHGH
( & &H H6H, (
H"H.H
ZH < $ !ZH &!
%H HLH=
H"H.H
H >)- & ? ( H, )
>)- ! & ? ?)+
/>)- ) & H"H.H, & ? )- /)-
)- ) & H
HPH& & $ )+<
; H6H < ) %
& HH6H, & >?
4
H.H
H"H.H ( & HLH H%H6H, $ (
ZH < $ !ZH &!
%H HLH=
$ H,
H >)- H
>=)
?)+
>)- H
$ H, $
H% % ,H /) )
"H & GH& />)- >)- H
!
$AH= H ; ( 2$ $ LH, H%> ; 2
) ? H.H ) <
)
H6H
)+
)- <
H, & < ?)-
)+
)+
)+
)+
!
)+
H.H,&'24(
$ H, >)-
H >)- H#<
?)-
>)- H#
) H.H&&'2 ; $ 4H% $
"H & ( &5 ) H $ H!! $&! (
H&"H ;% H,
H < 4
) /
Z H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
Z H
?& & > )H&? ,
!%)H% &!
4 %"H, <
) /
H
?& & > )H&? ,
Z
!%)H% &!
4 %"H, <
) /
Z H
?& & > )H&? ,
!%)H% &!
HPH%)0 4"H % <
"H.H
H"H.H
%H HLH=
H"H.H
%H HLH=
H"H.H
>)- !
& ? ?)+
$)-
& $)-
%H HLH=
>)- ?)+ H
)- ( ;)-
$)- H
!
)+
H.H,&'2 4(
H#
>)- ?)-
H!! $&! ) % H! H% < ?)-
)+
H.H&&'(&
& H)H
"H.H
; GH
&(
>
H
H
H )- ' >JH & H )- '
)+
)+
)+
)- <
H, & < ?)-
)+$)-
)+;)-
)+
)+
)+
!
@
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#=?>
Version 1.2, November 2002
*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
general network-using public has access to download using public-standard network
protocols a complete Transparent copy of the Document, free of added material. If you
use the latter option, you must take reasonably prudent steps, when you begin distribution
of Opaque copies in quantity, to ensure that this Transparent copy will remain thus
accessible at the stated location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before
redistributing any large number of copies, to give them a chance to provide you with an
updated version of the Document.
4. MODIFICATIONS
You may copy and distribute a Modified Version of the Document under the conditions of
sections 2 and 3 above, provided that you release the Modified Version under precisely
this License, with the Modified Version filling the role of the Document, thus licensing
distribution and modification of the Modified Version to whoever possesses a copy of it.
In addition, you must do these things in the Modified Version:
A. Use in the Title Page (and on the covers, if any) a title distinct from that of the
Document, and from those of previous versions (which should, if there were any,
be listed in the History section of the Document). You may use the same title as a
previous version if the original publisher of that version gives permission.
B. List on the Title Page, as authors, one or more persons or entities responsible for
authorship of the modifications in the Modified Version, together with at least five
of the principal authors of the Document (all of its principal authors, if it has fewer
than five), unless they release you from this requirement.
C. State on the Title page the name of the publisher of the Modified Version, as the
publisher.
D. Preserve all the copyright notices of the Document.
E. Add an appropriate copyright notice for your modifications adjacent to the other
copyright notices.
F. Include, immediately after the copyright notices, a license notice giving the
public permission to use the Modified Version under the terms of this License, in
the form shown in the Addendum below.
G. Preserve in that license notice the full lists of Invariant Sections and required
Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
I. Preserve the section Entitled "History", Preserve its Title, and add to it an item
stating at least the title, year, new authors, and publisher of the Modified Version
as given on the Title Page. If there is no section Entitled "History" in the
Document, create one stating the title, year, authors, and publisher of the
Document as given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
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
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"
document and put the following copyright and license notices just after the title page:
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
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 >
"with...Texts." line with this:
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.