Você está na página 1de 267

Jsp, Servlets e J2EE


 
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

  

Este livro dividido em duas partes. A primeira parte trata do desenvolvimento de


aplicaes Web utilizando, principalmente, Servlets. A segunda parte aborda o
paradigma de desenvolvimento de aplicaes distribudas utilizando a tecnologia
Enterprise Java Beans.
A primeira parte do livro aborda de forma consistente e didtica o contedo
relacionado a Servlets. Nesta abordagem definido um histrico do desenvolvimento
de aplicaes Web, passando por CGIs e linguagens de script. Alm dos tpicos
relacionados a Servlets so abordados tpicos relacionados tais como Java Server
Pages (JSP), Java Beans, Taglibs, modelo MVC, instalao de configurao de um Web
Container para desenvolvimento, alm de tpicos avanados tais como controle de
pooling de conexes com banco de dados.
A segunda parte do livro aborda o paradigma de desenvolvimento de aplicaes
distribudas, destacando a evoluo das tcnicas de desenvolvimento desde a
programao estrutura at o atual uso de sistemas distribudos. A tecnologia utilizada
para prover distribuio a plataforma J2EE (Java 2 Enterprise Edition). So detalhados
os componentes e possibilidades que esta plataforma oferecem ao desenvolvedor.
O livro foi dividido em partes para oferecer um contedo mais abrangente e completar.
A primeira parte trata da construo de interfaces e controles para interao com os
clientes de uma aplicao Web. A segunda parte aprofunda nos aspectos de
distribuio de um sistema, permitindo que este execute em diversos computadores,
dividindo sua carga e, conseqentemente, aumentando seu desempenho.
O intituito de todo o livro ser prtico nos temas que apresenta. Todos os captulos
apresentam exemplos que simplificam o processo de entendimento dos temas.



    !#"%$&'  ( *)+,-.!/0  1 234 !#$567&8:9 
;< >=?!#@

 

     

Introduzimos, nesse captulo, a tecnologia de Servlets e Pginas JSP e mostramos


algumas caractersticas que tornam essas tecnologias bastante atraentes para o
desenvolvimento de aplicaes na Web.

 "!"#%$'&
(*),+.-
$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-ToBusiness, 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
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.

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).
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:

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.

Figura 1.1

Exemplo de arquitetura distribu da com Servlets e P


ginas JSP.

Eficincia: os Servlets carregados por um servidor persistem em sua memria at que


ele seja finalizado. Assim, ao contrrio de outras tecnologias, no so iniciados novos
processos para atender cada requisio recebida; por outro lado, uma mesma
estrutura alocada em memria pode ser utilizada no atendimento das diversas
requisies que chegam a esse mesmo Servlet.
Recompilao automtica: pginas JSP modificadas podem ser automaticamente
recompiladas, de maneira que passem a incorporar imediatamente as alteraes
sem que seja necessrio interromper o funcionamento da aplicao como um todo.

 *$ $*-


 )  )  + # +

O CGI, ou Common Gateway Interface, surgiu como uma das primeiras tecnologias
disponveis para a gerao de contedo dinmico em servidores Web: o
desenvolvedor implementa uma aplicao que deve ser executada a cada requisio
recebida, sendo que o servidor Web passa para essa aplicao, atravs de variveis
de ambiente e entrada padro, os parmetros recebidos, e retorna a sada da
aplicao como resposta da requisio.

Figura 1.2

Funcionamento de um CGI.

Podemos usar o CGI para analisar algumas das vantagens em se utilizar Servlets.
Em primeiro lugar, h um grande ganho em performance na utilizao de Servlets: ao
invs de iniciar um novo processo a cada requisio recebida, um Servlet fica
carregado em memria e atende as requisies recebidas atravs de novos threads.

Alm disso, um Servlet pode tirar proveito dessa persistncia para manter tambm em
memria recursos que demandem grande processamento para serem inicializados. Um
exemplo tpico, para esse caso, a manuteno de conexes com banco de dados:
ao invs de inicializar uma nova conexo com o banco de dados a cada requisio
recebida, um Servlet pode inicializar diversas conexes ao ser carregado, e
simplesmente alocar uma conexo desse pool a cada requisio recebida (e retornar
a conexo ao pool aps o atendimento da requisio).
Alm destes ganhos de performance, a utilizao de um Servlet possibilita uma maneira
mais padronizada e portvel de se distribuir / implantar sua aplicao. Conforme
explicado mais adiante no Captulo
2 Instala o e Configura o, o ambiente onde
sua aplicao ser implantada no precisa ser igual ao ambiente onde foi feito o
desenvolvimento: seus Servlets podem ser instalados em qualquer ambiente onde
haja um Servidor de Aplicaes que implemente a especificao de Servlets.



Por fim, estaremos apresentando ao longo deste livro as diversas caractersticas e


funcionalidades da tecnologia de Servlets que tornam o seu desenvolvimento muito
mais simples, e o resultado, muito mais eficiente e robusto.

,) +  ')  ")
 +



Servlets so classes Java, desenvolvidas de acordo com uma estrutura bem definida, e
que, quando instaladas junto a um Servidor que implemente um Servlet Container (um
servidor que permita a execuo de Servlets, muitas vezes chamado de Servidor de
Aplicaes Java), podem tratar requisies recebidas de clientes.
Um cenrio tpico de funcionamento de uma aplicao desenvolvida com Servlets o
seguinte:

Figura 1.3

Exemplo de funcionamento de uma aplica ocom Servlets.

Ao receber uma requisio, um Servlet pode capturar parmetros desta requisio,


efetuar qualquer processamento inerente a uma classe Java, e devolver uma pgina
HTML por exemplo.

Exemplo de Servlet
    
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #1"2  !' #"43%56#7$#8%$9: ; <= 9:>@?BAC:D! #9E#F#GH I


-.-

EJD!' #!9%8#735#J#".8;LK8,M#9EJD#"2"$

!5ON' D:D' ".":P# Q8#H I / #!@' # #Q8#9E">68& / #%&(' #R

5N' DO! EE6B#Q >(8& / #!)' #&P#356#"F


&*OF

I2 9

. F#!

 .#35#"$>6& / #' #Q&P6#" !9"$#



$#"Q !9" # 

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9"

" #!5

'  

 . 9!)' 9 -

 -.

'  

 K8' 56"2*/+

#%9%E!#F#G

. 8#!8

H I$#&%'!)(

 F#35#"$& <#&P# JQ8#* EE% (+

%',!+

- >?BAC, 

0
0



,) +   *! -
$,+

,1

3254

76 38

As pginas JSP, ou Java Server Pages, foram criadas para contornar algumas das
limitaes no desenvolvimento com Servlets: se em um Servlet a formatao da pgina
HTML resultante do processamento de uma requisio se mistura com a lgica da
aplicao em si, dificultando a alterao dessa formatao, em uma pgina JSP essa
formatao se encontra separada da programao, podendo ser modificada sem
afetar o restante da aplicao.
Assim, um JSP consiste de uma pgina HTML com alguns elementos especiais, que
conferem o carter dinmico da pgina. Esses elementos podem tanto realizar um
processamento por si, como podem recuperar o resultado do processamento realizado
em um Servlet, por exemplo, e apresentar esse contedo dinmico junto a pgina JSP.
Existe tambm um recurso adicional bastante interessante na utilizao de pginas JSP:
a recompilao automtica, que permite que alteraes feitas no cdigo da pgina
sejam automaticamente visveis em sua apresentao. Assim, no necessrio
interromper o funcionamento da aplicao para incorporar uma modificao de
layout, por exemplo.

Exemplo de Pgina JSP


9 ::I;Q<( 93;

/ I

/  ' #"

35#J  . J#:#!96E#!$#GH IJE

J;Q35 935#J#"$&;K8M#9E:D#"." 7J#".8 ; <( 9:<

>?BAC
 

"2#5#9E#F#GH I=#>@? :$#356#"$& <#&P# JQ8#* EE%?

  .


- >(?

A0C

 

    

' 





   

Nesse captulo so apresentados os tpicos referentes a instalao e configurao de


um ambiente bsico para a implantao e execuo de aplicaes Web com Servlets
e pginas JSP.
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
. Esse servidor de aplicaes atende s especificaes mencionadas
anteriormente e pode ser utilizado sem nenhum custo para o desenvolvedor.

 &+,"- &! &.' /"! ("-0

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.

'  "- +  $*"$'&  ) # -21 !  $ & 


-   $,#43
)65 .#
$ 


!44

No site do Apache Tomcat so disponibilizadas verses do software com instaladores


para os diversos sistemas operacionais.

Normalmente esse processo de instalao simples, e, uma vez finalizado, tem-se um


servidor de aplicaes pronto para produo. De qualquer forma, o site disponibiliza
toda a documentao necessria para resolver problemas encontrados e esclarecer
dvidas com relao ao processo de instalao e configurao do servidor.
Para entender um pouco mais a fundo o funcionamento do Tomcat, deve-se examinar
os diretrios criados durante o processo de instalao. Os principais diretrios criados
so:
Diretrio Descrio
bin

Executv eis, incluindo os aplicativos para iniciar e para encerrar a execuo do servidor

conf

Arquivos de configurao do Tomcat. O arquivo server.x ml , em particular, define uma


srie de parmetros para a execuo do servidor, como por exemplo, a porta onde o
servidor ir receber requisies (essa porta , por default, 8080), devendo ser examinado
com cuidado e modificado conforme as necessidades.

logs

Arquivos de log do servidor. Alm de gerar arquivos de log contendo entradas para cada
requisio recebida, como qualquer servidor Web, o Tomcat tambm pode gerar arquivos
de log com tudo o que as aplicaes desenvolvidas enviam para as sadas padro do
sistema: tipicam ente, o que impresso atravs do System.out acrescido no arquivo
stdout.log, e tudo o que impresso atravs do System.err acrescido no arquivo
stderr.log .

work

Diretrio temporrio do Tomcat. Esse diretrio utilizado, por exemplo, para realizar a
recompilao automtica de pginas JSP (esse processo explicado mais adiante no
captulo Pginas JSP).

webapps Nesse diretrio so instaladas as diversas aplicaes web desenvolvidas por voc ou por
terceiros.

Figura 2.1

Subdiret

rios na instala
o do Apache Tomcat.

' 
- +  $ "$,&  )  - 1 !  $ &  ,) .$0 "!"# $ &  / )'2
&



!4

Conforme vimos anteriormente, existe um diretrio no Apache Tomcat chamado


webapps onde devem ser instaladas as diversas aplicaes desenvolvidas por voc
ou por terceiros.
Para que possamos mostrar como so feitas essas instalaes, precisamos antes definir
o que uma aplicao Web: a partir de agora, estaremos chamando de uma
aplicao Web um conjunto de Servlets, pginas JSP, classes Java, bibliotecas, cones,
pginas HTML e outros elementos, que podem ser empacotados juntos e que provem
as funcionalidades previstas pela aplicao.

Essa definio est contida, na verdade, na prpria especificao de Servlets Java,


no sendo especfica, portanto, utilizao do Servidor de Aplicaes Apache
Tomcat. Isso significa que as aplicaes desenvolvidas por voc podem ser instaladas
em qualquer servidor que implemente a especificao de Servlets (como o IBM
Websphere e o Bea Weblogic): com isso, segue-se o princpio da linguagem Java de
desenvolver o cdigo uma s vez e implant-lo em mltiplas plataformas.
Aplicao Web: Aplicao composta de Servlets + Pginas JSP + Bibliotecas e classes Java +
imagens + pginas HTML e outros componentes estticos que podem ser empacotados juntos e
instalados em qualquer Servlet Container.

De acordo com a especificao de Servlets, existem duas maneiras pelas quais uma
aplicao web pode ser instalada junto a um Servlet Container: por meio de um
arquivo WAR (Web Application Archive), explicado mais adiante no Cap tulo 9, ou por
meio de uma estrutura de diretrios criada junto ao servidor. No caso especfico do
Tomcat, essa estrutura deve ser criada abaixo do diretrio webapps.
Para uma determinada aplicao Web, a estrutura de diretrios mnima que deve ser
criada abaixo do diretrio webapps a seguinte:

Figura 2.2

Estrutura m nima de diret rios de uma Aplica


o Web.

/  &#

Conforme pode ser visto na figura anterior, deve ser criado, abaixo do diretrio
,
um diretrio com o nome da aplicao. Esse diretrio deve conter pelo menos um
subdiretrio 
; podem haver alm do subdiretrio   , por outro lado, outros
subdiretrios e arquivos, como pginas html, pginas JSP etc.
O diretrio  , por sua vez, deve conter um arquivo chamado web.xml e dois
subdiretrios: classes, com todas as classes, e lib, com as bibliotecas utilizadas.
Obviamente, abaixo do diretrio classes podem haver subdiretrios para refletir o
path relacionado aos packages Java (mais informaes sobre packages podem
ser obtidas em qualquer livro introdutrio sobre a linguagem Java).

/"* (/

  , contendo o Servlet
Utilizando como exemplo uma aplicao chamada 
RemoteIPServlet do exemplo do captulo 1 desse livro, uma estrutura possvel abaixo
do diretrio webapps seria a seguinte:

Figura 2.3

Exemplo de estrutura para aplica o RemoteIP .




Obviamente, podem haver diversas aplicaes instaladas, gerando diversas rvores de


diretrios abaixo do diretrio webapps:

Figura 2.4

Exemplo de algumas aplica es instaladas abaixo do diret rio


webapps.

Cada uma dessas aplicaes carregada pelo Servidor em um Servlet Context


(Contexto do Servlet). Cada contexto d sua aplicao uma URL base, chamada de
Context Path (Path do Contexto), e prov um ambiente comum para todos os
Servlets da aplicao.

O path do contexto serve para que o Servidor possa mapear e distribuir as requisies
recebidas para as diversas aplicaes instaladas. No Apache Tomcat, o path do
contexto coincide com o nome do subdiretrio criado abaixo do webapps.
Assim, no nosso exemplo, supondo que o endereo IP do servidor onde instalamos o
 
 , teremos os acessos s URLs iniciadas por
Apache Tomcat
*8&  -F-
 

   
    

! !!

- P%#! JQ8#H I

&/&* ( /  , os acessos s URLs iniciadas por

direcionadas para a aplicao 


*8&  -F-
 

   
     - 

QE"F&$

' #98#"

direcionadas para a aplicao

Figura 2.5

  #  - ( /%& /&# , e assim por diante.

 

 

Exemplo de mapeamento de requisi es para aplica


es instaladas
no Tomcat.

Por fim, conforme o leitor pode ter reparado nos exemplos citados anteriormente, para
cada aplicao h um Deployment Descriptor: trata-se de um arquivo, chamado
web.xml e localizado abaixo do diretrio 
, e que contm informaes de
configurao da aplicao, tais como, parmetros de inicializao, mapeamentos de
Servlets, entre outros.
Deployment Descriptor: Arquivo XML com as informaes de configurao de uma Aplicao Web.
Esse arquivo fica abaixo do diretrio WEB-INF e se chama web.xml.

Um possvel Deployment Descriptor para a aplicao RemoteIP, por exemplo, seria o


seguinte:

Exemplo de Deployment Descriptor


Q

'!%#$"2 !9


 

#!96DE 9<

9   ? (I $
#N!  I " !C6H 
!   '
 %  E8E!
@

H /   
 
#

-$-2/ 59

A D!)!"$"F&# J" 
 H 9D -.- (
 ?-

#!N( !  

QE "Q ' $)9 J#P# :8#!H I




- E "2 ' *$+896Q # 

" #(' #

Q".#@' #,F9! J#QP#! J&#!H I


Q".#@' #,D!' "."QP# JQ8#H I

- ".#!)' #Q,F9 J#

/ #F' # - "2#F' #Q,D!' "."

#!N$*  ' DQ& 9

%

-F-

&

8*%+& ! -F-

 Q "259 D!

- E8E -

#N!

- " #(' #

Q".#@' #,F J!   9<


Q".#@' #,F9! J#QP#! J&#!H I
Q5$'  

 -

88#.9 - P#!

- ".#!)' #Q,F9 J#

Q8#H I - 5.' 8 +&#.9

- " #(' #,F J   9<


#!N +!  

Como o Deployment Descriptor composto de muitas sees, procuraremos


apresentar as principais e suas respectivas funes, usando como exemplo a aplicao
mencionada anteriormente. Uma apresentao mais detalhada e
 
+ 
aprofundada desse arquivo pode ser encontrada na prpria especificao de Servlets.

 "# -( /%& /#

Pressupomos, para essa apresentao um conhecimento mnimo de XML; caso voc


no tenha familiaridade com esse tipo de documento, sugerimos que voc tente
acompanhar os exemplos, e os utilize como templates para criar seus prprios
Deployment Descritors.

Estrutura geral do Deployment Descriptor


Q

'!%#$"2 !9

9  

? (
 I $

I " 
 CH 

,


 B#9DE 9<FH /   
  

#N! 
-.- / 59

A0 D!F"#$"$8# J" 
 H 9D! -.- (
 ?-/

*8&  -F-  % "2569 D!


@

- E&E -

#!N$*

 ' DQQ& !9

%

-F-

)&

#!N +   '


 %B E8E!

#!N( !  





 -

#!N +!  

Assim, como em qualquer documento XML, inicialmente so colocados os elementos


de declarao do XML e do tipo de documento (XML declaration e Document type
declaration). Na figura anterior, esses elementos correspondem s 6 primeiras linhas
listadas.

/  .

- ((

 : esse o elemento
Em seguida, vem o elemento
(raiz) desse XML, ou seja,
  , e abaixo dele devem ficar todos os outros
deve haver somente um elemento
elementos do XML.

/ &

- ((&
#)   %".* / , '(%./ "  ."-* ,
# /# # (% '(% 0 / ')("* / / )#  /-- ( - & 0/ # / -  /  # / -  / * & %"0
O elemento #)   % .* / deve conter um nome da aplicao a ser apresentado por

Os principais elementos abaixo do elemento


so os seguintes:
    , !
 ,     ,  ,  e   ! .
 !

! 



ferramentas GUI de gerenciamento/desenvolvimento de Aplicaes Web. Esse


elemento opcional, porm caso voc decida utiliz-lo, importante que haja
somente um desses elementos por Deployment Descriptor.

Exemplo de utilizao do elemento display-name


QE "Q ' $)9 J# 

EQ"$&.JE#

' #9&#"

- E "2 ' *$+89

# 

O elemento context-param serve para que se possam definir parmetros de


inicializao do contexto da aplicao; esses parmetros estaro disponveis para
todos os Servlets e pginas JSP da aplicao. Cada elemento presente deve conter o

nome de um parmetro e o seu valor correspondente. O desenvolvedor pode tambm


optar por no utilizar nenhum desses elementos em seu XML.

Exemplo de utilizao do elemento context-param


QD9&#Q,F . /
Q F +96 J# &
Q F  O!' 5%# 


 J# Q"2#OQE" - F

EN ' D  - $

89 J#

 O' 56# 

- D9F#QQ,F $ /

QD9&#Q,F . /
Q F +96 J# QH I96DQ OQE6" 
Q F  O!' 5%#



 
  =
  

9 J#

- %.

 ' 5#

- .

- D9F#QQ,F $ /

# /&# # ("% ',("% 0

 
  , serve para que se possa especificar o perodo mximo,
O elemento seguinte,
em minutos, de uma sesso (esse recurso explicado mais adiante no livro, no captulo
, esse elemento opcional, mas caso o
6 Sesses). Assim como o elemento !   
desenvolvedor opte por utiliz-lo, deve existir somente uma instncia desse elemento no
arquivo.

#,  %".* /

Exemplo de utilizao do elemento session-config


Q".#"."Q 9)



D!9%K8 <.

 & J#5 
 

" #".", !9

- "2#"."Q 9) D9K8 <

- "$#" "2 9( ) J#!5%

/ '( * / / # 

/"--(- 0/

 #     e 
Os elementos 
contm, respectivamente, a lista ordenada de
pginas a serem utilizadas como index e as pginas a serem apresentadas em casos
de erros HTTP ou excees no tratadas pela aplicao. Esses dois elementos so
opcionais, sendo que somente o primeiro admite uma instncia por Deployment
Descriptor.
Exemplo de utilizao dos elementos welcome-file-list e error-page
@

#!' D J#! K& ' #!F' "$

 -

Q#!

#' D! J#  K& ' #Q 9E#Q *!& '  -

#' D! J#  K& ' #Q 9E#Q  "2  -

#!' D J#! K& ' #

#' DQ J#( K& ' #

#!' DQ J#! K& ' #(8' "$


F*8  <@# 

#!

F

DE#

Q' DQQ& !9




-

    

- #! F  DE# 

  .)%$ *& '  - ' D ) !9

- #2F F
 <# 

Q#!

F*8  <@# 

#QD# & 9)  


$ #QDQ!
Q' DQQ& !9 - .
  2)!


 J 9*%Q#!  $#"$ #DQ#! & 9"2 .

!99 !,D#! & !9 - #DQ# Q& 9(  6


$ %#

 *& '  - ' D & !9

- #2F F
 <# 

De acordo com o que apresentado na listagem anterior, se tomarmos como exemplo


nossa
aplicao
,
quando

feito
um
acesso
a
URL
 
) 
 
 

   
 
, o Servidor tentar retornar a pgina index.html, conforme
       . Caso essa pgina no exista, o Servidor tentar
especificado na lista do 
utilizar a pgina index.jsp.

 " # -( /% /#


  ! ! !    &# - ( / %./.#
/ '(&* / / #)

/ --("- &0/


A figura anterior tambm demonstra a utilizao do elemento
duas vezes: a
primeira vez para mapear erros HTTP 404 (pgina no encontrada) a uma pgina de
erro-padro, e a segunda, para mapear exceptions com.minhaempresa.exceptions.
DBConnException a uma outra pgina de erro.

# /"- / # /"- / *  %&0


 
 , servem para definir, respectivamente, os
e
Os ltimos dois elementos,
Servlets da aplicao, com seus respectivos parmetros, e os mapeamentos de URLs a
cada Servlet da aplicao.

Cada elemento

# / -  /. , por sua vez, composto dos seguintes elementos:




servlet-name: deve conter o nome do Servlet.

servlet-class: deve conter o nome da classe (incluindo a informao sobre o


package, se existir).

init-param: deve conter um parmetro de inicializao do Servlet; pode haver


nenhum, somente um, ou mais de um elemento deste tipo para cada Servlet.
load-on-startup: deve conter um inteiro positivo indicando a ordem de carga deste
Servlet em relao aos outros Servlets da aplicao, sendo que inteiros menores so
carregados primeiro; se este elemento no existir, ou seu valor no for um inteiro
positivo, fica a cargo do Servlet Container decidir quando o Servlet ser carregado
(possivelmente, no instante em que chegar chegar a primeira requisio a esse
Servlet).

Exemplo de utilizao do elemento servlet


Q".#(' #


" #(' #,F9 J#QIFDQ#" "2

QEQ"$&. - "2#F' #Q 8 96 J# 

" #(' #,D' "." D   9*Q#!  .#".  QEQ"$&.

' #!9%8#"Q IFD

QE".&$  - " #!)' #Q D!' Q" "

Q 9 8 . /Q $ +96 J#   J '  / #F E / A ? 


I  - %F + 96 J# Q F 
' 56#  "Q L&   9*%Q#!  F#"$ DQ  N!  - !F  ' 56#  - 9 ,8 F >
Q 9 8 . /Q $ +96 J#   J '  P%#! J#Q8#98# - !F 9 J#Q !) 
' 56#  "Q F#  9*Q#!  F#". D!  N  - !F  !' 5# - 9O , $ /
Q 9 8 . /Q $ +96 J#   J '   #"F& 9 8.  - $ 89 # Q ) 
' 56# $
 O#!9E"  9*%Q#  !$#"$ DQ  N  - %F!  ' 5# - 9  8 $ /
Q 9 8 . /Q $ +96 J#   J '  * "."259F 
D!' #9&# - !F  !' 5# - 96 , $ /
Q' QE(89)


".FF&56 

- $

89
# Q $  ' 5#&

QLDE"F)$7E#

 9("F&)5 

- ' E

- "2#@' #

Por fim, um elemento servlet-mapping contm um nome de Servlet, conforme definido


, e um padro da URL do Servlet no servidor (URL pattern).
em  

# /"- /. %".* /

Exemplo de utilizao do elemento servlet-mapping


Q".#(' #,& J 6 ! 9<


" #(' #,F9 J#QIFDQ#" "2

Q5O.' F 


QEQ"$&. - "2#F' #Q 8 96 J# 

8#.9 - I$D#"2"$ #9%8  - 5$'  Q88#.9

- "2#@' #,F J!   9<

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


ou   , de maneira que o acessos a todas as
tipo      , como por exemplo, 

! / & / %.# (

!*

!

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:

Exemplo de Deployment Descriptor completo para a aplicao


CadastroClientes
Q

'!%#$"2 !9

9  

? (
 I $

I " 
 CH 

*8&  -F@

,


 B#9DE 9<FH /   
  

#N! 
A0 D!F"#$"$8# J" 
 H 9D! -.- (
 ?-/

-.- / 59

 % "2569 D!

- E&E -

#!N$*

 ' DQQ& !9

%

-F-

)&

'%B E8E!

#!N +  

#!N( !  

E ", ' $)896 J# 

EQ".&$JE!#

' #!9!&#"@ - E " !' *$+9 #

D!9!&#QQ,F !$ /
 !)! 89% J# *&B J#Q".# OQE6"
 !)!  ' 5#


EN! ' D  - $

- .

9 #

 ' 5#

- D9&#2 &
 . /

QD!9F#QQ,F $ /
 !)! 89% J# QH I9%DQ OE"'
 !)!  ' 5#
 
    


- D9&#2 &
 . /

" #".", !9 + D!9%K <

- " #"."2 !9 + D!9%K <

Q".#"."Q 9)


) J#!5%

 

89 J# 
 !' 5#

- ".#"."2 9( . J#5

#' D! J#  K& ' # F' ".

 -

#!

@

#' D! J#! K& ' #Q 96E#Q *& '  -

@

#' D! J#! K& ' #Q 96E#Q  "Q  -

#!' DQ!

#!' DQ! J#( K8 ' #


#!' DQ!

#! K& ' # 

#! K& ' #  ' "$

F   <(#

Q#2$!*+D!E#    

- #.)% 8 DE#

' !DQ& !9 -    .F. *& ' 




- $
- $

- ' D ) 9

- # F F
 Q<O# 

#!

F   <(#

Q#D#! !& 9(  $ # D!   9*Q#  !)#". #QDQ# ) !9"  .


  
' !DQ& !9 - .
  O.F. *& ' 


- # F F
 Q<O# 

" #(' #

Q".#@' #,F9! J#QI!)!DQ#"."  


Q".#@' #,D!' "."QDQ!

99 QD# Q. 9 - #QD#! ) !9(  (


$ #

- ' D ) 9

QE6Q".&$  - " #(' #Q9 J#

  9*%Q#!  F#"$!  EQ".&$

' #98#", IFD

 9  8 $ / $ 89 J#  JQ '  / #!) E / A ?BI
" J&   9!*6 #!  F#"  D!  N!  - F  !' 5# 

- $

QEQ"$&. - " #%&6' #,D' Q"2"

+9 J#Q !)  ' 5#

- 9  . /

 9  8 $ / $ 89 J#  JQ '  P# J#Q&#98#  - F 9 J# Q !F 
"Q F#1  9*Q# 7 )#". DQ!  N  - $  ' 5# - 9 , !) >

' 56# 

 9  8 $ / $ 89 J#  JQ '  O#"F) 9 8!$  - .  9! J#Q F  !' 5#
#9EQ" J 9*%Q#!  F#"$! DQ  N  - .  ' 56#  - 9 ,8 F >

 9  8 $ / $ 89 J#  JQ '  * "."Q598 - .  9 J#Q $  !' 5# 
& 7DE"$&$7E#JD!' #!9F#  - !)  ' 5# - 9  8 $ /
' !QE(!9 "F&)&5  


- " #(' #

" #(' #

- ' QE(!9("$8!.5 

Q".#@' #,F9! J#. 5' $  


Q".#@' #,D!' "."QDQ!


- " #(' #

" #(' #,F J   9!<

  9*%Q#!  F#"$!  EQ".&$

Q".#@' #,F9! J#QI!)!DQ#"."  


Q5$'  

88#.9 - IFD#" ".

- " #(' #,F J   9<

" #(' #,F J   9!<


 -

#!N +!  

# 

' #98#", .

#!98 - 5.' 8 88#.9

QEQ"F.F - "2#F' #,F9

88#.9 - . 5' .  - 5$' F Q+&#.9

- " #(' #,F J   9<

QE6Q".&$  - " #(' #Q9 J#

Q".#@' #,F9! J#. 5' $  


Q5$'  

QEQ"F.F - "2#F' #,F9

# 

EQ"$&F - " #!)6' #,8D' "."'

 

   





 




      


     

Nesse captulo, exploramos as caractersticas bsicas de Servlets, mostrando o


funcionamento e sua interao com o Servlet Container. Implementamos tambm
nossos primeiros Servlets de exemplo.

  !2 "!   ) # $0)  #  ) -  $,&


1



Antes que voc possa iniciar o desenvolvimento de seus Servlets, imprescindvel que
voc tenha disponvel a biblioteca de Servlets Java (normalmente, um arquivo
; se voc estiver utilizando o Apache Tomcat, voc pode encontrar
chamado 
esse arquivo abaixo do diretrio de instalao do Tomcat, no subdiretrio
    ). Essa
biblioteca contm todas as classes e interfaces necessrias para o desenvolvimento de
Servlets, e deve estar contida em seu classpath.

# / -  /. !  &-

'(&* * (%

Outro item importante, embora no imprescindvel, a documentao da API de


Servlets. Por meio dessa documentao, voc poder verificar todos as classes, com
seus respectivos mtodos e variveis, com os quais voc poder contar durante o
processo de desenvolvimento. Essa documentao pode ser obtida diretamente do site
oficial do Java (
).

     #   

&

          ! #)$ % ! ',(&*


55
>8

Embora Servlets possam ser utilizados no s para o desenvolvimento de aplicaes


HTTP, a maior parte das aplicaes desenvolvidas so destinadas a esse fim. Sendo
assim, vale a pena estudar um pouco mais a fundo o funcionamento e caractersticas
desse protocolo.
O protocolo HTTP utilizado na navegao nas pginas da Internet: quando voc abre
uma janela de um browser, acessa uma pgina Web e navega em seus links, voc est,
na verdade, utilizando esse protocolo para visualizar, em sua mquina, o contedo que
est armazenado em servidores remotos.

#   / /.# #


de comunicao cliente-servidor: o cliente envia uma
O HTTP um protocolo
requisio para o servidor, este processa a requisio e devolve uma resposta para o
cliente, sendo que, a princpio, nenhuma informao mantida no servidor em relao
s requisies previamente recebidas.

Assim, quando digitamos o endereo de uma pgina em um browser Web, estamos


gerando uma requisio a um servidor, que ir, por sua vez, devolver para o browser o
contedo da pgina HTML requisitada.
A requisio enviada por um cliente deve conter, basicamente, um comando (tambm
chamado de mtodo), o endereo de um recurso no servidor (tambm chamado de
path) e uma informao sobre a verso do protocolo HTTP sendo utilizado.

 % / &! * e a verso 1.0 do


  ) / % /- / .( &/  0.$&* # / -  (-
 % &/ &! *

Supondo, por exemplo, que utilize-se o mtodo  , o path


protocolo HTTP (o que equivale a digitar um endereo

em um browser), temos a seguinte requisio enviada:

 








   

Exemplo de requisio HTTP


?

- 96E#Q! *& '>(?=?



I -

Existem diversos mtodos HTTP que podem ser especificados em requisies, sendo os
mais comuns o mtodo  , normalmente utilizado para obter o contedo de um
arquivo no servidor, e o mtodo  
 , utilizado para enviar dados de formulrios HTML ao
servidor. Alm desses mtodos, o protocolo HTTP 1.0 admite tambm o mtodo   ,
que permite que o cliente obtenha somente os headers da resposta; j o protocolo
HTTP verso 1.1 admite os seguintes mtodos:
PUT: transfere um arquivo do cliente para o servidor

OPTIONS: obtm a lista dos mtodos suportados pelo servidor

3
3

DELETE: remove um arquivo do servidor


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
contm informaes sobre o cliente que est gerando a requisio (tipo, verso do
browser etc.) e o header
, que serve para especificar os tipos de recursos aceitos
pelo cliente para a requisio enviada.

# / - 0 /%&

'.',/&

Exemplo de requisio HTTP com headers


?

- 96E#Q! *& '>(?=?



I -

"@" #!* * <@#!9,OA4!M ' '  -   


*

+DQ

 & N6' #!6A

/ H

 =
 

9E

"

 
 @ <. Q

DQD# %8#Q - *& '

Uma vez processada a requisio, o servidor, por sua vez, manda uma resposta para o
cliente, sendo que essa resposta tambm tem um formato predeterminado: a primeira
linha contm informaes sobre a verso do protocolo, um cdigo de status da
resposta e uma mensagem associada a esse status; em seguida so enviados tambm
headers (com informaes do servidor que gerou a resposta, por exemplo); e
finalmente, enviado o contedo, propriamente dito, da resposta.

Exemplo de resposta HTTP com headers


>? ?

I -


/ #F#





-
% 

 * QD*#

C"F 8 AE K8 #E) / 59

 

!9%8#!9%, ?'$ # 8#Q - *&

!9%8#!9%,8C6#!9!<&*) %

"


9  
#!D

'



    

>?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.

    ! # /-  /.! /%&/- ' / -  /

 / -  /.

Figura 3.1

  &! # /"-  /&! &! " /-  /&

Hierarquia de classes associadas a um Servlet.

No desenvolvimento do Servlet de nossa aplicao exemplo


seguinte declarao de classe:

Declarao do Servlet ProcCadastro


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

.J FDQ#"."2 J#98LE7DE"$&$7E#9"D!' #!98#"

!5ON' D:D' ".":I.D

QEQ".&$J# &#9E"

>(8& / #!)6' #R



  !"#   ) , ! $ , )

1 

) ) 

 


/% /"- ' /"- /

 # - ( /%./# , temos assim a




) 

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.

Figura 3.2

Ciclo de vida de um Servlet.

Cada uma das fases se traduz, na verdade, em mtodos do Servlet que so chamados
pelo Servlet Container nos diversos instantes do ciclo.

Apresentamos, nas sees subsequentes, os mtodos relacionados s fases de


inicializao, finalizao e de atendimento de requisies.

 " -
!"# ! $, ! ,$,&




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:

Inicializao do Servlet ProcCadastro


    
   ! "$#%&(' #) 

   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #


-.-

#9( :#!

.J FDQ#"."2 J#98LE7DE"$&$7E#9"D!' #!98#" 6


 7DQE796QJDQE6"F.F
 'D

!5ON' D:D' ".":I.D

"EE"

N%#!

",5%D#EO E 

EJDQE6Q".&$
>(8& / #!)6' #R

QEQ".&$J# &#9E"


5N' DO! E

9 5 R



0


As assinaturas do mtodo

%

 ! 

so:

Assinaturas do mtodo init ()


!5ON' D! E

9 

!5ON' D! E

9   Q ! ".#' #Q) / #(' #Q

=D%9!K <

%9!K <

8

%

Conforme pode ser visto, o mtodo    admite duas assinaturas, sendo que em uma
delas, recebido como parmetro um objeto da classe

   
# : atravs
desse objeto, o Servlet pode obter os parmetros de inicializao do Servlet, contidos
no Deployment Descriptor (veja seo 2.2). Por outro lado, caso voc opte por
implementar o mtodo  !  sem nenhum parmetro, possvel tambm obter uma
referncia para o objeto    # por meio da chamada    ,  da prpria classe


     
*
  .

  &! # / -  /! /"-  /. ( % 0

%
/"-  /& ( % 0
    ! # /-  /.! /%&/- ' / -  /  $& %(.#)#)2'  # # /2/&#  /"% /

0/. /"-  /. (% 0

Assinatura do mtodo getServletConfig ()


!5ON' D7  ! ".#' #Q. / #%&(' #

9K& <<@# / #)6' #

!9%K8 <



/"- /.
(% 0

Para obter um parmetro de inicializao do Servlet usando o objeto    # , deve-se


  , passando como parmetro o nome do parmetro que se
utilizar o mtodo ! 
deseja obter.

0/. %  " -.* /./"-

Assinatura do mtodo getInitParameter ()




!5ON' D7  ' 9<( / .. 9<<@#Q&H 9 &I. J#8#%

   ' 9<  / &. 9<

 $ J#QF#!

&

 J#



Temos, a seguir, um exemplo de uso desse mtodo:

Exemplo de uso do mtodo getInitParameter() de um objeto


ServletConfig
!5ON' D! E

9  / #' #Q

"25O #!  9 + ="$#!)6' #

/ & 9<

' =" #%&6 E! / A

K!+' =" #!) E / A


?

9K8 <

 ".#)6' #

!9%K8 < &*OF

"

/ #!)' #Q !
,D#% & !9R

!9%K8 <

I=7  ".#(' #Q

!9!K <( <#&H 9 &I$ J#Q8#

,  J '  /

#%&6 E! / A

?BI!+

9 :956' ' BR



0
0

0 / %  "&- * / /"-

 pode retornar um valor nulo caso o parmetro


Obviamente o mtodo  ! 
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.

/"-  /& (% 0

possvel tambm, a partir de um objeto da classe      , percorrer a lista dos


parmetros de inicializao do Servlet, bastando utilizar o mtodo   

 .

0/ %   - * /./-


* /#

Assinatura do mtodo getInitParameterNames ()


!5ON' D7  5& '  95 J#F & !9L<#&H 9 &I$ J#Q8#

&

 J#"@+

Temos, a seguir, um exemplo de uso deste outro mtodo:

Exemplo de uso do mtodo getInitParameterNames() de um objeto


ServletConfig
9  / #' #Q

!5ON' D! E

"25O #!  9 + ="$#!)6' #

965 J#!F& 9' 

* ' # +' 

!9%K8 < &*OF

/ #!)' #Q !
,D#% & !9R
"

!9%K8 <

%. J#&#! =
&  J#"3J  ".#(' #

K!+'  F J#8#% =


&  J#"

 ".#)6' #

9K8 <

!9%K8 <( <#&H 9 8IF J#QF#!

&

 J#"

8

9 :956' ' 
&

$ J#Q8#

 J#"Q *Q".AF# 6' #! J#98"

,

R
/ & 9<0'  !) J#8#

&

&

 J#

/ & 9<0'  !) J#8# 

/ ). 9<
 '  $ J#Q&#

!' 5%#
 
 "8#  !' #F

&

 J#"2 9#Q ' # J#!9 

29$K <! <#) H 9Q  I.. . 4#F #2 '  $) & # #  
& . 4#  



0
0
0

 &#  - ( /%& /# , podemos implementar o mtodo

Assim, em nossa aplicao de exemplo  


de inicializao do Servlet   
como:

-(&'  "# -(

 

Inicializao do Servlet ProcCadastro


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #


-.-

.J FDQ#"."2 J#98LE7DE"$&$7E#9"D!' #!98#"

JDE!97DE"$&F

!5ON' D:D' ".":I.D

-.-/ #%&( E

-.-

? I:J" #%45"$E

5N' DO! E

/ )$ 9<

9  / #%&6' #

?BI&J95' ' 

P# J#8#!9F#

"25O #2 9 + =".#' #Q


-.-

P#D5 #F9E7"

 J#Q.F"

/ #%) E / A?

P# J#QF#!98#/7 ="2#F' #

 * "


"259F

F. 

 

I=J =" #!)6' #

 

 'J" #%

#9( QE6:7DEJDQEQ"$&.

#!")) 9% &. 

!9%K < &*OF

"

J956' '   * "2"

59&&795O' ' 

/ #)6' # 
QD# & !9R

!9%K <+

-O#"F. 9

79O5' '  

B".#F' #

!9%K8 <

EDQE6"F.F

F7#9 :E#J# J '

/ )$ 9<+ / #@ E / A

P# J#QF#!98#E#".& 9Q8; J#Q" "259!87E#!

  8#"FFQ& D

 'D! "EQE"

>(8& / #!)6' #R

QEQ".&$J# &#9E"

/ A

  8#"FFQ& D

"25DQ#E E6 #9( :#!

N#

".#(' #Q

".#(' #Q

96 D ' MGE

/ #(' #

!9%K8 <( <#)H 9O &IF J#8#!

,!  J '  /

E#

!9%K <( <#Q&H 9 &I) #Q8#


%9!K& <( <#&H 9 &IF J#QF#!

!9!K& <( <#&H 9 &I$ J#Q8#

#!) E / A

!,  J '  P#! J#&#9%8# ,+


,  J '  O#"F& 9Q8. !+

,  J '  *

"$"2598!+

I ,+

0
0

Outro uso comum para o mtodo de inicializao do Servlet para o despacho de um


ou mais Threads, que devero ser executados durante o perodo em que o Servlet
permanecer carregado. Assim, um serlvet pode, por exemplo, iniciar um Thread que ir
verificar continuamente a disponibilidade de uma conexo com o banco de dados,
independente de qualquer requisio que receba. Este Servlet de exemplo
apresentado a seguir:

Inicializao do Servlet VerificaConBD


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

-.-

#! K& D4D9# 7D% N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%#  #. E DQ #9F#

.

 #. K& D  9 .L#QQF#!9E" >(+) / #!)' #  ' #! L#!9!&" P5969N' #7R

!5ON' D:D' "."

P#K8#!

96D :J&*)#!QE35# .;




*F#E$ ?
?

-.-

#. K 7965' ' 

*F#E 

H 9 D ' MQG JE

/ #(' #Q

9 
  / %
# &6' #

5N' DO! E

!9%K8 <

"25O #2 9 + =".#' #Q

-.-

C9G9E

L#. K DQG JE:D!96#

K8M#

B".#F' #

!9%K < &*OF

"

/ #)6' # 
QD# & !9R

!9%K <+

*$#QE


?

*.#QE 

#2 K579%#


?

*.#QE 

#2 K& "FFF5


?B*OF#E &* " + 



0
-.-

#D!5GJEJ&*F#QE
 59BR

5N' DO! E

* ' # 

?B*)#QE 

#. K59 J95' ' BR

K!9  !9 @ >!BR




0
0
0


Uma observao importante com relao a esse processo de inicializao que o


Servlet somente poder receber requisies aps a concluso de seu processo de
inicializao.
O desenvolvedor pode, por outro lado, indicar que esse processo de inicializao no

foi bem sucedido, atravs do lanamento da exceptions     , ou      
 ;
nestes casos, o Servlet Container ir deixar o Servlet em um estado inativo, ou seja, sem

/"-  /& "'/   (%

%"   / ')/"  (%

%"    / "'/" (%

 , em particular, pode receber


poder receber requisies. A exception      
como parmetro em seu construtor, um nmero de segundos com uma estimativa de
quanto tempo o Servlet dever ficar inativo.

Exemplo de uso da exceo UnavailableException para indicar


fracasso na inicializao


! E 9  / #' #Q

!5ON' D

&*)

=" #!)6' #

9K8 <

!9%K8 <

/ #F' #Q 
DQ# & 9(" 9Q ' N' # QD# & 9
"

"25O #!  9 + ="$#!)6' #

!9%K8 <


P#D!5 #F9EJ#J' E9EJ   J#)F"

-.-

/ #( E! / A

?BI&7  " #!)' #

P6#! J#&#!9!8#

J ="

#!(' #

J 

"$#%&6' #

 
.*

#!")) 9% &. 

K!

" "259!&

J 

"$#%&6' #

"=96

#9D!9.FQE"

 !

/ #' #
?BI!+

, '  / #F E! / A

,  J '  P# J#Q8#98#!+

9K& <@ <#&H 96 &I. J#8#!@!  J '  O#"$& 9 F.  !+

9K& <@ <#&H 96 &I. J#8#

9%#

9K8 <@ <@#Q&H 9O &IF J#&#

!9%K8 <( <#&H 9 &IF J#QF#!

/ #!@ E / A0? I&L95' ' 


&*)

E# 9 D ' MQG JE



P6#! J#8#!9%8#

!  J '  *

" "259!8 !+

J95' '    *

 ' N' # QD# Q. 9! O.F(  J#Q.F"

"."2569&
E#

7965' ' 

96 D! ' MG

9 

9 +

%

No caso de voc no ter percebido, todos os mtodos  !  apresentados at agora nos


exemplos foram declarados de maneira a possibilitar o lanamento do exception

  
, : isso necessrio devido chamada do mtodo
 !  , que pode, por si,
lanar essa exceo para indicar problemas em sua execuo.

/-  / "'/& (%

  #
"$,++ ) , )    )    -  ) 




#)$/"-! % 

 

/ -  /
(% 0
0/ / -  / ("%  / " / - " ( 2 '  # #)/ /%./"- ' /-  /

Alm da referncia ao objeto da classe      recebido como parmetro na


inicializao, o Servlet pode obter tambm uma referncia a um objeto da classe

   
 atravs do mtodo

 
 

  

   .

    ! # /-  /.! / -  / (%& / 

Assinatura do mtodo getServletContext ()


!5ON' D7  ! ".#' #Q. / #%&(' #

9&#2

<(# / #!)' #

98# 8

/"-  /
(% / 

 contm os atributos e informaes sobre o contexto em que o


Esse objeto   
Servlet est sendo executado e, sendo assim, compartilhado por todos os Servlets que
fazem parte da Aplicao Web.

/ -  /. (% 0

Analogamente ao que acontece com o objeto    # , existem mtodos para


recuperar os parmetros iniciais do contexto definidos no DeploymentDescriptor (vide
seo 2.2).

Assinatura dos mtodos getInitParameterNames () e getInitParameter


()
!5ON' D7  5& '  95 J#F & !9L<#&H 9 &I$ J#Q8#

&

 J#"@+

!5ON' D7  5& '  95 J#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
9  / #' #Q

!5ON' D! E

-.-

 ".#)6' #

9K8 <

"25O #!  9 + ="$#!)6' #

P#D!5 #F9E  J#Q))"

/ & 9<

E6#7##D5G 7E6

'  $ / Q#!D&7  " #!)' #

/ #!)' #Q !
,D#% & !9R
"

/ #' #

9K8 <@ <O#Q&H 96 8IF J#&#

8I) J#&) %,#D5DQ +

/ #' #F#!9F J"4D! J  J#&.:E67D%9!&#QQ8

9 J#Q! "F& 18' %!  J#&FJE

-.-/ #

!9%K8 < &*OF

!9%K8 <

K!+'  F / Q#D&J95' ' BR


/ #!)6' #

' B".#(' #Q

9&#2

'  F / %,#D

9F#Q 

' B".#(' # 

<# / #!)' #

98# 58

I$ J#Q&$ !#D56DQ +

!98# ) <O#&H 9 &I$ J#Q8#

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:

Assinatura dos mtodos getAttribute (), getAttributeNames (),


removeAttribute() e setAttribute()
!5ON' D

   ' 9<( N! #D  <(#!*B8& N58#+   ' !9<  / & 9<

!5ON' D

   5. '  95 J#F ) !9L<@#Q!*B&2 N!5!8#

!5ON' D

! E.# #*B8& N5F# +   ' !9<( / &. 9<

!5ON' D

! EJ"2#* +.. N58# +   ' !9<( / &2 9<
   ' 9<( N! #D  =Q+.. N5%8# 

&

 J#"

B 8& N5&#&

 :#+

+

B 8& N58#(&  J# +

  8& N5F#&B J# 

' 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.

Exemplo de uso dos mtodos getAttribute e setAttribute do objeto


ServletContext
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

/ #@' #

I$ J# F

EJ#Q#  ' 

!5ON' D:D' ".":I2 J#! F / #!)' #

5N' DO! E

# &#!9%E"

9  / #%&6' #

-.-

N' #!9' ="256DQ#"." 

H 9 D '

!9%K < &*OF

"

/ #)6' # 
QD# & !9R

#Q&$

9 D '

).56#!

'  F H 9 D '


=" #!)' #

K"+'  F

!9%K <+

! 

! F#<9EJ

/ &2 9<

B".#F' #

!9%K8 <

"25O #2 9 + =".#' #Q

>O& / #(' #R

9K8 <= <#)H 9 &IF J#8#!@8IF I. J#! F / #!)' #!+

7965' ' B' B"25D#"2"$ 

K8!' "2#



"@".9E7

-.-

/ #!)6' #

' ="2#F' #

-.-

.. N587E6#7D!9%8# & $7 9%E DQ

' B".#(' #Q

9&#2

"$8Q&56"

E

9 D ' MQG 

98# 58

<# / #!)' #

9F#Q 

!9%8# & ".#Q,*B8& N58#8I. J#! ) / #!@' #!O9#


!' #9+' ="25D#"2"$ 8

 #. K DQ9E7"$8Q&56" E".#<(59%E!

/ #@' #

!' #9' =".8&5" / 


# <(59E / #!)' #5&!' #9


' =" #!)' #

98# & <@#Q,* +.. N58#  / #<(59E / #(' #Q

,+

* ' # +'  "FF &5" / #Q<=59E / #!)' # J95' '  R


? *)#!QE "2' ##! 

  +

-.-

6"2 #. 

".#<(5O9E"

#J#. K8 D:"$8Q&5"9 J#!9!8#

' ="$8Q&5" / #< 59E6 / #F' # &!!' #!9

' =" #!)' #

98# & <@#Q,* +.. N58#  / #<(59E / #(' #Q

,+

0
-.-:/ #

97 9 D ' M!QG 7E#".8#

*6!5#LK&.QD"." 

/ #(' #

5E"$#<@59E 

' 96G J"05 J:#D#G 

-.-

K"'  " 5D#"."2/


&*OF

9#

D!.$#Q<@QE"

K+!' ".#

@+' =
 "$8Q&5%" / #Q<(59%E! / #!(' #& N!' #9  !' 5%#  K8' "2#
"=9% ' N!' # %,D#! ) !9, $F!6":E " / #)6' #&"09  !5%E#!$,
D "256D#"2".9 !+

" #



0
-.-0/ #<(59E

/ #(' #

!5ON' D:D' "."

/ #Q<(5O9E / #' #

E#Q#!  6' 

9  / #%&6' #

5N' DO! E

#2F#!9E6"

-.-

K"+'  F

H 9 D '

!9%K < &*OF

/ #)6' # 
QD# & !9R
"

#Q&$

9 D '

).56#!

'  F H 9 D '


=" #!)' #

!9%K <+

! 

! F#<9EJ

N' #!9' ="256DQ#"." 


/ &2 9<

B".#F' #

!9%K8 <

"25O #2 9 + =".#' #Q

>O+) / #!)' #R

9K8 <= <#)H 9 &IF J#8#!@8IF

7965' ' B' B"25D#"2"$ 

/ #<(59E / #!)' #!+

K8!' "2#


-.-

"@".9E7

/ #!)6' #

' ="2#F' #

-.-

9&#2

.. N587E6#7D!9%8# & $7 9%E DQ


' B".#(' #Q

9F#Q 

<# / #!)' #

"$8Q&56"

E

9 D ' MQG 

98# 58

!9%8# & ".#Q,*B8& N58# / #Q<(59%E! / #!)6' #!96#


!' #98' =" 5D#"."28

 #. K DQ9E7"$8Q&56" E".#<(59%E!

/ #@' #

!' #9' =".8&5"2I$ J#! F / #F' #5&!' #9


'=
 " #!)' #  98# & <@#Q,* +.. N58# I!

J#! . / #' #Q+

* ' # +'  "FF &5"2I$ J#! F / #(' #5J95' '  R


? *)#!QE "2' ##! 

  +

-.-

6"2 #. 

".#<(5O9E"

#J#. K8 D:"$8Q&5"9 J#!9!8#

' ="$8Q&5" I. J# F / #!(' #Q5/!' #9


' =" #!)' #

98# & <@#Q,* +.. N58# I! J#! . / #' #Q+

0
-.-:/ #
-.-

*6!5#LK&.QD"." 

97 9 D ' M!QG 7E#".8#

' 96G J"05 J:#D#G 

/ #(' #

5E

 # F

K"'  " 5D#"."2/

@+' =
 "$8Q&5%"2I. J# ) / #!@' #Q. N!' #!9  ' 56# K8' ".#
"=9% ' N!' # %,D#! ) !9, $F!6":E " / #)6' #&"09  !5%E#!$,
#!4D!.$#Q<@QE!"@9 ,+

&*OF

"

K+!' ".#

9#



/ -  /
(%& / 

Por fim, h um outro mtodo da classe   


 que vale a pena conhecer: o mtodo
   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

Assinatura dos mtodo log ()


!5ON' D! E

' <.+ Q ' 9!<( / ). 9<

 J"F<+

Em alguns Servidores de Aplicao voc pode tambm tentar usar as sadas-padro


(System.out, System.err) para gerar suas mensagens de log, porm, muito mais
interessante que voc use o mtodo anterior, de maneira que o ServletContainer possa
separar as suas mensagens em um log diferenciado. No caso especfico do Tomcat, as
mensagens geradas por meio do mtodo   so adicionadas a um arquivo de log
normalmente chamado      , onde  uma extenso contendo a data
corrente.

(&0

(&'   (.#  ( 0"! / !  &

/ &

Exemplo de uso do mtodo log () (da classe ServletContext)


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

.

!5ON' D:D' "."0?

-.-

&#"$8#E#J<#.QG JE# #!9%". <(#9"

#"$8#!C6Q<

 '  E#K85'  $7 !) #Q&$7 9 D! '6E

  8#"FFQ& DK& 9' / .. 9</ 

5N' DO! E

9  / #%&6' #

"25O #2 9 + =".#' #Q

-.-

P#D5 #F9E7"

/ &2 9<

' !

H 9 D '

/ #F' #Q

/ #)6' #

#QK85' &I. JH 96 D '&

B".#F' #

!9%K8 <

!9%K < &*OF

"

/ #)6' # 
QD# & !9R

!9%K <+

 J#Q.F"

'  $ H 9 D !'


 =" #!)6' #

K"+'  F

E#' Q<

#Q8#9E"0>6& / #(' #QR

96 D ' MGE

E#

/ #(' #

!9%K8 <( <#)H 9 &IF J#8#!@8IF J#&FH 9 D ' ,+

7965' ' BR

!9!&#Q '  DQ98# 

J 

".#@' #Q

9K& <( <# / #(' #Q

' =D!9F#QQ& ' <


*  "2 9 JK+  %!"$" %#'" #D $#Q<@
Q& N5O 9E' 
'  !) H 9 D '

0




 

E#K85'    !+


' !@O#QK85O' &I$ H 9 D ' 

!9!&#Q 5,+

  J#&.7 9 D! ' 

 %! - $  !
$'&







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:

Assinatura do mtodo destroy ()


!5ON' D! EE#"$))$

+

Utilizando nosso exemplo de cadastro de clientes, temos a seguir um exemplo de nosso



 implementados:
Servlet   #    com os mtodos  !  e 

/"- ', (%

%  &/#  - (

Inicializao do Servlet VerificaConBD


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

-.-

#! K& D4D9# 7D% N96DQJE#7E6QE"' 9G&*OF#QE3%56##. K8 DQ7"$8Q&5"4E:D%9%#  #. E DQ #9F#

.

 #. K& D  9 .L#QQF#!9E" >(+) / #!)' #  ' #! L#!9!&" P5969N' #7R

!5ON' D:D' "."

P#K8#!

96D :J&*)#!QE35# .;




*F#E$ ?
?

-.-

H 9 D ' MQG JE

/ #(' #Q

9  / #%&6' #

5N' DO! E

!9%K8 <

"25O #2 9 + =".#' #Q

-.-

C9G9E

*.#QE 
?

B".#F' #

!9%K <+

*$#QE

#2 K579%#


?B*OF#E &* " + 

 ? *.#QE  
# 2 K& "FFF5


0
-.-

#D!5GJEJ&*F#QE
 59BR

5N' DO! E

* ' # 

K!9 

?B*)#QE 

#. K59 J95' ' BR

!9 @ >!BR




0
0
0
-.-

 9' MQG JE

/ #(' #Q

5N' DO! EE6#"$)F$


?

*.#QE 

L#. K DQG JE:D!96#

K8M#

#. K 7965' ' 

*F#E 

 R

#2 K57965' ' 

!9%K < &*OF

"

/ #)6' # 
QD# & !9R



./ # - (


No exemplo, o mtodo 
 serve para indicar que o thread deve ser finalizado: a
    faz com que o looping principal do mtodo
atribuio do valor   varivel 
 seja finalizado.

%"$

-$ %

 -/  /"-

   ) -
!  )*-
  )  ) ,! + ! &
(*),+


Conforme descrito anteriormente na seo sobre o ciclo de vida de um Servlet, entre as


fases de inicializao e finalizao, existe uma fase onde o Servlet ir, efetivamente,
atender as requisies recebidas.

/"% /- ' /"- /


 /"-  /&
#)/"-  ',/

 
 , que a classe utilizada para Servlets genricos (classe-pai
No caso da classe
para a classe
  , que atende requisies HTTP), o mtodo relacionado a essa fase
o mtodo
  .

Assinatura do mtodo service ()


!5ON' D

! EJ"2#@ D#8 Q ! ".#@' #Q. / #!&(' #&P#3%5%#"$ 


   ! ".#@' #Q. / #!&(' #)P#"2 !9%".#

F#35#"$

 .#", !96".#+

Assim, para cada requisio recebida de um cliente, o ServletContainer efetua uma


chamada a esse mtodo
do Servlet; os parmetros desse mtodo so


referncias para um objeto que encapsula a requisio recebida e para um objeto que
encapsula a resposta que dever ser encaminhada para o cliente.

# /"- '/ ! !

Por outro lado, como voc normalmente estar desenvolvendo Servlets HTTP,
dificilmente voc ter que implementar esse mtodo; em vez disso, para classes que
extendam a classe
  , voc dever implementar um ou mais dos seguintes
mtodos:   ! ,   ,    ,   ,   ou  
.

 /- /


( / /./ ( /. (   ("% # &( (.#  .( $

( - ',/

Assinatura dos mtodos de atendimento de requests da classe


HttpServlet
!5ON' D

! EJEB# +  Q ".#(' #Q. *+&  >6+& / #' #Q&P6#35#"F  $#35#"F
   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#

 F#"2 !9%".# 

!5ON' D

! EJE!I%"F + Q ! ".#(' #) *+)  >6& / 


# ' #Q&P#35#")  $
 #35#"F

!5ON' D

! EJE  #!' #Q8#  QQ " #!)' #& *%+&  >(+& / #(' #&P#35#"$ 

   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#

   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#


!5ON' D

 F#"2 !9%".# 

! EJE!I5%+    ".#!)' #Q& *+&  >(+& / #F' #)P#35#"$ 
   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#

F#35#".

 F#"2 !9%".# 


F#35#".

 F#"2 !9%".# 

!5ON' D

! EJE 1 Q. 9" +   Q " #!(' #Q. *+&  >6+) / #F' #Q&P%#!35#"F  $#356#"F

!5ON' D

! EJE?

   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#

 F#"2 !9%".# 

FDQ#+   "2#F' #& *8&  >(+& / #F' #&P%#35#"F

   ! ".#@' #Q. *+.  >68& / #%&(' #)P#"2 %9%".#



)#!35#".

 F#"2 !9%".# 

Quando uma requisio HTTP recebida por uma classe que estende HttpServlet, seu
  chamado, sendo que a implementao default desse mtodo ir
mtodo
chamar a funo 
 correspondente ao mtodo da requisio recebida. Ou seja,
caso uma requisio com mtodo  , por exemplo, seja recebida (vide seo 3.2,
sobre o protocolo HTTP), o mtodo    implementado por voc ser chamado.

# / -  ',/

(

&( /.

&( /.

Geralmente, desenvolvedores de Servlets implementam somente os mtodos    e


 
 ; os mtodos restantes s so implementados em casos especiais, e requerem um
conhecimento mais avanado por parte do desenvolvedor. Por ora, estaremos
utilizando o mtodo 
 ; nos captulos seguintes demonstraremos com mais detalhes
alguns dos outros mtodos (principalmente, o mtodo    ).

( (&#

&(
/

&( (.# 
Um exemplo simples de implementao do mtodo .( /. pode ser observado a seguir:




Servlet HelloWorld
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

.J ; <( 96:>O#' ' 

!5ON' D:D' ".":>@#' ' 

-.-

.' E7# &#!9%E"

* &#9E J#987E#

5N' D

!$' E
>O+. / #F' #R

$#35 "2 G!#">(?=?

I:D!

#Q8E

%?

 E7E6B#Q +>68& / 


# (' #Q.P#35#"F  F#3%5%#"$
 $#"Q !9" #  .*.

>(+& / #@' #Q.P#"Q !9"$#


I2 9

. F#!

'  
J  .#", 9"2# <@#Q

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9>@#!' ' 

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

.' E

 -.

"

H  QD# & 9R

. 8#!8

9 ,+

- >?BAC, 

0
0

  '- #  -


# !"$ -
 $  ) -
!  ) -   ,)  )
! + ! &
(*),+

1 



4

Durante o ciclo de vida de um Servlet, o ServletContainer ir fazer a carga de um


Servlet instanciando um nico objeto e chamando seu mtodo  !  ; a finalizao

tambm efetuada chamando o mtodo 
desse objeto.

./ # - (

%

# / -  ')/

Na fase de atendimento de requisies, por outro lado, o mtodo


  (e,
  , no caso de Servlets HTTP), so chamados na
consequentemente, os mtodos 
medida em que so recebidas as requisies, ou seja, pode haver, em um determinado
 
instante, um ou mais threads do ServletContainer executando mtodos
simultaneamente.

(  

# / -  '/

Concorr ncia no atendimento de requisi


es.

Figura 3.3

Por isso muito importante que voc se preocupe com acesso a variveis de instncia
ou classe e concorrncia no seu desenvolvimento (maiores detalhes sobre esses tpicos
podem ser obtidos, por exemplo, no livro Aprendendo Java 2, da Editora Novatec).
Nesse sentido, uma opo para garantir a execuo livre de problemas de
   em seu Servlet.
concorrncia a implementao da interface   

%"0 / "- /& ( /

Essa interface no define, na verdade, novos mtodos ou variveis de classe, ela serve
somente para indicar ao ServletContainer que o atendimento de requisies do Servlet
em questo deve ser feito de forma a serializar as chamadas ao mtodo
  . Ou
seja, somente uma requisio ser atendida por vez pelo seu Servlet.

# / -  '/

Exemplo de Servlet que implementa a interface SingleThreadModel


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #1"2  !' #"43%56#7$#8%$9: ; <= 9:>@?BAC:D!


-.-

$#3%56 "2 G %#"0F#D#N E6Q"

!5ON' D:D' "."

-.-

/ #!)' #

98E!

Q!#

98E!

9 J#FJE#

J J#!9F
#Q8#9E"0>6) / #(' #Q

 ' # J#!9!&"

/ 9<@' #?

*)#QEA4!E#'R

E!"0$#356 "2 G !#"0F#D#N E6Q"

 

!9%8QE!

B

  8#

9

5N' D

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#


 .#", !9%"2#@.*$

I2 9

. F#!

"0H  QD# & 9R

'  
J  .#", 9"2# <@#Q

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9P#35 "2 G #"0$#D#%N EQ"

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

. 8#!8

 (

H 9!&#Q<O#%$ & / .. 9<

(($ 

98E!

+

- >?BAC, 

0
0

(%. .("-

No exemplo anterior, o Servlet utiliza uma varivel de instncia   e, por isso, h a


necessidade de se preocupar com a concorrncia no acesso a esta varivel.

%0 / "- /  ( &/

   , e
Imagine, por exemplo, que esse Servlet no implemente a interface   
receba duas requisies simultaneamente: o primeiro 
 poderia incrementar o
contador, seguido do segundo 
 incrementando o contador, seguido dos dois
threads, cada um por sua vez, imprimindo o valor do contador. Nessa situao, o
mesmo valor de contador seria impresso nas duas pginas HTML resultantes.

&(
/

Resultado da primeira requisio


>?BAC 
P#3%56 "2 G !#"

 - 
 

- >?

.#D#N EQ"

A0C

Resultado da segunda requisio

(
/

>?BAC 
.#D#N EQ"

P#3%56 "2 G !#"

 - 
 

A0C

- >?

Obviamente a implementao dessa interface tem um custo na performance de


execuo do Servlet, pois, no Servlet anterior, por exemplo, no s o acesso a varivel
serializado, mas a execuo do mtodo    como um todo. Em particular, a


execuo dos cdigos de gerao do header e do footer HTML no precisariam ser
serializados, mas so.

(%. &(-

&( /.

Por isso, em vez de implementar esta interface, na maioria das vezes mais
conveniente implementar diretamente um cdigo de sincronizao nos trechos que
precisam ser serializados. O Servlet   
 , por exemplo, poderia ser implementado
da seguinte forma (com exatamente o mesmo resultado):

/ -  /
(%& (-

Exemplo de Servlet que substitui a implementao da interface


SingleThreadModel por cdigo de sincronizao
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #1"2  !' #"43%56#7$#8%$9: ; <= 9:>@?BAC:D!


-.-

Q!#

$#3%56 "2 G %#"0F#D#N E6Q"

-.-

/ #!)' #

!5ON' D:D' "."

98E!

98E!

9 J#FJE#

J J#!9F
#Q8#9E"0>6) / #(' #QR

E!"0$#356 "2 G !#"0F#D#N E6Q"

 

!9%8QE!

B

  8#

9

5N' D

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#


 .#", !9%"2#@.*$

-.-

H  .  9EDN#G' *%

I2 9
'  

-.-

"0H  QD# & 9R

. F#!

'  
J  .#", 9"2# <@#Q

. 8#!8

 . 9!)' 9Q>? AC !+

2 J,M!#!99EL!' 

E7D!9%8E!

#

5 J4 ;Q#'' DQ!'O5"$9E7"Q 9DF!9O MG 

9%' BDQ98E! 
" 
$ 96D*$!9 M#!E &* " B
 R
' =D!9FQE!

(($ 

98E!2

0
-.-

H  .  9E:9 6
 J#!FJE#

$#3%56 "2 G !#"0$#D#N E6Q"

'  

 . 9!)' 9P#35 "2 G #"0$#D#%N EQ"

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

 (

- >?BAC, 

0
0

  
)   -
$*- ! - 1  .$'&
(*),+ + *2 )  ,)    )



FE #

H 9!&#Q<O#%$ & / .
 . 9< + ' =D!98QE6!



&(   % 

 ,
Alm dos mtodos 

   de um Servlet.

0/ / -  / % (

/&# - (

 ! 



, voc tambm pode implementar o mtodo

Assinatura do mtodo getServletInfo () da classe HttpServlet


!5ON' D



/ .2 9<<(# / #!)' #&H 9%K+

A implementao desse mtodo dever retornar um texto contendo informaes


gerais sobre o Servlet desenvolvido, como por exemplo, o autor, verso e informaes
de copyright de seu Servlet.
Implementando esse mtodo para o nosso Servlet

/ ( ("-

! 



, temos:

Servlet HelloWorld com implementao do mtodo getServletInfo()


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

.J ; <( 96:>O#' ' 

!5ON' D:D' ".":>@#' ' 

-.-

!$' E

.' E7# &#!9%E"

* &#9E J#987E#

>O+. / #F' #R

$#35 "2 G!#">(?=?

I:D!

#Q8E

%?

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#

5N' D

 .#", !9%"2#@.*$

I2 9

. F#!

"0H  QD# & 9R

'  
J  .#", 9"2# <@#Q

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9>@#!' ' 

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

.' E

 -.

. 8#!8

9 ,+

- >?BAC, 

0
-.-

P#&.99%E!J 9!K8!. JG #"4".N!$#J#!" ".#

5N' D

/ #!)' #Q

/ ) 9<<@# / #)6' #&H 9%K / R

.#)5$9>

5%8!**

5F!$#"E

' F 

#%$" %!



+

0
0

Caso voc no implemente esse mtodo, um texto vazio ser retornado pela
implementao default desse mtodo.

 



   









  





Embora j tenhamos visto um pouco sobre o funcionamento da gerao de uma


resposta simples de um Servlet, estaremos neste captulo analisando esse processo mais
a fundo e apresentando algumas funcionalidades mais avanadas.

  )  $,&  ,) + $ $




0+ ! . "),+


5 

(  
   &! # / -  /! "! " /- / / .$ /&# 

Quando o Servlet recebe uma requisio, sem mtodo 


  chamado com dois




  
parmetros: uma referncia a um objeto da classe
, que
encapsula a requisio recebida, e uma referncia a um objeto da classe
, que encapsula a resposta do Servlet.




 

    ! # /-  /.!   !  /-  /. /.#)("%&# /

Figura 4.1

Atendimento de uma requisi opor um Servlet.

Sendo assim, a manipulao da resposta do Servlet passa, na verdade, pela


manipulao do objeto dessa classe  
.


 

   ! #)/-  /. !  !  /-  /. /.#) ( %&#/

0/& -  /"-

Para gerar uma sada simples, por exemplo, voc deve utilizar o mtodo
   desse
objeto. A chamada desse mtodo ir retornar uma referncia a um objeto da classe
     , que encapsula um stream de sada para um contedo do tipo texto. Esse
stream deve ser utilizado para enviar a resposta de seu Servlet para o cliente que
enviou a requisio.

    ! ("! - %. -  / -

Assinatura do mtodo getWriter ()


!5ON' D7  ! I. 9

. 8#1<@#Q

. &#



.*.

"0 Q!  H  ,D#! ) !9O

Embora a anlise dos mtodos dessa classe fuja um pouco ao escopo deste livro (tratase de uma classe do prprio core Java), interessante apresentar alguns de seus
mtodos aqui.

"- %

&- %& %

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.

$#)

Exemplo de gerao de sada simples de Servlet


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

.J ; <( 96:>O#' ' 

-.-0/ #(' #

!5ON' D:D' ".":>@#' ' 

-.-

!$' E
>O+. / #F' #R

.' E7# &#!9%E"

$#35 "2 G!#">(?=?

* &#9E J#987E#

#Q8E

I:D!

%?

 E7E6B#Q +>68& / 


# (' #Q.P#35#"F  F#3%5%#"$>O+. / 
# F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

I2 9

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

. F#!

'  

 . 9!

 !Q>@?BAC +

'  

 . 9!

 8>O#' ' =

'  

 . 9!)' 9

'  

 K8' 56"2*/+

. 8#!8

.' E9 +

! - 
 

- >?BAC

8

0
0

    ! ("! "- %  -  /"-

    
Assim, nesse exemplo, utilizamos o objeto da classe
para adicionar um
contedo texto (no caso uma pgina HTML) ao stream de sada do Servlet. A resposta
recebida pelo cliente ser justamente essa pgina HTML.

Se voc observou o exemplo anterior com cuidado (e, na verdade, todos os exemplos
anteriores que incluiam algum mtodo 
 ), voc percebeu que o mtodo 

 foi
   
 : essa
declarado de maneira a possibilitar o lanamento de uma exceo
exceo pode ser lanada pelo mtodo    caso haja algum problema gerao
de sada do Servlet.

&( 
0 /. - /"-

Outra opo de implementao para o Servlet


#!  ' :E#L<#.QG JE#J"2

 E:"Q  ' #"

/ #%&(' #

E#

&(
/
 "! (! "'/  (%

/ ( ("-

! 



seria, portanto:

DQ D &5):E#J#QD#G!

    


   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #<(59E:  ' #! J#98QG 7E


!5ON' D:D' ".":>@#' ' 

-.-

.' E7# &#!9%E"

* &#9E J#987E#

/ #!)' # F7 ; <= 9%

$#35 "2 G!#">(?=?

I:D!

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


)

> #!' ' 

#Q8E

%?

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R

R
I 9
'  

. &#

!$' E

>O+. / #F' #R

'  
7  $#"Q !9" #! <(#

 !$ 9,!Q>?BA4C !+

. F#!



'  

 !$ 9,8>O#!' ' 

'  

 !$ 9&' 9! -

'  

 K ' 5"2*/+

D&D*
 H  %,D#! ) !9
/ #F' #Q

! ' E9 ,+

 
B#

AC! 

- >?

1R

!9!&#Q '  DQ98# 

' =D!9F#QQ& ' <! O.F(F9 

<# / #!)' #

98# 58

K8! "." #'=5. ' M




)#K8#


9D B1N #8I 9

 8#

,+

0
0
0

Dessa forma, podemos capturar e tratar a exceo


gerando, por exemplo, uma mensagem de log.

 "! (!  "'/  (%




caso ela ocorra,

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.

Exemplo de resposta HTTP do Servlet HelloWorld


>? ?

I -


/ #F#





-
% 

 * QD*#

C"F 8 AE K8 #E)

/ 59

 

!9%8#!9%, ?'$ # 8#Q - *&

!9%8#!9%,8C6#!9!<&*)

"


9  



#!D

  
   

'

 

>?BAC Q>O#' '  

.' E

9 - 
 

- >?BAC

Embora alguns headers sejam adicionados por default pelo ServletContainer, como
no caso da resposta do Servlet HelloWorld acima, podem haver situaes em que
voc queira definir ou modificar seus prprios headers HTTP, e para fazer isso, voc deve
utilizar o mtodo setHeader ().

Assinatura do mtodo setHeader ()


!5ON' D! E"2#&> #E# B
  Q! ' 9<@ / &. 9!<

 *#QE#! =
& 

# Q! ' 9<@ / &. 9%<

 *#QE#! 

+

' 5#

Para indicar, por exemplo, que a resposta de um Servlet no deve ficar armazenada
em nenhum cache (armazenamento temporrio) do browser do usurio, nem em
nenhum proxy, podemos definir alguns headers adicionais especiais por meio do
seguinte trecho de cdigo:

Headers para evitar cacheamento da resposta de um Servlet


!5ON' D! EEB# B
 >O& / #F' #&P#35#"F  $#35#"FO>68& / #(' #&P#"2 9".#  .#", 9"2#&



$#"Q !9" #! "2#&>@#QE#!

 



$#"Q !9" #! "2#&>@#QE#!

 8IF

D*# 

!9%&$!' ,  9 +DD*6# O 5".,.#!' E 8#

<@ J F9 8DQD!*#)+

 ! %  F#"!&A49 



$#"Q !9" #! "2#&>@#QE#!



$#"Q !9" #! "2#@ 8#>O#QE#%

 FCQ"$,FA4E K

;5O'
 

    +

#E, / 
$ "F&#  D5.F#9 ?

J#!A ' ' "

8
,+



Nesse cdigo, o header Expires indica a data de expirao, o header Last-Modified


indica a data de ltima modificao, e os headers Cache-Control e Pragma
indicam o tratamento que o documento (ou seja, a resposta do Servlet) deve receber
se houver cacheamento.
Com a incluso do cdigo anterior, a resposta do Servlet passa a ser:

Exemplo de resposta HTTP do Servlet HelloWorld com headers


adicionais
>? ?

I -






/ #F#

-
% 

 * QD*#

D*6#!

"

9  

9%&.' O9(+DD!*# 56"F,.#!' E 8#

I!$ <( J96!DD*6#

!  )#"A!9 

;(5'
 

    +

C"F 8 AE K8 #E) / 59

 



!9%8#!9%, ?'$ # 8#Q - 


* &

!9%8#!9%,8C6#!9!<&*)

#!D

    

'

 

>?BAC Q>O#' '  

.' E

9 - 
 

- >?BAC

Uma observao muito importante que essas adies / modificaes de headers


HTTP devem acontecer antes da gerao do contedo da sada, para garantir a
ordem dos elementos da resposta HTTP (ou seja, primeiro status, depois headers e, por
fim, contedo). A alterao de um header aps a escrita de parte ou de todo o
contedo pode gerar uma exceo

      , e interromper o processo de
gerao da sada do Servlet.

  &!  % 0 ! / 0&  / ')/"  ("%

Assim, o cdigo completo para o Servlet


como:

/ (  (-

! 



sem cacheamento pode ser escrito

Servlet HelloWorld com headers para evitar cacheamento da pgina


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.?

' #! J#98QG 7E

#FD# $7

!5ON' D:D' ".":>@#' ' 

-.-

.' E7# &#!9%E"

/ #!)' #Q $7 ; <= 9%

I:D!

5N' DO! EE6B#Q>68& / 


# (' #Q&P6#35#".
)

%$' E

>O+. / #F' #R

$#35 "2 G!#">(?=?

* &#9E J#987E#

> #!' ' 



#Q8E

%?

$#35%#"F >O& / 
# (' #&P#", 9"2#J  .
 #"2 9".# R

-$-

IQ" ".

@#K& 9 9E

*%#E#F"

 .#", !9%"2# " #Q&>@#QE#!

! 

 .#", !9%"2# " #Q&>@#QE#!

!+IF

 .#", !9%"2# " #Q&>@#QE#!

!! !  $#"@8A4!9  

D*# 

%9!)F' ,  9!DD*6# O 5"F.#' EQ8#!+

<@ J!9 8DQD!*#,+

;56'
 

    /BA0? ,+

 .#", !9%"2# " #Q@ F#!>O#QE#

-$-

I 9

IQ" ".

. &#

8CQ"$,8A

'  
7  $#"Q !9" #! <(#

 !$ 9,!Q>?BA4C !+

'  

 !$ 9,8>O#!' ' 

'  

 !$ 9&' 9!

'  

 K ' 5"2*/+

,+

J#A ' ' "



. F#!

! ' E9 ,+

 

DQQ&D* H DQ#! !& 9 =#/

 D5 F#9?

=#$9E7 ; <( 9E#F#"Q "FF

'  

/ #F' #Q

E K& #E / 


$ "$8#!

AC! 

- >?

98#2' =D%9!8# 5

<(# / #!)' #

98#Q58

' =D!9F#QQ& ' <! O.F .9  K8 2 "2"  #'!N8# F#K8#!


96D 

I. 9

J%N #QF

. 8#

!+

0
0
0

Se voc observou atentamente o cdigo para a modificao dos headers, voc deve
ter reparado no uso de um mtodo    : esse mtodo , na verdade, uma
variante do mtodo   que simplifica a definio de um header com uma data.
Assim como esse mtodo, existe um outro mtodo   para a definio de
headers que contenham valores inteiros.

# / / "/& ./"-

# / &/" ./ -

# /. %. "/" ./"-

Assinaturas dos mtodos setDateHeader() e setIntHeader()


!5ON' D! E"2#  &#!>O#QE# +    ' 9<( / &$ 9<
!5ON' D! E"2#&H 9&>O#QE# +  % ' 9<( / ). 9<

 *6#QE6#!
 *#E#

&

&

 #6' 9<

 J# ' 9<

BE!8# 


9+

# /  / "/& ./"-

O segundo parmetro do mtodo    deve conter o nmero de milisegundos


  '     do
desde epoch (meia-noite, do dia 1 de Janeiro de 1970); o mtodo

objeto
retorna esse valor para o instante corrente.



 &!  %0&! #  /&*

'.$&- -/%& * / #

'(%. % # /  /- , para verificar se um header


 /& &/"-  / "/& ./"- e  %& /" /- que permitem a adio

Alm dos mtodos anteriores, existe o mtodo


j foi definido, e os mtodos    ,   
de mais de um valor para um mesmo header.











Assinaturas dos mtodos containsHeader(), addHeader


(),addDateHeader() e addIntHeader()
!5ON' D7N' #9D!9%8 9"2>O#QE#% +  Q ' 9!<( / ). 9<
!5ON' D! EEE>O#E#!@+ % ' 9<( / ). 9<



!5ON' D! EEEO F#!>@#QE#! 8    ' 9%< / &. 9<


!5ON' D! EEEH 9&>O#QE!# +  Q ' 9<@ / .. 9!<



*#QE#

&

 J# +

*#QE#!*&  J# F  ! ' 9<@ / &. 9!<


 *6#QE#

&

 #' !9%<

 *#E#% =
&  J#' 9<

 *#QE#! 

' 5#+

 EQ8#8


9!+

Podemos usar o mtodo containsHeader() para verificar, por exemplo, se o header


Content-Type j foi definido, e defini-lo em caso negativo:

Servlet HelloWorld com definio do header Content-Type


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,



-.-

5%F87  ' # J#!98QG JE

!5ON' D:D' ".":>@#' ' 

/ #F' #Q

.' E7# &#!9%E"

.J ; < 9:>@#' ' 

>O+. / 
# F' #R

.' E

$#35 "2 G!#">(?=? I:D!

* &#9E J#987E#

-.-

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


)

#Q8E

%?

R
-$-

 O#K

IQ" ".

9 9E7*#QE#F"

 

K!9  F#"Q !9E6#! D!98 9" >O#QE#

, 

 $#"Q !9" #! ".#)>O#E#!

-$-

IQ" ".

I 9

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R


. &#

 &#Q

- *& ' !+

=#$9E7 ; <( 9E#F#"Q "FF


'  
7  $#"Q !9" #! <(#

 !$ 9,!Q>?BA4C !+

'  

 !$ 9,8>O#!' ' 

'  

 !$ 9&' 9! -

'  

 K ' 5"2*/+

D&D*
 H  %,D#! ) !9

'
? $ #,

98#!9%, ?'$ #!

'  

/ #F' #Q

!9%8#!9

. F#!



! ' E9 ,+

 
B#

1R

!9!&#Q '  DQ98# 

' =D!9F#QQ& ' <! O.F(F9 

AC! 

- >?

<# / #!)' #

98# 58

K8! "." #'!NF#!=)#K8#




9D  

N #8

I 9

. &#

+

0
0
0

(% /%  /

A funo desse header 


   informar o tipo do contedo que est contido na
resposta, para que o browser (ou dispositivo cliente que est fazendo o acesso) saiba
como esse contedo deve ser interpretado e apresentado.
Nos exemplos anteriores esse header no foi definido explicitamente em cdigo: nesses
casos, o ServletContainer automaticamente define seu valor como 
 . Esse valor
indica que o contedo deve ser interpretado pelo browser como uma pgina HTML.

 / " ,*

Outro header que definido automaticamente pelo ServletContainer, caso o



desenvolvedor no o defina explicitamente, o header 
. Esse header indica o
tamanho em bytes do contedo contido na resposta.

( %. /"%  /%"0 

Podem haver casos em que seja necessrio se alterar esse comportamento default:



nesses casos, o desenvolvedor pode utilizar os mtodos
apresentados
anteriormente, ou o mtodo 

 diretamente.

# /& ( %. /"%  ,/%"0

# /  /  ./ -

Assinatura do mtodo setContentLength()




!9%8#!9%&C#!9<6&*B 9%

!5ON' D! E"2#

  )  $'&  ,)
&

 



 DQ98#!9%&C#9<&*/+

+  "!   + , ) + $  $,+

( %. /"%  /

Conforme mencionado no na seo anterior, o header 


   serve para indicar o
 indica
tipo do contedo contido na resposta do Servlet. Dessa maneira, o valor 
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.

Assinatura do mtodo setContentType()


!5ON' D! E"2#

!9%8#!9% ? 
$ # + Q ' 9<@ / .. 9!<

=D9&#9 ?'$6 #+

Embora a gerao de uma sada HTML seja a situao mais comum, podem haver
situaes em que voc deseje gerar outros tipos de sada. Nesses casos, voc deve


utilizar o mtodo 
para especificar o tipo do contedo desejado.

#)/ ("%. / %.  /

Assim, podemos usar o seguinte trecho de cdigo para retornar uma imagem JPEG
contida em um arquivo:

Servlet ImageServlet
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #

#Q8#!96E"0>O+& / #' #QR

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


 ' #H 96 !5 / &$# '  J <#  ' #
)

;6I 

<(#.QG JE#7"   E:D  J <#!

.

!5ON' D:D' ".":H J <@# / #(' #

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R

J956' ' 

O#K8 9O 9E:J. E7D9&# E

-$-

 .#", !9%"2# " #Q

98#9 ?$ #! J <# -  #Q<.!+

-$-

N&#9E7F35 7D!  J

-$-

E# 9 D !' MG E

;6I 

<@#!

'  J <# O ' #

 96#
6 ' #!H 9 5 /
7
!+ <#&H 9 &I!F J#&#!  ;6 #<

&.# / <#Q / #' #Q

C%#!9EJD!9%8# 6
 E7E#5

-$-

)#8.969E:#"$8#D!9%8# 6
 E7DQ J.#", "FF



9K8 <

!$35 JDQ9&#9E

56 J

 <#

5!& !5! / &$# ' ="3J  $#"Q 9" #! <O#! 5& 5 / &$#

N 
$ F#
9

E"   J#)F"

 ' #!9 J#!+

-$-

/ #F' #Q

 F& 

/ #(' #

'  N5K+K+#

'  N$&#"3

*O ' # +'  N !
$ F#"
' ="2

J9#

N$F#

 

8

+

B
7'  J <@# 6 ' # $#QE + '  N5K+K #  9  

. 8# +'  N5K K8#!@) '  N 
$ &#"'+

6 9' M96E7 .DQ#"." 7E6#:<@#FGJE!#"   E:#JK8#D*9EJ.35O 

-$-

' ="2 K8' 5"Q*

,+

'  J <# O ' #! D' ".#/8

D&D* + H  QDQ# ) 9 =# R


.

$
R

K"'   <#  ' #

9 7956' ' B' 

 DQ# ) !9 =#

DQFD*

/ #F' #Q

!9!&#Q '  DQ98# 

J<# 6 ' # D' ".#/!+

0


<# / #!)' #

' =D!9F#QQ& ' <! O.F(9 %:K8 @ " " #!'O' #

98# 58
J <#

E#7F35 

,+

No exemplo anterior, voc poder observar tambm a utilizao do mtodo




 . Esse mtodo deve ser utilizado, em substituio ao mtodo
   que
foi usado nos exemplos anteriores, para obter uma referncia a um stream de sada
binria do Servlet.

0/ $ &$  - / &*

0 /. - /"-

Assim, quando voc desejar que seu Servlet retorne um contedo binrio (no-texto),
como uma imagem JPEG no cdigo anterior, voc dever utilizar esse mtodo


 , e obter uma referncia a um objeto da classe

   

.

0/ $ &$  - / &*

  ! # /"- /! /"-  /. $$  - /&*


Esse stream ServletOutputStream extende, na verdade, a classe    ! (! $.$ -/ *
sendo assim, herda os diversos mtodos -  / e o mtodo $#) da classe-me.
 





e,



Assinaturas dos mtodos write() e flush ()



!5ON' D! E&

. 8#+N 
$ 8#

 N$F#*.$*$ 8 

!5ON' D! E&

. 8#BN$8#

!5ON' D! E&

. 8#B 9! 

N 
$ 8#/8

1  N 
$ 8#*

 F*$O 9%

 K+K8".# 9

 ' #9<&*/+

!5ON' D! EJK&' 56"2*+

Obviamente, a utilizao dos mtodos anteriores e at mesmo a obteno desse


   
 , em
stream de sada binria do Servlet podem gerar excees do tipo
situaes em que o usurio que est operando o browser aperta o boto  , antes de
todo o contedo gerado pelo seu Servlet seja enviado, por exemplo. Por isso
importante que voc se preocupe em capturar essas excees, e fazer os tratamentos
necessrios caso isso ocorra.

 &! ("! '/&  (%


 (&

  )  $ -  #  -
 )   

 1

Dentre os diversos tipos de contedos que podem ser gerados como resposta de um
Servlet, apresentamos aqui, como mais um exemplo, a gerao de documentos XML.
Documentos XML so normalmente usados para estruturar um conjunto de dados de
maneira simples, bem-definida e eficiente. Um exemplo de documento XML j foi
apresentado no Captulo
2 Instala o e Configura o: o Deployment Descriptor
um arquivo XML que descreve a maneira como o ServletContainer deve carregar e
gerenciar uma Aplicao Web.
Um outro tipo de documento XML bastante utilizado atualmente o WML (definido
dentro do padro WAP, ou Wireless Application Protocol): atravs desse formato, um
servidor pode formatar um contedo que ser visualizado na tela de telefones celulares.
Embora a explicao detalhada do formato de um documento WML fuja ao escopo

deste livro (mais detalhes podem ser obtidos no site do WapForum,
),
apresentamos abaixo o cdigo de um Servlet que gera uma pgina WML apenas para
exemplificar a gerao de um documento XML.

 ) ! . ( -$.*4! ("-0

Servlet HelloWorldWML
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,



-.-

5%F87  ' # J#!98QG JE

!5ON' D:D' ".":>@#' ' 

.' E

/ #F' #Q

AC:# &#!9%E"

.J ; < 9:>@#' ' 


>O+. / #F' #R

.' EE6#!")&#!MJD! L<#$QG JE7$#"2 ".8:#

K8.  8$

AC

-.-

$#35 "2 G!#">(?=? I:D!

* &#9E J#987E#

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


)

$
R

@#K& 9 9E

-$-

IQ" ".

-$-

-$-

DQ J/ 8#  - 

-$-

E#K8 9 E7DQ J/ F#  - (9%E%

56

E6D!5

 .#", !9%"2# " #Q

-$-

IQ" ".

I 9
'  

%?

*%#E#F"

@A0C9%%$ J' > 

98#9+? (
$ #

' 89DQ"2#", #D  K DQE$


 

AC:#"$8#

96!.

*#QE#!

' J#98#:E#K& 9 E!


E!##J".#

' 

98#9 ?$ #! 8#  - 9E

 !

' !+

=#$9E7 ; <( 9E#F#"Q "FF


'  
7  $#"Q !9" #! <(#

. &#

 !$ 9&' 9!9

"%

#Q8E

#!98

 !$ 9&' 9! Q


  'QO#%)", !9

'  

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R

&*!+& ( -.-

. F#!



 %'
  %  ,+

  ? (I ! 'I " !CH  '%  - - 7* I


P "=A -F- ?-+


 K+! 5 J < - @?  -
' 

  ' % ,+

'  

 !$ 9,!

'  

 !$ 9,!Q L!' <(9'% DQ#98#,%',Q>@#' ' $

'  DQFE

'  

 !$ 9,!

'  

 K ' 5"2*/+

- DQFE





-F- (& %

!+
.' E

 - ,+

' ,8

D&D* + H  QDQ# ) 9 =# R


/ #F' #Q

!9!&#Q '  DQ98# 

' =D!9F#QQ& ' <! O.F()(

<# / #!)' #

B#! <(#&A

#"2"$ <(#

98# 58

,+

0
0
0

# /& ( %./%  /


interessante observar no exemplo anterior a utilizao do mtodo 

 para
indicar o tipo do contedo na resposta; embora para documentos XML esse tipo seja
geralmente o    , no caso especfico do WML ele deve ser definido como


.

 / & ,% "!  ! *

  $  ,+

 



/ & *

55

>8

Como explicamos na seo 3.2 deste livro, alm dos headers e do contedo
propriamente dito, a resposta a uma requisio HTTP deve conter tambm a
informao do status da resposta, sendo que essa informao composta por um
cdigo numrico mais um string com uma mensagem.
Esse status utilizado no s para indicar se o processamento da requisio recebida
foi bem-sucedida ou no, mas tambm para indicar algumas outras situaes possveis,
como por exemplo que o documento solicitado encontra-se disponvel em uma outra
URL.

# /  $#

 /-  /& /#, (%&# /

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.

Assinatura do mtodo setStatus()


!5ON' D! E"2# / 8Q&56" + 9

=".F &5"

E#+

Nos exemplos apresentados anteriormente, como esse status no foi atribudo


explicitamente em cdigo, automaticamente o ServletContainer o definiu como sendo
200, ou status  . Vemos a seguir, por exemplo, a resposta do Servlet      :

/ ( ( -

Exemplo de resposta HTTP do Servlet HelloWorld


>? ?

I -


/ #F#





-
% 

 * QD*#

C"F 8 AE K8 #E)

 

/ 59

"


!9%8#!9%, ?'$ # 8#Q - *&

!9%8#!9%,8C6#!9!<&*)

9  
#!D



  
   

'

 

>?BAC Q>O#' '  

.' E

9 - 
 

- >?BAC

Temos, a seguir, uma tabela com alguns dos cdigos de status HTTP existentes e seus
respectivos significados:
Cdigo de Status

Mensagem

Significado

200

OK

Requisio foi processada com sucesso.

302

Moved Temporarily

O documento solicitado encontra- se disponvel em outra


URL.

404

Page Not Found

500

Internal Server Error Erro

O docum ento solicitado no foi encontrado.


no

processamen to

obteno

do

documen to

requisitado.
503

Service Unavailable O servio no se encontra disponvel.

Assim, no caso de nosso Servlet de gerao de imagem JPEG ImageServlet, podemos


modific-lo de forma que ele retorne um cdigo  caso o arquivo com a imagem a
ser gerada no exista.
Servlet ImageServlet com possvel uso do cdigo de status HTTP 404
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #


-.-

.

;6I 

<(#.QG JE#7"   E:D  J <#!



<@#F:D !E <JE#"F&&5"

  

D" 7F35 :D  J <O#! 9 J# "FF

!5ON' D:D' ".":H J <@# / #(' #

#Q8#!96E"0>O+& / #' #QR

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


 ' #H 96 !5 / &$# '  J <#  ' #
)

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R

J956' ' 

R
-$-

 #%$ K8 DQ!9EJ"2#$35 O:D

/ & 9<

'  K ' #9 #=

<(# / #!)' #

 <#

9K8 <

# "F&#

8 <#&H 9 &I$ J#Q8# ;6 #<

K!+' =K8 ' #!9 J#&9 L95' '  R


 ' #' @K& ' #/79#

 ' #+' @K& ' #9 J#+

K",9 ' =K8 ' #! # "$8"3, '  K ' #!9 J#/7965' ' 

0
K!+' =K8 ' #!9 J#&:9O5' ' BR
-.-

 J7F35 

 $#"Q !9" #! ".# / 8&5"@+  $#"Q !9" #! /


$#Q)56.9



9 %7# "F&#$#QF%$9 J"4D EO <@

'&
?

  "& .+

  

 ' #9 J#!

0
O#K8 9O 9E:J. E7D9&# E

-$-

 .#", !9%"2# " #Q

98#9 ?$ #! J <# -  #Q<.!+

-$-

N&#9E7F35 7D!  J

-$-

E# 9 D !' MG E

'  J <# O ' #

796#

;6I 

<@#!

C%#!9EJD!9%8# 6
 E7E#5

-$-

)#8.969E:#"$8#D!9%8# 6
 E7DQ J.#", "FF



!$35 JDQ9&#9E

56 J

 <#

5!& !5! / &$# ' ="3J  $#"Q 9" #! <O#! 5& 5 / &$#

N 
$ F#
9

E"   J#)F"

6 ' #!H 9 5 / &.# /+' =K8 ' #!96 J#+

-$-

/ #F' #Q

 F& 

/ #(' #

'

'  N$&#"3




J9#

N5K+K+#

N$F#

8

+

B
7'  J <@# 6 ' # $#QE + '  N5K+K #  9  

. 8# +'  N5K K8#!@) '  N 
$ &#"'+

*O ' # +'  N !
$ F#"
' ="2

6 9' M96E7 .DQ#"." 7E6#:<@#FGJE!#"   E:#JK8#D*9EJ.35O 

-$-

' ="2 K8' 5"Q*

,+

'  J <# O ' #! D' ".#/8

D&D*
 H  %,D#! ) !9
.

B#

K"'   <#  ' #

1R

/ #F' #Q

9 7956' ' B' 

 DQ# ) !9 =# 

DQFD*

!9!&#Q '  DQ98# 

J<# 6 ' # D' ".#/!+

0
R

<# / #!)' #

' =D!9F#QQ& ' <! O.F(9 %:K8 @ " " #!'O' #

98# 58
J <#

E#7F35 

,+

0
0
0

Podemos ver, nessa implementao, que o cdigo de status definido pela constante
numrica        da classe
  
.

  /"- /. /.#) ( %# /

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
200

Mensagem
OK

Constante
SC_OK

302

Moved Temporarily

404

Page Not Found

SC_NOT_FOUND

SC_MOVED_TEMPORARILY

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

.

" #

-.-

D% 5O J: J#!9"  <#!

.#K8 QJE

!5ON' D:D' "."

-.-

H IJED' #9&#L35#LK8ML.#35 "2 G 

H IJ9 LK8.#D!9O*#D! EE F#D 97 .756 J

-.-

E#D#" ".

*%#!DH I* DDQ#!" "

IF#K8 QJE":H I%"

# &#9E"

#!  & E"

>O& / #F' #

  @

  
  

#EH IIF#K8 =

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".

F#E!#' D!' 

  8#"FFQ& DK& 9' / .. 9</ 


* ' ' 

)

%;Q<( 9

9#<QE

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# R

R
-$-

 #%$ K8 DQ!9EJ

F#K8 QE7D' #!9%8#J3%56#K8#!M

$#35O "2 G 

'  /:  F#35#"$& <#&P# JQ8#* EE%8

/ & 9<

K!8'  &9 J95' ' 

+' 

 "F8!&&"

.*

.*

' ' 

#E%H II!)#K8 !B'  /J95' ' 

K!+'  /J95' ' BR


 $#"Q !9" #! ".# / 8&5"@+  $#"Q !9" #! /
 $#"Q !9" #! ".#)>O#E#!

,8CD

& !9,


A

 

$#Q)56.9

0
-$-

* D#!"$"2 #.  & E!6  2  9E7 ;

I 9

. &#

<( 9E#J"256DQ#"2".

'  
7  $#"Q !9" #! <(#

'  

 !$ 9&' 9!Q>@? A0C ,+

'  

 !$ 9&' 98IFN#9" 


 " #!5

'  

 !$ 9&' 9! -

'  

 K ' 5"2*/+

 

. F#!



D#!"$"2LK8  #.  & E9 ,+


AC! 

- >?

D&D* + H  QDQ# ) 9 =# R


/ #F' #Q

!9!&#Q '  DQ98# 

' =D!9F#QQ& ' <! O.F()(

<# / #!)' #

B#! <(#&A

#"2"$ <(#

? 6
A0I P*

- DD#" "2E#9 #E *& ' !+

98# 58

,+

PH C+

0
0

Essa situao de redirecionamento do acesso mostra-se to frequente que um outro


 , disponibilizado pela API de Servlets para a obteno
mtodo, chamado   
desse mesmo efeito.

# /% / - /&'

Assinaturas do mtodo sendRedirect()


!5ON' D! E"2#9EP#E )#DQ / & 9<

 ' DQQ& !9+

Desta forma, poderamos trocar, no Servlet anterior, o trecho de cdigo:



K!+'  /J956' ' BR


$#"Q !9" #! "2# / 8Q&5"   F#"2 !9%".#! /



$#"Q !9" #! "2#&>@#QE#!

CDQQ& !9!

 
A  
?

!AI P*

PH C 

- DD#" ".E#9 #E *! ' !+

F#&5O.9

0


Pelo cdigo:

K!+'  /J956' ' BR


$#"Q !9" #! "2#9EP#E F#D 

 -

DD#"2"$E#!9 #E *& ' !+

F#&5O.9

0


Veremos a seguir uma variao do ServletContador, apresentado anteriormente neste


livro, que utiliza o mtodo    para redirecionar o milsimo acesso para uma
pgina especial:

# /"% / -/&',

Variao do ServletContador: redireciona milsimo acesso


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #1"2  !' #"43%56#7$#8%$9: ; <= 9:>@?BAC:D! 


-.-

$#D#!N EQ"

! J#98!6.#E $#D !96:

/ #!)' #

!5ON' D:D' "."

-.-

#J

98E!

98E!

9 
 L#F:E#.#35 "2 G #"

' #"Q J:D#"." 

#Q8#9E"0>6) / #(' #QR

E!"0$#356 "2 G !#"0F#D#N E6Q"

 

!9%8QE!

B

  8#

9

5N' D

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#
&*OF

-.-

"0H DQ# & 9R

2 J,M!#!99EL!' 

9%' BDQ98E!

E7D!9%8E!

=

" 
$ 96D*$!9 M#!E &* " B
 R
' =D!9FQE!

(($ 

98E!2

#

5 J4 ;Q#'' DQ!'O5"$9E7"Q 9DF!9O MG 

0
-.-:/ ##"FF#:K84

 ' #" J:D#" ".O.#E F#D !9%7 $75 J: ; <= 9:#", #D '

K"+'  DQ98QE6!

 =R



 .#", !9%"2# " #!9EP#E% F#D 



- F#!  #"2 #D! '  *%& 7' !+

$#Q.5.9

0
  D".D!9%&.; 

-.-

I2 9

. J#:9 
 J#!):E#

'  
J  .#", 9"2# <@#Q

. F#!

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9P#35 "2 G #"0$#D#%N EQ"

'  

 K8' 56"2*/+

 (

F#35 "Q G #"0$#D#N! EQ"

. 8#!8

H 9!&#Q<O#%$ & / .. 9< + ' =D!98QE6!



0
0






!  ,)  $  '+ ) )   
4



# /& $ #

# / % / - /"')

 e
  
 que permitem a manipulao do status da
Alm dos mtodos 
 para indicar erros no
resposta do Servlet, possvel tambm utilizar o mtodo  
processamento da requisio recebida.

#)/"% -- ( -

Assinaturas do mtodo sendError()


!5ON' D! E"2#9E  F + 9
!5ON' D! E"2#9E  F + 9

=".F &5"

E#+

=".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

 / -  / /&#) (%&# / :






Assinaturas dos mtodos relacionados ao buffering de resposta do


Servlet
!5ON' D7 9%B<(#5K+K+#% / M#+
!5ON' D! E"2#5%K K8# / M# 9%
!5ON' D7N' #9
!5ON' D! E

"

!   +8#!E+

.#".#,+

!5ON' D! EJK&' 56"2*5K K8#!@+

 " M#/+

Ao invs de simplesmente repassar para o cliente contedos parciais a cada chamada


aos mtodos de escrita da classe   
(como por exemplo, os mtodos  # 
e   ), para otimizar o desempenho da aplicao o ServletContainer armazena esse
contedo em um buffer, sendo que esse contedo repassado para o cliente somente
quando o buffer enche ou quando encerrada a execuo do Servlet.

& /"- /. /.#) ( %.# /

- /

"- % %

Dessa forma, embora tenhamos dito anteriormente que h uma ordem de definio
dos elementos HTTP de resposta de um Servlet a ser obedecida, utilizando essas funes
de manipulao do buffer de resposta, possvel contornar essa regra.
No exemplo a seguir, utilizamos essa funcionalidade para, dependendo do
processamento realizado, redefinir os elementos da resposta do Servlet.

Servlet com manipulao dos buffers da resposta


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #13%56#7$#' M75  $D#" ".! J#987356' 35# 


 #6D9K+. J#7DQ"2
-.

9 5' 0

N5%K K8#4E!#

!5ON' D:D' "."

>O8& / #!)' #R

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

-.-

$#"Q "F&

/ #!)' #5K K8#!.P6#" "FF:#2F#!9E6"

"0H DQ# & 9R

H  .  9EJ&

<(# / #%&(' #

9&#2

9*:EN5K K8#

+ ' <

&

9*:E#K85' 

E

N5K+K #4E#

H 98#<(#. 8 / & 9<+  $#"2 %!9".# <@#Q5%K K+# / M#>(+%

-.-

O#K

9 9E79:F 9*LE#

N5%K K8#

 $#"Q 9" #! " #Q5K+K+# / M#

  +

-.-

>? A0C

H  .  9EDN#G' *%

I2 9
'  

-.-

. F#!

'  
J  .#", 9"2# <@#Q

E#

F#"2 ".8&#&%

)(

!+

$#"Q "F&:E#

. 8#!8

 . 9!)' 9Q>? AC !+

#D5&9%E!5

.D#"."  J#!98J35' 35#!

N' #!9' ="256DQ#"." !I.D#"2".

-.-:/ #D2$#!5
-.-

E:! ' DQG 

E#$#"Q "FF79' Q<

JE K D J"

5

#! F

#98/= %#D58!IFDQ#"."  J#!98+

9 FD#"2"  J#!9!879%8#. !

"$8Q&56"

E

)#!" "$8

K"9 ' ="Q5DQ#"." !I$D#"2"$! J#!9!8 BR

-$-

#"2

-$-

N

-$-



E#J8#. J"

E#K 9 E:#! !' D 8 J#9&#LJ& J9*JE

O#%$ K8 DQ!4".#" #!5


&#QFE "

J# :E

K!9  F#"Q !9" #! "

D!9%8# 6
 E

;

9 :K8 @F# "." QE

N65K+K #

 #"$#%  F#

%!F:D' #!9%8#

!   8#E/!

!   +&#E/!BR

D98#EJE!

N5K+K8#4 )F 
# "E

-.-

C   J"

-.-

"FFQ&5"4E7$#"Q "FF7 $7H &B? 


P(&

-.-

9%E% DQ435#J!D! .#5

 $#"Q !9" #! F#"2#5!+

5

#2F

* 
C 

#QFE $#" #Q # $#E#K8 9 J"


&
P  PP P&+5"2QE $
"2 J#9&LE7$#35 "2 G 

/ 
P 

96 !$D#"

 $#"Q !9" #! ".#9E 2)!@  .#"2 !96".# / 

 H& ? P(& * 
C 

/ 6
P 

$#Q)56.9

0
0
-.-

0
0

H  .  9E4K& 96'E.#", "FF7>?

'  

 . 9!)' 9

'  

 K8' 56"2*/+

/ 5%DQ#" ".

9%

A0C

$D#" "2 J#9&9  -

 

- >?

AC+

P 6PP P +

 



   

     


 


  

     

 

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).

Assinaturas dos mtodos getServletName (), getMajorVersion() e


getMinorVersion()
!5ON' D

/ .2 9<

9K8 <= <O#Q / #!)' #,&BQ J#

/ #%&(' #

!+

!5ON' D7 9%

/ #@' #

9&#Q& <@#Q&A4  

#!F"Q 9/!+

!5ON' D7 9%

/ #@' #

9&#Q& <@#Q&A 9 

#!F"Q 9/!+

Existem tambm mtodos para a obteno de informaes sobre o servidor em si, tais
como: nome do servidor, que pode ser o prprio nome da mquina na rede
(dependendo de como o servidor foi instalado); a porta onde o servidor recebe as
requisies; e um texto de identificao do servidor, que normalmente contm o nome
e verso do software que implementa o ServletContainer.

Assinaturas dos mtodos getServerInfo (), getServerName() e


getServerPort ()


9&#Q& <@#Q / #!)#.H 9%K /8

!5ON' D

/ .2 9<

/ #%&(' #

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q / #!)#

!5ON' D7 9%

>O8& / !
# )' #&P#3%56#")& <@#Q / #!)#%$I

&

 J#

8

!+

0/& / - ./-
* /
 / -  /. / $/ # 

0/ /"-./- &("-


 e

  devem ser chamados a partir do
Em particular, os mtodos 
objeto da classe     : como cada servidor pode definir diversos servidores
virtuais, atravs de uma tcnica chamada de virtual hosts, necessrio se utilizar o
prprio objeto da requisio para distinguir qual o servidor (virtual) que gerou a
chamada ao servlet. Mais informaes sobre esse recurso de virtual hosts podem ser
encontradas, geralmente, na documentao de servidores Web.
No prximo exemplo, utilizamos os mtodos apresentados anteriormente para construir
uma pgina HTML com todas as informaes conhecidas sobre o servidor, o Servlet e
seu contexto.

Servlet para apresentao de parmetros do servidor


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

* 6F#".#!9%87 9%K+%$ JQG!#"4E7"

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

-.-

"0H DQ# & 9R

H  .  9EDN#G' *%

I2 9
'  

-.-

. F#!

H  .  9E: 9K8!.

. 8#!8

QG %#"4"2NF#J"2#@ E

 . 9!)' 9+?B#28JE#

 <#

H E#9) K DQG JE

 . 9!)' 9 =


&  J#:E

'  

 . 9!)' 9I&E

/ #( E!*)(
/ #( E

H  .  9E: 9K8!.

'  

 . 9!)' 9 

( 

/ #(' #,

/ #%&(' #

#F" JE=*

IH6"25 %!FQE7 #!' 

H 9F#Q<#. & / ). 9<

 <@#Q

/ #!&(' #

9&#2

H  .  9E:.E! #>?BAC

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

- >?BAC, 

 " -21   .$,& ( ),+ +  2 ) $  ) !+! &


4

#" #!5



98#2

&

 (+!P !+

 J#

 <#

!9%K <

/ #F' #Q

(>P!

D!9%8#2F

9&#25,+ <@#Q&A4! ! 

&

<(# / #@' #Q

)#!35#".& <# / ##2IF5

)(J<@# / 
# F' #Q

H 9%8#Q<@#!. 8 / & 9!< <# / #@' #Q

 (

 F#35#"$& <@#Q / #!&#!

QG %#"4"2NF#J

 . 9!)' 9 =


&  J#:E
)(>,P,+

'  

/ #!)6 E!*

/ #%&#! H 9K8/(+P 

'  

-.-

>? A0C

'  
J  .#", 9"2# <@#Q

 . 9!)' 9Q>? AC !+

'  

-.-

#( E!

/ #!)' #&H 9%K  / #%&( E1#Q8#%9%E!">68& / #(' #R

!5ON' D:D' "."

/ #@' #,&  J#

98! 9#!

#!)", !9>

+ <#Q&A 9! 

#!$"2 %9/

(>P!+

Conforme mostramos na seo 3.2 desse livro, uma requisio HTTP recebida por um
Servlet composta de alguns elementos bsicos: mtodo, path, informaes sobre a
verso do protocolo e headers.
A API de Servlets permite que o desenvolvedor acesse todas essas informaes
associadas a cada requisio recebida. Assim, temos de incio as seguintes funes:

Assinaturas dos mtodos associados a captura de informaes de


requisio
!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&P# JQF#* EE

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&P# JQF#!>O"F5

!+

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&A4#Q&*6E/8

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&P#35#"F,"=PH8

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q / D*6#! J#

+

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&I$Q&D'

+

Essas funes permitem recuperar o endereo IP do cliente que gerou a requisio, o


nome da mquina associada a esse endereo IP (se for possvel obter esse nome), e o
mtodo, path, e protocolo e sua verso associados a essa requisio. O protocolo da
requisio pode tambm ser chamado de esquema (= scheme).
Temos, a seguir, um Servlet que imprime essas informaes para cada requisio
recebida.

Servlet que imprime informaes sobre cada requisio recebida


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

H  . J#J 9%K . JQG #"

&*OF

"0H DQ# & 9R

H  .  9EDN#G' *%

I2 9
'  

-.-

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

-.-

" !N$#JDQE7$#35 "2 G7$#D#!N E

/ #!)' #&H 9%K P#37#Q8#9E"0>6& / #' #Q

!5ON' D:D' "."

. F#!

. 8#!8

 . 9!)' 9Q>? AC !+

H  .  9E: 9K8!.

'  

>? A0C

'  
J  .#", 9"2# <@#Q

F#35 "Q G

QG %#"4"2NF#J

 . 9!)' 9, 9E#!$#G7E#J"2567 J;35 96

( 


$#356#"F& <#&P# J8#*

EE%

(+!P!8
'  

 . 9!)' 9 =


&  J#:E#"25 J;Q35 9 (

'  

 . 9!)' 9A

'  

 . 9!)' 9I &*JE.#35 "2 G (

'  

 . 9!)' 9I!)Q&D' JE

'  

 . 9!)' 9 

( 

-.-

#F" JE

 -.

(   F#3%5%#"$& <#&P#3%56#"),"=PH (>P!+

)#!35 ", G %!


F8DQ' E

$#35#"F) <#Q&I$QFD'!

 . 9!)' 9 -

F#35#".& <#&P#! J&#!>O". ,(>P!+

#8ELE7F#35 "2 G   )( 


 F#35#"$& <#&A4#Q&*%E>(+P,+
( 


- >?BAC, 

.#35#"F& <#Q / D*6#! J#

)#!35 ", G %!

(>P!+

H  .  9E:.E! #>?BAC

'  



)(/P!+

'  

 K8' 56"2*/+

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(
#

I

5N' DO! EE6!I"F + >6& / #(' #)P#35#"$


&*)

/ ?

" L)$ &QE"

EJ #" J

9#! .

 .#35#"F 
 >(8& / #!@' #&P#"Q !9" #7  $#"2 !96".# 

"H DQ# & !9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Assim, uma sada possvel para esse Servlet poderia ser:

Exemplo de pgina retornada pelo Servlet ServletInfoReq


>?BAC 
9E#.#GJE#7"Q57

;Q35 9

    @
 
P

&= #:E#"2567 J;Q35 9' D!' *%!")P 


#8E:E7$#35 "2 G! - ?P
A

I&*JE7$#3%56 "2 G %! - ' (F".#(' #QF" -2/ #)#&H 9K+!P%#!3 - ! *& ' P

I!$QFD!' 7E67F#35 "2 G !O*& P


$QFD!' 7E67F#35 "2 G !O>?B?BI -

 #." %7E6

 - 
 

- >?


P

A0C

0 /. / $/# 

  utilizado em nosso exemplo, a API de Servlets disponibiliza


Alm do mtodo  
algumas funes adicionais para a obteno de informao relacionadas ao path da
requisio.

Assinaturas de mtodos adicionais para a obteno de informaes de


path


!9%8# &IQ&*/

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q

!5ON' D

/ .2 9<

>O& / 
# (' #&P#35#"F& <@#Q / #!)' #&IQ&*/

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&IQ&*6H 9K+

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&IQ&*?BF96"2'  F#E/!+

!5ON' D:".8& D



/ ). 9< 
 5K K8#!4>68& " & ' "2 <#Q&P6#35#"F,"=PC+>6+& / #(' #&P#35#"$

0/
(%& /  & 0 /& /"- / 

 .#35#"F + 

0 /. " % (

Os mtodos 
 
 ,

   e
   retornam, respectivamente, o caminho
do contexto, o caminho do Servlet abaixo do contexto, e o restante do path da
requisio (se exclurmos as duas primeiras informaes).
Em particular, no ambiente apresentado no Captulo
2 Instala o e Configura o
desse livro (utilizando o Apache Tomcat), o caminho do contexto equivale ao
 , ou seja, o subdiretrio da aplicao Web.
subdiretrio criado abaixo da pasta
Por outro lado, o caminho do Servlet, corresponde ao mapeamento (servletmapping) que originou a chamada ao Servlet.

/ &"#

/"- / % ( &/


 /"-  /& % ( / 

.- (&# /"- /.#

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).

0 /. &/ $/.# 

  , serve para construir a URL que gerou a requisio ao


A ltima funo,  
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:

Servlet que imprime informaes sobre cada requisio recebida


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

H  . J#J 9%K . JQG #"

&*OF

"0H DQ# & 9R

H  .  9EDN#G' *%

I2 9
'  

-.-

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

-.-

" !N$#JDQE7$#35 "2 G7$#D#!N E

/ #!)' #&H 9%K P#37#Q8#9E"0>6& / #' #Q

!5ON' D:D' "."

. F#!

. 8#!8

 . 9!)' 9Q>? AC !+

H  .  9E: 9K8!.

'  

>? A0C

'  
J  .#", 9"2# <@#Q

F#35 "Q G

QG %#"4"2NF#J

 . 9!)' 9, 9E#!$#G7E#J"2567 J;35 96

( 


$#356#"F& <#&P# J8#*

EE%

(+!P!8
'  

 . 9!)' 9 =


&  J#:E#"25 J;Q35 9 (

'  

 . 9!)' 9A

'  

 . 9!)' 9I &*JE.#35 "2 G (

'  

 . 9!)' 9I!)Q&D' JE

'  

 . 9!)' 9 



F#35#".& <#&P#! J&#!>O". ,(>P!+

#8ELE7F#35 "2 G   )( 


 F#35#"$& <#&A4#Q&*%E>(+P,+

#F" JE

(   F#3%5%#"$& <#&P#3%56#"),"=PH (>P!+

)#!35 ", G %!

( 


.#35#"F& <#Q / D*6#! J#

)#!35 ", G %!

F8DQ' E

( 


)(/P!+

.#35#"F& <#Q&I)Q&D'



(+!P!8
'  

 . 9!)' 9P!+

'  

 . 9!)' 9

  9*6E7D!9%8#2F!

'  

 . 9!)' 9

  9*6E

'  

 . 9!)' 9H 9K+. JQG %#"4QE D 9 "

/ #F' #Q,



( 


F#35#".& <#

!9!&#Q )I &*/,(>P!+

$#356#"F. <# / #!)6' #&I&*/ (+!P!+

E#JD  9*()(



$#35#"F& <#)I &*H 9!K /

(+!P!8
'  

 . 9!)' 9 


(+!P!8

'  

 . 9!)' 9 "=PCBD!  ' #QF


(+!P!8

-.-

  9*64)FE%5M E 

E

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

$#356#"F& <#&I &*!?

$#35 "2 G!

H  .  9E:.E! #>?BAC

'  

( 


- >?BAC, 

.Q9" '  &#E>

>(8& "O& ' "  <#&P#3%5%#"$,"=PC+  .#35#"$

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

-.-.-

I
#

" L)$ &QE"

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 

5N' D

&*OF

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Com essas novas funes, uma possvel sada para esse Servlet passaria a ser:

Exemplo de pgina retornada pelo Servlet ServletInfoReq


>?BAC 
9E#.#GJE#7"Q57

    @
 
P

;Q35 9

&= #:E#"2567 J;Q35 9' D!' *%!")P 


#8E:E7$#35 "2 G! - ?P
A

I&*JE7$#3%56 "2 G %! - ' (F".#(' #QF" -2/ #)#&H 9K+!P%#!3 - ! *& ' P

"235# JE7$#!35 "2 G (*%+) P


$QFD!' 7E67F#35 "2 G !O>?B?BI -

 #." %7E6


P

!P 


  96*:EJD9F#QQ8( - ' @F" #(' #&"

  96*:E
H 9%K . JQG #"

P 

/ #%&(' #, -2/ #)6' #)H 9!K P#3

  96*)$QE5%M E!

  %QI!$Q<@.

 ' #"

"=PCJD!  ' #Q&EJ.#35 " G(*+.  -.-

 - 
 

1


 

% *

D*#

' D' *6"F

 DQ 

   

  %

#!N  "%,' ()" #!)6' #8" .


% ! *& ' P

- ' F".#F' #8" -./ #' #Q.H 9K8P#3 -  *& J' P

A0C

- >?

*  !  +

.)*$   )    + $  ) !+! &


5 

2

P

E6#7D!  96*! -  *!& ' P

E D !9%! "

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.

Exemplo de pgina HTML com formulrio de cadastro


>?BAC 
  PA

A$ !?B>

@ <@ &#L"2#5

.8I

/ #' #D! !96#:"Q5  "

/ 6
C


?

/ ?-

* 

96! J#! PQH & I"(?

?BH &

D!@+#"'B $#QK8#2 E "

& * 3
A +DQF#"

1A



- ' (F".#F' #8" -./ #F' #Q&I%F "2P%#3!

? (
 I  F#Q 

"=C!?

& *
A

9! J#

/ H

   ,PP

  P

H IC 

 I?BH &

 * C("  ,M5'  ,M5'  - I? H & @ I?BH '&

 I?BH &

 * C("  #%)E!#$#!FE6#  - I?BH '&  I? H &

 * C("  #%F

 I?BH &

 * C(" NF9DQQN!$9D  - I?BH &  I? H '&

#!' *% !$O#!. J#' * -

I,?

H &

 *C " + JF#' ! JF#!'   - I? H & 


 * C " 8 F#8 Q .#8 - I? H & 

 
?  !PP

-./ 
C

H &BI "(?

? (
 I  "25N  & 
* A



 * C)" ! 69(  !

#!9

 -  PA 
 - 
 

- >?

A0C

Nesse formulrio, existem 3 parmetros que sero enviados junto com a requisio ao
,
e . Em particular, o parmetro
servidor quando clicamos no boto Enviar:
pode estar associado a mais de um valor, dependendo de quantas cores forem
selecionados pelo usurio que visitar essa pgina.

% (&* / ')( - /# /%&

')( - /#

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:

Mtodos para a captura de parmetros de formulrios HTML


!5ON' D

/ .2 9<

!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q&I!) J#Q&#

/ &2 9<

1>68& / #(' #&P#35#"$& <#&I$ J#Q8# 



' 5#"

!) #Q8#

!5ON' D7  5& '  95 J#F & !9>68& / #' #Q&P6#35#"$& <O#&I$ J#Q8#
!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q

5#

/ &2 9<



/ ). 9<

&

&

 J#+

. J#8# B
&  J# +

 J#"

,+

8

O primeiro mtodo para a obteno de parmetros da requisio o mtodo



  : ele recebe um nome de parmetro e retorna o valor associado a esse nome
de parmetro.

0/ "- .* /& /"-

Por outro lado, conforme vimos no formulrio de exemplo da seo anterior, podem
existir campos com diversos valores associados a um mesmo nome (vide campo
do


 , que ir retornar no
exemplo). Nesses casos, devemos utilizar o mtodo 
um nico valor, mas sim um array de valores.

0 /&  - * /./-  $/&#

'("- /&#

0/  -.* /./"- * /#


 , retorna uma lista enumerada com todos os nomes
O mtodo seguinte, 
de parmetros recebidos. Dessa forma, possvel iterar nessa lista e obter os respectivos
valores de parmetros.

0 /. $/ - - %"0

Por fim, o ltimo mtodo,     , retorna justamente o texto da query explicado


na seo anterior, ou seja, a parte do path de requisio que vem aps o caractere
(se existir).

/"- /& &- &* # /

  usa os mtodos apresentados anteriormente para capturar os


O Servlet   
parmetros enviados pelo usurio e apresent-los em sua sada
Servlet que imprime parmetros de cada requisio recebida
    
   5!) '  ,
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

H  . J#J   J#)F"

!5ON' D:D' "."

&*OF

"0H DQ# & 9R

H  .  9EDN#G' *%

I2 9
'  

-.-

'  
J  .#", 9"2# <@#Q

. F#!

H  .  9EJ&# &E

'  

-$-




H  .  9E

&

%!

/ & 9<

'  $

 ' 5#

 J#

=

 !$ 9&' 98I  J#&F 

'  

 !$ 9&' 9

'

FE!"4!"

!)
?

 ' 5#"
E"

(+P!+

/ & 9<

!+

&BQ J#"Q 9#2 ' #! J#95+

$#35#"F& <#&IF J#QF#!  '  !)


'

$

'  !)

!' F#": !$:

7 

&

K!1H

 

 '  

(/P!+

! J#Q.F7D..#98#

$#35#"F& <#&IF J#8#! 

+

 !' 5#"2 ' #!9<&*6H (( R


 . 98'  $

 . 9 (

0
 !$ 9&' 9!P,+

0
H  .  9E:.E! #>?BAC

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

- >?BAC, 

'  F!

&= J#+

 J#<(+P!+

 ' 5#

 ' 5#"39 J95' ' 

#%' "2#'  

.#35#"F& <#Q&I) J#8# B


&  L#"

"!' %)#!"*

K8 8 9H =6H Q'  !)

'  

56#!

' 

)(

 ' !* )(

H  .  9E

K!+'  F

$#35#"F& <#Q

/ & 9!<B'  F

J 

'  

 !$ 9,

9%! #

&



J 

 J#"

'  $

'  

( 


&=Q J#"Q *"2A4!F# ' # #!9F" !BR

$

/ & 9<

5##$)

E"0   J#)F"

#"

& !9'  $

/ & 9<

-$-

5#

#Q 8JE!

H F#!$9E796"9!

* ' # +' 

-.-

. 8#!8

5##$ / &. 9<>!9 :


 965' '

 !$ 9&' 9 ?

95 J#.

>? A0C

 . 9!)' 9Q>? AC !+

K"1  F#35#"$& <@#Q

-.-

>O8& / #!)' #R

"2P#3J#2F#!9E6"

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

-.-

F#35 "2 G F#D#N E6

E#JDE

/ #!)' #&IF

 ' 5#" H !+

 ' 5#" H !+

' 5#" + '  $

&

, J#+

-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

I
#

 E7E6!I"F + >6& / #(' #)P#35#"$ 

5N' D

&*OF

" L)$ &QE"

/ ?

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Se utilizarmos o formulrio apresentado na seo anterior para enviar informaes para


esse Servlet, uma sada possvel seria:

Exemplo de pgina retornada pelo Servlet ServletInfoReq


>?BAC 
I  #&. 96! J# P

 


E"4!"4' .#" 

?

'  6
 #!569! J#!P
#!59%! J# P

I  #&. D$#"P

 


'  %
 M5O' P

E"4!"4' .#" 
 M5' #FE#P
?

I  #&. #9P

 

?

' 

 9  !P

E"4!"4' .#"

 - 
 

- >?

 O9  P 

A0C

Frequentemente, quando voc quiser adicionar interatividade a sua aplicao Web,


permitindo que o usurio envie dados ao servidor, voc ir utilizar formulrios HTML, e
por isso, muito importante que voc domine os mtodos apresentados nessa seo.

 
)'$ ) + $  ) ,! + ! & 


0

55

>8

Assim como acontece na resposta de um Servlet, a requisio recebida tambm pode


conter headers. Esses headers podem servir para indicar, por exemplo, caractersticas
sobre o cliente que gerou a requisio.

Mtodos para a captura de informaes de headers da requisio


!5ON' D

/ .2 9<

!5ON' D7' 9<


!5ON' D7 9%

>O& / #(' #&P#35#"F& <@#Q&> #QE#

/ &2 9<



>(8& / #!(' #&P#35#"F& <#@ 8#>O#E!#  / &. 9<


>O8& / !
# )' #&P#3%56#")& <@#Q&H 9%&>O#QE6#!

/ & 9<

*#QE#

 J# +

&

 J# +

 *%#E# B
&  J# +

!5ON' D7  5& '  95 J#F & !9>68& / #' #Q&P6#35#"$& <O#&>O#QE#F"
!5ON' D7  5& '  95 J#F & !9>68& / #' #Q&P6#35#"$& <O#&>O#QE#

0/. /  /- 0/   / /  /-

&

 *6#QE#


&

0/& %. "/& / -



/ & 9<
 J#"

*%#!QE#

&

 J# +

+

Os mtodos   ,    e    servem para recuperar o contedo de um


header e se comportam de maneira anloga aos respectivos mtodos

 
apresentados na seo 4.2 desse livro: o mtodo    recupera o contedo de
um header contendo uma data, e o mtodo    recupera o contedo de um
header contendo um nmero inteiro.

0 /. /  /-#

0/.
/ &/" / 0/ %  "/& &/"-

#)/! ! /" / -

O mtodo


 , por sua vez, permite obter todos os valores associados a um
determinado header: caso voc saiba de antemo que um header ir ter diversos
valores associados, voc deve utilizar esse mtodo para garantir a recuperao de
todos esses valores.

0/& /& ./"- * /#

 retorna uma lista enumerada de todos os nomes de


Por fim, o mtodo  
headers recebidos. Com isso, voc pode usar essa funo para iterar na lista de todos
os headers recebidos.

$# /- .0 /%&

Um uso frequente para esses mtodos o de verificao do header 


, que indica
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
a seguir verifica o contedo desse header e,
pelo cliente. O Servlet   
dependendo de seu valor, retorna uma pgina de saudao em formato HTML ou
WML; dessa forma, ele pode ser usado tanto para atender requisies de browsers
normais da Internet, como tambm para atender requisies de browsers de telefones
celulares (vide seo 4.3).

/ -  /.
/- '.'/  

Servlet ServletVerAccept
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

 #. K DQJJ%' ! E6

-.-

5&

DQD#! 

*6#QE#

B#

$#8.96: ; <= 9:>(?

AC

ACLE#! #9E#!9EJE#".#5D98# 
 E
/ #!)' # 

!5ON' D:D' "."

#,*1DDQ# 

#Q8#%9%E!">68& / #(' #R

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".

I2 9

-.-

. F#!

'  
J  .#", 9"2# <@#Q

 #. K DQ9E7D!9%8# EJE


'  QDD#! &>O#QE#

/ &2 9<

$#35#"F& <#Q&> #QE#

'  

DQ9&# 
 E=

 !$ 9&' 9! Q


  'QO#%)", !9

'  

 !$ 9&' 9!9

"%

&*!+& ( -.-

QDDQ# 

,+

ALC!6 . J# F:8# "

98#9 ?$ #! 8#  - 9E

O# ! "1<@#F "

-$-

!

'  QDD# &>@#QE#!. #3%5%' " 8#2 - 696E

LD' #98# QD# &:D!9%8# 6E!$

 .#", !9%"2# " #Q

. 8#!8

*#E#!4QDD#% 

J 

9 :9O5' '  

K"'  QDDQ# Q.>O#E!#


-$-

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# &*OF

 !

 

35#JE#K 9 

' !+

AC

 %'
  %   ,+

  ? (I ! 'I " !CH  '%  - - 7* I


P "=A -F- ?-+


 K+! 5 J < - @?  -
' 

  ' % ,+
'  DQFE

'  

 !$ 9,!

'  

 !$ 9,!Q L!' <(9'% DQ#98#,%',@ ' ; - !+

'  

 !$ 9,! - DQFE

 -

' ,=R

DQ9&#9  (
$ #

!+
' ,8

0
#' " #

R
-$-

D' #!9!&#79 7D# F:D98# 


 E

'  

 !$ 9&' 9!Q>@? A0C ,+

'  

 !$ 9&' 9!QI@

'  

 !$ 9&' 9!

0
'  

 K8' 56"2*/+

' ; - I!+

 

- >?

AC! 

AC<@#!$ J"5 J: ; <= 97>?

AC



-F- (& %

"H !,D#! & !9R

 *  $ ) $  !   +


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.

Exemplo de pgina HTML com formulrio para upload de arquivo


>?BAC 
!? >. .8I / ?- * 
&  ? (I + 5' &  -

 PA
A

H & - ' .".#(' #&" - / #F' #," ' QE*F3 K8!

+E&!

/ #!' #D !96#:.35 ! P

QH &BI"(?

H &
I "@?

& * 3
A +#!9!6   * (
C " , 9 @!

? (
 I  ",56N  

? (
 I  K ' #& 
* A

+$3!5O !PP

 -  PA 
  
-

A0C

- >?

 - &$  (

Nesse formulrio de exemplo, o campo   do tipo #  ; esse campo permite que seja
selecionado um arquivo do disco local que ser enviado junto com a requisio. Vale a
pena observar tambm que existe um atributo adicional      , com contedo
! ,

  , que deve ser especificado junto ao elemento   .

* $  &-  ( -* &

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


  

pelo formulrio HTML do exemplo anterior.

Servlet ServletUploadArq
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

 *& ! 5& ' "2 5' & %)F#35#"F& / #!)' #Q&A5' & F&P#35#"$&
 *& ! 5& ' "2 5' & %)F#35#"F& A5' & F&P%#35#"$&

-.?

$ &:$35 %"1..9"$K8#! E"


/ #!)' #,"= ' QE*

!5ON' D:D' "."

EJD!' #98# !$:".#)6 E!

F3# &#9E"

>O& / #F' #Q

 E7E6!I"F + >6& / #(' #)P#35#"$ 

5N' D

&*OF

I2 9

"0H DQ# & 9R

. F#!

'  
J  .#", 9"2# <@#Q

NQF#!9E 9%K

-.-

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

. 8#!8

. JG !#!"4".N.#J!F35O JD!$.#<(QE

-.-

-.-

8#!  .;$ 

. J#! $7   #&.&#7$#3%56 "2 G % 6".#<(59E&#

-.-

J8#FD# $&#J& J!9*67 J; ! L:# N$8#"0 %#!.  & E"'#356F8 E!#

-.-

E#K8 9O 

9! J#JE#

5

E $#Q 2 

E#Q# 1" #!@$ ,M#9QE"="=$35 %"=D!.$#Q<@QE!"=96 " #!) E

!96E!#

#!9DE 9<

J"2#05!) ' M!QE! #' 

A5' & )P%#35#")'  F" #!

!F" #!+JE#K 5' )#>&H /

 9%#
/ #!)' #&A:5' & )P%#35#") + 
7
   %%.&#  !A:5' & )&P#35#"F& A *  P *  6? / 95' ' 

  
,

.#35#"$

/ &2 9<

-.-

'  9 J#*

.3/J'  F"2#2 <#".#  ' #!9% :#+)3%56 !+ -$-

?  J9*6E$3%56 

/ &2 9<

' =8 &*

-.-

&

-.-

.35 F#!

-.-

D' Q"2" #

F3>JC9<( 8 / &. 9< + '  !F".#. <#  ' # / M!#  !F35 %,+

! J#7' DQ!'6EJ!F35 !6D98#E:E$35 O:D2F#<E

/ &2 9<

-.-

'  9 J#*

$".#. <@#Q O ' # F35 %,+

.3CDQ!' 7
 '  $3CD'  <#Q,& 
#

+

A0C

 . 9!)' 9Q>? AC !+

H  .  9E: 9K8!.

QG %#"4"2NF#J!$35 F#D#N E

'  

 . 9!)' 9 =


&  J#:E.35 !

'  

 . 9!)' 9+?BQ J9*E$35 O!

'  

 . 9!)' 9 =


&  J#BE!F35 :8#  F;2 

-.-

5

/ #F' #Q&A:5' & &P6#35#"F

H  .  9E:*#E#!4>(?

'  

#J<=FQE!J#!

.;. ' DQ!'6!N Q7EE .# ! J#"2 #D! K& DQE9JD9"$&.5%8!4E

 ' #' =!F3CDQ!' :


 '

-.-

&= J#:E67F35 %

)(

'  9! J#*

F3/(>P,+

' @F $*F3/(>P 


' D'

 (

'

9 J#*)3%C%D'

(>P

H  .  9E:.E! #>?BAC

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

- >?BAC,+

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.

Mtodos para definir / recuperar atributos da requisio


!5ON' D

/ .2 9<

>O& / #(' #&P#35#"F& <@#Q* +.. N5%8#  / ). 9<

=Q+)$ N58# &  J#

!5ON' D75) '  95 L#!$ & 9J>O8& / !


# )' #&P#3!56#")& <O#Q!*B+.. N5F#!& 
 J#"
!5ON' D! E

>O& / #F' #&P#35#"F& ".#Q,* &2 N58#  / & 9<

+

,+

  8& N58# &BQ J#



N #D =+). N!5%8# 

' 5%#

8

Embora estejamos falando desses mtodos pela primeira vez nesse captulo, exemplos e
uma explicao mais detalhada de seu uso sero apresentados no Cap tulo 8
Modelo MVC.

 



   

    


 


Nesse captulo so explorados os conceitos de Cookies e Sesses: atravs dessas


tcnicas, veremos como possvel armazenar informaes sobre os usurios que
utilizam nossas aplicaes.

'   .$ ')*- $*-


 ! - 1   .$ &
(*) +  '+  ! 


Como explicamos na seo 3.2, o HTTP um protoloco stateless, ou seja, ele no


mantm um histrico das requisies recebidas de um mesmo cliente.
Assim, imaginando uma aplicao simples como um carrinho de compras de uma
livraria virtual, por exemplo, como devemos proceder para manter o histrico dos livros
j selecionados pelo nosso cliente? Se a seleo de cada livro gera 1 ou mais
requisies, no momento do fechamento da compra, como fazemos para saber quais
foram todos os livros selecionados?
Existem algumas maneiras diferentes de resolver esse problema, de maneira a contornar
essa limitao do protocolo HTTP, como veremos a seguir.

'  $   + ) + # -


!  + )


1

&




  ! +
2


5 

Alm dos tipos de campos de formulrios HTML apresentados na seo 5.3 desse livro,
existe tambm um tipo, chamado hidden, que pode ser usado para esconder
parmetros da requisio.
Na pgina HTML seguinte, o campo

'(% .("- do tipo hidden.




Exemplo de formulrio HTML com campo hidden


>?BAC 
 PA


A= !?
>

98E!

.8I
E#

/ ?

* 

H &
?

)#!35 ", G %#"(

H &
I "@?

? (
 I * EE#!9&

H &
I "@?

? (
 I  ",56N  

 -

' @F" #!)' #8" -./ #!)' #Q

98E%$P#3 -

,

P
+DQ98QE

& * 3
A  *B)5' M

 * C("   !PP


 *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
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

96 J#!FJE#

%9!&:

/ #!)' #

!5ON' D:D' "."

F#3%5O " G #"0$#!D#!N E"

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

I2 9

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

. F#!

. 8#!8

*B)5' M9%E:D98E! !FJD' #!9%8#JD.$#!9F#  E#"2"$7.#35 "2 G 

-.-.-

  )& D56'  "2##"."

-.-

J!' 

-.-

DQ9&QE

6. J# )7F#35 "Q G7$#D#!N E

K84

  J#)F/DQ%9!8E!@#

E

D! J' 

9%' BDQ98E!
)

E#JDE!JD!' #98#

98E!2P%#3J#Q8#9E">68& / #%&(' #R

965' #96#" ".#DQ" 

96 D ' M J"

=

R
' =D!9FQE!7H 98#<(#. $".#H 9!+  $#35#".& <#&I. J#8#%

((
0

D&D*

+D9&QE ,+

' BDQ!9%8E! 

&

5 N#! . J  QDQ# ) 9 =# R

' =D!9FQE!

B

0
-.-.-

F#".#!9%89ELJ' !4E7D%9!&QE
#%$  & 

'  

96D.# J#!98JE

#JK8! 5' ;!. 7>(?

A0CJ35# F;

J#"2 J

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9


/ #F' #Q

'  

PA

!9!&QE!

 . 9!)' 9QH & I "(?

!? >   % I
% !

/ ?

%' * 
?

H &

- ' .".#(' #Q&"

!9!&QE.P#3 -

 . 9!)' 9 


(P,+

'  

'  

E#

? =
 I

$#35O "2 G #"

 %

&* EE6#!9%

H 9%8#Q<@#!. 8 / & 9!<+' =D!9FQE!


 . 9!)' 9QH & I "(?

? =
 I

 %

(H 98#<#!

 8 / & 9!<+' =D!9FQE!

& * A '% D9&QE,%'  *C(" @% ,


 %!PP 

 (

8" 5N  %

& *
A

@% * &5' M %

 * C("  % * &5%!' M% !


'  

 . 9!)' 9 -

 PA !+

'  

 . 9!)' 9 -

 -.

'  

 K8' 56"2*/+

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

/ -  /
(%& .(- /

' (%. ($.  -

   anterior usa o campo escondido



O Servlet   
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.

'  - 1   .$,& ( ),+ $ !"#%!  -'$,! + , )# $.! - 3





1

Outra forma de armazenar / passar informaes entre requisies subsequentes de um


mesmo cliente utilizando as informaes adicionais de caminho.

/-  /& (%  &(- &/

   da seo anterior, por exemplo, poderia ser modificado para


O Servlet   
passar o valor atual do contador como uma informao adicional do caminho.

Servlet ServletContadorReqMod
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

96 J#!FJE#

%9!&:

!5ON' D:D' "."

/ #!)' #

F#3%5O " G #"0$#!D#!N E"

98E!2P%#3A4EJ# &#9E"

E#JDE!JD!' #98#
>(8& / #!(' #R

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

I2 9

"0H DQ# & 9R

. F#!

'  
J  .#", 9"2# <@#Q

Q&$ 9EJ 9%K

-.-

. JQG #"

/ &2 9<

'  9!K I &*/ 

K"

+' 

9K+!IQ&*/9 :
 965' '

+' 

9K+!IQ&*6 ' #9<&*/

. 8#!8

E D !9%! "4E#7D!  96*

F#35#"$& <O#&I &*OH 9K+

  

,+

'  9K8!IQ&*6 "FF&"

  '  9K8I )*/:' 

)* -

,

9K+!I &*O "256N")&. 9%<



-.-

*B)5' M9%E:D98E! !FJD' #!9%8#JD.$#!9F#  E#"2"$7.#35 "2 G 

-.-

  )& D56'  "2##"." K84 6. J# )7F#35 "Q G7$#D#!N EJO'  E
!  #Q&$  D!9%8QE # 965' #O9#"."2#JDQ"  9O D ' M J" D9FQE!
DQ J!'   

-.-.-

9%' BDQ98E!
)

=

R
' =D!9FQE!7H 98#<(#. $".#H 9!+'  9%K+!I &*+

((
0

D&D*

' BDQ!9%8E! 

&

5 N#! . J  QDQ# ) 9 =# R

' =D!9FQE!

B

-.-.-

F#".#!9%89ELJ' !4E7D%9!&QE
#%$  & 

'  

96D.# J#!98JE

#JK8! 5' ;!. 7>(?

A0CJ35# F;

J#"2 J

 . 9!)' 9Q>? AC !+


 . 9!)' 9  !9!&QE!
(+!PP  !+

'  

'  

 . 9!)' 9

>@P

E#

 %' -

$#35O "2 G #"

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

H 9%8#Q<@#!. 8 / & 9<.+'  DQ9&QE

 9FQE!.P%#3A4E
 %!@*B&56' M  - * !+

' ()!"$#!)6' #8" -2/ #(' #

H 9%8#Q<@#!. 8 / & 9!<+' =D!9FQE!

'  

 (

 (

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

'

Em relao a utilizao de campos escondidos, essa tcnica possui a vantagem de


simplificar um pouco a construo de seus Servlets. Por outro lado, ela no resolve os
problemas apontados anteriormente com relao a perda dos parmetros definidos.

! ),+





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
 
 



 ), que contm sua especificao.

  ! ."#,! / ! ("- 0  - ' - ' ! *

Por outro lado, vale a pena conhecer os principais atributos de um Cookie; alm de um
nome, que identifica o Cookie para um determinado servidor e path nesse servidor, e o
valor, que contm os dados em si, um Cookie possui tambm alguns atributos
adicionais:

3
3

Comentrio (Comment): deve conter um texto descrevendo o propsito e funo


do Cookie;
Perodo de expirao (MaxAge): determina por quanto tempo (em segundos) o
Cookie ser vlido;
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);

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.

    ! # /-  /.!   ! (&(&+ /

Mtodos para definir / recuperar os principais atributos do Cookie


!5ON' D

/ .2 9<<(#,&  J#

!5ON' D

/ .2 9<<(# 

!5ON' D! E"2# 


!5ON' D

/ .2 9<<(#

!5ON' D! E"2#


!5ON' D

,+

' 5#/8

' 56#  / &. 9<

=' 5#+



!  J#!9!

!  J#!9!  / &
 $ 9<

!5ON' D! E"2# ! J 9 / )$ 9<


!5ON' D

BDQ!  J#9+

/ .2 9<<(#O  9&!+


=E J 9+

/ .2 9<<(#&IQ&*/

!5ON' D! E"2#&IQ&* / &$ 9<


!5ON' D7 9%B<(#&A4 *B<#

 % &*8



!5ON' D! E"2#&A4Q@*B<(#+ 9

 J B
* <@# +

Para usar um Cookie, primeiro devemos cri-lo, passando como parmetros de seu
construtor o nome e valor do Cookie, e, em seguida, devemos definir seus atributos.
para que seja
Finalmente, o Cookie deve ser adicionado ao objeto   
enviado para o browser do usurio.

 / -  /. /&#) (%&# /

Exemplo de cdigo com definio de Cookie




 
 #' =D  #/796#

' =D 
 # ".#

  J#!9

' =D 
 # ".#&A4
 .#", 9"2# QEE

 
 #

98QE6!

 #:E6#7##!  ' 

  +
-

&#"F&#+

*B<#    +

 # +' BDQ #+

( %. .( -

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
no houver nenhum Cookie na requisio recebida, ou um Array com os Cookies
recebidos.

0 /
(.(&+ /#

 /"- / / $/#)

%$

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.


("%. .("

Exemplo de cdigo para obteno de um Cookie




 
 #

' =D #"3J  F#35#".& <#

 
 #"

!+

H K!+' =D #"39 :


 965' ' 
=O '  DQ !
 #"Q ' #!9<O&*

K8 + 9

((

K"'  DQ 
 #" + + <#&  J#

9 :95O' '   


,  98QE !,

!+ #3%5%' "


$

.

R
' =D98QE

DQ 
 #" + + <#&  J#

+' 

JH 9%8#Q<@#!. $".#!H 9+' 

 &B5 N#!

DQFD*

' =D98QE

DQ 
 #" + <# 

' 5#/8

6!. J  %QDQ#% & !9 =# B


 R

 B

Com os mtodos e recursos apresentados, podemos reimplementar nosso Servlet



 
   da seguinte forma:

/-  /
(%. .( - &/

Reimplementao do Servlet ServletContadorReq


    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

96 J#!FJE#

%9!&:

!5ON' D:D' "."


5N' D

/ #!)' #

F#3%5O " G #"0$#!D#!N E"

O#K

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

-.-

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

CQ".,AE K8 #E

;65'
 
/ 
$ ".8#

    

A0?-!+

 D52)#!9&?B J#A ' ' "

!+

*B)5' M9%E:D98E! !FJD' #!9%8#JD.$#!9F#  E#"2"$7.#35 "2 G 

-.-

  )& D56'  "2##"."

-.-

J!' 

-.-

DQ9&QE

-.-



-.-

F#D#N E"

E#JDE!JD!' #98#

98E!2P%#3J#Q8#9E">68& / #%&(' #R

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#
&*OF

-.-

D! J' 

/ 
 6FD5. J"
D



 #

K84

6. J# )7F#35 "Q G7$#D#!N E

  J#)F/DQ%9!8E!@#

E

J' 

K"+'  DQ 
 #"
K8  9

96 D ' M J"

EJD9FQE!

#!9%&.#J"0DQ 
 #"

F#35 "Q G

'  DQ #"3J  )#!35#".& <#

9%' BDQ98E

965' #96#" ".#DQ" 

 
 #"3+

 B

9 L95' ' 


 Q
 ' BD 
 #"2 ' #!9%<&* ((

K",+' BDQ! 
 #" +  <#&  J#

,+ #35' " 

9 :965' '  


!,

98QE

' BDQ!  #"

+  <#&  J#

)

R
' =D98E!

JH 9%8#Q<@#!

' =D98E!

((

DQQFD*

 &B5 JN#!

' =D98E!

 $".#!H 9+'  DQ #" + + <@#Q 



' 5%#

6!$ J  
QDQ# Q. 9 =# R

 B

0
-.-

5FE9E:JO' 
 #

' =D 
 #

' =D 
 # " #Q

!  J#!9!

' =D 
 # " #Q&A4 *B<#
 $#"Q 9" #! EE

-.-

'  

 

 #

!9%8QE!

#

 #JDQ DQ9&QE




 

 +


5

H 98#<(#. 8


%.

/ #F' #Q

 !' EQE#/

-.-

 
 #

/ & 9<+'  DQ9&QE

 @"

+

%9!&QE.P#3+

#Q<(59%E!"

 =  958"


*!)"3

E 

 
 # +' =DQ #+

F#".#!9%89ELJ' !4E7D%9!&QE

I2 9
'  

D% F#98#JEDQ9&QE

J9#

. F#!

'  
J  .#", 9"2# <@#Q

. 8#!8

 . 9!)' 9Q>? AC !+


 . 9!)' 9  !9!&QE!
(+!PP  !+

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

E#

$#35O "2 G #"

 (

H 9%8#Q<@#!. 8 / & 9<.+'  DQ9&QE

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Nessa nova implementao do Servlet, vale a pena observar que no necessrio que
o usurio de nossa aplicao clique em nada para que o contador seja atualizado,
basta que ele recarregue a pgina. At mesmo se o usurio visitar outra pgina e
depois voltar para o endereo desse Servlet, o contador incrementado.
Infelizmente, existem situaes em que Cookies no funcionam: geralmente isso
acontece quando o browser do usurio est configurado explicitamente para no
aceitar Cookies. Com as crescentes preocupaes em torno da privacidade de quem
navega na Internet, alguns usurio passaram a bloquear o armazenamento de Cookies
em seus browsers.

'  )  ) -'# !"$ ) -   , ) + ),+ +%(*),+




A API de Servlets disponibiliza um mdulo extremamente til no controle de informaes


associadas ao usurio que acessa nossa aplicao: o mdulo de gerenciamento de
sesses de usurios.
Basicamente, esse mdulo funciona da seguinte forma: a primeira vez que o usurio
acessa nossa aplicao, criado para ele um identificador de sesso, ao qual
associado um objeto da classe
na memria do servidor de





aplicaes. A partir da, o servidor de aplicaes procura fazer com que todas as

  &! #)/"-  /&!   &!   /# # ( %

requisies vindas daquele usurio carreguem esse identificador de sesso, seja atravs
da definio de Cookies, ou atravs da reescrita das URLs (com informaes adicionais
de caminho) para que incorporem essa informao. Recebido esse identificador, a API
automaticamente disponibiliza para o Servlet o objeto
  criado anteriormente.

  /# # (%


 /.# # (% em memria para armazenar

Dessa forma, um Servlet pode utilizar esse objeto  


informaes que queira associar a um usurio especfico que acessa a aplicao. Essas
informaes estaro disponveis em todas as requisies posteriores recebidas no s
pelo Servlet que as armazenou, mas tambm para todos os Servlets que
compartilharem do mesmo contexto.

 /&# # ("%

Para obter uma referncia ao objeto dessa classe


  , um Servlet deve utilizar o
mtodo
da classe
   
; esse mtodo possui, na verdade, duas



assinaturas.

0 / /# # (%

  /"- /. / &$ /&#

Assinaturas para o mtodo getSession () da classe HttpServletRequest


!5ON' D7  ! ".#' #Q. *+& 6 >6+& / #" "2 9L<# / #".", !9, 
!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:

Primeira alternativa de cdigo para obteno do objeto HttpSession


para a sesso corrente
>O+& / #!"$"2 !9' ="2#"."Q 9/7 

F#35#"$& <O# / #".", !9 K8' " #



K!+' ="2#"2" 9/9 J95' ' 


R
-.?

. 8 J#!98JEJ!N #8JD

" #!"$" 

0
#%' "2#
R
-.-/ #!"$"  9E79 %:K8 OD!. QE#

9#DQ#"2"$;!. :" #D2 5 J:96Q:" #" " %!

0 /. /&# # (%

O cdigo anterior utiliza a segunda assinatura do mtodo    para obter a sesso


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 


K!+' ="2#"2" 9 "

& #

F#35#"$& <O# / #".", !9+

!

"= J79%:"

-.-



#"." JDQ!N5JE#J"2#

D! E6D E <@

*%Q :"Q E67D. QE:#!

5 J:.#35 " G79&#2 ! 

..FQ8

#"." #DQ" 

0
#%' "2#
R
-.-.-



" #" " 

D E <@

;

..FQ8

#"." #!5%&.JD".

#/

No cdigo anterior, podemos observar tambm a utilizao de um mtodo   da


classe   : esse mtodo indica se o identificador da sesso j foi enviado para o
browser cliente ou no (ou seja, se a sesso acabou de ser criada). Alm desse
mtodo, a classe  # oferece diversos outros mtodos:

 /#)# ("%

  /# # (%

Mtodos da classe HttpSession


!5ON' D! E"2#* +.. N58#  / )$ 9<

=+). N58# &= J# N #D    8& N58# 

!5ON' D= N #D  <@#* +). N58# / &$ 9<


!5ON' D! E

.# %#*B8& N58# / ). 9<

 Q+.. N5%8#!&  J# +

!5ON' D7  5& '  95 J#F & !9L<#!*B&. N!5!8#!&  J#"
!5ON' D

' 5#+

B 8& N58# &B :#+

8

/ .2 9<<(#&H E>8

!5ON' D7' 9<<@#

F#Q& !9?B J#

,+

!5ON' D7' 9<<@#&C"F*1DDQ#"." #E%? J#



Os primeiros quatro mtodos apresentados permitem gerenciar os objetos que


queremos associar a sesso do usurio de forma similar a manipulao de uma
Hashtable. Dessa forma, para cada objeto que queremos armazenar na sesso HTTP,
ns devemos associar um nome de atributo, e manipular o objeto como valor desse
atributo.

("%. .("-

Assim, se quisermos definir um atributo de sesso de nome   , contendo o valor do


contador de requisies usados nos Servlets   
   , podemos utilizar o seguinte
trecho de cdigo:

/-  /
(%. .( - &/

Cdigo com exemplo de definio de atributo de sesso


>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:

Cdigo com exemplo de recuperao de atributo de sesso


>O+& / #!"$"2 !9' ="2#"." Q/7  $#3O5#"$& <# / #!"$"2 !9 ..5# +
H 9%8#Q<@#!

' =D!9FQE!.H 9 &+H 9%8#Q<@#!

 '=
 "

#" ".Q <@#Q*

+). N!5%8# 

9&QE

!+

0/

0/& -/   (% * /

0/&  # 
' '/.# #/ * /

Os trs mtodos seguintes,


retornam,
   ,  ,    e 
 (
 ,
respectivamente, o identificador dessa sesso, o instante de criao da sesso e o
instante de ltimo acesso do usurio com a sesso corrente (esses dois ltimos valores
em milisegundos, desde 1 de janeiro de 1970 GMT).
O Servlet a seguir utiliza os mtodos apresentados anteriormente para construir uma
pgina HTML com todas as informaes sobre a sesso corrente do usurio:

Servlet ServletInfoSessao
    
   5!) '  ,
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

" !N$#J7".#" " JD F#98#JE

H  . J#J 9%K . JQG #"

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

-.-

O#K

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

D*6#! 

H  .  9E:*#E#!4>(?

I2 9
'  

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

 $#"Q 9" #! " #Q  &#>O#!QE#

-.-

56"25;. 

/ #!)' #&H 9%K  / #!"$"2QJ#Q8#%9%E!">68& / #!)(' #R

!5ON' D:D' "."

CQ".,AE K8 #E

/ 
$ ".8#

    

A0?-!+

 D52)#!9&?B J#A ' ' "

!+

A0C

'  
J  .#", 9"2# <@#Q

. F#!

;65'
 

. 8#!8

 . 9!)' 9Q>? AC !+

N8#9E7 9K8. QG

-.-

" !N6F#7"$#!"$" D! .#9&#JE5",5%;. 

%#"

>O+& / 
# ".", !9'  "$#!"$"2Q/ 
K"9 ' =" #" ".! "

& #

F#35#"$& <O# / #".", !9 ..5#8

,

R
'  

 !$ 9&' 98H 

'  

'  " #" ". <@#Q&H E/(>P

 !$ 9&' 98H 9"F8!9!8#:E#D G  E1"2#"2" 

C6!9!<( 8 / .. 9!<+' =" #"." Q <#

'  

 !$ 9&' 98H 9"F8!9!8#:E#

F#Q& 9%?

' & D#"."




C6!9!<( 8 / .. 9!<B' =" #" ".! <#Q&C6Q"F,*

695 J#!$

EJ"2#"2" !.)(

& 9'  9 J#"* & N"

J' 

,+

+#!   ' ".#Q<@59E"E#"


! (>!
 P !+

' "$#<59%E" %
 E#" E#7# D*

#! 

DDQ#"2".#E!?B J#

#9&"

 

! (>!P!+

".#"." Q <#*B8& N58#(&  J#"

*O ' # B'  9 J#"* & N"2 *Q"2A4F# 6' #!

E# # D*

J#



,

R
'  9 J#* &$ N/& / & 9!<B'  9%! J#"*B). N"2 96#Q  
' #! J#9 !+

/ &2 9<

N #D


' B!N / #".".

K"' =N / #" ".Q


'  

 . 9.' 9

* &
#' " #

'  

&

N5%8!

Q! <#!*B+). N58#+'  9%! J#*B& N+

N5%8

 J#:E#&* .. N58(

 (+

 !$ 9&' 9

* &
0

J' ="2#"."

9".896DQ#QK Q! ' 9<= / &2 9%<

'

9 J#*B). N/(>,

 !'  E#

/ ). 9<B' =!N6 / #"." Q/(>P+

& ! J#LE!#&*B.. N!5!&!!)( ' 


 N #QF 9 % / ). 9<.!P!+

96! J#* &. N/(>!

 

!' !

E#

0
'  

#' " #

-.-

 . 9&' 9

&

Q" #" " D E 9 P 

QF#!>?BAC

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

/ ?

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

A outra caracterstica importante desse mdulo de gerenciamento de sesses que


ele permite que sesses criadas automaticamente expirem aps um determinado
tempo de inatividade. Obviamente, o desenvolvedor tambm pode expirar uma sesso
explicitamente atravs de sua programao.
Essa funcionalidade, presente em diversas tecnologias de desenvolvimento de
aplicaes para a Web, pode ser observada, por exemplo, em sites que exigem a
autenticao do usurio, como por exemplo, em um site de Internet Banking.
Nesses sites, aps o login, se o usurio ficar um longo perodo de tempo sem interagir
com o site, sua sesso expirada, de forma que ele no consiga utilizar mais
nenhuma funo do site antes de efetuar o login novamente. O mesmo ocorre se o
usurio clicar no boto ou link de sair / logoff.
Isso ocorre dessa maneira para reforar a segurana do sistema; uma segunda pessoa
que utilize o mesmo browser do usurio que acessou a aplicao ter que efetuar o
login para conseguir ter acesso as funes do sistema. Caso contrrio esse segundo
usurio poderia simplesmente usar o sistema em nome do primeiro usurio.
A API de Servlets oferece as seguintes funes para controlar a expirao da sesso do
usurio.

Mtodos para controle da expirao da sesso


!5ON' D7 9%B<(#&A4 H 9QD . #H 98#'!+
!5ON' D! E"2#&A4QH 9%D & #!H 9%8#!)'  9
!5ON' D! E



9&#' +

9' EQ8#/8

As duas primeiras funes permitem, respectivamente, obter e definir o perodo mximo


de inatividade em segundos antes que o ServletContainer invalide a sesso do usurio,
e o terceiro mtodo permite que essa sesso seja expirada (ou invalidada)
explicitamente pela aplicao.
Para exemplificar o uso de todas as funes apresentadas nessa seo, vamos construir
um esqueleto de uma aplicao que requer a autenticao de usurios. Mais tarde,
voc poder utilizar os cdigos apresentados a seguir para construir sua prpria
aplicao autenticada.
Primeiro devemos construir um Servlet que apresenta a tela de login propriamente dita:

Servlet FormLogin
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

* 6F#".#!9%87 ;

!5ON' D:D' "."

<( 9:>?

A0CJD!

K8. 56' ;. :E#' Q<= 9


>O+. / #F' #Q

. C< 9J#Q&#9E"

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".


&*OF

O#K

-.-

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".#

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

H  .  9E:*#E#!4>(?

I2 9

-.-

-.-

    

A0?-!+

 D52)#!9&?B J#A ' ' "

!+

A0C

"2#"." &#D!$ QE679#"." #

. 8#!8

)#!35 ", G %7 !):#"2".#

%N #8E#J"2#"." JD!$ QE6 6E#Q# .#E F#D !9%!

/ #F' #Q

>O+& / #".", !9'  "$#!"$"2Q/ 


K"9 ' =" #" ".! "
-$-

& #

/ #%)' #8"E:! ' DQG 

/ #!)' #Q)6".#"E#! J! "

F#D#N#!$#! F#35 "2 G !#!"4".#!




/ 
$ ".8#

 . 9!)' 9Q>? AC !+

-.-

;65'
 

CQ".,AE K8 #E

'  
J  .#", 9"2# <@#Q

. F#!

'  

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

 $#"Q 9" #! " #Q  &#>O#!QE#

-.-

D*6#!

F#35#"$& <O# / #".", !9 ..5#8

, R

" #"."  ;J*Q :"2 E7D. QE:# !5%&.JF#3%5O " G !6E#QO#! J"

-$-

"$#

-$-

9K8!$ JG %7E#' Q<= 9J".##"$& #

-$-

D*6#Q<@!5J!##"."2 ; < 9#

*;7' <(5 J7 J#9". <@#!

'  J"$<

/ & 9<
K!+'  J"F<

 /

:" #

 6F#" #!9%8QE: !):


$#".#!9%8#

96"2#"." /+ K& 9!' ".#

F35#JE#"2# 4K8M#!4

.. 9< =
 ' =" #"."2Q <#Q,* &2 N58# ,8A

9 :956' ' B'  

 . 9&' 9+'  J"F<

' =" #" ". $#! J#* +& N58#C

H&

#! K& D

5" 5;!. 7#

56"25;. 

' Q<= 99%Q J#98#


C BH &

M!#!$4

!+

(+P 

!+

0
-.-

H    9E:

$#"$8!9!&#:E ; < 9:>(?

* 

'  

 . 9!)' 9

'  

 . 9!)' 9CQ<( 9(H & I"=?

'  

 . 9!)' 9 / #9*QH &BI!"@?

'  

 . 9!)' 9QH & I "(?

'  

 . 9!)' 9 -

 PA !+

'  

 . 9!)' 9 -

 -.

'  

 K8' 56"2*/+

PA

? =
 I

H &

C<( 9 *8 ' %' A

? (
 I

 % ?

? =
 I 

 %
/

A0C

" A

% 8I*

%?
//

%' & *

H?

!?
>

.@% 8I

% !+

/ ?

%' & * 3
A @% 8C

BH &

 %' / (
&B>*% ,P!+

P % & *
A

'% , (&=?BP* 
P %

% P,+
 * C)"  %', 9&$% !P!+

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

Em seguida, temos um Servlet que faz, efetivamente, a autenticao. Se a


autenticao for bem sucedida, esse Servlet armazena, como atributo da sesso, o
nome do usurio, e redireciona a requisio para o menu principal de nossa aplicao.

Servlet Login
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

%K8#Q.5:J58#9& DQG 7E6

!5ON' D:D' ".":C<( 9J# &#9E"

-.-

56"25;. 

" #!9O*: F##!96D* E!"

 #. K8 DQ7".##! ".8#5" 5;!. 7D! 

  8#

N' #!9' ="256DQ#"." 

K"  ' <( 9/9 :


 95O' ' 

 

-$-

 !D

-$-

+ 

' <( 9J#" #!9*6: "$"2QE"

 !' E!C6Q<@ 9 / #!9* / ). 9<

N!' #9

96:K82 56' ;. :E#' Q<= 9

>(8& / !
# (' #R

 ' <@ 9 / ) 9<

D! J !  J#&F

 ".#9*BR

K8' "2#

+ ="

9 J95' ' BR

#!96*



E#Q#B  ' # J#!98Q35 )

D !E <(B . ' E

' Q<@ 9J#" #!9*6=E15"25%;!. 

#Q#!  '  D9"25O' 89EJ5 J7N".#E#JEQE"'

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

-.-

O#K

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

;65'
 

CQ".,AE K8 #E

/ 
$ ".8#

-.-

P#D5 #F9E7E6QE!"4E:".#" "  " #7" #" " %

-.-

F#E )#!D !96 J"

A0?-!+

-.-

#!9.FE:EJ! ' DQG D".D!9%&.; $#! J#! J"

-.-

".#"."  O  "#!' #J" JE##%);:#".8

-.-

".# N#!

9 J& %#

E#K8 9 E7DQ"2

!+

", E!D QE:! 9E

/ #@' #58C6Q<@ 9 . /!%3%56#=#

.#35 ", G  !FJ

    

 D52)#!9&?B J#A ' ' "

&2 N!5!&

FC

98JE#
H & BE

$D#" ".E#J!58#9& DQG 

",56DQ#EO E!

>O+& / #".", !9'  "$#!"$"2Q/ 

F#35#"$& <O# / #".", !9 K ' ".#+

K"+' =" #" "./J95' ' BR


 .#", !9%"2# " #!9EP#E% F#D 

CQ<= 9

%!. J *& ' !+

$#Q.5.9

0
' ="2#"2".! F# J#* +&2 N58#  C BH &

-.-

P#D5 #F9E7": ! 

+

#Q&$"4D!

' < 9J#".#9*:#J' E69E:#"2".#"EE"

/ &2 9<

'  ' < 9/7  F#3%5%#"$& <#&I. J#8#

/ &2 9<

'  ".#9*=J  $#35#"F) <#Q&IF J#QF#!

K" 

!' E!C<( 9 / #!96*+'  ' Q<@ 9'  ".#9*% R

8C

BH &

!+

, /
& 
> * +

-.-

-$-

C%Q<( 9J#".#9*" L;!' E" O


 E#!

-$-

 D!9F#!9EJ

56"25;. B#

' Q<( 9JE

"

E#K8 9O 1). N58JE#7" #" " %

E!# "0F#E $#D !96

FC

H&

F#35 "2 G  $

J#!95 . 9D 'EJ ' DQG 




' =" #" ". " #Q,* &2 N58# ,8C

H&

,' 

 .#", !9%"2# " #!9EP#E% F#D  A

' <( 9+

#95IF 9D '  *& ' +

0
#' " #

R
;' E6" 6
 D' DQ

' Q<( 9J#".#9*:9 :K8$#!

-$-

/ #

-$-

9%:58#9& DQG 

-$-

)#!35 ", G %7 !):

"056 J

5"25%;!. 7D%$.#9&##

 56987J" #" " JE

#!9"$Q<#

E#LK8!' *

$#E F#D !9 J"

/ #%)' #5C<( 9 %!. /

' =" #" ". " #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
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I
#

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

/ ?

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #  $#35#"FO  .#", 9"2#/+

0
0

Um detalhe interessante com relao ao Servlet anterior que ele no retorna nenhum
contedo HTML por si, ele simplesmente efetua um processamento e, conforme seu
resultado, redireciona a requisio para Servlets que apresentaro um contedo. Esse
modelo de funcionamento ser explorado com mais detalhes no Cap tulo 8 Modelo
MVC.
Finalmente, teremos o Servlet que apresenta o menu principal da aplicao (caso a
autenticao tenha sido bem sucedida).

Servlet MenuPrincipal
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

* 6F#".#!9%8:

J#!965 . 96D '6E7 ' DQG %

!5ON' D:D' ".":A4#!956I!$ 9D '#2F#!9E6"

>O8& / #!)' #R

5N' DO! EE6B#Q>68& / #(' #Q&P6#35#".

-.-

O#K

9 9E7*#QE#!)"05!! ' !F#"

 $#35%#"F 
 >O& / #(' #&P#", 9"2#J  .#"2 9".# &*OF

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

;65'
 

CQ".,AE K8 #E

/ 
$ ".8#

-.-

P#D5 #F9E7E6QE!"4E:".#" "  D#"." 7J#"2".#

-.-

".#"."  ;

) O#!4"2 E7D. E:#D9& #!

    

A0?-!+

 D52)#!9&?B J#A ' ' "

/ #F' #Q
"

/#

!+

#.  & E7"$#

' Q<= 9JE5"256;. 7DQ JJQ& N5F:E#

"H !,D#! & !9R

-.-

".#"." !6" #

-.-

#QK8#&55JJ!58#9& DQG 

5O JE#" "."4D9E G %#"4K ' *6

#

!$35#7

5%"25;!$ JD.$#!9F#

9 %

'  ' < 9/7965' ' 

/ &2 9<

>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

0
-.-

J#95J . 9D 'EL! ' DQG

H    9E:

I2 9
'  

'  
J  .#", 9"2# <@#Q

. F#!

. 8#!8

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9"

' ;

 ' DQG P


'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

)(
!+

'  ' <@ 9/(>,O#"$8#/#

 -.

J#!95  9D !'%E#7" 5

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Caso a aplicao venha a ter mais Servlets autenticados (que s podero ser
acessados aps o login do usurio), pode valer a pena criar uma hierarquia de classes
para facilitar o processo de desenvolvimento.

/ - / ("0. &(


( -* ( 0 %

 que faz a validao da sesso do


Assim, podemos criar uma classe abstrata  
usurio, verificando se o usurio j efetuou o login, e, se isso no tiver acontecido,
 .
redirecionando a requisio para o Servlet

Servlet ServletLogado
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

' Q" ".#N"$&$ &7 $#2 K& D!

!5ON' D:N"$&.QD

D!' Q" "

56"25;.  ".#J!5!&#!9!& DQG %

-.-

C<( 9JE6

-.-

D' DQ J!"

-.-/ #%&(' #8"


-.-

3O5#

#"2".JD!' "." #J#

5N' D

 ;:#K+#&56!5J

' < 9

>(+) / #!)' #R

 ;:& #

"Q ELK8#! 8 

' <@ 9JE5" 5;!. 7356#K8#!MJJ5%8#!9%& DQG 

96#" ".O!. ; #'

/ ). 9<

$8#D F#E

" #5"25%;!. 

/ #(' #&C<(QEJ#QQF#!9E"

$ ' <( 9/J95' ' 

9%#!DQ#" "2 F.#


 ' #! J#!9!8

E:5%8#!9%& DQG JE#QO#!




#Q8#%9%E!#

&#8EL!N! ,

N".&$QDQ O% EE!C%<6<#E=#+>6& / #(' #)P#35#"$ 


>(+& / #@' #Q.P#"Q !9"$#

 $#"Q !9" #  .*.

"

F#35#".

H  QD# & 9

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

O#K

-.-

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE7 ; <@ 9%

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49   ;65'


 

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

CQ".,AE K8 #E

/ 
$ ".8#

-.-

P#D5 #F9E7E6QE!"4E:".#" "  D#"." 7J#"2".#

-.-

".#"."  ;

-.-

".#"." !6" #

-.-

#QK8#&55JJ!58#9& DQG 

) O#!4"2 E7D. E:#D9& #!

A0?-!+

/ #F' #Q
"

/#

!+

#.  & E7"$#

' Q<= 9JE5"256;. 7DQ JJQ& N5F:E#

#

5O JE#" "."4D9E G %#"4K ' *6

>O+& / #".", !9'  "$#!"$"2Q/ 

    

 D52)#!9&?B J#A ' ' "

!$35#7

9 %

5%"25;!$ JD.$#!9F#

F#35#"$& <O# / #".", !9 K ' ".#+

K"+' =" #" "./9 J95' '  & ' <@ 9/= / & 9!<B' =" #" ".! <@#Q*

8&. N58# C

H&

,+

9#! .

K"+ $ ' Q<@ 9/J95' ' BR


 .#", !9%"2# " #!9EP#E% F#D 

CQ<= 9

%!. J *& ' !+

$#Q.5.9

0
E!C%<6<#EB#Q+  )#!35#"F 6
  .#", 9"2#+

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(
#

I

 E7E6!I"F + >6& / #(' #)P#35#"$ 

5N' D

&*OF

" L)$ &QE"

/ ?

EJ #" J

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Utilizando a classe anterior, podemos criar tantos Servlets autenticados quanto


quisermos: basta que esses Servlets estendam a classe     e implementem o
mtodo 
  , em vez do mtodo 
 . Poderamos, por exemplo, implementar o
Servlet
    da seguinte forma:

( ( 00 / /.
/%"$ - %' 

/"-  /& (&0. .(

&(
/

Servlet MenuPrincipal
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-

* 6F#".#!9%8:

J#!965 . 96D '6E7 ' DQG %

!5ON' D:D' ".":A4#!956I!$ 9D '#2F#!9E6"

 E7E6!C6Q<<#E=#+>O+& / #!)' #&P#3!56#"F

5N' D

 .#", !9%"2#@.*$

-.-



 J7#"." #

/ #(' #

D EO < ;K8 K8# 8:L!' EQG J#


-.-

/ #@' #&CQ<@QE
R

 .#35#"F>(+& / #@' #Q.P#"Q !9"$#

"0H  QD# & 9R

#"$&#9E#:JD!' Q" ".#> / #(' #Q)C%Q<QE!6QD!*#<49#"2"$#:..#D*


;

K8!$ E#QK& 9 E"

":*#QE!#F"

2 9D  "'!K& DF#"$8!9EJ"   !$  1 ; <( 9D! 

I2 9
'  

. F#!

'  
J  .#", 9"2# <@#Q

 . 9!)' 9Q>? AC !+

. 8#!8

J#95

-$-

E#

'  

 . 9!)' 9"

' ;

 ' DQG P


'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

)( $
 ' <( 9/(+6#"$8#/#
!+

 -.

J#!965 . 96D '6E#J"25

- >?BAC, 

0
-.-.-

&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

5N' D

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

I

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 


&*OF

" L)$ &QE"

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

 

   


Nos quatro captulos anteriores, exploramos com detalhes como um Servlet pode tratar
uma requisio HTTP e gerar sua resposta.
Infelizmente, as aplicaes que pudemos desenvolver at agora tem uma sria
limitao inerente a prpria tecnologia de Servlets: a formatao do contedo da
resposta est totalmente integrada a programao da lgica da aplicao. A
tecnologia de pginas JSP, que estudaremos nesse captulo, nos ajudar a transpor
essa limitao.

    .$  $'&

#  -
 )   $  ) +   +  $ #   , )   )  +

 


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

Essa pgina HTML no tem, praticamente, nenhuma formatao; um Webdesigner


sugeriria, com certeza, diversas alteraes no cdigo HTML para tornar o layout da
pgina mais atrativo. Assim, poderamos alterar esse cdigo minimamente para:
>?BAC
Q> *5.
QA= !? *
,?


- >

>@?=?BI 

9&#9, ?'$ #

C  9%E!#F#GH I - ?BH ?

H?

  C P

H A

&.* =
A 8C

QI

&=?

 & ? (&=? 

&#Q  - *& ' D*6!F" #Q Q


 "$!

 
,

C 

  &=?-
QI

/ P

 

 !'

/ H

- D9" - ' Q<O%  <( 9  < P. P

 

<( 9E##Q#  ' 

 ,P

 1C P!C(" !


)#!"$#!9%89E:#9E#!$#GH IJEJD!' #!9F#  -

- I

&=?
*   *  !'

  =
  =
, - 
 

 - 
 
A0C

!

*   *

" QI;
-

- >(?

"=H   

*  

 

/ H
-

 

 1C P!C(" !@


&(?  - I

".#5J#9E#!)#!G

H I$#

"  - 
 

Apesar da pgina apresentar exatamente as mesmas informaes, a formatao pode


tornar o contedo muito mais atraente para o usurio que estiver visitando nossa
aplicao.
Por outro lado, essa modificao faz com que a codificao do Servlet fique muito
mais trabalhosa, pois agora a resposta do Servlet precisa conter todos esses dados de
formatao adicionais.
Assim, se originalmente o cdigo do mtodo
5N' D

.( /.




do Servlet era

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#
&*OF

I2 9

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

. F#!

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9"

'  

 . 9!)' 9

'  

 K8' 56"2*/+

" #!5
-

H I$#&%'!)(

#%9%E!#F#G

 -.

. 8#!8

 F#35#"$& <#&P# JQ8#* EE% (+

%',!+

- >?BAC, 

, agora esse cdigo passa a ser


5N' D

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#
&*OF

I2 9

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

. F#!

'  

 . 9!)' 9Q>? AC!+

'  

 . 9!)' 9Q>. * .!+

'  

* >(?=? I !
 
% ,8

"BH  '% 

 . 9!)' 9 A3 ?


D*!)"2# Q
 " !

'  

 . 9!)' 92?BH ?

'  

 . 9!)' 9 - >. *5.,8

'  

 . 9!)' 9 >

'  

 . 9!)' 9QH A

 
P . P

 C P %'

& * A3 @% 8C


 %  % !P!+

*   %' *

 . 9!)' 9QI &=?

 . 9!)' 9" Q


 I; <( 9E#7#Q#!

F#QQ - *& ' 

 @%'

/ P

. ' %'
!' 

/ H

- D!96" - ' Q<@!  < 96  <%'

  %' %  C P % !C(" %'!,+


* .#"2#9&9%E!J#!9%E#!F#G

H IJE

"  - 
 )+

'  

 . 9!)' 9 -

'  

 . 9!)' 9QI &=?

 &=?  - I,+

#9E#F#G!H I&#>
 . 9!)' 9

 &=? (&=?-@%

% !!+

'  

'  

98#9,+? (
$ #%

C  9%E#!F#G7H I  - ?BH ?BC !+

'  

D' #!9!&#  -

. 8#!8

*   %' * . ' %' / H   %' %  C P % !C(" %'!@


%'
  @
   
% , -  -  &=? - I ,+

! - 
 

- >?BAC

".#5

8

Alm disso, qualquer modificao na formatao dessa pgina torna necessrio o


envolvimento do programador, j que ele precisa incorporar essa modificao ao
cdigo do Servlet e recompilar seu cdigo. Por exemplo, se nosso Webdesigner
decidir que a cor do texto agora precisa ser verde, precisamos alterar o cdigo anterior
para
5N' D

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#
&*OF

I2 9

. F#!

"0H DQ# & 9R


'  
J  .#", 9"2# <@#Q

'  

 . 9!)' 9Q>? AC!+

'  

 . 9!)' 9Q>. * .!+

'  

 . 9!)' 9 A3 ?

'  

 . 9!)' 92? H ?

>(?=?

I !

C  9%E!#.#G

"BH  '% 

. 8#!8

98#9,+? (
$ #%

H I  - ? H ?BC !+

 &=? (&=?-@%

F#QQ - *& ' D*6.".#Q ".(

 
% !!+

'  

 . 9!)' 9 - >. *5.,8

'  

 . 9!)' 9 >

'  

 . 9!)' 9QH A

 
P . P
'  

'  

'  

 . 9!)' 9" Q


 I; <( 9E#7#Q#!

 @%'

/ P

. ' %'
!' 

/ H

- D!96" - ' Q<@!  < 96  <%'

  %' %  C P % !C(" %'!,+


* .#"2#9&9%E!J#!9%E#!F#G

H IJE

"  - 
 ,+

 . 9!)' 9 -

 &=?  - I,+


*   %' * . ' %' / H   %' %  C P %  P  & % ,@
%'
  @
   
% , -  -  &=? - I ,+

 . 9!)' 9QI &=?


#9E#F#G!H I&#>

'  

% !!+

*   %' *

 . 9!)' 9QI &=?

D' #!9!&#  '  

 C P %'

& * A3 @% 8C


 %  % !P!+

 . 9!)' 9 -

 -.

" #!5

- >?BAC, 

Todo esse processo faz com que o desenvolvedor tenha um grande trabalho cada vez
que a formatao da pgina precise ser modificada, tornando esse processo lento e
pouco flexvel.
&


.$  $,&

 



# - )   $  ,) +  +  $ #  ,! - $'+

   

32 4

76 <8

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

Primeiro exemplo de pgina JSP


>?BAC 

" #!5

 - 
 

#%9%E!#F#G
- >?

H I$#>@?):.#35#"F) <#&P#! J8#* EE



?

A0C

Nessa pgina JSP, o contedo dinmico est contido no elemento


?:$#!35#".& <(#&P# J8#*

EE

,

? 

Desde que esse elemento no seja alterado, podemos incluir / alterar livremente a
formatao da pgina sem afetar o funcionamento da aplicao. Podemos, portanto,
modificar essa pgina de maneira a ter a segunda verso do Servlet apresentado na
seo anterior:

Segundo exemplo de pgina JSP


>?BAC
Q> *5.
QA= !? *


,?
- >

H?

*  

>@?=?BI 

"=H   

C  9%E!#F#GH I - ?BH ?

9&#9, ?'$ #
C 

 & ? (&=? 

&#Q  - *& ' D*6!F" #Q Q


 "$!

 
,

  C P

 
QH A

QI &=?
" QI;

!

/ P

 

*  "*

 '

/ H

& * 3
A 8C

- DQ9" - ' <! % <( 9  <

 


P . P  !P

 
C P,!C " !

* F#".#989%E:#!96E#!$#GH IJED!' #9&# - "  - 


 

<( 9E#7##  !' 

 -  &=?  - I


QI &=? *  "*  ' / H    C P,!C " 
!@ "2#5#9E#F#GH I=#> 
?:$#3%5%#!")& <O#Q&P6#! JQ8#* EE  
? ! -   -  &=?   - I
 - 
 

A0C

- >?

Aps fazer essa modificao, ao contrrio do que acontece quando se trabalha


diretamente com Servlets, voc no precisa recompilar a aplicao, essa modificao
j passa a ser automaticamente visvel para os usurios.

 *-
#%!  -'$ )*-
  ! -  )  - 
!1

 

A mgica por trs de uma pgina JSP a seguinte: existe um Servlet especial,

  , que intercepta requisies direcionadas a recursos com extenso
chamado 
.jsp.

".0/
(&*  / -

No instante em que recebida uma requisio para uma pgina JSP, o Page Compiler
transforma essa pgina em um Servlet e o compila, sendo que o resultado dessa
compilao carregado em memria para evitar que esse processo tenha que ser
repetido para todas as requisies recebidas.

"- * "0 !  #) , por exemplo, transformada

A primeira verso de nossa pgina de exemplo 


no seguinte Servlet

Primeira verso da pgina JSP PrimPag.jsp transformada em Servlet


DQ<#J!)<(  QD*6#!  "2 

   ! "$#%&(' #) 


   ! "$#%&(' #) *!+)  ,
   ! "$#%&(' #)  "2   
 

<(  D*6#!  " #. .59& J#!  

!5ON' D:D' ".": Q<

 " :#Q8#9E"0>6& ;"2 Q" #7R

"FFQ& D7R

0
5N' D7 <

 "2 


R

0
  8#"FFQ& D7N' #9$  "2  9O 8#E

5N' DK8 9!'!! E&  "2 @ 9  )*6.

"4F<( ! D*%#!  Q"2 %#!. .59!& J#! ;%"2  %,DQ# & !9R

K8!' "2#

5N' D

 E=  "2 / #F DQ#+>6+) / #@' #&P#35#".


$#"Q !96".#  &*F

;%",

D &!$/

$#3%5%#!") 
 >(+) / #(' #Q&P6#"2 %!9".#

"0 Q ! H QDQ# Q& 9 / #!)' # DQ# & !9R

 ",  QD8

95' ' 

IQ<#

!9%8#2

 <#

7965' ' 

98#2

>O+& / #".", !9J" #".", !9+7956' ' 


/ #!)6' #

9&#2

/ #!)6' #

9K& <

;%", 

  <@#/&*O "Q

/ &2 9<
)

7956' ' 

DQ9K& <

%5!57965' ' 

. F#!

N #D

  ' D . !9+7965' ' 

J95' ' 

!' 5%#

R
K5

 "2 !

9 8#E>

K8' "$#

" 6
$ 96D*$!9 M#E



 " 





R

&* "BR

9 8#E>

K8' ".# R

  "Q Q

9 

+

  "Q Q

9 F#E/..56#!

0
0
0
  "Q 

6QDQ8

$#"Q !96".#! ".#

=;6"2


!9F#!9 ?'$ #  8#QQ - *%& '  H /

 !9!&#Q 5<  "2  D &!$ <@#Q&IQ<O# 


 !%&25%#  
 & 5#+

<#

  !' DQQ& !9/J  <#

J 

D!9%K <

<@#

7 

-$-

>?

#9E

-$-

N#<( 9

9K8 <

  
!+
9&#2  &
 * " 
 $#356#"F 
 .#"2 %!9" # 

9&#2

+

+

!9%8# & <@#Q / #"2"2 9+

K& ' #  -  <

N#<( 9

  "2 8 K&F! /

. &# ,Q>(? AC  ,


% ,%29

-$-

+

!9F#Q ) <#! 5!!+

- -

AC

5&

<O#

9&#2. <# / #%&(' #

98#Q& <@#Q / #!)' #

" #" "2 !9/  <@#


5

6QDQ8 (
$  <#Q O
 #K+5'  D &!$

K8 ' # - Q<

  "2 8 K8. +

" #!5

   + 8



#!96E#%)#H I

  + 8
 


% !+

5& . 9+.#35#"$& <#&P# JQ8#* EE%!+


-$-

#9E

-$-

>?

5&

-$-

- -

AC

. &# 

%' %Q,%,9  


-

 ?B*$

  % + 8 
 

N' #:1R

K5 5 9 :
 9O5' '



5. <#5K K8#! / M# 9

5& D' # 


 5!K K8#
K5+ <#
K& 96' ' $
K5

  "2 8 K&F! /


AC!+

- >?

#9E

D&D*

K& ' #  -  <

N#<( 9

  

+

!9%8# 59 :
 95O' ' B  <@#

!9%8#QQ& *9E' #!I <# %QDQ#% & !9 8

R
 "2 ! D &#$

9 :95O' '    "

Q %D &#$ .#' #Q"2#IQ<#

!9!&#QQ+  <@#

!9F#Q  + 

0
0
0

O Page Compiler tambm verifica a data de alterao do arquivo que contm a


pgina JSP: caso essa data se modifique, o processo de compilao executado

novamente para garantir que modificaes feitas na pgina sejam visveis para os
usurios da aplicao.
Devido a todo esse processo de compilao / recompilao, voc poder observar
que o primeiro acesso aps a criao ou modificao de uma pgina JSP sempre
mais lento que os acessos seguintes (at que haja uma modificao no contedo da
pgina).

  !"#   ) , ! $


O fato de uma pgina JSP ser convertida para um Servlet faz com que ela tenha o
mesmo ciclo de vida apresentado na seo 3.4 desse livro: existe uma etapa de
inicializao, uma etapa de atendimento de requisies, e finalmente, uma etapa de
finalizao.

( /.

( (# 

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.

 # % 

#) /#)- (


 que possibilitam a implementao
Por outro lado, existem os mtodos !  e

de cdigos de inicializao e finalizao, respectivamente, da pgina JSP. A maneira
pela qual esses dois mtodos podem ser declarados para uma pgina JSP ser
apresentada na seo Declaraes mais adiante nesse mesmo captulo.

   )  )*-
  + ! - . !"#  +


J vimos nas pginas JSP apresentadas at agora um exemplo de um elemento


dinmico; na pgina   
apresentada na seo 7.2 desse captulo, por exemplo,
temos a seguinte linha contendo um elemento dinmico:

"- * "0 !  #)

"2#5#9E#F#GH I$#>@? :$#356#"F. <#&P# JQ8#* E!E

?

, onde o contedo do elemento dinmico est delimitado pelos caracteres

 e 


Este apenas um tipo de elemento dinmico, chamado comumente de expresso.


Alm desse, existem outros 4 tipos principais de elementos dinmicos que podem estar
presentes em uma pgina JSP: diretivas, scriptlets, declaraes e JavaBeans.
As sees seguintes iro apresentar, de maneira mais detalhada, cada um desses tipos
de elementos dinmicos que podero ser utilizados por voc em suas pginas JSP.

 !  )  ! ,$'+


O primeiro tipo de elemento dinmico que iremos estudar ser a diretiva.


O formato bsico de uma diretiva o seguinte:

Formato bsico de uma diretiva de uma pgina JSP


?

E F#& J9! J#*B&2 N58

-/  

 ' ! *B&2 N58

9 J#* &$ N58



' ,*B)$ N58

.0 / %' $ /

?

.0

, onde a palavra ! , deve ser substituda por


,    ou   . Para cada um desses
tipos de diretivas, existem conjuntos de atributos especficos utilizados para parametrizar
a diretiva.

&0/

Conforme o prprio nome indica, a diretiva


serve para se definir diretivas da pgina;
embora existam diversos atributos possveis para essa diretiva, os atributos mais comuns


 e  
 .
so os seguintes:   ,
, import,

% ( ',("%. / %.  /

/ -- ("- "0/ # -- ( - 0/

O atributo info deve ser utilizado para se definir um texto informativo sobre a pgina
sendo construda; seu valor retornado pelo mtodo     do Servlet (veja seo
3.10).

0/& / -  / % (

Exemplo de diretiva page com atributo info


?

 <O#

9K8! %"2D 8 

9 #=E!=5F!

?

# /& (%& /%& /



 apresentado na seo 4.2 desse livro, o
Da mesma forma que o mtodo 

atributo
serve para indicar o tipo de contedo sendo gerado pela pgina JSP.

Assim, podemos utilizar a seguinte diretiva no incio de uma pgina JSP para indicar que
seu contedo uma pgina HTML.

'(%./%. /

Exemplo de diretiva page com atributo contentType


?

 <O#7D%9!&#!9! ?$ # 8#  - *& J' -? 

*  ( - 

O atributo seguinte, 
deve ser utilizado para indicar pacotes a serem importados no
). Assim, devemos indicar por meio desse
Servlet que ser gerado (via declarao 
atributo todos os pacotes que estaremos utilizando na programao de nossa pgina
do pacote
JSP. Se quisermos utilizar a classe 
  , e as classes que esto no
 , por exemplo, poderamos declarar a diretiva
pacote
com os seguintes
atributos:

* ("-

/&',( -

 &! (

   ! $

&0 /

Exemplo de diretiva page com atributo import


?

 <O#

 !)8  ! ! '?)

?

 <O#

 !)8  ! 5& '  

#DQ8

? 

/ -- ("- "0/

Finalmente, o atributo
 serve para indicar a pgina JSP a ser exibida em caso de
erro no processamento da pgina corrente. A pgina JSP que for exibir o erro deve, por
com o atributo   
definido explicitamente como
sua vez, declarar a diretiva
.

- $ /

&0/

# -- ("- .0 /

.0 /

Usando todos esses atributos da diretiva


, poderamos implementar uma pgina JSP
simples de impresso da data corrente da seguinte forma:

Pgina JSP que imprime data corrente (datacorrente.jsp)


?

 <O#7# F.I <#! 62FIQ<(  "2 

?

 <O#

?

 <O#7D%9!&#!9! ?$ # 8#  - *& J' -? 

?

 <O#

 !)8  ! 5& '  '

 <O#

 !)8  ! 8# ) /  !' # O8# 6!. J 

?

9K8! %"2D 8 

? 

9 #=E!=5F!

?

? 
? 

>?BAC
 
*

  C P

EQF:DQ2$#!9F#

  
-

- >?

,


#>@?):9#

/  ' #@ 8# 6!$ J 

+EE

- AA

$ $($ $ ! K8!$ J  + 9#

O&#/! ? 

A0C

&0 /

Alm do tipo de diretiva


ao qual todos os atributos apresentados anteriormente se
referem, existe tambm um outro tipo de diretiva, a diretiva    . Essa diretiva admite
um nico atributo #  .

%' $ ./

Essa diretiva deve ser utilizada para incluir o contedo de outro arquivo na pgina JSP
corrente, sendo que esse arquivo tanto pode conter um contedo esttico, como uma
pgina HTML (ou pedao de uma pgina HTML), como um contedo dinmico, ou
seja, uma outra pgina JSP.
Sendo assim, podemos reescrever a pgina JSP anterior da seguinte forma

Segunda verso da pgina JSP que imprime data corrente


?
*

9D' 5E#K8 ' #DN#D' *%!  "2 

#>@?):9#

EQF:DQ2$#!9F#

?

?)

/  ' #@ 8# 6!$ J 

9D' 5E#K8 ' #FFE %#! *!& '

+EE

- AA

$ $($ $ ! K8!$ J  + 9#

O&#/! ? 

? 

',  / '. ( !  #)

, sendo que o contedo do arquivo

Cabealho para pgina JSP que imprime data corrente (cabecalho.jsp)


?

 <O#7# F.I <#! 62FIQ<(  "2 

?

 <O#

?

 <O#7D%9!&#!9! ?$ # 8#  - *& J' -? 

?

 <O#

 !)8  ! 5& '  '

?

 <O#

 !)8  ! 8# ) /  !' # O8# 6!. J 

9K8! %"2D 8 

? 

9 #=E!=5F!

?

? 
? 

>?BAC
 

  C P

,


, e o contedo do arquivo

- ( &&/"! *


Rodap para pgina JSP que imprime data corrente (rodape.html)


 - 
 

- >?

A0C

A vantagem de utilizar essa diretiva est no fato de que voc pode manter contedo
esttico ou dinmico comum a diversas pginas JSP em arquivos separados, includos,
atravs dessa diretiva, conforme a necessidade. Podemos, por exemplo, construir novas
 
 : se for necessrio
e 
pginas JSP que incluem o arquivo de cabealho
mudar o contedo do cabealho ou do rodap, no precisaremos editar todas as
nossas pginas, apenas o contedo desses arquivos.

'. /&'   (! #) - ( & /! *

   ) ++%(*) +




Em todas as pginas JSP construdas at agora utilizamos um elemento dinmico


 : esse elemento serve para imprimir o resultado  
chamado de  
de uma
expresso Java.

""- /# # &(

 - %"0

Sua sintaxe bsica a seguinte:

Sintaxe de uma expresso JSP


?=Q# F#"." $;



? 

Obviamente, esse elemento pode ser utilizado para imprimir o contedo de uma
varivel do tipo   , ou at mesmo de uma constante   . Supondo que   seja
uma varivel   , por exemplo, poderamos incluir o seguinte elemento em uma pgina
JSP para imprimir o contedo da varivel:

- %0

 - %&0

- %"0

/ (

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.

Expresso que imprime a data corrente na pgina JSP datacorrente.jsp


?:96#

/  ' #OQ8# . J 



E!E - AA

$ $($ $ !+ K+. J  +9#

 &#/

? 

 
#  !"   )  +
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:

Sintaxe de um Scriptlet JSP


?

N' !D7E6#7D

E <$;



? 

Ns podemos utilizar um Scriptlet para incrementar um pouco nossa pgina JSP



:

 ',("-- /"% /!  #,

Terceira verso da pgina JSP que imprime data corrente


?

9D' 5E#K8 ' #DN#D' *%!  "2 

?)

?
/ & 9<

' @&# 8 / 5%E!DQQ>

/ & 9<

' =E 8/79%#

K! ' =E & ".8&"

&*

#' " # K! ' =E 8 "$8!8"

,8

/  ' # O F# F    EE - A0A

,
- 
 ' =8#

8 / 5%E!DQQ>

&*  (-
 ' @
 F#QQ8

$ $($ $ + K+%$ JQB9#


OQ8#>,+


#' M3*9

/ 5EDQQ>& 6#!' M

&BQ9 
&B

F' 9 8

?-
*

EQF:DQ2$#!9F#

?

#>@?):' =E &=?)!P @?:' 

9D' 5E#K8 ' #FFE %#! *!& '

&#Q8 / 5EQDQ

? 

? 

Nesse exemplo de pgina JSP, utilizamos um Scriptet para definir variveis cujos
contedos so posteriormente impressos por expresses JSP. De fato, podemos
combinar o uso de Scriptlets e expresses, desde que, obviamente, seja preservada a
semntica Java (ou seja, variveis sejam utilizadas somente aps serem declaradas, por
exemplo).
Construmos, a seguir, um exemplo um pouco mais elaborado de pgina JSP utilizando
Scriptlets: trata-se de um formulrio HTML para input do ms do aniversrio do usurio,
sendo que Scriptlets so utilizados para construir os meses possveis da caixa de seleo
do formulrio.

Pgina JSP com formulrio HTML de input do ms de aniversrio do


usurio (formmesaniv.jsp)

?

9D' 5E#K8 ' #DN#D' *%!  "2 

* 

  PA

?BH &

9&)#7D%


/ 6
C

"


>

-.I

/ ?



9 %#F" ;. !

E6#7" #!5

& * 3
A +A
?

?)

8 $D #".9   "2  A= !?


!

?
-.-/ D!. &' #Q!K8M#9E756


K8
 9

 

K8

$7 F#%)!

"$%N$#7"

#"$#!"4EJ9  

 ((/

?-@

-.-

  "  96E:E

-.-

E7 ;Q<@ 9:#Q"# F#"." #"

I?BH

&

/ D2 &' # F

 .  1!"4#' # J#!9F"

#"$8;Q& DQ"

/ I

 * 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

H &BI "(?

 
? P
? (
 I  /

" AH ?- &.*


A

 *C("  9 @!


! (&  H * 
P

 -  PA 
?

9D' 5E#K8 ' #FFE %#! *!& '

? 

interessante observar nesse exemplo a combinao de Scriptlets, expresses e


elementos estticos da pgina: o bloco de cdigo Java iniciado no primeiro Scriptlet
da pgina no finalizado nesse prprio Scriptlet, mas sim em um outro Scriptlet,
inserido aps a impresso de um contedo esttico e de 2 expresses JSP.

 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
config

javax.servlet.ServletContex t
javax.servlet.ServletConfig

Voc deve utilizar esses objetos implcitos da mesma maneira como voc utilizaria os
objetos das respectivas classes na programao de seus Servlets. Em particular, o
objeto implcito , da classe   , prov funcionalidade semelhante a da classe
 
  que utilizamos na maior parte dos exemplos com Servlets desse livro.

(&$

"- %. - /"-

#  - /"-

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 &

9&)#7D%


/ 6
C

"


>

-.I



/ ?

9 %#F" ;. !

E6#7" #!5

& * 3
A +A
?

?)

8 $D #".9   "2  A= !?


!

?
-.-/ D!. &' #Q!K8M#9E756
K8
 9





K8

$7 F#%)!

"$%N$#7"

#"$#!"4EJ9

 ((/

!5%& $ 9&' 9

@ I?BH &  * C("  %  ( H 9%8#Q<@#!$ 8


( H 9%8#Q<@#!. 8 / & 9!<B
 )(>  -
I?BH &  

/ &2 9<B .(>"%



?-


-./ 
C

H &BI "(?

 
? P
? (
 I  /

" AH ?- &.*

 *C("  9 @!


! (&  H * 
P
A

 -  PA 
?

9D' 5E#K8 ' #FFE %#! *!& '

? 

"- ("'.* /#)"% !  #, que far o tratamento dos dados
(-* *4/.#)"% !  # , utilizando os objetos implcitos -/ .$ /&#  e

Podemos tambm construir a pgina JSP


submetidos pelo formulrio da pgina 
:

- /#, (%&# /

Pgina JSP que faz o tratamento dos dados submetidos pelo formulrio
formmesaniv.jsp (procmesaniv.jsp)
?
H 98#<(#
&$

'  J#"

7956' ' 

R
'  J#"3J9#

DQ&D*

H 9!&#Q<O#% + .#3%5%#"$& <#&I. J#8#

8A

!+
/

 DQ# & !9 =#BR

'  J#"3J95' ' 

K!8'  J#"3J956' ' 

' 

#"2 9 

,

' 5#

+' 

#"2 9 

' 5#

,



.#", 9".# ".#!96E!P#E )#DQ K+.  J#".96   "2 !+

?-@?

9D!' 5E#K& ' #+DN#D' *6!  "2 -?-

?
K!+'  J#"2 9 

' 5#/

' #9E. <#&H 9"$89DQ#/8 <#

!5%& $ 9&' 98IFN#9" 6


 #" ".#/#
#' " #J!5%& . 9&' 98H 9!K #' M J#!98##"2"$#
9 #!)"2; &#

9

"

%'! (

"

' #!9%E!$ A & ?

>.

E#".#596 #.".;. 9 !+

9 &#

'  J#"2 & / ). 9<

"

E#7" #!5

 (>"%

!9 #!$".;. " #!5

& !+

?-
?

9D' 5E#K8 ' #FFE %#! *!& '

? 

Nesse exemplo, tomamos o cuidado de tratar o parmetro recebido e, conforme o


caso, gerar o redirecionamento da requisio logo no incio da pgina, antes de
escrever qualquer outro contedo esttico ou dinmico: da mesma forma que no
desenvolvimento de Servlets, precisamos obedecer a ordem de gerao dos elementos
da resposta HTTP, ou seja, os headers do redirecionamento devem ser gerados antes da
escrita de qualquer elemento do contedo da resposta (veja seo 4.2).

   ) #
"$ $ & (*) +


Esse tipo de elemento dinmico especial de uma pgina JSP serve para definir cdigos
Java que devero ficar fora do mtodo de atendimento das requisies (o mtodo

 , no mais alto nvel). Assim, esse elemento serve para declarar variveis de classe
(estticas), variveis de instncia, ou at mesmo novos mtodos.

# /"- ',/

Sua sintaxe a seguinte:


Sintaxe de uma declarao JSP
?9 E#!D' $QG

E67 ; <= 9

#"

?

# % 

#  /&# - (


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.

Terceira verso para pgina JSP de input do ms de aniversrio do


usurio (formmesaniv.jsp)
?

9D' 5E#K8 ' #DN#D' *%!  "2 

?)

?9
* F$

-.-

D%

":9! J#"

"*

N2 ' ,FA

E": J#!"$#"

BD 9 #" A

/ )$ 9<

  8#"FFQ& D

#".#"

  ;O59* , 6
; 5' *

 &BQ# NF , ,O#!M#! NF 0


569G %7 !)7.#8.96

-.-

/ & 9<

  8#

N&#

K"  965 A



#"

$#Q.5.9JD
#' " #

$#Q.5.9

9 J#7E

&= J#!A4#"@+ 9 




  

9 #" A

+ 

7R !;%9# ) !  6#QO#!$#! $ , A4!FG ,


 * <".8!  / #&#! NF 5!&5NF 

"

" ".D! QEJ9 J#F7 Q" ".E!JD J   J#Q))

956 7A4#"@ R

95 JA4#"





#"2#" +  956 7A4#"



965' ' 

0
?-
* 

  PA

9&)#7D%


/ 6
C

?


?

?BH &


8 $D #".9   "2  A= !?




"

E6#7" #!5

& * 3
A +A
/

!

9 %#F" ;. !

>

-.I

/ ?



-.-/ D!. &' #Q!K8M#9E756


K8
 9





!5%& $ 9&' 9!@

NQF#!

K8

$7 F#%)!

"$%N$#7"

#"$#!"4EJ9

 ((/
IQ?BH

&

&

 *C "  %', (

! J#A4#"


H 9F#Q<#. & / )$ 9<B .)(/"%'!

(> -
I? H 
& !+

?-


-./ 
C

 
? P

H &BI "(?

? (
 I  /

" AH ?- &.*


A

 *C("  9 @!


! (&  H * 
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:

Sintaxe de um comentrio HTML


9 :

QD! J#9&;. :<

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:

Sintaxe de um comentrio JSP


? :

D J#!9F;.  : ? 

Exemplificando o uso dos dois tipos de comentrios:

Pgina JSP com exemplo de uso dos dois tipos de comentrios (HTML e
JSP)
>?BAC 
#!  ' :E#5".E"

. "

E#JD J#!9!&;. "4E#

9 := "$".#7D J#!9F;. 7 F;7 !F#DQ#


? :

6"."

 - 
 

#7D!
- >?

5 J: ; < 93; / I

96:K898#JE7 %; < 9:$

#!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:

Primeiro exemplo de JavaBean: encapsula lgica de clculo de preos


de um produto
DQ<#JD   96*Q#  F#".

-.-

;6

O#9J"2

' #"0 $:DQ;' D5O' JE# F#GJE#5  FE5&

!5ON' D:D' ".":I.#DIFE#9R

-.-

 '  569 F;. 

  8#

-.A

9

& IF#DQ "=9 E

=

#QFE .LD;' D5' 7EJ!' 1&8'E#5 ' F#!OF#D#!N%#7D!  ! J#Q.F7J359!& EQE#:E# FE5F"09%

5N' D7 9 D!' DI.#D!C6Q8#B 9  359%&IFE"


.#)5$9

' QF#

 R

 359&I$E"47 $ IF#D!" 9 E

0
0

Uma vez construdo o JavaBean, para referenci-lo em nossa pgina JSP, devemos
  , que tem a seguinte sintaxe:
utilizar o elemento dinmico 

 #  $ # / &/ "%

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

  deve conter o nome da classe incluindo
referenciado na pgina e  
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:

Exemplo de pgina JSP utilizando o JavaBean PrecoProdBean

>?BAC
 
 "Q  5"$# #9 E I!$#D!IFE58

D!' "."DQ!

?=,
(

F#GL&8'E

' Q8#E#

.E5&"

  9*Q#  $#". IF#D!I$E#9

#( 

H 9%8#Q<@#!. 8 / &. 9<.+I!)#DI.E%5!8% DQ!' DIF#DQ!C6Q8#

 .? 

  
-

A0C

- >(?

 #  $ # / &/ "%


0 / /- # //-

  no o nico elemento disponibilizado pela API de pginas


Esse elemento 
JSP para trabalhar com JavaBeans: existem elementos para referenciar diretamente os
mtodos
e
dos JavaBeans desenvolvidos.

- /&'( - ( /" %

Ainda no exemplo de JavaBean anterior (    ), vamos acrescentar mtodos


e
para a propriedade com o preo de unidade do produto:

# /./ -

0/& / -

Segundo exemplo de JavaBean: aperfeioa PrecoProdBean com


mtodos getter e setter para o preo de unidade
DQ<#JD   96*Q#  F#".

-.-

;6

O#9J"2

' #"0 $:DQ;' D5O' JE# F#GJE#5  FE5&

!5ON' D:D' ".":I.#DIFE#9R

-.-

 '  569 F;. :E#K 5' 

  8#

9

& IF#DQ "=9 E

#QFE/ <#88#

-.A

=


1 $:

F#G7EJ59 EQE!#JE

.E58

5N' D7 9B<@#Q.I!$#D!" 9 EBR


.#)5$9

$ I.#DQ!"B9 E%

0
#QFE/+"

-.A

#+F#! 1 $:

$#GJE!59 EQE#:E $E5&

5N' DO! E" #&I.#D!" 9 E+ 9

 F#DQ("=9 E R

$ IF#D!" 9 E/J  F#DQ!"B9 EO

0
#QFE .LD;' D5' 7EJ!' 1&8'E#5 ' F#!OF#D#!N%#7D! 

-.A

-.-

!  #Q&$:J359. EQE#7E#

5N' D7 9 D!' DI.#D!C6Q8#+ 9


.#)5$9

$E58"096

' &#

=359&IFE" B
 R

 359&I$E"47 $ IF#D!" 9 E

0
0

0/ / -

Para referenciar o mtodo


de um JavaBean, a API de pginas JSP disponibiliza o

elemento 

 , cuja sintaxe :

#)  0/& - (" /-

Sintaxe de um elemento para referenciar o mtodo getter de um


JavaBean
 "Q  <#)IF #!) $

9 #!Q96 J#:E

;6

#9 $! #

$!Q9 J#:E7 6F !

#EQE# -

Para imprimir o valor do preo unitrio de um produto, por exemplo, poderamos


acrescentar as seguintes linhas em nossa pgina JSP:

Segundo exemplo de pgina JSP utilizando o JavaBean


PrecoProdBean
>?BAC
 
 "Q  5"$# #9 E I!$#D!IFE58

F#G

596 &;$ LE

$! #F

$ F#DQ!"

D!' "."DQ!

  9*Q#  $#". IF#D!I$E#9

6FE%5!&=#> " ! <(#&IF #


9 E -


-

96 J# IF#D!I$E58

 - 
 


- >(?

A0C

0 /. / -

Da mesma forma como existe um elemento dinmico para referenciar mtodos


de
. A sintaxe
JavaBeans, tambm existe um elemento dinmico para os mtodos
desse elemento :

# /./ -

Sintaxe de um elemento para referenciar o mtodo setter de um


JavaBean
 "Q  ".#&I$! #!) $ 9 J#Q9! J#:E ;%Q#91 F! %#!) $!Q96! J#:E67 . . #EQE#
!' 5#$%'  E7 6. ! #EQE#  - 

Podemos, ento, modificar o exemplo de pgina JSP anterior para definir o valor do
preo unitrio do produto antes de exibi-lo:

Terceiro exemplo de pgina JSP utilizando o JavaBean PrecoProdBean


>?BAC
 
 "Q  5"$# #9 E I!$#D!IFE58
 "Q  ".#&I$! #!) $

F#G

9 J#8I)#DI.E%5!8

596 &;$ LE

$! #F

D!' "."DQ!

$ F#DQ!"

  9*Q#  $#". IF#D!I$E#9

9 E -

$8 )#!DQ "=9O E

F #!)

6FE%5!&=#> " ! <(#&IF #

!' 5# 

%
-

96 J# IF#D!I$E58

 - 
 


- >(?

A0C

Esse elemento de referncia a mtodos


de uso:

# /& /"- de JavaBeans admite, ainda, outra sintaxe

Sintaxe alternativa de elemento para referenciar o mtodo setter de


um JavaBean
 "Q  ".#&I$! #!) $

9 J#Q9! J#:E

;%Q#91 F! %#!) $!Q96! J#:E67 . . #EQE#

!$ /!Q96! L#:E   J#&F -

Nessa sintaxe, o valor que ser recebido pelo JavaBean para a propriedade em


 , conforme recebido pela requisio
questo, ser o valor do parmetro 
HTTP.

% (&* / ( "- .* /-(

   "! 2 !   ) #%$ + ) 5 $ '+ 5 $


 !"2 $  !)
+
@1

4

Existe um ltimo tipo de elemento dinmico que pode ser utilizado em uma pgina JSP:
um elemento de referncia a uma biblioteca de Tags.

Uma biblioteca de Tags permite que voc tambm separe a lgica de programao
de sua aplicao do contedo da pgina JSP, assim como JavaBeans se prope a
fazer.
No entanto, ao contrrio de JavaBeans, uma biblioteca de Tags oferece um acesso
nativo aos objetos da pgina JSP, como por exemplo, o objeto que encapsula a
resposta do Servlet correspondente a pgina JSP.
Nessa seo estaremos explorando algumas caractersticas bsicas de biblioteca de
Tags. Uma explicao mais detalhada e aprofundada sobre TagLibs pode ser obtida
   )  .

  

em

         ! #)$ % ! ')("*  &- ( "$',# #) )$("-   &0 -"- /&# ! *

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.

Exemplo de um Descritor de Bibliotecas de Tags (minhabibliotags.tld)


Q

'!%#$"2 !9



B#9DQE 9<

8H /   


9   ? (I L& <=' N7I " C6H    -$-2/ 59A: D$" $".8# J"'6H 96D -F- 
 ?-
*+&  -F-  % "2569 DQ -  ## - EFE" -
#N! "2 8Q<@' N$ $


/ I7?

 EFE

,

 <

C6 NF$

!

-&- &

8Q<@' N

$.' N#!F"Q 9


  


- &' NQ#F"2 9

"Q*&96 J#  #,#  ' QF < - "2*6!&)9 J#

Q 9K8 Q#!  ' :E#N N' 8#D:E#7?B

<@"

- 9K+

$FQ<
Q9 J#,?


 <

' A459E  - 96, J#

8<D!' "." D   9*62#  F#"  ? Q<


' A59E  - & <D' Q" "

NE$DQ!9%8#!9%



#!  

$ 

- NE$D!9!&#!9!

- FQ<

- &<(' N

Nesse exemplo de Descritor de Biblioteca de Tags, podemos observar diversos


  ,
elementos: os elementos , 
e   contm, respectivamente, a verso da
biblioteca de Tags, seu nome (conforme referenciado posteriormente na pgina JSP) e
um texto informativo sobre a biblioteca.

 ./"-# (% # ("-%&.* /

% (

O ltimo elemento no descritor de nosso exemplo um elemento tag: esse elemento


serve para especificar um nome de uma Tag (   
 ) e a respectiva classe que ir

 +
 ). O elemento
tratar essa Tag quando utilizada na pgina JSP (
  
especifica o tipo de tratamento que o contedo da Tag dever receber: no
nosso exemplo, esse contedo dever ser vazio, ou seja, no dever haver texto
nenhum entre o elemento de incio e fim da Tag; outros valores possveis para esse
elemento so  e   .

.0  $&% .(
',(&*4! * %/"* "- /#"! 0  $ % .(

( '(%& /%&

0 &/&/% /%&

Embora em nosso exemplo haja somente um elemento do tipo tag, pode haver mais
de um elemento desse tipo no mesmo Descritor de Biblioteca de Tags.
O componente seguinte por trs do uso de uma biblioteca de Tags, o Deployment
Descriptor, j apresentado no Captulo
2 Instala oe Configura odesse livro. Para
que se possa utilizar uma biblioteca de Tags, necessrio incluir um mapeamento de

uma URI, referenciada na pgina JSP, ao arquivo .tld com a biblioteca de Tags
correspondente.
Assim, poderamos incluir as seguintes linhas no Deployment Descriptor de nossa
aplicao:

Exemplo de linhas includas no Deployment Descriptor para utilizao de


uma biblioteca de Tags
9  

? (
 I $

I " 
 CH 

#N! 

,

-.- / 59

8*%+& ( -F@

A0 D!F"#$"$8# J" 
 H 9D! -.- (
 ?-/
- E8E -

 Q! "259 D

#N 8  

#!N$*

 ' DQQ& !9

%

-F-

)&

 %@ E8E!

#!N( !  

8Q<@' N

$FQ<(' N(52 

-  9*6,N N!' 8 <" - & <@' N 85 

$FQ<(' N(' D

& !9

 -

(+H &

9*N N!' & <"2 &' E

- & <(' N(' D . !9

- &<(' N

 -

#!N +!  

O componente seguinte de uma biblioteca de Tags a classe que ir gerenciar a Tag


(    ). Essa classe, especificada pelo elemento
do Descritor da Biblioteca de

Tags, responsvel por executar as rotinas pertinentes quando a Tag encontrada na
pgina JSP.

.0  % /"-

0.'  # #

&0

"( .0

Essa classe que gerencia a Tag deve implementar a interface  ou     : a diferena


bsica entre essas duas interfaces diz respeito ao tratamento do contedo da Tag.
Como em nosso exemplo no estamos interessandos no contedo da Tag, a classe que
apresentamos implementa a interface  .

"&0

Exemplo de classe para gerenciar uma Tag (Tag Handler)


DQ<#JD   96*Q#  F#".

   ! "$#%&(' #)  "2   


   ! "$#%&(' #)  "2  8 <(#2. 

-.-

' Q" ".#356#<(#F#9D 

!5ON' D:D' "."0?


IQ<O#

-.-

?  <.

 <

' A59E5%& ' MQE#  ; <= 9Q"

 <
' A059E7  ' # J#9&"?  <

98#Q $ IQ<#

98#2&

H  !' #! J#98QG 7E#K85' 

5N' DO! E" #&I!F#9 ?  <

=F < R

0
-.-

H  !' #! J#98QG 7E#K85' 

5N' DO! E" #&IQ<#


$ I <#

!9%8#QQ+I<#

!9!&#QQ J   <#

98#    <#

!9F#QQ&

!98#  B
 R

/ IJE#9"."2L ' DQG

0
H  !' #! J#98QG 7E#K85' 

-.-

5N' DO! E

$#' #Q".#> R

0
H  !' #! J#98QG 7E#K85' 

-.-

5N' D

? Q<

.#)5$9

<#&IF#9 ! R
95' ' 

0
, ' 7A59%E!9 B3O59E77?  < ##9DQ9&$QE
  E# 9%#! $35#JD98# E:E:?B
".E/8 99".".D".6
 L?  < J
# M  

-.-

H  !$  JQ"

-.-

:K&569G7$#QF%$9

-.-

9 J" #% 7 $D#"

JF#QQF

/ 
 H I

,+R

5N' D7 9 E / &&? Q<


)

$
R

$ I <#

<

D&D*
.#)5$9

!9F#QQ& <O#! 5 ,+ . 9&' 9 ' 7A459E9 !

 D# ) 9  


#  R 0
/ @
 H I

 (

0
$#8.9= 

-.-

H  !' #! J#98QG 7E#K85' &LK&59G

-.-

.#"FF98#JE7 ;<( 9=; / IJ"2#  .DQ#"." QE

5N' D7 9 E 9E%?  <

* 
C  
I * 

E!#

J96#! F:356#:

! R

.#)5$9>  * C I* 

0
0

&( &-  &0

Os mtodos mais importantes dessa classe so os mtodos     , chamado quando


a Tag encontrada,      , chamado aps o processamento do contedo da Tag, e

 , chamado ao trmino de todo o processamento devendo liberar quaisquer
recursos alocados durante o processo. interessante observar que no mtodo   

obtemos uma referncia ao stream de sada da pgina, e utilizamos esse stream
para imprimir nosso texto  
  .

&( )% &0

- / /"# /

 $"% .(

( &-  .0

Finalmente, o componente final de nossa biblioteca de Tags a pgina JSP em si. Para
  
#  , podemos elaborar a seguinte pgina JSP de
utilizar a biblioteca de Tags 
exemplo:

* % & (&0 # ! 

Exemplo de pgina JSP que utiliza a biblioteca de Tags


minhabibliotags.tld (exemplotags.jsp)
>?BAC
 
I!$D#" "29%E!7?  <
' A059E7   P

?
Q

8<(' NJ5.  -

9*6,CO N  ? Q< ' A459E -

 - 
 


9*N N' QF <" 1 F#K8  7 9*C N?

- >(?

A0C

.0

$&-

Nessa pgina, primeiro inclumos um elemento !  , cujo atributo  contm a URI


especificada no Deployment Descriptor (que por sua vez faz o mapeamento com o
arquivo .tld correto), e cujo atributo prefix especifica o prefixo a ser utilizado antes
de cada Tag.
Na linha seguinte, temos a utilizao da Tag em si: h um prefixo, conforme
especificado pelo atributo #  do elemento taglib, seguido da Tag, que dever ter sido
declarada no descritor de bibliotecas de Tags. Ao encontrar esse elemento, o container
ir carregar a classe que gerencia esse Tag, e chamar os mtodos pertinentes.

&-/

* %".   &0  $ % .(

importante observar que no existe nenhum contedo para a tag   


+  ; a
    
 
 
notao
abreviada

equivalente
se
escrever
              . Caso houvesse algum contedo para essa tag,
 
 

teramos que utilizar um valor diferente para o atributo   
no descritor de
bibliotecas de Tags, e poderamos considerar a implementao da interface     em
vez de  para a classe 
+  .

* %".  0  $ % .( 
* %".  0  $ % .( ,* %".  "&0  $ % .(
0

.0  $"% .(

( ("%. /%&

"( .0

A pgina HTML resultante do processamento da pgina JSP apresentada anteriormente


ser ento:

Resultado do processamento da pgina exemplotags.jsp


>?BAC
  
I!$D#" "29%E!7?  <
' A059E7   P

' 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/.

 

  






Nesse captulo apresentamos o modelo MVC: atravs desse modelo, procuramos


mostrar como podemos separar o trabalho de desenvolvimento do trabalho de
formatao e layout da aplicao.
8

$ .$,&  ) "$

 34 



Normalmente, o desenvolvimento de uma aplicao Web envolve o trabalho de duas


equipes distintas: os desenvolvedores so responsveis pela programao, e os webdesigners so responsveis pela formatao e layout do front-end da aplicao.
Pelo que vimos at agora, existe uma interseco entre esses dois mundos: na verdade,
qualquer que seja a tecnologia que se utilize para desenvolver aplicaes Web, sempre
existe um ponto em que se mistura os trabalhos dessas duas equipes.
Agora imagine uma situao onde o incio do trabalho de uma equipe dependa da
outra equipe finalizar a sua parte; imagine tambm que, qualquer alterao feita por
uma equipe precise necessariamente envolver o trabalho da outra equipe. Essas
situaes podem onerar tanto o cronograma quanto o custo de um projeto.
Assim, tanto para efeitos de construo, quanto da manuteno da aplicao
desenvolvida, muito importante que haja a maior separao possvel entre esses dois
trabalhos, de maneira que as duas equipes possam trabalhar de forma independente,
sem dependerem uma da outra.

Embora j tenhamos visto nesse livro algumas tcnicas que auxiliam na separao entre
lgica da aplicao e apresentao, apresentaremos nesse captulo uma tcnica
muito mais eficaz e que pode ser utilizada de maneira complementar as apresentadas
anteriormente.

 .  ,!  )   $ 2
+ !"# $
&

%

O

32

A arquitetura bsica do modelo MVC, ou Model-View-Controller, se vale do uso de


Servlets, JavaBeans e pginas JSP: os Servlets controlam as requisies recebidas
(Controller), os JavaBeans implementam a lgica da aplicao (Model), e as pginas
JSP se encarregam da apresentao do resultado (View).
Podemos representar melhor essa arquitetura atravs da seguinte figura:

Figura 8.1

Arquitetura b sica MVC.

Toda vez que uma requisio recebida, o Servlet de controle repassa a requisio
para a pgina JSP responsvel pela apresentao da resposta, sendo que JavaBeans
so utilizados pela pgina JSP para obter os dados dinmicos da aplicao.
"1


$ )  )
! + ! & ( ),+

 

00

(%&- ( /-

Para que um Servlet 


  possa repassar a requisio recebida para uma pgina JSP,


  
necessrio utilizar um mtodo especfico da classe  
.

    ! # /-  /. !  !  /-  /. / $/# 

Assinatura do mtodo getRequestDispatcher () da classe


HttpServletRequest
!5ON' D7  ! ".#' #Q. P#35#"$@ "2 % &D*#%<#&P#3%5%#"$@ "2  8D*#!@+  O ' 9<( / )$ 9<



&*+

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.

    ! # /-  /.! / &$/#  #)&'./-

(-  -

  que permite que voc


Esse wrapper, por sua vez, disponibiliza um mtodo 
repasse a requisio para o recurso encapsulado pelo wrapper.

Assinatura do mtodo forward () da interface RequestDispatcher


!5ON' D! EJK8,

!)E + >(+& / #F' #Q&P%#35#"F 

$#35#"FO>68& / #' #Q&P6#"2 9".#  $#"Q !9" # +

Podemos, dessa forma, implementar um Servlet de exemplo que no faz nada, apenas
repassa todas as requisies recebidas para uma pgina JSP.

Exemplo de Servlet que repassa requisies 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' "."

5N' D

/ #!)' #&P# ".".P6#3"4# &#9E"

>(8& / #!)6' #R

 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" # +

D&D*

/

#(' #Q !
DQ#% & !9 B# B
 R

0
0

No Servlet anterior, existe um ponto importante que deve ser observado: o path
)

referencia um recurso
passado como parmetro para a funo  
contido na mesma aplicao Web do Servlet, e, dessa forma, deve excluir a parte
referente ao diretrio virtual da aplicao (ou seja, esse path no deve ser escrito
 +


). Alm disso, importante observar que o mtodo 
como  
poder lanar uma exceo: uma das causas pode ser uma exceo lanada pelo
 
prprio recurso referenciado pelo  
.

0/& / &$/#  #)& '. /-

 -(# / -  /#  $ % .("! #)

("- &-

/ $/&#  #)'. /-

Podemos tambm implementar a pgina JSP referenciada no Servlet anterior como:

Exemplo de pgina JSP OlaMundo.jsp


>?BAC
 
?

!5%& 6. 9&' 9 ' 

A59%E!9 ,8? 

 - 
 


- >(?

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

 $ % (!  # 

Resposta do Servlet ServletRepassaReqs


>?BAC
 

' 7A59%E!9

 - 
 

- >(?

A0C

   ! 2   + , )  ) ,! + ! &
(*),+


4



Existe ainda um outro recurso da API de Servlets que iremos utilizar no desenvolvimento
de nossas aplicaes Web no modelo MVC: esse recurso a definio / obteno de
atributos da requisio.

  / -  /. / $/# 

A classe    
possui quatro mtodos que podem ser utilizados para gerenciar os
atributos de uma requisio.

Assinatura dos mtodos da classe HttpServletRequest que gerenciam


os atributos de uma requisio
!5ON' D

   ' 9<( N! #D  <(#!*B8& N58#+   ' !9<  / & 9<

!5ON' D

   5. '  95 J#F ) !9L<@#Q!*B&2 N!5!8#

!5ON' D

! E

$#! J#*

&

 J#"

+). N58# + Q! ' 9<@ / .. 9!<

B 8& N5&#&

!+

=Q+.. N5%8#!&  J# +

 :#+

! EJ"2#* +.. N58# +   ' !9<( / &2 9<

!5ON' D

=Q+.. N5%8# 

  8& N5F#&B J#  Q ' 9!< 

N #D 

' 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
  , eles podem ser objetos quaisquer Java.

- %"0

Para exemplificar o uso dessas funes, vamos implementar novamente nosso Servlet

 
  da seguinte forma:

/-  / /". # #) / #

Segunda verso para Servlet que repassa requisies para uma pgina
JSP
    
   ! "$#%&(' #) 
   ! "$#%&(' #) *!+)  ,

-.-0/ #(' #1"2  !' #"43%56#7$# "." 7.#35 "2 G #"0$#D#!N E"
!5ON' D:D' "."

/ #!)' #&P# ".".P6#3"4# &#9E"

$: ; <= 93; / I

>(8& / #!)6' #R

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

O#K

-.-

"0H DQ# & 9R

9 J"

Q& N5%87EF#35 "Q G:D* JQE&8A4#!96". <# /

5

 $#35#"F& ".#*B8& N5&#8A4#!9"  <#! /, ' :A:59E9 !+

P#! %Q"."29%E:.#3%5O " G 

-.)

.: ;Q<( 93; / I

 .#3%56#")& <O#Q&P#35#")= " 8D*#

* $#"
0

$#" #!9!&A4#!9"$ <#!   ".

/

D&D*

!

#9". <@#   ". !+ K ,

#!9FA

#(' #Q !
DQ#% & !9 B# B
 R

- ' F".#(' #&" FE+  F#3O5#"FO  $#"Q !96".# +

0
0

A pgina JSP

"- /# / %. /%&# &0/&* !  #) , por sua vez, pode ser implementada como:

Pgina JSP ApresentaMensagem.jsp


>?BAC
 
?
/ & 9<

'  J#!96". <#

K!+'  J#9". <@#!

 /

9 L95' ' 

)$ 9<B$#35%#!")& <@#Q* +.. N5F# 8A4#9". <# /!+

!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.

 -
 $*-
 $'+ ,$  ) +


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#' <

!5ON' D:D' ".":C<( 9J# &#9E"

9J#JK8,MJJ!5!&#!9!& DQG EJ! ' DQG

>(8& / !
# (' #R

-.-

 #. K8 DQ7".##! ".8#5" 5;!. 7D! 

-.-

#! "F. @.#8.9J9  #!'E6#7D#" " 7E56"25;!$ J#! 356#"F 

-.-

5" 5;!. 7D! 5 /

  8#

9

& %#' *

,

.J9  #!'E6#

.J9  #!'E6#7E%  9 "$&FQE + 6D"$D!9%&$;.  O.#&! 9

DQ#"."2 "@"256.  

9%'  9O #' * D#" ".>

 

K"  ' <( 9/9 :


 95O' ' 
-$-

 !D

-$-

#"$#%96*:E

-$-

+ 

D! J !  J#&F(" #

' <( 9J#" #!9*6: "$"2QE"

E6##



/ &2 9<

' <@ 9





 ".#9*BR

/ ) 9<

+ ="

9 J95' ' BR

#!96*



!' #! J#98

3%56 D E <

56"25;. J#E#K& 9 

.' E!

' Q<= 9

L2 ;Q#'  '  9O #!' * D#"2"$

#Q#!  '  D9"25O' 89EJ5 J7N".#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

-.-

O#K

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE# ; <( 9

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

-.-

O#K

&B #!' *

9 9E:Q& N5F"

K"+'  9 #!' *

DQ#"."2/9

8C

BH &

    

9  #'E#QD#"." 

!' 

".#9*6<

DQ#"."2 "@"Q5.  +'  ' <( 9 


 ' B".#!9O*+

5",5%;. K8

O;' E

F#35#"$& <O# / #".", !9 ..5#8

 
 ' B".#"."2Q ".#* +). N58#8C

' =" #" ". )#! JQO#*B8& N58#8C

BH &

!+

A0?-!+

 D52)#!9&?B J#A ' ' "

 / (
&B>* !

E#" #" " > " #J

>O+& / #".", !9'  "$#!"$"2Q/ 

/ 
$ ".8#

5%"25;$ J#!N!8#!9EJ".#5

'  ' < 9/7  F#3%5%#"$& <#&I. J#8#

9%'  9O #' * D#" ".>

;65'
 

CQ".,AE K8 #E

 .#3%56#")& <O#Q&I!F J#&#

#' " #

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

M#9EJ5&#9) DQGJE

/ &2 9<

-.-

H&

!' 

' < 9+

!+

)

R
K!+'  9 #' *


 R

DQ#"." /

"@"

-.-

9 JD!96".#<(5 5J".#!5!&#!9!& DQ 6#Q! "$&#

5;!. 
-

E%5%"0 "."Q N ' EQE#"

5"25;. J! 9E:9 J#9 !5J"E!E"E

-.-

' <( 9

-.-

K8! 5' ;. /+"2  ' #"2 J#!9!8#:D#" "25 ;<( 9% +#  N"4"D"."'

-.-

K8,M# J"05

".#9*7 9D2F#8"

 K8

5

FE $

; <= 9=; / I/ . C%Q<( 9  "2 

 $#356#"F& ".#*B8& N5F# 8A4#9". <# /!,!8


K",+'  ' Q<@ 9/9 :
 95' ' 

!8A4#9".

+' ="

9 J95' ' + 

#!9*%

<@#! /!, .$!O' Q<= 9J# - !5

F#35#"$& " #Q* +.. N5%8#

".#9*J 9;' E "

9 +

 $#356#"F& <#&P#3%5%#"F "2  8D*#!@ - 6!. C%Q<( 9  "2 !+ K 

FE +  $#35#"F

 .#", 9"2#+

0
#' "2#R
-.-

"@"

-.-

D2)#!"Q !9E#98#JQ"2#5

58#9& DQQG  6F#".#!9%89E: 98#K8QD#

5;!. 7D!96".#<(5 5J#K+#&5

9  #!'6E#JD#" "2

 $#356#"F& ".#*B8& N5F# 8C%Q<( 9!'  ' Q<= 9+


K"'  9 #!' *

! - "
#' " #



! - *



DQ#"." 

"25. 

 

F#35#"$& <@#Q&P%#!35#"F@ "Q  &D*6#!

 5   "2 ,+ K+!

FE +  $#35#"FO  F#"2 9".#+

.#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
&B#"

".# / #%&(' #6


 ": /# &E"  !?
8 #'  J#"2 J))#!D*6JE!#DE <(

-.-.-

I

" L)$ &QE"

/ ?

 E7E6!I"F + >6& / #(' #)P#35#"$ 

5N' D

&*OF

EJ #" J

9#! .

F#35#".>(+) / #!)' #&P#"2 !96".#7  F#"2 9".# 

"0H DQ# & 9R

E #8  .#35#"$  F#"2 !9%".# 

0
0

Conforme voc pode observar no Servlet anterior, no existe nenhuma codificao


feita que se relaciona a apresentao da interface para o usurio da aplicao. O
Servlet simplesmente trata os parmetros recebidos, repassando a requisio para as
diversas pginas JSP da aplicao, que devero ser responsveis pela interface em si.

Pgina JSP FormLogin.jsp


>?BAC
 
?=

/ & 9<. $#356#"F. <#*B8& N58#8A4#!96". <# /!

  PA

* 

?BH &

C<( 9(QH &BI "(?


/ #9* Q
 H

H &BI "(?

8C<

? (
 I +?

&
I "@?

? (
 I I*

? (
 I  /

!?B>  I

9 BA

6?-&
//

" AH ?- &.*

* 3
A 8C
P. & *

/ ?

? P

,
BH &P

 /
& 
> * ,P

 * (
! (&=? 
P * 
P
C " ! 69&F! !P

 -  PA 
 - 
 

- >?

A0C

Pgina JSP UsuarioComum.jsp


>?BAC
 
' ; @? :$#3%5%#!")& <@#Q!*B+.. N5F# 8C%Q<( 9! ?%D


8#

D#"." 7D!

5" 5;. :D!

5! /9

 - 
 


- >(?

A0C

Pgina JSP Administrador.jsp


>?BAC
 
' ; @? :$#3%5%#!")& <@#Q!*B+.. N5F# 8C%Q<( 9! ?%D


8#

D#"." 7D!

7QE  9 ")&.QE!@9

 - 
 


- >(?

A0C

Essas pginas JSP podero ser trabalhadas pelos responsveis pelo layout e formatao
de nossa aplicao, sem afetar a lgica e o trabalho de desenvolvimento.

 

            

J apresentamos nos captulos anteriores as principais caractersticas e funcionalidades


referentes ao desenvolvimento de aplicaes Web com Servlets e pginas JSP.
Estaremos, nesse captulo, apresentando alguns tpicos adicionais que
complementaro todo o conhecimento que voc obteve at agora: voc ir
conhecer arquivos WAR, mecanismos de autenticao HTTP e pools de conexes a
uma base de dados.

,   ,!   + /1 


%4

J apresentamos, na seo 2.2, uma maneira atravs da qual voc pode instalar uma
aplicao Web em um servidor de aplicaes: voc pode fazer essa instalao
 , uma pasta com o nome de sua aplicao, com o
criando, abaixo do diretrio
contedo dessa pasta obedecendo a um formato especfico (veja seo 2.2).

/ #

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

Na seo 6.4 desse livro, apresentamos um exemplo de aplicao contendo uma


autenticao baseada em formulrios HTML. Essa no a nica forma de fazer a
autenticao de usurios de uma aplicao.

O protocolo HTTP incorpora uma funcionalidade que pode auxiliar na implementao


de um mecanismo de autenticao. Estaremos, nessa seo, mostrando o
funcionamento de um tipo especial de autenticao, a partir do protocolo HTTP,
chamada de Basic Authentication (autenticao bsica).
Para implementar esse tipo de autenticao, precisamos utilizar o cdigo de status de
resposta    (   
.
       ) e o header de resposta  
,

 /- / /&#) (%&# /!

$ /%& '   /

Ao retornar uma resposta com esse cdigo de status e esse header de resposta
contendo um valor          , onde    !  deve ser substitudo por um nome do
domnio no qual estamos fazendo a autenticao (cada domnio deve proteger um
conjunto de recursos de sua aplicao), faremos com que o browser do usurio de
nossa aplicao mostre uma caixa de dilogo pedindo um usurio e senha de acesso.

&(&* % (

(&* % (

O usurio e senha digitados nessa caixa pelo usurio sero enviados, por outro lado,
junto com uma nova requisio a nossa aplicao, atravs do header
  . O valor
desse header estar codificado no formato Base64, sendo necessrio utilizar um
decodificador para ler, efetivamente, seu contedo: esse contedo ser um texto no
!    .
formato        

$ ( -   ( %

$#)$ - ( 0  .(  # /% & 0  &

O Servlet a seguir exemplifica o uso desse tipo de autenticao HTTP:

Exemplo de Servlet que utiliza autenticao HTTP para controlar acesso


    
   ! "$#%&(' #) *!+)  ,

5& ' MB!5F#!9& DQG 

-.-0/ #(' #35%#

/ #!)' #!*

!5ON' D:D' "."

>(?=?

I !F1D9&$!' !OD#" "  E#

58#9& DQD!>?B? IL#Q8#9E">O+& / #%&(' #

 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

O#K

-.-

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE# ; <( 9

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49  

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

-.-

NQF#!9EJJ' !4E

-.-

E#K8 9O J"

-.-.-

 ' DQG

5",5%;2 "@E



9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

<( J!896!DQD*#!+

*#E#%

K"+'  *#QE#!

/ 
$ ".8#

    

A0?-!+

 D52)#!9&?B J#A ' ' "

!+

5%&*! M& 98" ##"."2#J' 1K895'  

 *5!)*#9& DQQ8#E1 $:35#J

'  *#E#!

;65'
 

CQ".,AE K8 #E

D E <@7E#.#"2 %"$87>(? ?BI

E ;!' Q<@7"$%' D &9%E:

/ &2 9<

/

N.

F##9D* J#98LE#

'" &.* "@?B> PH  


".#!

E

#

*#QE#!

5"25%;!. 7 !$#" #!9!&#:JD :E#

' <( 9J#" #!9O*

5&*/7  .#3%5%#!")& <O#Q&>@#QE#!@

5&*%!. MQ& !9

+

5)*&J95' ' 

R
 .#", !9%"2# " #Q&>@#QE#!

*

/ H

C6A3

!     * 5&*#9& DQ &#!


% O!  96 :E#$*5F#!9& DQDQ%!!

 .#", !9%"2# " #!9E .$!@+  .#"2 9".# /

'"& * "(?

>
PH

 .+

$#Q.5.9

0
-.-.-

O#DQ!E K8 DQ96E7DQ9F# EJE*#QE#! O $7 " "  5. ' M J" D' Q"2".#
!
 "$#    %
;   BE "2 9  #'# *8&  -F- *%!FE#. " !56FD#K8!)<# 9# - NQ".#  (-

 / # 9%#!D#"
 #!' #"4D9#!

-.-.-

/ &2 9<0'  *#E!#,*

-.-

".;!$ E#".D9"2 E#%)!

"

$ J#! ."

D!FDQ8#F#"

E

*%#E#

Q"Q D/!

/ &2 9<


5.*O#DJ9#

/ &2 9<Q"2#

 

 E#DQE# '  *#E#!

5&* " 5N"F). 9<



' <( 9&#".# !FE7EL"2#9*: #' JD.QD&#!$#

/ &2 9<

'  ' < 9/7'  *#QE#!

/ &2 9<

'  ".#9*=J'  *#QE!#*

I2 9

5&*O#D " 5N"F&. 9<

'  
J  .#", 9"2# <@#Q

. F#!

'  

 . 9!)' 9Q>? AC !+

'  

 . 9!)' 9CQ<( 9(%' (

'  

 . 9!)' 9 / #9*%

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

)(

 -.

  ' 

*#QE!#*

5.*O#D "256N")). 9<+'  *%#!QE#*

'  ' <( 9/(+"%


' B"2#9*

   
 (

5.*O#D 9E#Q =K


5&*O#D 9E#Q K!

 !+

+

8

. 8#!8

P+

(+ %',P ,+

- >?BAC, 

0
0

Existe tambm uma maneira de implementar a autenticao de usurios que esto


acessando nossa aplicao baseada em elementos de segurana configurados no
Deployment Descriptor de nossa aplicao (veja seo 2.2).
Para implementar essa autenticao dessa forma, voc deve adicionar elementos

 
 e um elemento      ao Deployment Descriptor de sua aplicao.

# / '.$&-  '(%&# - % 

("0 % '(% 0

Exemplo de configurao de segurana no Deployment Descriptor da


aplicao
Q".#D5O.  $ D!96"F)F 9


#N(8$#".5$DQ#

@

Q5$'  
 -




D' ' #DQ& !9

#N &)#!" !56.DQ#(F9 J# '*


88#.9

-./ #!)6' #*

F#7P#"F)$ & -

5%8#!9%& DQDQ>?=?

#!N(.#"25)D#!F9

I

- 5.' 8 +&#! 9

# 

#!N(.#".5FD#!D' ' #DQ& !9

5&*) D9"F.F! 9Q)%' #!F9 J#$8!

- "2#D5O. 

DQ 

- $!' #!F96 J#  - 5&*(+D9".&$ 9!

$)8D!96"F))! 9!

' < 9(+D!9%K <




5&*) J#&*E*

Q$#' +96 J# 




/ H

- 5%&*( J#&*%E

!  9 :E#$*58#9& DQDQ  - F#'

9 J#

- ' Q<= 9( D!9%K8 <.

Os elementos apresentados na listagem anterior, por exemplo, definem que os acessos


 
 

  devem ser autenticados. Em particular, o elemento  
a URL  
define o grupo de usurios que deve ter acesso a URL em questo: os diversos
grupos, com seus respectivos usurios / senhas, devem, nesse caso, ser configurados no

  abaixo do diretrio de instalao do Apache Tomcat.
arquivo  

% * /

 -(# / -  /# /"- / $  /"%  ',&',(

-( /

'(%  (&* '. $ #)/"- # ! "*

Se voc optar por utilizar esse mtodo de autenticao, voc deve chamar em seu

 e

  *   , da classe     , para obter o
cdigo os mtodos 
nome do usurio e seu grupo.

0 / /&* (&/ # / -

0/ # / - - %"' &

 /"- /. / &$ /&# 

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*$ + ) , ) $  +




Uma das grandes vantagens no desenvolvimento de aplicaes Web com Servlets e


pginas JSP a performance obtida em funo da persistncia dos objetos carregados
em memria. Em particular, conforme mostramos em diversos exemplos ao longo desse
livro, o estado de uma varivel esttica pode ser mantido ao longo das diversas
requisies recebidas pela aplicao.
Um dos recursos que mais se beneficiam dessa persistncia em memria so as
conexes com o banco de dados: como o processo de abrir uma nova conexo com
o banco de dados pode pesar significativamente na performance da aplicao, vale a
pena manter as conexes abertas, em vez de abrir uma nova conexo a cada
requisio recebida.
Esse tipo de persistncia , normalmente, implementado por meio de um gerenciador
de conexes a base de dados: a cada requisio recebida, um Servlet chama um
mtodo desse gerenciador para alocar uma conexo; ao trmino de seu
processamento, o Servlet chama outro mtodo para liberar a conexo previamente
alocada. O gerenciador, por sua vez, responsvel por estabelecer efetivamente
novas conexes quando necessrio, e armazenar essas conexes abertas.

(.(
(% 

A classe 

! 



, a seguir, implementa um gerenciador de conexes a base de dados:

Classe PoolConBD: implementa gerenciador de pool de conexes


com a base de dados
DQ<#JD  ' F".#(' #QF"2

    


   " 3'  ,
   5!) '  ,
   5!) '  O F#!

-.-

B#F#!96D QE!
A49#!

-.-.-

56

E6#7D%9%# %#"4

N9D7E6#7EE"

%!'E#DQ9# #"4Q& "

D! 

N9DJE#JE!E!"4E# J9# F:35#9 

" # 796#D#!"$"2; J"2#J#".8N#%' #D#%45 J:9:D!96#Q J7DE

$#35 "2 G 

F#D#%N E

!5ON' D:D' ".":I!'  !9


R

-.-

I'E6#7D%9%# %#"4E#

56  ' DQG J#"Q #D  K& D

-.-

" "2 /
 DEJ! ' DQG&
+DQ"2JD9.F;!. &E"4"

-.-

9"F 9%D! LE7 J;Q35 96

-.-

#%NJ E#

J9%8#!45

 ' DQG #"43%56#K8$#!

D9 598:E ".& 9&LE#7D9# %#"


##D!5!&QE"4#!

@ &&5'F# J35#JD  ) ' *

  8#"FFQ& D:D' Q" "0I%'  9*

J#"2

5 J:
7I!' +

' D

&.* ' D

.  &#

/ &2 9<

.  &#

 #DQF! $ I'

-.-

"=.' 5%",5

.  &#

/ &2 9<

J95' ' 
7956' ' 

&

-$-.-

!

#:E: !' DQG %

I!'6E#D9# #"

E#"2"$:! ' DQG 

J#".#9*: F:N. 49Q"DQ9# %#"


&'" .' J
 95' '  $'" "25%. /7965' ' 
 & / #!96*=7956' ' 

#"2 J

-.-

?  J9*6: ;  JJE#!"$"2# ' E#"." K8! J:# 8

-.-

5

-.-

 #JE#..5ON

" #!)6 E!

E#

.  &# 9% $ ?  A4 I!'

-.-

?B J#!5

35%# 6D"$

*! 

N9DQE#JEQE",

 B

$:#"F&N#' #D! J#!98JE#

.  &# 9% $ ?B J#55

9QOQ"0DQ9# %#"

B

.  &#/=. #!4 & @


  #;%END&7956' ' 

.  &# 9% $'&B5

!9%"*

' DQEQ"=

-.-

. O#! END

&  J#F:D%

-$

-.-

H 9 D! !' M:#"F)$5&5)"0' DQ! "DE"$&.LE. #! END:#

-.-

NF#J

#! $D9# 7D%

2
I!'  !9

5N' D

"

9J ' DQG 9%QQ"DQ9# %#"0"$#%  N#F8"0 96E#QK& 9 E J#!9!8#

#! F

*

' D / ). 9<

 5O.'  / .. 9<

/ &2 9<

@. J#5

F#98#JE#DQ9# %#"0' DQEQ"

N"$#7E#EQE"
= !' D / ). 9<

=E #;%END / ). 9<

 5"Q5.  / ). 9<

 9! J#.

 " #!9*6 9 =8 7A4 I'  9

"0I'  !9. DQ# & !9

&*$

R
K!+ =! ' D=9 :
 9O5' ' BR

9 7956' '  

+  9%! J#  9 J95' '  


  + 
 8  ".#9* 9 7965' '    + 
+ @& #!5   B
 R

K",+ =E. O#!;%END

 

56"25$ &9 L95' ' 

 
&.*

5$'

9 7956' '  


 I!'  

& JA

J B ' D

' D

& I' J
 9#

 #D &3,+

&'"=$'7  52' 
&'"@" 5. /J  5"Q5. 
& / #9*

J 

".#9*6

& ?  A4 IQ!'7 @F A4 I' 


& ?B J#5 7 @. J#!5&

-.-

)

 F#<9E

DQEQ"..F96E!JE. #%

;6END

R
 
 + Q#2 ; E2N D


0

  + Q#2, 

' ."+"& K Q 


& . 4#   EQ+ #2 ,; E,N$D   9 #

H 9."  )9 DF#   

. %#.A49 <O#%$ F#<( "F&# @


 . #!@+ $ @
 . #!;%END+

 !D#! . !9 =# 

DQQFD*

.*F

I!'  !9. QD# Q. 9+ = ' DF9 LK8  "2"  #'

9#

D..#<( - DQE!"F)$

EO. %# END+

0
-.)

5 JD!96#Q 

H 9 D! ' M9E7 !'ODQ


R

'&

DQQFD*

I!'  QEE ' # J#!9!+' DQ!& QO

5

!9"*

' !DQQE6Q"3

 !D#! . !9 =# 

E#"..F! I'
.*F

9#

D! 

!96#QQ/!+

+
I!'  !9. QD# Q. 9+ = ' DF9 LK8  "2"  #'

 . J# F:D9#%!

 ( 

# <@#Q&A4#".". <@#

0
0
#' " #:.*F

9#

&  J#Q.F"

I'  9. QD# ) 9+ =! ' D


E#D2 QG E

!' 9;' E"

,+

!

0
0
-.-

' D5 J:9D9#QJD!

-.-



/ 
 #"." #

-.-

.N' # JQ"

NQ" #JE#7E6QE!"

&#QFE F#D ".7"$#%" 


$ 9D*OF!9O M#E !):#( F
E#DQ9D.

.  &#J" 


$ 96D*$!9 M#!E

9D 79%7D#"." 7




996#DQ& 9J!' DQ &=

!996#D& 9' BD9>J95' ' 

.

9#Q !.*F

"=I'  9. DQ# & 9R

' =D9>&=. #! A49 <#. <O#

I'

 !D#! . !9 


# 

DQFD*

)*6F

99%#DQ& 9 $'" .' 6 &'"@" 5.   $ / #9* +

I!'  9. QD#! . !9+ $.*

9#

 (+1

D!96#Q 

)M JK+ %

' D&9 :K8 O " " #!'6!N2 

)(


#! <#&A4#"."  <#/ (+

9

%',!8

0
$#Q.5.9'  DQ9

0
-.-

P#QF!.96" #

" " #!' 


 5 JD%9%# JD NQ"2#JE#EQE"

-.-

 !5

#!98#JE

-.-



-.-

.N' # JQ"

E% F#8
/ 
 #"." #

'5

5

9%JDQ9#% 

&#QFE F#D ".7"$#%" 


$ 9D*OF!9O M#E !):#( F
E#DQ9D.

5N' D:"#$(96D*$!9 M#E

9D 79%7D#"." 7




!996#D& 9J!' !DQ

I'

9#,



&*$

I'  9. DQ#! !& 9


"

!996#D& 9' BD9>J95' ' 


K!+ $ I'

9 7965' ' 

R
K"+

I!'  "2 M#/!

 

R
%'6E#DQ9# %#":9 #".& #1,M% O E#! J"

-.-:/ #
-.-

F#) )!

E6#!' #

' =D!9+  

0D!96#Q 

5

%969#D& 9B $

I'  K8 $"F ' #! J#9 8

& I'  $#! J# 6


' #! J#9* 

)

 +

K5+' =D9 "

$#Q(  J#!98#J#"F&N#' #D! E

DQQFD*

' ".#E>!B' =D!9+7965' ' 

 D# Q. 9   


#  R ' B
 D!9+7965' '  0

K!8'  DQ9/J95' ' B' =D9>L!' DQ

!96#QQ/8

0
#' " #

K5+ $'&B5

9"*

' DQE!Q"=J $ ?

, A4 I!'

R
-.-

  6D".D9&$;  6" # 9%E!J9 J& %#. J"

-.-

J; ! J:E

!' O E!# J"

' =D!9+:' DQ!& 

#"$8!N#' #DQ#

& 9!<( EJJ8! J9*


56 J79QO:D9# 

!96#QQ/!+

0
#' " #:.*F

9#

I'  9. QD# ) 9+ $.*


& 9<( E+

E#JD9# #"

0
K!+'  DQ!9+9 J95' ' B &'&B5

9"*

' DQEQ"=((

' D96 J#!$7 J;Q J

$#Q.5.9'  DQ9

0
-.-

C N#F756 J:DQ9#%

-.-



-.-

DQ9D.

5N' D

/ 
 #"." #


F#8%$9:#"."

)#  J#!9!8#:!' DQE

:D9#  .L

&#QFE F#D ".7"$#%" 


$ 9D*OF!9O M#E !):#( F0 $!N' #! JQ"
9D 79%7D#"." 7

" 6
$ 96D*$!9 M#E: E
K"+

' 

E#

I'

' N%#!F

!9%#Q

99#D & !9 =D!9


R

9 J95' ' 

I!'

R
),$
R
K!!9  DQ9 "

' " #E>, $ I!'  QE!E O' # J#!9+ =D9+

 D#! ) !9  B#  R 0

DQ&D*

&'&B5

96"*

' DQEQ"

,:


0
0
-.-

9 6
 J#!FJDQ2F#98#E#JD9# #"

P#QF!.96

5N' D:"#$(96D*$!9 M#E

9

&B5 

N8#!

9"*

' DQEQ"

' DQE!Q"

!

'&

$#Q.5.9

56

!9"*

' DQE"2

0
-.-

O#"F)F O !'E6#7D!96#Q

 K+#!D*9EL&E6Q"0Q"D!96#Q

#"

5N' D:"#$(96D*$!9 M#EJ EE#"F.F I'



&*$

#"4!N#&Q"

"I'  !9. DQ# & 9

R
K!+ $ I'

9 7965' ' 

R
K8

+ 9% .
 =O 7 $

I!'  " M#/!+O ((

!9O9#DQ& !9' =D9>&

)

99#DQ& !9 $ I!'  #' # J#!9*B + +

R
K+' BDQ9/9 L95' ' B' BDQ9 D' ".#/!+

DQQFD*

 D# Q. 9   


#  R 0

0
& I!'  .# JQ#*

),$

,+

=. #!
0

' ' 6' # J#!98"

DQ&D*

A49 <#. E#F#<( "$8# @


 2 #% + $ @
 . %# !
; END+

 D# ) 9 =# R

)*F

9#

I!'  !9 . !,DQ# ) !9+ $.*

E#"2DQEQ"F.F!

' DF9 LK8! @ "2"  #'

E. #%4 END+

0
0
0
0
-.-

>@"2*&N' #7D!

J # J#!9F:#!9%&F#

  8#"FFQ& D7> "2*FN' # $ I' "

' DQ"

9 J#"

79%#

EQ"! ' DQG #"


>@"2*8N!' #

+

#" #!56"0$#"Q #D ) "0 %!' "

-.-

 5 9

' )& 

9 J#:EJE. #

-.-

E#JD9#% %8! J9*%7 ;  J:E6

5N' D

EE" O
 9! J#JE: ' DG % 

E6"".#<(5 98#"

E#JD9# 7NQ" #7E#JEQE"'69 J#:E7NQ" # O5O.' -

-.-

"$8Q& D:" 
$ 9D*OF9 M#EJ ED!$ I%!' *
BE% #;%END / )$ 9<

' D / &. 9!<

 9! J#. / .2 9<

"2#9*%

  ' D / &2 9<

 5O.'  / .. 9%<

 5"256.   / & 9!<

"0I%'  !9. QD# & 9R

B"2#9* 9  & A4 I!' O 9! @) J#5 &*$

K"+ = ' D

5" 5;!. 

'#J& J#5 E#D9# 7NQ" #7E6#7EQE6"2

9 J95' ' BR

I!'  9*
K!+'  '

&+I' 

' DJ'  !'

9 :956' ' B' 

'  !' 7
 9%#

9

I%'  9*

' D $ I' "

!' D"2 <@#Q+ = ' D

+

%'  E#"F))! I!'

' D+ B !' D =E. #! %


; ENDO  9 J# .  56.'

 5"Q5.  =" #!9* =8 A4 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

R
I!'  !9*
K"+'  !'
#' " #

' D7'  !'

9 L95' '  F#&5

$#Q.5.9

&+I!' 

!9*

9'  '  ' DQ

' D $ I!' "

' DQ"2 <# + = ' D8

9#Q>+

965' ' 

0
-.-

 # 7I'  !9 * ' D !N8#

5N' D:"$8Q& D7 91%N8#

&B5 

&

5

!9"

9"

' DQE"

/

' DQE"

  6' D

& 9<

R
I!'  !9*

K"+'  !'
#' " #

' D7'  !'

9 L95' '  F#&5




$#Q.5.9

&+I!' 

!9*

9'  '  !N&#

' D $ I!' "

&=5 

' DQ"2 <# + = ' D8

9"*' DQE!"

!+

0
-.-

 # 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*
K"+'  !'

' D7'  !'

&+I!' 

9 L95' '  '  '  ' N#F

!9*

' D $ I!' "

' DQ"2 <# + = ' D8

!96#QQ + =D!9+

0
-.-

 E#I'  9.* ' D E#".&F I!'

5N' D

"$8Q& D:" 
$ 9D*OF9 M#EJ EE#".&$! I'  / &2 9%<
&*OF

"0I!'  !9  
QD#! & !9

  ' D

R
I!'  !9*

' D7'  !'

K5+'  '9 :
 956' ' 
R
'  !'  E#".&F I!' +

&+I!' 

!9*

' D $ I!' "

' DQ"2 <# + = ' D8

$ I!' "

' DQ"2 F# JQ#+   ' D+

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    
   , :

'/& ( %

(.( (% "',/&  (%

Classe PoolConBDException: excees associadas a classe


PoolConBD
DQ<#JD  ' F".#(' #QF"2
DQ<#JD  ' F".#(' #QF"2

-.-

%DQ#G  $<@#%)#!96D E

E#JD9# #"

!5ON' D:D' ".":I!'  !9. %,DQ# & !9J# &#!9%E"

N"$#7E#JEQE"3FI'  !9.

DQ# ) !9R

5N' D7I!'  9. DQ# Q& 9 / .. 9<



5N' D7I!'  9. DQ# Q& 9 / .. 9<

B ' D  / )$ 9<

"25O #

, (  

 ' D

(+  ( 


"F<BR1",56 #! +  J"F<+

 J"F<BR

J"F<+

0
0

Finalmente, temos a seguir um Servlet para exemplificar o uso de nosso gerenciador de


pool de conexes:

Servlet ServletTestePool: exemplifica o uso de nosso gerenciado de


pool de conexes a base de dados
DQ<#JD  ' F".#(' #QF"2
    
   " 3'  ,

   ! "$#%&(' #) 


   ! "$#%&(' #) *!+)  ,

 

D  ' $".#' #QF"2  

-.-0/ #(' #


!5ON' D:D' "."

-.-

.

&#"$8#E

/ #!)' # ?

!'E6#7D%9%# %#"4

#"$8#!I!'6# &#9E"

H 9 D ' M7 !'6E#JD9# #"

NQ" #JE#7E6QE"

>(8& / #!(' #R

5N' D

&*OF

"
"

K5+  ".#(' #Q

B"2#F' #Q

!9%K8 <

!9%K <

9Q ' N' # QD# ) 9 / #(' # %QD#! . !9R

"25O #2 9 + =".#' #Q

.

9  / #%&6' #

 E

!9!K& <

!9%K <+

9 7965' ' 

R
I!'  !9

@ D I' * ' DC () / #!@' #QF" DQ  $".3'   END @$ # ,
&' ()" #!)6' #8"',  END $O".3'  -$-
  =  
 %% (- ' @F" #!@' #8" 
8QE  9! %
!
    

DQFD*

 DQ# ) !9 =# R

)*6F

9#

" 9 ! ' N' # QD# & 9 , .F(9 LK8! @ "2" #!'6D!
( 
=# <O#&A4#"."2 <O# )(> %'!+



!' 

% 

0
0
 E7E6B#Q + >68& / #(' #Q.P#35#"F  F#3%5%#"$>O+. / #F' #Q&P#"2 9".#  F#"2 9".#

5N' D

&*OF

O#K

-.-

"0H DQ# & 9R

9 9E7*#QE#!)"05!! ' !F#"

F:#( &4DQD*# J#!98JE# ; <( 9

 $#"Q 9" #! " #Q&> #QE#

! 

 $#"Q 9" #! " #Q&> #QE#

!+I6F

 $#"Q 9" #! " #Q&> #QE#

!,  ! .#" 8A49   ;65'


 

D*6#!

 $#"Q 9" #! " #Q  &#>O#!QE#

I2 9
'  

)

. F#!

9))%' ! 8 9 DD*6# O 5"F 8 $#Q' E!8# +

CQ".,AE K8 #E

'  
J  .#", 9"2# <@#Q

A0?-!+

 D52)#!9&?B J#A ' ' "

!+

. 8#!8

 !$ 9&' 9 


* ' DQ96E:D9# JD!

!996#D& 9' BD9>JI' 

-$-

  6#,#D5%8:35#. #!"

'  

D&D*
'  

9

= ' D

NQ" #JE#7E6QE!"  P,+

9#, FC F / #!)6' #8"',+

CD! D!96#Q J!' DQE7  

 !$ 9&' 98C N#!F9E6:D9# 7D%

I!'  9@ ' N#!)

N"$#7E#EQE"0  

P ,+

!96#QQ8C F / #F' #Q8"!O' BDQ9+

 DQ# Q. 9 =# R


 !$ 9&' 9!  F796:' DQG 

    

R
'  

/ 
$ ".8#

 . 9!)' 9Q>? AC !+

<( J!896!DQD*#!+

'  

 . 9!)' 9 -

'  

 K8' 56"2*/+

 -.

- >?BAC, 

' N#.QG JE#DQ9#%7N" #7E#EQE"

9 +



  7@09 4  :@ &$5 7 (


@ .! @= ,$ ;  @  @
$ 

 

 


  

 




 


    ) + )*-    ,!  ) -   ,)  
+ + ! #  )    ! # $'&
(*),+


2

O mercado de desenvolvimento de aplicaes na dcada de setenta e oitenta era


baseado em sistemas centralizados executando sobre um nico computador. O
desenvolvimento contnuo da tecnologia diminuiu o preo de componentes de
hardware. Com a queda no preo de componentes de hardware tornou-se vivel a
aquisio de computadores, agilizando, principalmente, o processo produtivo de
empresas.
As empresas, que adquiriram muitos computadores, comearam a perceber a utilizade
em criar canais de comunicao entre estas mquinas, este foi o desenvolvimento
prtico das redes de computadores. As redes deixaram de estar na teoria de livros e
partiu para o cotidiano do mercado. A vantagem das redes de computadores estava
ligada, principalmente, possibilidade de acesso compartilhado de recursos tais como
impressoras e arquivos.
Com o desenvolvimento das redes de computadores diversas empresas comearam a
oferecer sistemas operacionais que suportassem tal interconexo em rede.
Desenvolveram-se, ento, sistemas como o Novell, Windows for Workgroups, Linux que
mais tarde foram evoluindo para os sistemas mais utilizados atualmente.
Com o desenvolvimento dos sistemas operacionais de rede, que permitiam o
compartilhamento de recursos, os desenvolvedores se depararam com clientes
desejando softwares capazes de executar em todos seus computadores, atualizando
um mesmo banco de dados. Neste ponto houve o desenvolvimento da tecnologia
cliente-servidor, utilizando linguagens tais como Clipper, Visual Basic e Delphi.
Nas implementaes da tecnologia cliente-servidor era utilizado um computador
central com o banco de dados. Cada um dos computadores que participavam da
rede tinha instalado um software que acessava remotamente este banco de dados.
Esta foi a forma encontrada para que todos pudessem executar o software com
desempenho desejvel.
Nos anos noventa, com o desenvolvimento da Internet, um novo mercado foi criado.
Este mercado exigiria mais conhecimentos dos desenvolvedores, e especializao at
mesmos dos vendedores de tecnologia. Estes sistemas de Internet executavam sobre
um determinado computador, que tinha um Web Server (tal como Apache, Microsoft

IIS, etc) e uma banco de dados (PostgreSQL, Oracle, etc). Quando um usurio
acessasse um servidor via um navegador (Netscape, Opera, Microsoft Internet Explorer,
etc), este servidor retornaria uma pgina, esta pgina conteria contedo em HTML, que
mais tarde evoluiu para outros formatos.
No incio os servidores de pginas na Internet, hospedavam apenas pginas em HTML
com figuras (gifs, jpegs, etc). Pginas HTML no poderiam gerar dinamicamente dados,
tal como obter, inserir e alterar informaes em um banco de dados. Neste momento
houve o desenvolvimento de CGIs (Common Gateway Interfaces). Os CGIs eram
pequenos programas em linguagens como por exemplo C. Estes CGIs eram chamados
pelo servidor Web para acessar um banco de dados ou executar qualquer tipo de
tarefa que deveria ser dinmica, e no esttica, tal como so as pginas HTML.

Servidor Web
CGI

Servidor

Figura 10.1

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

Computador Computador Computador

Figura 10.3

Servidor

Computador Virtualmente

nico

Os benefcios de um Sistema Distribudo sobre um sistema que executa em um nico


computador compreendem a economia, velocidade, desenvolvimento de aplicaes
naturalmente distribudas, confiabilidade, crescimento incremental.
Um caso prtico da economia encontra-se em certa situao vivenciada por um dos
autores que, na poca, desenvolvia sistemas para a Internet. Determinado sistema
havia sido contrudo em PHP, uma linguagem de script, para acessar um banco de
dados e realizar determinandas operaes. Aps certo tempo este sistema tornou-se
um dos sites mais acessados do pas, e o servidor que o executava ficou cada vez mais
carregado. Havia ento dois caminhos a se tomar: o primeiro seria comprar um
computador maior e com mais capacidade, o outro desenvolver a aplicao
novamente para executar como uma aplicao distribuda.
Para tratar da questo que envolvia esta aplicao em PHP foram realizados diversos
estudos comparando custos e desempenho computacional. Foi observado que seria
necessrio adquirir uma workstation da Sun Microsystems para atender a aplicao,
caso contrrio seria necessrio desenvolver novamente. Contudo, caso a aplicao
fosse implementada para funcionar sobre um sistema distribudo seriam necessrios trs
computadores pessoais para execut-la, o que era em torno de 12 vezes mais barato.

Sistema
Centralizado

Sistema
Distribudo

X
Workstation
Figura 10.4

PC

PC

PC

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 (
). 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)

  ) ! 0(.(&0 / ! '(&*

...
Workstation

Workstation

Workstation

...
Servidor

Servidor

Figura 10.5

Servidor

Google.

H aplicaes que so naturalmente distribudas, onde mdulos precisam executar


tarefas distintas, contudo em algum momento necessitam trocar mensagens para
sincronizar determinadas informaes. Este tipo de aplicao altamente privilegiada
pelos sistemas distirbudos.
A confiabilidade de um sistema pode ser atingida de duas formas: atravs da
replicao de hardware e da replicao de software. Replicar hardware tem o intuito
de no deixar o sistema cair em casos onde um dos componentes fsicos venha a ter
problemas, este tipo de soluo conhecida como tolerncia a falhas. A rplica de
software tem o intuito de copiar softwares para diferentes computadores, caso um dos
computadores pare, outro poder reiniciar a aplicao e o sistema continua disponvel,
este tipo de soluo conhecida como alta disponibilidade.
A alta disponibilidade algo inerente de um sistema distribudo. Como existem vrios
computadores em uma rede, torna-se muito acessvel desenvovler uma aplicao
onde sejam criados mdulos e rplicas destes mdulos possam existir em outros
computadores. Caso um dos computadores tenha problemas, outro poder assumir.

Mdulo A

Mdulo B

Servidor

Servidor

Figura 10.6

Mdulo C

Servidor

Alta Disponibilidade.

O crescimento incremental est relacionado necessidade do sistema de suportar


maiores cargas. Em um sistema centralizado, quando este torna-se muito carregado
(veja o exemplo citado sobre o aspecto econmico de sistema distribudos) deve-se
adquirir um novo hardware para execut-lo, e este com certeza ser de maior custo.
Contudo, numa aplicao distribuda bem subdividida em mdulos, no caso do
ambiente ficar muito carregado, pode-se adicionar novos computadores ao sistema,
redistribuir os mdulos entre os computadores de tal forma que atinja maior
desempenho e atenda seus novos requisitos.

Mdulo A

Mdulo B

Servidor

Figura 10.7

Mdulo C

Servidor

dulos do Sistema Distribu do.

Mdulo A

Servidor

Servidor

Figura 10.8

Mdulo B

Mdulo C

Servidor

dulos do Sistema Distribu do Redistribu dos.

As desvantagens de um Sistema Distribudo compreendem o desenvolvimento de


software, sobrecarga no meio de comunicao, segurana.
Para projetar um sistema distribudo o desenvolvedor precisa de conceitos adicionais e
sempre ter em mente aspectos tais como multithreading, acesso compartilhado a
recursos, comunicao em rede de computadores, acesso simultneo a recursos e
outros conceitos. Isto tona o desenvolvimento de aplicaes distribudas algo complexo
para os desenvolvedores mais comuns.
Subdividir os mdulos de uma aplicao distribuda no uma tarefa simples. Para isto
deve-se ter em mente a necessidade de criar mdulos que tenham pouca
comunicao entre si, sobrecarregando o mnimo possvel o meio de comunicao.
Tendo, por exemplo, cinco objetos, sendo que trs deles comunicam-se em demasia,
crie um mdulo para estes trs, caso os outros tenham pouca comunicao, subdividaos entre os demais computadores.

Sistema Distribudo

Mdulo A

Mdulo B

Servidor

Mdulo C

Servidor

Figura 10.9

Subdivis o de M dulos.

Observando a figura 10.9 pode-se pensar: caso a aplicao fique muito carregada
posso redistribuir os mdulos B e C, conforme a figura 10.10.
Sistema Distribudo

Mdulo A

Mdulo B

Servidor

Figura 10.10

Servidor

Mdulo C

Servidor

Redistribui ode M dulos.

Contudo, se o mdulo A tornar seu computador muito carregado como resolver tal
questo? Pode-se tentar subdivid-lo, mas se a rede ficar muito sobrecarregada com tal
diviso pode ser necessrio comprar um computador de alto desempenho somente
para executar este mdulo. Os sistemas distribudos minimizam em cerca de 95% dos
casos que envolvem aquisio de hardware, contudo h problemas que se resolvidos
de forma distribuda podem tornar a rede sobrecarregada e gerar um pior
desempenho final.

 


  

* /01
32

  !#"$%&' ()*


,+


,&- 




 %.

O principal objetivo de um sistema operacional de rede o compartilhamento de


recursos em uma rede de computadores. Suponha uma rede onde existe apenas uma
impressora, mais fcil compartilh-la para todos os usurios do sistema do que
comprar uma impressora para cada computador. Para solucionar este tipo de
problema foram desenvolvidos os sistemas operacionais de rede. So exemplos de
sistemas operacionais de rede o Linux e Windows 95/98/NT/2000.
Em um sistema operacional de rede, os computadores so enxergados pelos usurios
como mquinas distintas. Desta forma, para acessar um determinado recurso, deve-se
saber em qual computador ele se localiza. Em um sistema operacional de rede a
comunicao entre computadores realizada atravs de arquivos compartilhados, isto
ocorre tanto no acesso a diretrio (ou pastas) compartilhadas, quanto no uso da
impressora, que cria uma fila de impresso para recepo de arquivos compartilhados.
Um sistema distribudo oferece ao usurio a imagem de um nico recurso
computacional. O usurio final no sabe se parte de sua aplicao executa nos
computadores A, B e C. Alm disto, as partes em que sua aplicao foi subdividida
comunicam-se entre si para sincronizar informaes e, portanto, executar uma
operao em conjunto.
Suponha uma aplicao que necessita realizar muitos clculos, enquanto outra parte
da aplicao utiliza os resultados destes clculos. Pode-se subdividir esta aplicao em
dois mdulos. Cada um deles executando em um computador diferente. O projetista
do sistema conhece estes aspectos do sistema, contudo o usurio final acredita que o
sistema est executando em apenas um computador, pois ele desconhece o
funcionamento do sistema e suas operaes.
A comunicao em um sistema distribudo feita atravs de mensagens que trafegam
sobre a rede. Ao contrrio dos sistemas operacionais de rede que podem trafegar
arquivos completos.
Com as definies anteriores pode-se notar que executar um sistema operacional
como Linux ou Windows em uma rede no ter um sistema distribudo. Ter um sistema
distribudo construir uma aplicao que seja subdividida em mdulos, cada um deles
executando em um computador distinto e trocando mensagens entre si para sincronizar
todas as tarefas que esto sendo executadas.

   !  ) !   + -,+ $,!  + , )  ,!  )   $'+  $ $ ! +  ) $'+  ! +   !"2




1

%

O



 

+ -   )  # $ 


41$
CORBA (Common Object Request Broker Architecture) um padro que definido pela
OMG (Object Management Group), organizao que rene cerca de 800 empresas
do mundo todo. Este padro foi desenvolvido para a construo de aplicaes
distribudas. Por ser um padro, para aplic-lo, deve-se ter acesso a um suporte ou
ferramenta que o implemente. Diversas empresas e interessados desenvolveram suas
prprias verses seguindo o padro Corba, dentre estas pode-se destacar o Mico
), OmniOrb (), Visibroker (), Jacorb () entre outros.
(


      ! * '( ! (-0

Segundo o padro Corba, aplicaes para um ambiente distribudo podem estar


sendo executadas em diferentes plataformas de hardware e sistemas operacionais.
Alm disto, podem ter sido construdas em diferentes linguagens de programao tais
como C, C++, Java ou Delphi.
Uma das vantagens do padro Corba ser aberto, isto permitiu que vrias empresas
implementassem suas prprias verses, deixando de limitar o desenvolvedor tal como
ocorre com solues proprietrias. E o mais importante, fossem interoperveis entre si.
Isto de fato o objetivo, contudo fazer duas verses de Corba diferentes interoperarem
no to simples quanto parece.
Um desenvolvedor contri sua aplicao sobre uma verso do Corba, e desta forma,
pode distribuir as partes desta aplicao em uma rede. Assim a aplicao ir funcionar
como um sistema distribudo.
Aplicao Distribuda

Middleware CORBA

Servidor

Servidor

Figura 10.11

Servidor

Corba.

A principal limitante no crescimento do uso de Corba a complexidade em


desenvolver para esta arquitetura. H muitas exigncias para os desenvolvedores, que
necessitando de produtividade acabaram deixando esta arquitetura.

  +


Com o desenvolvimento da plataforma Java, a Sun Microsystems observou um grande
horizonte no desenvolvimento de aplicaes em rede de computadores e iniciou o
desenvolvimento de um suporte para objetos distribudos chamado Java/RMI. RMI
significa Remote Method Invocation, ou seja, a invocao de mtodos remotos. Este
suporte simplificou a construo de aplicaes distribudas, contudo funciona apenas
para a linguagem Java, ao contrrio de Corba.

Chamada

Objeto
Cliente

Stub
Cliente

Retorno

Figura 10.12

Stub
Servidor

Objeto
Servidor

Java/RMI.

RMI contou com o apoio de diversas empresas, que interessadas na plataforma Java,
desenvolveram uma srie de IDEs (Integrated Development Environments), aquelas
ferramentas grficas que simplificam o desenvolvimento, prontas para implementar
usando a nova tecnologia. Isto agregou muito e diversos desenvolvedores voltaram sua
ateno para Java.
RMI possibilitava as mesmas funcionalidades que Corba, contudo, com o apoio de
fabricantes, em pouco tempo surgiram boas ferramentas e aplicaes neste suporte.
Alm disto, a Sun Microsystems criou o suporte Java/IDL para comunicar Java com
Corba, isto permitia que desenvolvedores utilizando Corba pudesse at mesmo migrar
para Java e continuar o desenvolvimento em RMI.


Observando o lado promissor da tecnologia Java/RMI a Sun Microsystems desenvolveu
um padro chamado J2EE (Java 2 Enterprise Edition). Com isto, a empresa segmentou
a tecnologia Java e comeou cada vez mais a se preocupar com o mercado de
aplicaes distribudas.
J2EE uma arquitetura que utiliza a mesma pilha de protocolos de Java/RMI o que
permite comunicao com Corba, e alm disto, permite continuidade aos
desenvolvedores Java/RMI. Nesta tecnologia uma srie de suportes foram oferecidos.
Programar para um ambiente distribudo tornou-se mais simples, pois uma base slida
de componentes haviam sido desenvolvidos para isto.
Diversos fabricantes se interessaram pela arquitetura J2EE, mais ferramentas de
desenvolvimento foram lanadas e o mercado aumentou sua aceitao para esta
tecnologia. Dentre os fabricantes destaca-se a Oracle, IBM, Sun Microsystems, Bea
Systems, etc.

 &
0    

Observando a conquista do mercado pelo J2EE, a Microsoft no se agentou e lana


sua prpria tecnologia para o desenvolvimento de aplicaes distribudas. Esta
tecnologia proprietria e no um padro aberto tal como Corba e J2EE, por isto,
somente a Microsoft a oferece.

   )  # $  
$   $  $ ' ! +  ) .$'+  !+   ! 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

 

    








  

J2EE, ou Java 2 Enterprise Edition, uma plataforma para desenvolvimento de


aplicaes distribudas. Apresenta facilidades para a utilizao dos recursos
computacionais e distribudos tais como acesso banco de dados, componentes Web,
utilizao de mensagens assncronas, execuo de processos transacionais, persistentes
ou no etc.
Apresenta uma API, especificada pela Sun MicroSystems, que proporciona um padro
para a implementao dos diversos servios que oferece, sendo que isto pode ser feito
diferentemente por vrias empresas, de formas distintas mas ainda assim oferecendo as
mesmas facilidades, por estarem de acordo com as especificaes impostas para a
sua construo.
Para um programador que j tenha tido contato com a linguagem Java e suas APIs na
J2SE (Java 2 Standart Edition), este no ter muitas dificuldades no entendimento e na
utilizao de J2EE. O que precisa-se entender os detalhes da arquitetura e onde se
encontram cada componente e seus recursos, isto , se faz necessrio se ambientar
neste contexto para se fazer o uso correto da plataforma.

    ! +
)

$  $  $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.

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.

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.

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.
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

HTML
Container

Servidor J2EE

Pgina
Html

Servlet

JSP

Container Web
App-Client
Container

EIS

Stand
Alone

EJB

Container EJB

Applet
Container

Camadas, seus respectivos componentes e containers e a intera o


entre eles.

Figura 11.1

   " - +  $*$ -

1

Applet


6




Para obter o kit de desenvolvimento para J2EE, acesse o site da Sun MicroSystems em

J2EE e faa o download do J2SDKEE e de suas documentaes. A sua
instalao segue praticamente o mesmo esquema da verso J2SE. Por fim se faz

necessrio a criao da varivel de ambiente    . Inclua tambm o diretrio

     na varivel de ambiente PATH. Para acessar a biblioteca J2EE, aponte o

 
classpath da sua aplicao para o diretrio    * 
. Os pacotes desta API tem
o prefico javax e nele podem ser encontrados todos os recursos disponveis para a
especificao J2EE.

  &! #,$ %! ',(&*   /./


 %

)   /&/!  "-

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.

 %  //! 




0

)+  -  )    ! + ) $ ,$ *)'$ -


+


Enterprise JavaBeans so objetos distribudos que apresentam uma estrutura bem


definida, isto , implementam interfaces especficas e que rodam no lado do servidor.
Tambm so conhecidos como EJBs (Enterprise JavaBeans) e sero tratados dessa
forma neste livro.
So nada mais do que simples objetos que devem seguir algumas regras. Estas regras
foram definidas pela Sun MicroSystems atravs da especificao de EJBs na arquitetura
J2EE.

Apresentam mtodos para a lgica de negcio e mtodos que tratam da criao


(instanciao), remoo, atualizao do EJB entre outros, dentro do ambiente aonde
sobrevive. (Isto ser abordado durante o livro no tema ciclo de vida do EJB).
Conforme definido pela Sun MicroSystems Enterprise JavaBean uma arquitetura
para computao distribuda baseada em componentes ...
Devemos entender que EJBs, no so simples classes Java, mas sim componentes
distribudos que fornecem servios e persistncia de dados, alm de processamento
assncrono e que podem ser invocados remotamente.

   $ $ ) + ) ')  )    ,)  ! "!   +






0

EJBs so normalmente utilizados para executarem a lgica de negcio do lado do


servidor de forma distribuda. Podemos ter EJBs sobrevivendo em ambientes distintos, em
mquinas diferentes, em locais geograficamente diversos e ainda assim utilizando de
servios eficientes.
Utilizando EJBs, sua aplicao ir se beneficiar de servios como transaes, segurana,
tolerncia a falhas, clustering, distribuio, controle de sesso entre outros. Estes servios
so fornecidos pelo ambiente que o EJB sobrevive, o container EJB, que ser visto em
mais detalhes nos captulos seguintes.
EJBs residem em um mundo chamado container. Este local conhece muito bem a
interface implementada pelos EJBs e sendo assim, consegue tratar cada tipo de EJB
diferente um do outro e de forma correta.
Veremos mais adiante que o cliente que deseja utilizar um EJB, no acessa-o
diretamente, mas sim utiliza-o atravs do container, que encaminha as chamadas de
mtodo ao EJB e retorna a chamada ao cliente quando for necessrio.
Vejamos a seguir como isto feito pelo container, implementando um exemplo de
acesso
remoto a um servio, utilizando a API de Sockets e o recurso de serializao
de objetos.

Servidor
Cliente
RMI

Skeleton

Stub
RMI

Figura 11.2

Objeto

Exemplo de servi o e troca de objetos utilizando Sockets e


Serializa o.

   .  - )*-
 )
+


)6

Os tipos de Enterprise JavaBeans especificados at a edio deste livro so:


Session Bean : Stateless e Stateful

Message-Driven Bean

Entity Bean : Bean-Managed Persistence e Container-Managed Persistence

Um EJB Session Bean prov servios, isto , define mtodos de negcio que podem ser
acessados remotamente e que disponibilizam operaes relevantes aplicao. O tipo
Session Bean Stateless no apresenta um estado como o prprio nome j diz, e fornece
servios para clientes locais e remotos. O EJB Session Bean Stateful, tambm fornece
servios localmente ou remotamente, mas apresenta uma relao forte com um
cliente, isto , mantm o estado que um cliente define, assim este cliente pode
configurar e recuperar dados deste EJB.
Os EJBs Entity Beans representam entidades, objetos que so persistidos. Podem
apresentar a manipulao e persistncia do objeto de duas formas: BMP ou CMP. No
tipo BMP (Bean-Managed-Persistence), o cdigo de persistncia e manipulao do
objeto deve ser fornecido pelo Bean, isto , deve ser programado. J o tipo CMP
(Container-Bean-Managed) provido pelo prprio container, no tendo a necessidade
de escrever linhas de cdigo para estas operaes.
Message-Driven-Bean so EJBs que fornecem servios assncronos e podem ser
comparados a Session Beans Stateless, que tambm fornecem servios aos clientes
locais e remotos, mas de forma assncrona. Um EJB do tipo Message-Driven-Bean se
comporta como um listener que aguarda o recebimento de mensagens atravs de um
MOM (Middleware Oriented Message).
Detalhes de cada tipo de EJB sero vistos na Parte II Tipos de Enterprise JavaBeans.

    " $,+ +) + )!"-  ) "1 $,# )


+

Cada tipo de EJB deve implementar interfaces diferentes e definidas pela API J2EE.
Estas interfaces definem o comportamento que o EJB deve apresentar.
Alm de implementar uma interface definida pela API, devemos criar duas interfaces
que sero utilizadas pelos clientes para acessarem os EJBs. Estas interfaces so
conhecidas como
e devem ser definidas para os EJBs do tipo   
 e 
(Stateless e Stateful) e Entity Bean (BMP e CMP).

(&'.

&/&* ( /

/ # # (% "/" %

/.# #,0/ - ./% "/" %

    no precisamos definir nenhuma interface e conforme


Para EJBs do tipo
veremos em um prximo captulo.
No se preocupe com detalhes destas classes e interfaces neste momento, pois logo
adiante detalharemos cada uma delas, nos tipos especficos de EJB.

     # ) ++  *# $* )   ) 


0

 

O acesso remoto utilizado quando o EJB e o cliente esto em mquinas diferentes. Se


o cliente e o Enterprise JavaBean estiverem na mesma mquina o acesso remoto ser
realizado igualmente. Acessamos um Enterprise JavaBean na mesma mquina ou em
outra mquina da mesma forma (transparncia).

Para criarmos um Enterprise JavaBean com acesso remoto, devemos implementar a


interface Remote e a interface
. A interface 
define os mtodos de negcio
especficos do EJB e a interface
define os mtodos do ciclo de vida do EJB. Para os
tambm define os mtodos de busca (create e finders).
Entity Beans a interface

(&* /
"( * /

("* /

<<Interface>>
javax.ejb.EJBHome

java.rmi.Remote

Figura 11.3

getE JB MetaData()
getHomeHandle()
remove()
remove()

Diagrama de Classes UML da Interface Home.


<<Interface>>
javax.ejb.EJBObject
getEJBHome()
getHandle()
getPrimaryKey()
is Identical()
remove()

java.rmi.Remote

Figura 11.4

/"* (& /

Diagrama de Classes UML da Interface Remote.

No acesso local, o cliente e o EJB devem estar na mesma JVM. O acesso ao EJB no
transparente, dessa forma devemos especificar que o acesso local. O acesso local
pode ser usado em vez do remoto para melhora no desempenho do negcio, mas
deve-se fazer isto com cautela, pois um EJB definido como acesso local no pode ser
executado em container em forma de cluster, isto , no pode ser acessado
remotamente de forma alguma.
Para criarmos um Enterprise JavaBean com acesso local, devemos implementar a

interface Local e a interface
. A interface  define os mtodos de negcio
especficos do EJB (assim como a interface Remote) e a interface !
define os
mtodos do ciclo de vida do EJB (assim como a interface
). Para os Entity Beans a
interface

tambm define os mtodos de busca (finders).

("'. ("* /

(&' 

(&'. (&* /

(&* /

("', "(&* /

<<Interface>>
javax.ejb.EJBLocalHome
remove()

Figura 11.5 - Diagrama de Classes UML da Interface LocalHome

<<Interface>>
javax.ejb.EJBLocalObject
getEJBLocalHome()
getPrimaryKey()
remove()
isIdentical()

Figura 11.6 - Diagrama de Classes UML da Interface Local

/&# #).0 /
- ,/ % /&"%

Para um EJB do tipo


    , no precisamos implementar nenhuma dessas
interfaces porque, como veremos no Cap tulo 5 Message-Driven Beans, este tipo de
Enterprise JavaBean apresenta um comportamento diferente de um Session Bean e um
Entity Bean, proporcionando processamento assncrono. O que precisamos fazer
implementar uma interface de Listener que ser associado ao MOM.
<<Interface>>
javax.jms.MessageListener
onMessage()

Figura 11.7

     2 ) #  )


)6

)6




Diagrama de Classes UML da Interface Listener.

Como podemos observar ao longo dos tpicos explicados at este ponto, vimos que os
componentes EJB no so acessados diretamente, isto , no acessamos a instncia
do Bean diretamente, mas fazemos o acesso aos servios disponveis por eles atravs de
interfaces que so disponibilizadas para acesso remoto ou local.
Outro detalhe que pode ser observado, que apesar de utilizarmos as interfaces de um
componente EJB para acessar seu mtodos, vimos que a implementao dos seus
servios oferecidos, isto , o Bean no implementa as interfaces oferecidas por ele.
Bem, conhecendo a definio de interfaces e herana devemos nos perguntar:
Por que o Bean no implementa as interfaces locais e remotas? E no implementando
estas interfaces, como possvel acessar os mtodos contidos no Bean?
Esta pergunta pode ser respondida simplesmente pela explicao de como o container
se comporta com os componentes EJB. Cada fabricante de servidores de aplicao
prov a implementao para as interfaces remote e home definidas para o
 e   .
componente e que so respectivamente as classes   

 /&'

 / '

("* /

A classe   
implementa a interface remote para os acessos remotos e locais e
 criado
encapsula (wraps) a instncia do EJB que foi solicitada pelo cliente. O   
baseado nas informaes contidas nos arquivos de deploy e na classe de Bean.

/&',

  /&'

No caso da classe EJB Home, esta se comporta da mesma forma que a classe   
.
Ela implementa todos os mtodos da interface home para os acessos remotos e locais
e ajuda o container a gerenciar o ciclo de vida do Bean, tais como sua criao,
remoo etc.
Quando um cliente solicita uma instncia de um EJB atravs da interface home pelo
 que faz referncia
cria uma instncia da classe   
mtodo
 , a classe  

' -/&/

("* /

/&',

 /&',

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


 que repassa as
do Bean. Estas chamadas so enviadas do stub para a classe   
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
Container EJB

Cliente

Home Interface

EJBHome stub
Home Interface

EJB
Home

EJBObject stub
Remote Interface

Remote Interface

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
(ou 
),
referncia do EJB em mos, podemos acess-lo pela sua interface
 ) e executar os mtodos de negcio
obtr uma referncia para a interface 
(ou
desejados.

&/&* ( /

(&'.

(&* /

( '. ("* /
(&* /

Lembre-se que o acesso ao EJB pelo cliente realizado atravs das interfaces
e

, sendo que o acesso diretamente instncia do EJB propriamente dito de
responsabilidade do container, que opera sobre o Enterprise JavaBean e executa seus
mtodos e retorna valores, atravs das solicitaes dos clientes, por meio das interfaces
(stubs e skeletons).

/"* (& /

 

  


 '  ')+


4

   


),+ + !  -  ) $,- +

Session Beans so componentes que apresentam servios para seus clientes. Estes
servios so fornecidos para o cliente pelas interfaces do EJB Session Bean e
implementadas pelos mtodos de negcio no prprio Bean. O estado do objeto Session
Bean consiste no valor da instncia de seus atributos, sendo que estes no so
persistidos.
Imagine que uma aplicao necessite realizar alguns clculos e retornar este valor para
o cliente, sendo que deseja-se que este servio seja remoto para ser acessado por
vrios clientes pelo pas. Isto pode ser implementado por um EJB do tipo Session Bean e
disponiblizado em um servidor de aplicaes para todos os clientes. Este um exemplo
de utilizao de um Session Bean.
Mais adiante veremos os cdigos fonte de Session Bean exemplo.

Home

Remote

SBExampleHome

SBExample

c reat e()

<<instantiate>>

<<EJBRealizeHome>>

<<EJBRealizeRemote>>

<<EJBSess ion>>
SBExampleBean
EJB_Context : SessionCont ext = null
SBExam pleBean()
ejbCreate()
ejbRem ove()
ejbAct ivate()
ejbPassivate()
setSessionCont ext()

Figura 12.1

Diagrama de Classes UML do Session Bean.

Analisando o diagrama de classes acima temos uma classe e duas interfaces. A classe
do EJB Session Bean     
(    ) e as interfaces     ( 
) e   !
 e
(Home). Para cada classe do Bean devemos definir as interfaces ( 
e/ou
e/ou
). No exemplo acima, foram definidas as interfaces 
e
, mas

poderiam ter sido definidas as interfaces ! e !
ou todas elas (com isto teramos
acesso local e remoto ao mesmo EJB).

*  / &/ "%

(&'. (&* /

/# # ( %

("', ("', (&* /

*  / &/ * (&/


&/"* (& /
&/&* (/

&*  / &( * /
(&'. &( * /
(&* /

O Bean deve conter os mtodos definidos para um EJB Session Bean conforme a API


 ,  ,     e      . Tambm devem
J2EE que so: 
 ,
 ,
apresentar os mtodos de negcio com suas devidas implementaes que sero os
servios disponibilizados pelo EJB.

/, - /   / /. /&* (./ / ')  / /, ##   /

(&* /

# /& /# # (%


(%./ "

' - /"/

 , que ser utilizado pelo cliente


Na interface
do EJB devemos definir o mtodo
para solicitar ao container que crie uma instncia do Bean e fornea uma referncia
para acessar os seus servios ou os mtodos de negcio atravs da interface 
.

Interface Home : SBExampleHome


DQ<#JD  N #,  ' #! #! N ".#"2"2 !9

   ! # N  


   5!) '  ,
   $

!5ON' D7 9%8#!)K8QD#

5N' D

  

 %Q  !' #!>O ##Q8#%9%E!" 

 Q  ' #LD!F#Q8#

&*OF

"

! # N

;>O J#JR

F#Q8# DQ# ) 9P6#! J&# !DQ#% & !96

/&* (&/

/&* (./

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.

Interface Remote: SBExample.


DQ<#JD  N #,  ' #! #! N ".#"2"2 !9

   ! # N  


   5!) '  ,
   $

  

!5ON' D7 9%8#!)K8QD#

 %Q  !' #:#Q8#9E"0 

! # N ; N #D R

DQ' D@ " DQ59+H 9!&#Q<O#!1' 56# H 98#<#

5N' D7H 98#<(#

$9<# &*OF

"P#!

Q8# QDQ# Q. 9

A seguir apresentamos a implementao do Bean deste exemplo.

Bean: SBExampleBean.
DQ<#JD  N #,  ' #! #! N ".#"2"2 !9

   ! # N  

!5ON' D:D' "."

  8#

 ,  ' ##9  ' # L#!98"




/ #" "2 !9

5N' DO! E# N

!9!&#Q 

" #" ", !9

F# 8# &*OF

"

/ #"2" 9#9R

!9%8#QQ&

)#!8# DQ# Q& 9R

0
5N' DO! E# NP#! J# !BR

0
5N' DO! E# N* DQ& Q8# ,BR

0
5N' DO! E# NIQ".",  8#BR

0
5N' DO! E" # / #" "2 !9
&* ", ".#"."2 !9

!98#   / #"."Q 9

!9!8# 5L"2#"2" 9

9&#21"2#"."Q 9

98#Q R

9&#Q&

5N' D7H 98#<(#


-.-

0
0

DQ' D@ " DQ59+H 9!&#Q<O#!1' 56# H 98#<#

 !' #! J#98QG 7E#".8# /#8E!JE#9#< D 

$9<# R

Para obter este servio, o cliente deve realizar a localizao do EJB no servidor de
aplicao utilizando a API JNDI, solicitar uma referncia para a interface
do EJB e
 . Assim, o cliente ter acesso
com ela executar o mtodo de ciclo de vida:
interface Remote que apresenta os mtodos de negcio, isto , os servios disponveis
para o EJB e dessa forma, poder execut-los para as operaes desejadas.

("* /

' - /"/

Maiores detalhes de localizao e obteno das referncias para as interfaces, sero


vistas no
Ap ndice A que apresentar exemplos mais detalhados de EJB e a utilizao
de cada servio, alm de especificar os arquivos de instalao (deployment
descriptors).
At aqui introduzimos o EJB Session Bean, mas ainda no detalhamos os dois tipos de
Session Bean que sero vistos nos prximos tpicos e que so:

3
3

Session Bean Stateless


Session Bean Stateful

 '  $ -  ,+ $ 
) + + !  - * ) $ 

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.

 ' ),+ + !  - * )'$ -  $  )* ) + +


,1

Um Session Bean Stateless no mantm o estado para um cliente em particular.


Quando invocamos um mtodo, o estado de suas variveis se mantm apenas durante
a invocao deste mtodo. Quando o mtodo 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 clientes.

Session Bean Stateless: SBStatelessExampleBean.


DQ<#JD  N #,  ' #! #! N ".#"2"2 !9

   ! # N  

-.-

%#!  ' LE#

-.-

6".8#"4".#F G"

-.-

;:EL) 

-.-

E" &#8E"4#! N*

!5ON' D:D' "."

/ #"."Q 9>#9J35#J! .#"2#9&"".#F G""" #!5"4D!' #98#",


" 

-.-.-

&*F

"

!9!&#Q 

" #" ", !9

# N

E#

9#< D 

F# 8#B## NP# JQ#!' #

/ #" "2 !9/%#96"

E:. 

/ 8Q8#K85' 

/ #" "2 !9#9R

!9%8#QQ&



5N' DO! E# N

' # #9  !' #! J#9&"

#' JD98 9#1! "

#Q&E!"

/ #!" "2 !9/%#9

/ #" "2 !9

#D!58E

"0

D )  &#B## NI"."  F#  $

/ & F#!' #!"$" 


Q

-.-* !9%8#2F7E
  8#

 ' #! L#!9!&QE"4Q&$  
# "E# &#8E"

/ #"."Q !9+#!9J F#".#98

JD! G %7EJ 9%"F 9D :E> ;

$#&# %QD#! . !9

#QD#!G9LD!. GE#

"

F# 8# &*OF

)#!8# DQ# Q& 9R

5 J#%9!) EQE#LE

;

-.-

"

-.-

IFJ> ;

-.-

!):#".8#> ;J9#".8# /#8E!

;

& ' MQEJ #!' JD!9%8! 9#!4 FJE#!"$&.5 1 9"F 9%D! LE
/ #"."Q 9>#9

/ F &#' #"2"@E##!".#

' N#!F

"

$#D5)"."

!' DQE"

5N' DO! E# NP#! J# !BR

0
-.-

"

-.-

&B#"$8# ! J#98:E##!

-.-

H ".8&#JK8# &J" ! #98# .

%N #8JE !'6E#> ;"Q

& ' MQEJ #!' JD!9%8! 9#!4 FJQ& !

&E"4!":$#D5."$":5) ' MQE" #!' / ;!

" #!$#!D5O #!$QE"


/ #"2" 9/#9

EJ) 

-.-

"$8# /#Q8EJE!##J".#4E#QK& 9 E !FJ> ;

-.-

! #"2

E#9 J"2#45& ' MQE 6 ! "

/ & &#K&5' 

/ #"."Q 9>#9

/ F &#' #"2"

8! N#! /

#".F#:. JE#> ;79 LK& DQ Q" ", %

5N' DO! E# N* DQ& Q8# ,BR

0
-.-

"

-.-

&B#"$8# /#Q8EJE!##

-.-

H ".8&#JK8# &J" ! #98# .

-.-

"$8# /#Q8EJE!##J".#4E#QK& 9 E !FJ> ;

-.-

! #"2

& ' MQEJ #!' JD!9%8! 9#!4 FJE#' O#!


".#0' N#.QE"

/ #"2" 9/#9

E#9 J"2#45& ' MQE 6 ! "

'E#/ ;",

N #QF7Q

8E"

":.#D!5$"."

EJ) 

' DQE"0 #' / ;

/ & &#K&5' 

/ #"."Q 9>#9

/ F &#' #"2"

8! N#! /

#".F#:. JE#> ;79 LK& DQ Q" ", %

5N' DO! E# NIQ".",  8#BR

0
-.-.-

/ #".", !9+#9

9K& <(5$0D98#Q87E
F

"2#"."Q 9

98# 

5N' DO! E" # / #" "2 !9


&* ", ".#"."2 !9

D98# &JE

!98#   / #"."Q 9

!9!8# 5L"2#"2" 9

/ 
 
9&#21"2#"."Q 9

98#Q R

9&#Q&

0
-$-

  6!N! ,E#K8 960": &#8E"

-$-

35#J

/ #" "2 !9/#9

E#9#< D  "$8

F;K8.96#D#!4""2#5"

#6"0"

#!) G"

D' #!9%8#"Q

 '  "! #   , ) , ! '$  '),+ + !  -  ) $ -  $  )* ) ++




A figura 12.2 representa o ciclo de vida de um Session Bean Stateless.

Instncia do EJB
Session Bean
Stateless ainda no
existe

1. Class.newInstance()
2. setSessionContext()
3. ejbCreate()

ejbRemove()

Session Bean
Stateless pronto ou
mantido no pool de
objetos
Figura 12.2

Execuo dos
mtodos de negcio

Ciclo de vida de um Session Bean Stateless.

Assim que o servidor de aplicaes inicializado, no existem beans instanciados,


ento, dependendo das polticas de pooling adotadas, o container instancia o nmero
definido de beans. Caso o container decida que precisa de mais instncias no pool,
instancia outros beans. Os beans no pool devem ser equivalentes (porque so
Stateless), pois eles podem ser reutilizados por diferentes clientes. Quando o container
decide que no precisa mais de instancias no pool, ele as remove.

)
+ + !  - * ) $ -  $  ) 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.

Session Bean Stateful : SBStatefulExampleBean.


DQ<#JD  N #,  ' #! #! N ".#"2"2 !9

   ! # N  

-.-

%#!  ' LE#

-.-

/ #"."Q 9>#9J35#J! .#"2#9&"".#F G""" #!5"4D!' #98#",

6".8#"4".#F G"

" 

 ' #! L#!9!&QE"4Q&$  
# "E# &#8E"

E#

9#< D 

-.-

;:EL) 

-.-

' #

-.-

EL) 

/ #"."Q !9+#!9J F#".#98

#Q&E!"

"0

E!" /#QFE"4# N* DQ& Q8#! ## NIQ"."Q 8#

/ & F#QK&5'   ' ##9  ' # J#!9%8"

/ #" "2 !9

  8#

!9!&#Q 

-.-

  6E!#K8 9:"). N58"

-.-

7" #"." E!#

&*F

"

!9%8#QQ&

35#J".# 

J9!) E"

#!963598
N#)8

96 J#!



#D!58E

-.-

" #" ", !9

D' #!9!&#:#"2 #D  K8 DQ#".. #

56

/ & 9<

  8#

/ #" "2 9#9R

/ #"."Q 9>#9

98#Q8JE

-.-

F# 8#B## NP# JQ#


/ #"."2 !9+#!9%"

/ 88#K 5O' 

!5ON' D:D' "."


-.-

# N

B $

#' JD98 9#1! "

5N' DO! E# N

$#&# %QD#! . !9

JD! G %7EJ 9%"F 9D :E> ;

#QD#!G9LD!. GE#

F# 8# &*OF


"

5 J#%9!) EQE#LE

;

)#!8# DQ# Q& 9R

0
"

;

& ' MQEJ #!' JD!9%8! 9#!4 FJE#!"$&.5 1 9"F 9%D! LE

-.-

5N' DO! E# NP#! J# !BR

0
-.-

"

-.-

&B#"$8# ! J#98:E##!

-.-

H ".8&#JK8# &J" ! #98# .

%N #8JE !'6E#> ;"Q

& ' MQEJ #!' JD!9%8! 9#!4 FJQ& !

" #!$#!D5O #!$QE"


/ #"2" 9/#9

&E"4!":$#D5."$":5) ' MQE" #!' / ;!

EJ) 

/ & &#K&5' 

5N' DO! E# N* DQ& Q8# ,BR

0
-.-

"

-.-

&B#"$8# /#Q8EJE!##

-.-

H ".8&#JK8# &J" ! #98# .

& ' MQEJ #!' JD!9%8! 9#!4 FJE#' O#!


".#0' N#.QE"

'E#/ ;",

N #QF7Q

8E"

/ #"2" 9/#9

":.#D!5$"."

EJ) 

' DQE"0 #' / ;

/ & &#K&5' 

5N' DO! E# NIQ".",  8#BR

0


-.-

/ #".", !9+#9

9K& <(5$0D98#Q87E

-.-

F

"2#"."Q 9

98# 

5N' DO! E" # / 


# " 2
" !9
&* ", ".#"."2 !9

D98# &JE

!98#   / 
# "."Q 9

!9!8# 5L"2#"2" 9

/ 
 
9&#21"2#"."Q 9

98#Q R

9&#Q&

0


-.-

9K& <(5$0JO!' 

-.-

Q&. N5&J9 J#

F 9 J#O!' 

E!&2 N5&:J" #%

5N' DO! E" #,&  #  / ). 9<

9 J#+R

&* ", 96 J#=9 J#!

0
-.-

N#

-.-

F#&5.9L' 

5N' D

EJQ.. N658
EJQ.. N5!8

/ ) 9<<@#,&  J# +R

.#)5$9

J' 

9 J#

9% J#%
9

#!

D9K& <(5$QE!

-.-

  6!N ,JE#K 9": &#8E"

-.-

35#J

/ #" "2 9/#9

E#9#Q< D  "FF

$;K8.96#D#!4"0" #!5%"

#6!"".#) G"

D!' #!9%8#"Q

!#   ) , ! $  ,) + + !  - * ) $,-  $  ) 1 ,
@

O diagrama a seguir, figura 12.3, representa o ciclo de vida de um Session Bean


Stateful. Temos as transies entre estado ativo e passivo, nos quais o bean deixa de ser
utilizado por um tempo e fica aguardando novas chamadas do cliente quando esta
passivo, e ativo quando volta a ser utilizado pelo cliente. Nestes dois momentos, podese liberar os recursos alocados para determinado bean que se tornar passivo, e obter
estes recursos quando o bean se tornar ativo.

Instncia do EJB
Session Bean Stateful
ainda no existe

1. Class.newInstance()
2. setSessionContext()
3. ejbCreate()

ejbRemove()

ejbPassivate()
Execuo dos
mtodos de negcio

Session Bean Stateful


pronto

Session Bean Stateful


Passivo

ejbActivate()

Figura 12.3

Ciclo de vida de um Session Bean Stateful.

 

  "!
#%$&'#)(+*,.- /1032"465879:7<; =>-?356/A@
Entity Bean so Beans de Entidade, isto , representam entidades persistentes. Em outras
palavras, so componentes de negcio com mecanismo de persistncia de dados.
O estado do Entity Bean pode ser persistido em um banco de dados relacional, arquivo
XML alm de outros tipos de repositrios de dados. Isto quer dizer que o estado do
Entity Bean mantido alm do tempo de vida da aplicao ou do servidor J2EE. Esta
uma caracterstica muito til em situaes onde deseja-se utilizar os dados desta
entidade em momentos que seria invivel mante-los em memria.
Existem dois tipos de Entity Beans:

Bean-Managed Persistence.
Container-Managed Persistence.

Home
Remote

EBExampleHome

EBExample
<<inst antiate>>

create()
findByPrimaryKey()

<<EJBRealizeHome>>
<<EJBRealizeRemote>>

<<EJBEntity>>
EBExampleBean
EJB_Contex t : Ent ityContext
<<EJBPrimaryKey>>
EBExampleBean()
ejbCreate()
ejbPostCreate()
ejbAc tivate()
ejbPassivate()
ejbLoad()
ejbSt ore()
ejbRemove()
setEntityContext()
unsetEntityCont ext()

Figura 13.1

<<EJBPrimaryKey>>
EBExamplePK
hashCode()
equals()
toString()

Diagrama de Classes UML do Entity Bean.

#%$& ,? 5 .2 ,3/1? , 465 79 7<; = - ? 56@








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.

#%$&'$ 465879:7<; = -.? 5 = -? 5 ? 58? - >- /19'/ 7-5











Utilizando esta estratgia, a codificao das chamadas de acesso base de dados


esto na classe de negcios do EJB e so responsabilidade do desenvolvedor. Ento,
para os mtodos de busca (mtodos utilizados para encontrar Entity Beans na base de
dados) e para os mtodos de criao, remoo e atualizao dos Entity Beans, devese codificar os comandos responsveis por realizar estas operaes.
O Entity Bean BMP - Bean de Entidade com Persistncia Gerenciada pelo Bean oferece ao desenvolvedor a flexibilidade de desenvolver as operaes de persistncia
de dados que em alguns casos, podem ser complexas de serem implementadas pelo
container.
Esta estratgia demanda mais tempo de desenvolvimento e alguns autores sugerem
que se utilize a estratgia de persistncia CMP (Container-Managed-Persistence), que
ser vista a seguir.
Detalhes de implementao de um EJB Entity Bean BMP, assim como os deployment
descriptors sero vistos no
Ap ndice A.

Entity Bean BMP: EBBMPExampleBean.


 "!$# %" # &'!$)( # * %"# + ,.- ,0/1

- !$ )23,4* 56&# "* %)# 761

8.89 &!$"( ;:)


8.8

")2JH- HA,+,K$"2L"H.+E,G2M HE )2JNOEHHP)%"2."H,A2.- %"@ ,G"H:)"HJ,

8.8 R
8.8

9 + ,- ,0/=< "+$<>?@ ,A- ( - B :"C "2.D!+E,GF2 H:):) H)!I@)!I!$"-

% H62A5)DS@EC+"

9Q <"#

9 + ,- ,0/=<"+$<">?"T , :)D$ U:- V;:)D"2P- NW $XG )2JH'- HJ,F"+"- K:)

)%"* ,"Y0T2L! NW ETE,@Z( - BNW D ,#[:" 5H.)2- !$"( "!+ ,G:)+) H.,G"H !\ ,G :)HPT

8.8] - +E:)K2V:)$)2J V2L!:)2M:) ] - +)- 2M$!$"( ^""2


@[%"( - K( H.H

9 <"<">? 9 &!$"( < "+- !$"( !+,GH

8.8` )+ ,G &,G:)

] )2.!K:"

] B)2- H6H.)#

9 + ,- ,0/< "+$_

9 + ,- ,0/=< "+)#

9 +E,- ,3/ ` +,&6,a)+ ,- ,0/ ` )+ ,G &6,A1

8.8b ,A2L- %"@ ,GdcCDH.)2""2JH'- H.,- :)#


* 65# ( +V# e,A2.- + 

] - )( :fcE1

8.8b ,A2L- %"@ ,G$ghDH.)2""2JH'- H.,- :)#


* 65# ( +V# e,A2.- + 

] - )( :)gi1

8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)*  ,G)!k!l!U"2.- Km )2JH- HL,GDH6@ZH:" :"HP#



8.8
8.8
8.8

 2J!

] - "( : cD!$"KH6E2")2JHP- HJ,.- :"#

8.8

 2J!

] - "( : cD!$"KH6E2")2JHP- HJ,.- :"#

+)- KS@"$- :Z+ ,- ] - ;$E%"* ,JC )2JH- HL,- :)"#)" :)DH62+)@Z( ( #

2J ,@)2.+^Z65



` 2L, 9 &,.- +l& NW"$+);2.- NW $:"$E%"* ,G"#

,^)2J dH

* 65# ( + V# e,A2.- + m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +  ] - )( :fcZT
* 65# ( + V# e,A2.- +  ] - )( :EgiYi,^)2L
H ` .
2 "6,J 9 &'  ,- +$_

"@)%)( - 



8.8

:"5))+ ,J2$U":E- :"m"2LHP- HJ,GF)+"- :)"H,2P- %@E,GH:)




9Q <)#

HP, )- )( :fc"X ] - ( :fcEY01


HP, )- )( :)g X ] - ( :)giY01
2.,A@)2L+m+)@)( ( 1

8.8K9 & @ ,G :"C )( )+ ,G"- +")2M U"H26-  N'WED:)


8.8
8.8

9)Q <"#

 2J!I@)+",- ,( : )- )( :ic !m C )2JH- HL,- :)"#



` 2L, 9 &,.- +l& NW"$+);2.- NW $:"$E%"* ,G"#

,^)2J dH

5))- :D)* %)? HJ, ` 2J"6,"X0* 65E"# ( +V# e,26- + 


,^[2J
H ` 2. ,G 9 &),A- "+$_

"@)%)( - 

] - ( :fc"T)* 65# ( + V# e,A2.- + 

8.8K9 & @ ,G :"C )( )+ ,G"- +")2"2LD2L!$5)E2 $%)* ,JC""2.H6- HA,A- :""#

] - )( :EgiY

 )"!5 9 &,- "+


"@)%)( - 5[- :$)* %"
!5)XGY ,^[2J H ""!$5) 9 &",.- "+$_
8.8  5E$)+ ,J2$U":)- :)$2L!"N'W :) 9Q <+"m!- D:)$""2.HP- H.,GF"+)- #

8.8

,^)2J dH

8.8` )+ ] - V@)2L 5[( )2 :)D6,.2P- %"@ ,

8.8

] - "( :fcE#

] - )( :fc5"( )2:"$,2P- %@,KHP)2)+ ] -  @2J:")#

 "2J!


,^- H'# ] - "( :fc

"@)%)( - 5[- :$H6 , - ( :icEX0* 5E# ( + V# e,A2.- + 

] - )( :fc"1

8.8` )+ ] - V@)2L 5[( )2 :)D6,.2P- %"@ ,

8.8

] - )( :)g

 "2J!




] - "( :)gi#

5"( )2:"$,2P- %@,KHP)2)+ ] -  @2J:")#

"@)%)( - 5[- :$H6 , - ( :EgiX0* 5E# ( + V# e,A2.- + 


,^- H'# ] - "( :)g


8.8R

%,\"!

8.8

] - )( :)g 1

5)"( "2:),.2.- %Z@ ,G

2J ,@)2.+;5( )2:),.2.- %)@,G



] - )( :fc"#
] - E( :fc"#

"@)%)( - D* 5# ( + V# e,A2.- + $ , [- ( : c X0Y _


2.,A@)2L+


8.8R

%,\"!

8.8

] - "( :icE1

5)"( "2:),.2.- %Z@ ,G

2L,@[2.+5( )2:),26- %"@ ,J



] - )( :)g #
] - ( :)g #

"@)%)( - D* 5# ( + V# e,A2.- + $ , [- ( :g X0Y _
2.,A@)2L+

] - "( :icEY _

] - "( :Egi1

] - "( :EgiY _

 !$( !"+ ,GNW D:)$!\ ,G:);:)DH6)( "N'WED:"$)%"*  ,G$"( KHP@ZK^Z5)G)2L- !2L- #
  2J! ] - "( : cD^"5E3)2.- !2.- ;: 9"Q <"#
8.8 2J ,@)2.+^Z65$)2.- !
 2.- ;: 9"Q <"#
8.8 ,^)2JdH 
 - +":")2 9 &,- "+262.m( "( - B"2 9Q <"#
"@)%)( - 
* 65# ( + V# e,A2.- + m)* %)
 - +":)</E?)2L- !23/Z /X0* 65# ( +V# e,26- +  ] - ( :fc"Y
,^[2J  H)
 - +):""2 9 &" ,- "+$_
8.8
8.8



8.8
8.8

 5E$)+ ,J2D- !$"( "!+ ,GNW :)KEE2AN'WED:"m(  ( - B NW"

:"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[- :$)* % ":)X3Yf_

8.8

,- ( - B:)"( +E,G- +"2"2J,@""( - B 2 H:):)H:)E%"* ,J

8.8

+"m!- D:"m""2.H6- HA,GFE+E- #

"@)%)( - 5[- :$)* % e,G)2J)X0Y _

8.8

,- ( - B:)"( +E,G- +"2 S)@)+":"K,A- 5K$%Z*  ,GD:ZC" )( #

"@)%)( - 5[- :$)* % b ,- 5),GX3Y _

8.8

,- ( - B:)"( +E,G- +"2 S)@)+":"K:Z5))( 5)$)%* ,m")( #

"@)%)( - 5[- :$)* %"? H.H'- 56,G)X0Y _



8.8

"H. + ] - V@2A $ )+ ,&P,JD:)

9 + ,- ,0/=<"+)#

"@)%)( - 5[- :m@[+"H. , 9 


+ ,- ,G/ ` )+ ,G &6,AX0Y _
,^- H'# + ,- ,0/ ` "+ ,&,

K+[@)( ( 1

8.8` )+ ] - V@)2L $ )+ ,G &,GD:)

8.8

9 + ,- ,0/=<"+)#

 2J!E+,A- ,0/ ` E+,&6,a E+,&,G:)

9 +,- ,0/=< "+)#

"@)%)( - 5[- :$H6 , 9 +E,- ,G/ ` + ,G &6,AX 9 + ,- ,G/ ` "+ ,&P,ME+,A- ,0/ ` +,G&6,AY _

,^- H'# + ,- ,0/ ` "+ ,&,

)+ ,.- ,G/

` + ,J&6,A1

#%$&  9  2 3-39 ? 465 79 7<; = - ? 5 =


J

k

A figura 13.2, representa o ciclo de vida dos Entity Beans BMP. Todos os mtodos so
chamados pelo container para o bean. Para criar um novo Entity Bean utilizado o
mtodo create e para remov-lo necessrio executar o mtodo  . Pode-se
carregar um Entity Bean usando os mtodos de busca do entity bean ( ! "#$ % , '&)(*+ ",#

  #% ). Quando o bean ativado, ele carrega o dado do meio de persistncia e




quando desativado, persiste o dado no meio de persistncia.

Instncia do EJB Entity


Bean BMP ainda no
existe

1. Class.newInstance()
2. setEntityContext()

unsetEntityContext()

ejbHome()

ejbFind()
Entity Bean BMP no
pool de objetos

1. ejbCreate()
2. ejbPostCreate()

ejbRemove()

1. ejbPassivate()
2. ejbLoad()

1. ejbStore()
2. ejbActivate()

Entity Bean BMP


Pronto
ejbLoad()

ejbStore()

Executa os
mtodos de negcio
ou ejbFind()

C
#%$& 485679 7 ; = - ?35  2 587 ?39 5 - ? 58? .- >- 1/ 9 / 7<->5 1Figura 13.2



E


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.

Entity Bean CMP: EBCMPExampleBean.


 "!$# %" # &'!$)( # * %"# + ,.- ,0/1

- !$ )23,4* 56&# "* %)# 761

8.89 &!$"( ;:)


8.8

9 + ,- ,0/=< "+$@",- ( - B:)D""2JD!l+ ,GF)2MH:":""H"!

8.8  H.$:"m@"H.$:)

9 +E,- ,0/=<" +

@)!I!- DEE2AHP- HJ,"+ ,

9Q <"#

$")2J"H.+E,G2 HE )2J NOEHHP)%"2."H,A2.- %"@ ,G"H:)"HJ,

` >?"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

8.89 + ,- ,0/=< +

9

+"D:Z)( /)!$"+ , :"H62P- ,2 :)

` >?#
9 < ` >? 9 &!$"( < "+$- !m"( !+,GH

% H.,2L,)@)%"( - ( H6H

8.8` )+ ,G &,G:)

9 + ,- ,0/< "+$_

9 + ,- ,0/=< "+)#

9 +E,- ,3/ ` +,&6,a)+ ,- ,0/ ` )+ ,G &6,A1

"26- 56,G

8.8` 26- $@)!K- +"H.,Gj+E- ;:$"%)*  ,G)!k!l!U"2.- Km )2JH- HL,GDH6@ZH:" :"HP#



8.8
8.8
8.8

 2J!

] - "( : cD!$"KH6E2")2JHP- HJ,.- :"#

8.8

 2J!

] - "( : cD!$"KH6E2")2JHP- HJ,.- :"#

+)- KS@"$- :Z+ ,- ] - ;$E%"* ,JC )2JH- HL,- :)"#)" :)DH62+)@Z( ( #

2J ,@)2.+^Z65



` 2L, 9 &,.- +l& NW"$+);2.- NW $:"$E%"* ,G"#

,^)2J dH

"@)%)( - 




* 65# ( + V# e,A2.- + m)* % ` 2L,G)X0* 5)# ( +V# e,A2.- +  ] - )( :fcZT
* 65# ( + V# e,A2.- +  ] - )( :EgiYi,^)2L
H ` 2."6,J 9 &'  ,- +$_



HP, )- )( :fc"X ] - ( :fcEY01


HP, )- )( :)g X ] - ( :)giY01
2.,A@)2L+m+)@)( ( 1

8.8K9 & @ ,G :"C )( )+ ,G"- +")2M U"H26-  N'WED:)


8.8
8.8



9)Q <"#

` 2L, 9 &,.- +l& NW"$+);2.- NW $:"$E%"* ,G"#

,^)2J dH

"@)%)( - 

 2J!I@)+",- ,( : )- )( :ic !m C )2JH- HL,- :)"#

5))- :D)* %)? HJ, ` 2J"6,"X0* 65E"# ( +V# e,26- + 


,^[2J
H ` 2. ,G 9 &),A- "+$_

] - ( :fc"T)* 65# ( + V# e,A2.- + 

8.8K9 & @ ,G :"C )( )+ ,G"- +")2"2LD2L!$5)E2 $%)* ,JC""2.H6- HA,A- :""#

 )"!5 9 &,- "+


"@)%)( - 5[- :$)* %"
!5)XGY ,^[2J H ""!$5)

8.8

,^)2J dH

9 &",.- "+$_

] - )( :EgiY


8.8` )+ ] - V@)2L 5[( )2 :)D6,.2P- %"@ ,
8.8R

] - "( :fcE#

% HP"2J5)S@"$+"K"HP""- ] -  NW

8.8

8.8

9)Q <gi#

T" H.,JHK!\ ,G:) HHWEm- !$"( !+ ,J:"H

"( $)2JU)"2.- K)+ ,J- +")2.#


 2J!

] - "( : cK5( )2:ZD,A2.- %"@ ,GDH.)2"+ ] -  @)2J:Z#



"@)%)( - K%EH.,2L, 5[E- :$HP, )- )( :fc"X0* 65# ( +  # e,2.- + 

8.8` )+ ] - V@)2L 5[( )2 :)D6,.2P- %"@ ,


8.8R

] - "( :)gi#

% HP"2J5)S@"$+"K"HP""- ] -  NW

8.8

8.8

9)Q <gi#

T" H.,JHK!\ ,G:) HHWEm- !$"( !+ ,J:"H

"( $)2JU)"2.- K)+ ,J- +")2.#


 2J!

] - "( :g=5( )2:ZD,A2.- %"@ ,GDH.)2"+ ] -  @)2J:Z#



"@)%)( - K%EH.,2L, 5[E- :$HP, )- )( :)g X0* 65# ( +  # e,2.- + 

8.8R

%,\"!

8.8

2J ,@)2.+;5( )2:),.2.- %)@,G

] - ( :fc"Y01

5)"( "2:),.2.- %Z@ ,G

] - ( :)g Y01

] - )( :fc"#
] - E( :fc"#



"@)%)( - K%EH.,2L,4* 5E# ( + V# e,2.- + $ , Z- "( :fc"X0Y01

8.8R

8.8

%,\"!

5)"( "2:),.2.- %Z@ ,G

] - )( :)g #
] - E( :)g #

2J ,@)2.+;5( )2:),.2.- %)@,G



"@)%)( - K%EH.,2L,4* 5E# ( + V# e,2.- + $ , Z- "( :)g X0Y01

8.8
8.8

,- ( - B:)"2.;262J "2$)%"*  ,GCEE2AHP- HJ,"+ ,K:ZC!)- :)$ E2LHP- H.,GF"+)- 

$,@Z( - B2"H:":""H:)HP@ZD- +ZHJ,Gj+Z- "#

"@)%)( - 5[- :$)* % ":)X3Yf_

8.8
8.8

,- ( - B:)"( +E,G- +"2"2J,@""( - B 2 H:):)H:)E%"* ,J


+)$!- K:ZC""2.H6- HA,F+E- #

"@)%)( - 5[- :$)* % e,G)2J)X0Y _

8.8

,- ( - B:)"( +E,G- +"2 S)@)+":"K,A- 5K$%Z*  ,GD:ZC" )( #

"@)%)( - 5[- :$)* % b 


 ,- 5),GX3Y _

8.8

,- ( - B:)"( +E,G- +"2 S)@)+":"K:Z5))( 5)$)%* ,m")( #

"@)%)( - 5[- :$)* %"? H.H'- 56,G)X0Y _



8.8

"H. + ] - V@2A $ )+ ,&P,JD:)

9 + ,- ,0/=<"+)#

"@)%)( - 5[- :m@[+"H. , 9 +,- ,G/ ` )+ ,G &6,AX0Y _


,^- H'# + ,- ,0/ ` "+ ,&,

K+[@)( ( 1

8.8` )+ ] - V@)2L $ )+ ,G &,GD:)

8.8

9 + ,- ,0/=<"+)#

 2J!E+,A- ,0/ ` E+,&6,a E+,&,G:)

9 +,- ,0/=< "+)#

"@)%)( - 5[- :$H6 , 9 E


+ ,- ,G/ ` + ,G &6,AX 9 + ,- ,G/ ` "+ ,&P,ME+,A- ,0/ ` +,G&6,AY _
,^- H'# + ,- ,0/ ` "+ ,&,

)+ ,.- ,G/

` + ,J&6,A1

#%$&  9  2 3- 3 9 ? 485679 7; = - ?35








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.

Instncia do EJB Entity


Bean CMP ainda no
existe

1. Class.newInstance()
2. setEntityContext()

unsetEntityContext()

ejbHome()

ejbFind() e
ejbSelect()

Entity Bean CMP no


pool de objetos
1. ejbCreate()
2. ejbPostCreate()

ejbRemove()

1. ejbPassivate()
2. ejbLoad()

1. ejbStore()
2. ejbActivate()

Entity Bean CMP


Pronto
ejbLoad()

ejbStore()

Executa os
mtodos de negcio
ou ejbFind() e ejbSelect()

C
%# $& -  ? 9:2>5.? -587<2 4 = 465879:7<; >= -?35
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.

+

)    
"  )
  " .
,%) -&
 ( 

,



Um relationship field equivalente a uma chave estrangeira em uma tabela de um


banco de dados relacional e identifica um entity bean atravs do relacionamento.

() /"() & -  




) -&' (  $. ,


  


1$





Existem quatro tipos de multiplicidades:

B
B

1 1: Cada instncia de um entity bean pode se relacionar com uma nica


instncia de outro entity bean. Por exemplo, um entity bean marido tem um
relacionamento   com o entity bean esposa, supondo que esta relao ocorra
numa sociedade onde no permitido a poligamia.

1 N: Uma instncia de um entity bean pode se relacionar com mltiplas instncias


de outro entity bean. O entity bean gerente, por exemplo, tem um relacionamento 

com o entity bean empregado, ou seja, um gerente pode ter vrios empregados
sob seu comando.

N 1: Mltiplas instncias de um entity bean podem se relacionar com apenas uma



instncia de outro entity bean. Este caso o contrrio do relacionamento  , ou

seja, o entity bean empregado tem um relacionamento  com o entity bean
gerente.
N M: Instncias de entity beans podem se relacionar com mltiplas instncias de
outro entity bean. Por exemplo, em um colgio cada disciplina tem vrios estudantes
e todo estudante pode estar matriculado em vrias disciplinas, ento o


relacionamento entre os entity beans disciplina e estudante .

*%
& 
  ,


) &' 

.
$ .
 0  


1$
.



Um relacionamento entre entity beans pode ser bidirecional ou unidirecional. Num


relacionamento bidirecional cada entity bean tem um campo (relationship field) que
referencia outro entity bean. Atravs deste campo um entity bean pode acessar o
objeto relacionado.Em um relacionamento unidirecional, apenas um entity bean tem o
campo referenciando outro entity bean.Consultas em EJB-QL podem navegar atravs
destes relacionamentos. A direo dos relacionamentos determina quando a consulta
pode navegar de um entity bean para outro.
Sendo um relacionamento bidirecional as consultas EJB-QL podem navegar nas duas
direes acessando outros entity beans atravs dos campos de relacionamento. A tag
no arquivo ejb-jar-xml define o nome do campo do relacionamento e na
$    #" $ 


classe abstrata do entity CMP teremos os respectivos mtodos abstratos , e %!
relacionados a este campo. Os tipos que um mtodo get como esse retorna o tipo

 , caso o
da interface local do objeto relecionado sendo um relacionamento





relacionamento seja o tipo retornado pode ser ou & ,         " ou & ,       .
Sempre que tivermos campos de relacionamento no entity bean no devemos invocar



o seu mtodo set no +&)(     , ele deve ser invocado no mtodo $& ( %     ou atravs dos
mtodos set e get que estiverem disponveis na interface local. Exemplos:
Relacionamento bidirecinal:

Esposa

Marido

marido

esposa

Figura 13.4

Relacionamento Bidirecional Entity Bean CMP.

Neste caso podemos ver que os dois entity beans podem navegar e acessar as
informaes sobre o entity bean relacionado, s para visualizar iremos agora mostrar
como ficariam as configuraes no deployment descriptor.




* % G2L)( ,- )+



* % G2LE( ,- E+ G+"!6H H6 J!2.- :

* % G2LE( ,- E+EHP^)-  32J)( 





8 "* % 32."( ,A- "+ G+Z!

:""H.2L- ,- + 6H6"H.

"* % J2J)( ,- )+"HP^Z-  G2L(  J+Z'!l 9 H H6 "( ,- +EHP^)-  ""( 

!m@)( ,- "( - - ,0/


 R +"

2J)( ,- )+"H6^)-  G2L(  GH6@Z2.

 

8 :)H62P-  ,- "+

:"HL2.- ,- +6"HP "H.

* % G+Z! 9 HP "H.

 

!$2

:"HL2.- ,- +!2.- :)

8 )* % G2L)( ,- )+"HP^)-  32."(  J+"!

!$2

 ] - "( :

8 !$2

8 )* % G2L( ,- +ZHP^)-  32."( 

* % G2LE( ,- E+EHP^)-  32J)( 

:""H.2L- ,- + !2.- :)

"* % J2J)( ,- )+"HP^Z-  G2L(  J+Z'!l>2.- :" ""( 6,- +EHP^)-  ""( 

!m@)( ,- "( - - ,0/


 R +"

2J)( ,- )+"H6^)-  G2L(  GH6@Z2.

 

8 :"H62.-  ,- "+ 

:"HL2.- ,- +!2.- :)

* % G+Z!>2L- :"

 

8 )* % 3+)!

!$2

8 : HP"2.- ,- + 

8 2AE( ,- +EHP^)-  32."(  3HP"@)2. 

 ] - ( :

8 !$@Z( ,- "( - - ,0/




:"HL2.- ,- +6"HP "H.

8 :) HP26- ,.- + 

!$2' ] - ( :+E! HP" H.  8 ! 2  ] - "( :J+"!


 ] - "( :
 8 )* %G2L( ,- +ZHP^)-  3 2."( 

8 : HP"2.- ,- + 

' ] - ( :+E!!$2L- :"  8 "!$2  ] - "( :J+"!




 

8 * % G2L( 6,A- +"H^)-  32J)(  J+"!





8 "* % 3+"!

8 2AE( ,- +EHP^)-  32."(  3HP"@)2. 

8 :) HP26- ,.- + 

 ] - ( :

8 !$@Z( ,- "( - - ,0/




8 !$2



8 )* % 32.)( ,- )+

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- +

 8 !$2 ] - ( :G+Z!


' 
]
`
!$2' - "( : ,G/V * 5)# @,- ( # "( ( ,- )+  8 !$2 ] - E( :0,3/"
 8 !$2 ] - ( : 


] - "( : 3+)! HP"HL

!$2

Neste caso voc pode escolher se o tipo retornado ser & ,

Esposa



    " ou & +






  .


Marido

marido

Figura 13.5

Relacionamento Unidirecional Entity Bean CMP.

Aqui temos um relacionamento unidirecional onde apenas a esposa pode encontrar o


marido, o marido no capaz de recuperar informaes das mulheres por meio do
relacionamento. Neste caso a tag $ ))  # no deployment descriptor $& ( &     no estar
configurada no lado em que definimos o relacionamento do lado do EJB marido.








* % G2L)( ,- )+ G+E!6 H' "H. J!2L- :"

* % G2L)( ,- )+"HP^)-  G2J)( 



:)"H."2.- ,- "+6"HP H6

* % G2LE( ,- E+EHP^)-  32J)(  J+"! 9 HP" H. ""( ,- +ZHP^)-  ""( 

!$@)( ,A- ( - - ,0/  R +"

2L)( ,- +ZHP^)-  32J)(  3HP"@)2L

8 :""HP26- ,A- +

 


 

:""H.2L- ,- + 6H6"H.

"* % J+"! 9 HP "H.

8 )* % 32.)( ,- )+"HP^Z-  G2J)(  J+"!l

!$2

:""H.2L- ,- + !2.- :)

8 :"H62.-  ,- "+ 

 ] - ( :J+"!!l2.- :"

!$2

'


 * %G 2L)( ,- )+"HP^)-  G2J)( 
8 "!$2



8 )* % 32J)( 6,- "+"HP^)-  02."(  3+)!

8 * % G+""!



8 :)H62P-  ,- "+

8 2L)( 6,.- +ZHP^)-  G2L(  3H.)@)2L




' ] - "( : 

8 !$@)( ,- "( - - ,0/ 



8 * % G2L( 6,A- + 3+)!

 

8 !$2 ] - ( : +E!

] - ( : 

8 )* % 32.)( ,- )+"HP^Z-  G2L( 

:)"H."2.- ,- "+!2.- :)

* % G2LE( ,- E+EHP^)-  32J)(  J+"!>2L- :" Z( 6,- "+"HP^)-  "( 

!$@)( ,A- ( - - ,0/  R +"

2L)( ,- +ZHP^)-  32J)(  3HP"@)2L

 


 

8 :" HP26-  ,- +

8 !$@)( ,- "( - - ,0/ 

:""H.2L- ,- + !2.- :)

"* % J+"!>"2.- :"




 8 )* %32.)( ,- )+


8 :"H62.-  ,- "+ 

8 )* % G+Z!

8 2L)( 6,.- +ZHP^)-  G2L(  3H.)@)2L

8 )* % 32.)( ,- )+"HP^Z-  G2L( 

#%$& 4 A=


 D


EQL ou EJB-QL a linguagem portvel utilizada para construir os mtodos de consulta


dos EJBs CMP de acordo com a especificao 2.0. Esta linguagem no utilizada
para os EJBs BMP, pois os mesmos utilizam a API JDBC, ou outro mecanismo de
persistncia para acesso base de dados.


  (

 )  




Devemos utilizar EQL para implementar os mtodos de busca de seus Entity Beans CMP
que no seja a partir de sua chave-primria ( ! ",#
  
 
), pois este j oferecido
automaticamente pelo container.

 
 

  

Um comando EJB-QL contm trs partes:

Uma clusula SELECT

Uma clusula opcional WHERE

Uma clusula FROM

&) 
 )  3+
!


A clusula * ela define o domnio de uma consulta, indica qual parte de uma base

de dados voc ir consultar. No caso de uma base de dados relacional, a clusula *
tipicamente restringe quais tabelas sero consultadas. Por exemplo:

e 9

9"`dR
b

< Q)9E` X "Y

R >

e

Aqui estamos declarando uma varivel na clusula * . Esta varivel o pode ser usada
posteriormente em outras clusulas desta mesma consulta, neste caso estamos
reusando a varivel na clusula    .
Algumas vezes precisamos declarar variveis na clusula
conjunto de valores:
e 9

9"`dR
R >

*!

que representa um

< Q)9E` X Y


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

partir das variveis declaradas na clusula *  :

e 9

9"`dR




R >

< Q)9E` X0"Y

? "H.H6D



)# +E!

fc

Esta consulta recupera todas as pessoas que possuem o atributo nome igual ao
parmetro que ser passado no mtodo. Por exemplo, o mtodo poderia ser
construdo da seguinte forma:


] - +":)< /

!X e ,2.- + =+)"!Y

Para ultizar collections na clusula

clulua * :

e 9

9"`dR

 

R >

  

voc precisa declar-la primeiramente na

< Q)9E` X Y


b

? "H.H6



emT





# ] - ( ^"# +"!

X0# "2J"+ , HY


?" :)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

 

R >
9

< Q)9E` X

c"Y

? "H.H6KfcET? "H.H6K)g

;g

fc"# - :):"

# - :":)

 



"g # +""!

Q 'W

&) 
 )     



A clusula

e 9

9"`dR
R >

especifica o resultado retornado pela consulta. Por exemplo:

  &
 

< Q)9E` X "Y

? "H.H6DZT

X # "2J+,H6Y 

Na consulta so definidas duas variveis p e a, a clusula select determina qual deve


ser selecionada.
Neste exemplo a consulta retorna todos os produtos em todas as regras que contem
items:

e 9

9"`

( # "2J":)@ ,G"H

R >


9

HK2.T

X32.# - ,"!HPY (

Como voc pode ver podemos utlizar o ponto para acessar relacionamentos na
clusula    . Este cdigo interpretado para um SQL-padro onde um JOIN feito
para recuperar os dados desejados.
Perceba que nest exemplo no utlizamos a notao  (&  ' , ele apenass utilizado
quando se trata de uma varivel simples que no faz uso do ponto para acessar
informaes por meio dos relacionamentos entre entity beans.
 %

Outra informao importante que a clusula


apenas aceita variveis simples, ou seja:

e 9

9"`

R >

2P# - ,G"!H

Z

2.

em2

Esta query no est correta, a forma correta :


e 9

9"`dR

%"* ",X "Y

   no trabalha com collections,

Z

R >

2.

em2.T

X02.# - ,!lHPYi

Para filtrar as informaes, ou seja, no trecuperar informaes repetidas utlizado o



filtro $   $   :
e 9

9"`

i`

e 

( # 2L:)@ ,G"H

R >

em2.T

X02.# - ,"!HPY

Voc pode tambm fazer que seu mtodo de busca retorne um


permite que valores repetidos sejam inseridos.

& 




   que no


Agora a seguir temos um exemplo de como um mtodo definido no arquivo +&)( &   
pode ser acessado por meio das interfaces  e/ou      do EJB. Na interface o
mtodo estaria assim:

* 65# @ ,.- ( # ` "( ( 6,.- "+ ] - +E:E</


"!l,G 9 &" ,- )+$1

@[%"( - 

 H )- +":""2 9

!"X e,A2L- + =+Z!$"Y ,^[2J

&" ,- "+T

Este mtodo vai retornar todas as pessoas que tem o nome passado como parmetro.
No arquivo +&)( &    temos:


## #
S)@")23/ 

S@EE2/ J! ,^" :

!$,^"": 3+"! ] - +":)</

!$,^"": 3"2L!H

8 !$,^) : G 2L!H







8 S[@"2A/ ! ,^" :


* % 0S( 

  `



8 )* % 0S( 

[b

fb

e
9

9"` 

!

8 ! ,^" : 3+"!

!l,^"": G "2.!

S)@")23/ 
## #




* 5)# ( + V# e,.2.- +  



8 !,^" : G "2J!

R < Q"9Z`  X Y

R >

? "H.H6

e$

 
9



+Z!

c

 



 ! !  
)     "!

#' & #)( * ,6- / 0.2 -/ / ? -  9.-5 = - ? 56/A@




So um tipo de componentes EJB que recebem mensagens por meio de um JMS (Java
Message Service).
Enquanto tradicionalmente os outros Beans so acessados atravs de interfaces (RMIIIOP) com acesso sncrono, os Message-Driven Beans, tambm conhecidos pela sigla
MDB, so utilizados por meio de mensagens, com acesso assncrono.
Isso se d por meio de um middleware orientado a mensagens (MOM), localizado entre

o cliente, % %   #     , e o bean, $% %  +  "%    . Este middleware recebe mensagens de
um ou mais clientes e envia as mensagens para os Beans destino.
JMS a API utilizada para receber as mensagens dos clientes e enviar as mensagens
aos Message-Driven Beans.
O estado do objeto muito simples e semelhante a um EJB Session Bean Stateless que
no mantm o estado para um cliente em particular. Quando enviamos uma
mensagem para invocamos um Message-Driven Bean, o estado de suas variveis se
mantm apenas durante a invocao. Quando o processamento requerido
finalizado o estado no retido. So componentes que no esto associados a um
cliente especfico e, portanto, implementam comportamentos que atendem a
necessidade de muitos cliente.
<<EJBMessage>>
MDBExampleB ean
EJB_Context : MessageDrivenContext = null
MDBExampleBean()
ejbCreate()
onMessage()
ejbRemove()
setMessageDrivenContext()

Figura 14.1

Diagrama de Classes UML do Message-Driven Bean

Message-Driven Bean : MDBExampleBean.

 "!$# %" # &'!$)( # * %"# !:E%"1

- !$ )23,4* 56&# "* %)# 761


- !$ )23,4* 56&# * !HP# 7'1
- !$ )23,4* 56&# +E!$- + # 761



'

8.89 .
H ,G 9)Q <; &'"!$)( ;:)K,.- "$>"H.H.[
2P- 5+$<E+)TZ)2J"H.)+ ,GK"HK!\ ,G:) H J":)2W
8.8 :)- ( :)K5 - :)K)* % ` 2. ,G)X0Yi$)* % ""!5)X3Yi$m!\,G :)K)+)>H6H.6 X0Y
8.8

 &"@ ,:"$+)$2J""%)- !"+ ,G:)C@Z!!l+"HL"!$#

@[%"( - K( H.HK>

< 9 &'!$"( < +$- !$"( "!+ ,GH> HPHL6V

8.8` )+ ,G &,G:)C>

)2.- 5),G$>H.H66


8.8
8.8

<"#

2.- 5)+ ` + ,J&6,4!$ H.H66V

9Q <"#

` 2L, 9 &,.- +l& NW"$+)- +ZHJ,G+"- NW :)D"%)*  ,G)#

,^)2J dH



"@)%)( - 5[- :$)* % ` 2J"6,G)X0Yi,^[2J

8.8

2.- 5E"+)< +[T">H.H66 )- HJ,"+"2_

2.- 5E"+ ` "+ ,&P,.1

,- ( - B:)"( +E,G- +"2"2J$- +ZHJ,G+Z- 2



` 2A,G 9 &),- "+$_

,- ( - B:)"( +E,G- +"2"2J$2J)!5"2

9)Q <#

"@)%)( - 5[- :$)* % "!5)XGY _

8.8K9 & @ ,G :"C+"$2L)%"- !l+",G;:)C@Z!$K!+ZH.6"!k "2JD H.,JC>

8.8

<#

R >#

 2J!I!$HJ=!)+"H.6 !2." %"- :;,2L65\H:"m>

"@)%)( - 5[- :$)+)> HPH.6 X0> H.HP6[C!HJ Y _


,A23/

_
8L8

- !$"2.- !K$!)+"H.6"!I2. )%"- :)

e /)HL,GE!$# @ ,# )2.- + ,( +)X3>"+"H.[!

X0X  &,>H6H.6V"Y !HJVY0# V,   &6,XGY0Y01

2L )%- :)

X Q >e 9 &,- +l&Y _

,^

 &# )2L- +E,Ge,  2. X0YG1


e /)HL,GE!$# 262.# "2.- +",( +)X 9 2.2J$%,GE2 ,G &,G$:$!+ZH.6"!$&Y01

8.8` )+ ] - V@)2L $ )+ ,G &,GD:)$> HPH.6 

8.8

"@)%)( - 

#' & ,3? 5 .2 ,./1? ,


A





 

2L- 5)"+$<"+)#

2.- 5)+ ` +,&6,a E+,&,G:)$>

5))- :DH6 ,>HLH.


,^[- H# !"H.H.6

 2J!I!$H6H.6 

2.- 5+ ` +,G&6,X0> H.H.6 

26- 5)+ ` +,&,

!$ H.HP6

 

<"#

2.- 5)+ ` +E,G&,4! HPHL6V

2.- 5E"+ ` "+",G&,Y _

2L- 5)"+ ` "+ ,&P,.1

-/ /1? - 9 .->5 = - ?356@





m

Deve-se utilizar EJB Message-Driven Bean quando necessita-se de operaes


assncronas sendo executadas no servidor (container).
Observe que para realizarmos um processamento em paralelo no servidor sem o uso de
Message-Driven Bean, era necessrio o uso de Threads em EJB Session Bean Stateless.

Esta prtica desaconselhada pela prpria Sun MicroSystems Inc., pois recai em vrios
problemas, um deles a falta de controle dessas execues por parte do container,
perdendo assim as facilidades e ganhos que o container oferece.
Para sanar este problema, foi criado o EJB Message-Drive Bean que pode ter vrias
instncias de um mesmo componente sendo executados em paralelo, para realizar a
mesma operao.

#' &'$  9  2 3-39 ? -/A/A? - )9 .->5 = -.? 5


J

k




m

A Figura 14.2, representa o ciclo de vida do Message-Driven Bean. Ele bem simples
comparado aos outros beans, pois o container instancia um determinado nmero de
beans e os mantm no pool de acordo com as necessidades e removidas quando o
container decidir, da mesma forma que o Session Bean Stateless. Assim que uma
mensagem recebida pelo JMS, ela redirecionada para um bean especfico, para
que seja tratada.

Instncia do EJB
Message-Driven Bean
ainda no existe

1. Class.newInstance()
2. setMessageDrivenContext()
3. ejbCreate()

ejbRemove()

Message-Driven Bean
no pool de objetos

Figura 14.2

onMessage()

Ciclo de vida Message-Driven Bean.

#' & (+* ,6-- ? ? *,.- / - . - 2 @






Antes de falarmos a respeito de JMS, devemos enteder o conceito de Messaginig


(envio de mensagens). Messaging pode ser entendido pela troca de mensagens entre
duas aplicaes, programas ou componentes. Um cliente pode enviar mensagens para
um ou mais receptores, que tambm pode retornar um outra mensagem, ou executar
algum mtodo de negcio. Utilizando este recurso, o receptor de mensagens no
precisa estar disponvel no mesmo momento que o cliente enviou a mensagem,
podendo consumi-la, ou receb-la posteriormente, isto , no momento em que seu
servio estiver ativo. Assim, o cliente que envia a mensagem e o receptor da

mensagem devem somente conhecer bem o formato da mensagem, com os dados


que ela carrega.
Para fazer uso destes recursos na linguagem Java, foi criada uma API conhecida como
JMS Java Messaging Service. Esta API fornece servios que permitem a criao, envio,
recebimento e leitura de mensagens. O importante a saber que um cliente cria uma
mensagem e a envia utilizando esta API. Um receptor de mensagens, receber esta
mensagem atravs de um Message-Oriented-Middleware ou MOM. Alguns conceitos
muitos usados nas referncias a JMS so produtores e consumidores de mensagem
(producers / consumers), para designar um cliente como um produtor de mensagens e
um componente EJB Message-Driven Bean por exemplo, como um consumidor de
mensagens.
O caminho percorrido pela mensagem bem simples. Vamos ver isso na figura abaixo,
na qual o produtor envia a mensagem, que recepcionada pelo MOM e a seguir
redirecionada para o consumidor correto. Observe na figura, que o produtor tambm
pode ser um consumidor de mensagens e que o consumidor de mensagens tambm
pode ser um produtor.

P1

MOM

Figura 14.3

P2

MOM.

A arquitetura JMS composta por cinco partes que so: Provedor JMS, que
implementa as interfaces definidas na API JMS e prov recursos para administrar esse
servio; os clientes JMS que podem ser programas ou componentes que agem como
produtores e consumidores de mensagens; as mensagens propriamente ditas que so
objetos que transportam os dados do cliente para o receptor; os objetos de
administrao do servio JMS que so utilizados pelos clientes para enviar as
mensagens; e os clientes nativos que so clientes que usam produtos de Messaging
nativos e no da API JMS.
A seguir vamos detalhar os dois tipos de postagem de mensagens e enteder as
diferenas entre eles.

B
B

Point-to-Point
Publish/Subscribe.

 

   
 $ 
    



O conceito de mensagens Point-To-Point PTP de enfileirar as mensagens para
serem consumidas. Os produtores enviam as mensagens para uma determinada fila
(Queue), que so consumidas por um destinatrio. Assim que receber a mensagem, o
destinatrio avisa ao MOM que a mensagem foi recebida e processada corretamente
(sinal de acknowledge). A fila armazena todas as mensagens que so enviadas, at o
momento que so consumidas pelos receptores, ou at o momento que forem
expiradas.
Observe ainda, que vrios consumidores de mensagens (muitas instncias do mesmo
consumidor) podem consumir mensagens do MOM. Este recurso normalmente

disponibilizado e gerenciado pelo servidor de aplicaes para processamento de


mensagens em paralelo.
O cliente pode enviar mensagens para o MOM, mesmo sem existir nenhum consumidor
de mensagens ativo naquele momento.

Producer

QUEUE

Figura 14.4

 

   
 
1 

 

1

Consumer

M OM

Point-To-Point (Queue).

&
 1
 
"
 &



No uso de  ( % %  (% , ( Publica/Inscreve os clientes enviam a mensagem para um


tpico (topic). Os consumidores registram-se nos tpicos que lhes so convenientes e
so notificados da chegada de uma nova mensagem.


Os consumidores podem somente consumir mensagens que foro postadas depois de


terem se registrado (inscrito) no MOM, isto , as mensagens enviadas pelos clientes
antes disto, no podem ser consumidas por eles. Observe que neste caso, cada
mensagem pode ter mais de um tipo de consumidor.
Se algum cliente emviar uma mensagem para um tpico que no possue nenhum
consumidor registrado, esta mensagem no ser entregue. Aps o consumidor se
registrar, as mensagens que chegam ao MOM so notificadas aos consumidores, que
fornece estas mensagens a eles.
Por haver uma dependncia muito grande do tempo em que o consumidor deve estar
ativo enquanto o cliente envia a mensagem, os consumidores podem fazer registros
durveis ( &"  ) e receber mensagens enviadas enquanto eles no estam ativos. Isto
permite a facilidade de uma fila, com a diferena de consumo de mensagens por
diversos tipos de consumidores.

Consumer 1

Producer

TOPIC

Consumer 2

M OM

Consumer 3

Figura 14.5

Publish/Subscribe (Topic).

  "
A seguir apresentamos um exemplo simples do envio de mensagens por um cliente



 
 
 " e o recebimento das mensagens por um Message-Driven Bean  % .

Teste de envio de mensagens: TestClient


- !$ )23,4* 56&# * !HP# 7'1
- !$ )23,4* 56&# +E!$- + # 761

8.89 H.,G;( HPHL$&!


8.8

"( TEE+5V- D!"+)HL6+ZH 2J$@)!

""2JKH6)2)+"H6@)!$- :"K"2@)!I>

@[%"( - K( H.H

,A23/

<"#

 HL, ` ( - )+ ,a_

"@)%)( - KHL,G,- 5[E- :m!- +)X e,2.- + 

] - ( DX S)@Z@""Y



"2JPY _

+)@( ( 1

@)"@" ` +)+" ,- +S)@Z@" ` "+)+""6,- +


_
8L8

26- K$"+",G &6,

+" 

` +E,G &P,a,G&

8L8

( "( - BK"+)+Z,- )+

+Z- ,- ( ` + ,J&6,AX0Y01

] 6,)23/

@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

X 

@Z@"S)@"@Z

@""@"Y 6,3&# ( "@)"XJ* 65) !$ 8 "+"5 8 * !H 8

@"@"



! GY01

8L8

26- K+Z&'W

S@""@"

S)@Z@" ` "+)+",- +

8L8

` +)+Z6,.- + "6,J2A/Z# 2L,G

26- KHP HPHWED:ZK)+" &PW"

8L8

;S)@)"@" ` +)+""6,- +Z# 2A6,G

9
 9 Y01

@Z@" e"H.H- "+$S)@"@Ze H6HP- +


fR
b `
iR
e"H6H'- +)# b

26- K$H6+":)"2

@""@" ` +)+E6,- "+)X0Y01

@""@"e"H6HP- +)X ] ( H."T

;S)@)"@"e"H6HP- +[# 2J"6, e"+":)"2.X S)@"@EY01

@Z@" e"+":"2 S)@)"@"e"+E:"2

8L8

26- K$!+"H66!$ H "+ 5V- 

KS[@"@""e HLHP- +)# 2J"6,G 

 &,> HPHL6VD!lH6H.6 

] )2X0- +E,a-



i1-

&,> HPHL6V"X0Y01

1[- )Y _

!$ H.H66# H. ,   &6,AX3>"+"H.6"!I+)2  mX0-  c"Y0Y01


e /)H.,G)!$# "@ ,A# "2.- + ,( +)X0!HLH.6V"# ,  &,X0Y0YG1
S)@)"@"e""+":"26# H.)+ :X !HLH.6)Y01


,^

X 9 &",A- "+)Y _

)# 26- +,Ge,G  

2J EX0Y01

e /)HL,GE!$# &- ,XPc"Y01


] - +Z( ( /=_
8L8 ] "^"K E+E&PW"
-]

X S)@""@) ` +[+",- )+
,A2/

 +)@)( ( Y
_

_
SE@Z@E ` "+)+""6,- +)# ( H6X0Y01
,^

e /)HL,GE!$# &- ,X

X Q >e 9 &),- )+YM_

Y01

Message-Driven Bean : TestMDB


- !$ )23,4* 56&# "* %)# 761
- !$ )23,4* 56&# +E!$- + # 761
- !$ )23,4* 56&# * !HP# 7'1

8.8

 "HJ,:"m2J")%"- !"+ ,GD:"m!"+"HP6[+"H)( C>

Z %"$@)!K!$"+"H.6 ! :ZK,.- " ":"


@[%"( - K( H.H  HL,>  <K- !$( !"+ ,GH>H6H.6  


8.8

 

8.8` )+ ,G &,G:)C>H.H66V

"26- 56,G,2L+)H6- "+ ,a>H6H.6

 

<"#

 &,>H6H.6V

8  :)$C- !$"2.- !+"D )+"HP"( )#

2.- 5)+Z<"+T"> HPHL6V )- HJ,J+""2_

2.- 5E$<" +)#


2.- 5)+ ` +,&6,a,G&

+)@)( ( 1

 +"HJ,j+E- ;$E%"* ,G$+ZDH.)2A5- :""2""( "+",G- +)"2.#

8.8

"@)%)( - 5[- :$)* % ` 2J"6,G)X0Y _

8.8

)"!5;C- +"HJ,Jj+"- K:"$%)* ,JC+ZDH62A5- :)"2P#

"@)%)( - 5[- :$)* % "!5)XGY _

8.8` )+ ] - V@)2L $ )+ ,G &,GD:)

8.8

9)Q <>

 2J!,G&+E,G &P,JD:"m>

"@)%)( - 5[- :$H6 ,>HLH.

;,G&1

<"#

<"#

2.- 5+ ` +,G&6,X0>H6H.6 

2.- 5)+ ` + ,J&6,a,3&Y _

,^- H'# 6,G&

8.8

"( - :)C!)+"H.6 !2." %"- :;$C- !$26- !$K+ZD)+ZH.( "#

8.8

 2J!I!$H6H.6 D!$"+"H.6 !

DH62+Z,A- ] -  :"#

"@)%)( - 5[- :$)+)> HPH.6 X0> H.HP6[C!"H.H.Y _


,A23/

_
-]

X0! HPHL6VD- +"HL,G+"  ]

  &6,>HLHP6"Y _

e /)H.,G)!$# "@ ,A# "2.- + ,( +)XG>+"H66"!


2L)%"- :"D E( C>
mXGX   &P,>"H.H.6 Y ! HPHL"Y0#  ,   &6,XGY0Y01


< 

)( HP$_

,^

e /)H.,G)!$# "2P2L# "2P- + ,( +ZXG>"+"H.6 !


m!"H.H.)# , ` (  H.HX0Y0#  ,

X 9 &",A- "+)Y _

)# 26- +,Ge,G  

2J EX0Y01

!k,A-  $"2P2J :"


!X0Y0Y01

 



 "! 



  

A proposta inicial da API desenvolvida para a plataforma Java a de prover aos


desenvolvedores os recursos bsicos de infra-estrutura e permitir que eles pudessem se
concentrar na implementao das regras de negcio de suas aplicaes. Assim, foram
disponibilizadas bibliotecas para trabalhar com colees, com entrada e sada de
dados, com recursos de internacionalizao, entre outras.
Esta idia foi utilizada novamente na especificao da plataforma J2EE, com o objetivo
de prover implementaes para problemas recorrentes de aplicaes distribudas,
agilizando seus tempos de desenvolvimento e permitindo que o foco do
desenvolvimento fique nas regras de negcio a serem atendidas, deixando os recursos
de infra-estrutura complexos a cargo dos fabricantes dos containers. Desta forma, h
um aumento significativo nas chances das necessidades dos clientes serem atendidas
e, por consequncia, os sistemas construdos serem bem sucedidos.
Entre a gama de servios previstos na especificao da plataforma J2EE ligados aos
Enterprise JavaBeans, sero abordados dois dos mais usados: transaes e segurana.
O primeiro servio serve para garantir a integridade dos dados, permitindo que falhas e
execues concorrentes no tornem as informaes gerenciadas pela aplicao
inconsistentes. O segundo servio trata da proteo da aplicao com relao ao
acesso no autorizado s funcionalidades disponibilizadas por ela.

  "!"#%$&


Tipicamente os sistemas provem funcionalidades para seus clientes baseados em uma


massa de dados armazenados em um meio peristente. A integridade das informaes
armazenadas neste repositrio fundamental para o correto funcinamento do sistema
e muitas vezes a perda de informaes pode causar prejusos para seus usurios.
Os problemas relacionados a manuteno da integridade das informaes
armazenadas em um meio persistente podem ser causados por fatores fsicos ou
lgicos. Dentre os fatores fsicos podemos destacar a falta de energia eltrica durante o
processamento de uma funcionalidade que envolva vrias operaes sobre os dados.
J fatores lgicos esto relacionados com erros na programao do acesso
concorrente aos dados, onde alteraes realizadas por um processo podem ser
sobrepostas por outros processos executando de forma concorrente.

Estes problemas so significativamente agravados quando estamos desenvolvendo em


um ambiente distribudo. Uma vez que partes de nossas aplicaes podem ser
executadas em mquinas diferentes, h a chance de uma delas quebrar sem que o
restante da aplicao tenha conhecimento disto, fazendo com que uma operao
realizada pela aplicao seja executada parcialmente, o que pode corromper os
dados sendo manipulados. Tambm h a chance de uma infomao ser alterada por
uma parte da aplicao sem que a outra seja notificada, o que tambm ocasiona
resultados errneos.
Como soluo a estes problemas, foi desenvolvido o conceito de transaes. Para
tanto feito um agrupamento das operaes realizadas em uma determinada poro
do software em uma unidade denominada transao, que apresenta quatro
propriedades fundamentais, chamdas de ACID:
Atomicidade - garante a completude da execuo das operaes de uma
transao, ou seja, ou todas as operaes de uma transao so executadas ou
nenhuma operao realizada. Caso no seja possvel completar uma operao
aps outras terem sido executadas, deve ser possvel anular o efeito destas ltimas
para atender a esta propriedade.
Consistncia - garante que o conjunto de operaes que compem uma transao
nunca deixem o sistema em um estado inconsistente.
Isolamento garante que a execuo de uma transao no seja afetada pela
execuo de outra transao. Esta propriedade especialmente importante
quando h aplicaes concorrentes que acessam os mesmos dados, uma vez que
durante a execuo de uma transao os dados podem ficar temporariamente
inconsistentes, levando outras transaes que utilizam estes dados a produzirem
resultados incorretos e possivelmente violarem a propriedade de consistncia.
Durabilidade - garante que os resultados obtidos em uma transao sejam
armazenados em um meio persistente.
Para ilustrar estas propriedades, vamos utilizar como exemplo uma transao bancria
de transferncia de fundos de uma conta corrente para outra. Suponha a existncia da
seguinte classe responsvel por realizar a transferncia:

Classe usada para demonstar propriedades transacionais.


 
 H.H
  

  
_

   
 ZH   ! ` `#" `  ` $% 
& '()+* ` 
 +)-$ . _
 $%   DH&0/ KH&  DH,$    +
$
$H1  
`

,%+"H *

  "  '2)  '(Ge   " .  )-  .

 / 3
e   "H,$4  5    " b $
H,  7 '8$ $H$% 1  9)-$  .;:
 '2)     " )+< =$.;:

+ '()


6 -

H%  >     " )- .?:


  

A necessidade da primeira propriedade pode ser logo vista nas duas ltimas operaes
do mtodo de transferncia entre contas correntes. Caso logo aps a primeira

operao ser processada ocorra uma queda do sistema, por falta de energia eltrica,
por exemplo, o montante ser reduzido da primeira conta mas no ser creditado na
segunda. Isto significa que o montante iria simplesmente desaparecer, tornando a base
de dados do sistema bancrio inconsistente.
A segunda propriedade diz respeito demarcao dos limites da transao. Ela
garante que uma transao conter um mtodo de negcio completo. Assim, no caso
do mtodo de transferncia entre contas correntes, no seria possvel inclir a operao
de dbito em uma transao e a de crdito em outra, pois neste caso ao final da
primeira transao o sistema estaria inconsistente.
O isolamento diz respeito a tornar a execuo em paralelo de transaes
independentes. Como a consistncia s garantida no trmino de uma transao,
possvel que durante sua execuo o sistema esteja num estado inconsistente (no
exemplo esta situao seria atingida no momento aps a operao de dbito e antes
da operao de crtido). Assim, caso uma outra transao seja iniciada enquanto
uma primeira ainda no terminou, possvel que seus resultados no sejam corretos,
uma vez que a premissa da consistncia que o sistema estaria inicialmente
consistente.
A ltima propriedade trata da confirmao dos resultados efetuados pelas transaes.
Neste caso, aps a confirmao das operaes, seus resultados so efetivamente
armazenados em meios persistentes. Assim, garantido que em caso de falhas no
sistema aps o encerramento da transao, seus resultados ainda podero ser vistos
aps o restabelecimento do sistema.

   


 
  
O uso de transaes traz muitas vantagens e garante a integridade dos dados, mas h
um custo alto em utiliz-las. Os controles que so utilizados para garantir as
propriedades ACID podem tornar uma aplicao lenta de tal forma que se torne sua
utilizao invivel. Assim, este recurso deve ser usado de forma consciente, ficando a
cargo dos desenvolvedores determinar as operaes de negcio que necessitam de
transaes e as que no. Ele tambm deve determinar a melhor forma de agrupar as
operaes em transaes.
Na especificao J2EE h duas formas do desenvolvedor informar aos containers EJB
quais so as operaes transacionais e como elas devem se comportar com relao s
outras: uma forma programtica e outra declarativa. A primeira forma consiste na
incluso no cdigo fonte dos EJBs instrues para que as transaes sejam iniciadas e
terminadas. Uma vez que o controle todo de quando as transaes iniciam e so
concludas faz parte da especificao do bean, este tipo de delimitao chamada
de BMT (Bean Managed Transaction).
A forma declarativa de determinar os limites das transaes feita atravs de
instrues nos arquivos descritores dos EJBs. Desta forma, o prprio container fica a par
da existncia das transaes no momento do deploy e capaz de controlar sua
execuo. Este tipo de transao chamado de CMT (Container Managed
Transaction) e permite um elevado grau de flexibilidade para mudanas na poltica de
controle de transaes da aplicao. Os dois tipos de transaes sero discutidos com
detalhes nas prximas sees.

 
   
Transaes BMT (Bean Managed Transactions) ou programadas permitem maior
controle por parte do desenvolvedor, pois ele que insere em seu cdigo instrues
que indicam o momento em que a transao foi iniciada, o momento em que ela foi
concluda com sucesso ou que ocorreu um erro e a transao deve ser abortada.
As instrues para o controle das transaes so disponibilizadas numa API chamada
JTA (Java Transaction API). Ela permite o acesso transparente aos mais variados
gerenciadores de transaes disponveis nos containers. A implementao da Sun para
tal API o JTS (Java Transaction Service).
A comunicao com um gerenciador de transaes se inicia com a obteno de uma
referncia para a interface javax.transaction.UserTransaction, que feita atravs do
contexto do EJB. Esta interface permite enviar comandos para delimitar o incio de uma
transao (begin), concluso com sucesso (commit) ou solicitar que as operaes
realizadas sejam descartadas pela ocorrncia de falhas (rollback). Abaixo um exemplo
de uso de uma transao gerenciada pelo bean em um mtodo que realiza a
transferncia de um montante de uma conta corrente para outra.

Exemplo do uso de JTA

 

 






  (  !% )H!%  $  2$ H &$"H "  &$-$% ')+*
 &-H%  >*$  )- .
&( &5    "H&      H   ZH  & 9 ;H,"H.H  2<5  '2 H,  % "H&     " .;:





   '2  " .;:


 '2)     " +
) < =$.;:

H%  >    " )  .?:
  )+)+  " .;:

  / " 5 <! -5.











  
!

  %   " .:


< / " 5 <! +,$5.
&5     

 /(!

$

   " .;:

  )-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:

Exemplo de descritor - ejb-jar.xml:




 H6H)+ ;"H   


   $$ !% "H&     
 )+< / 

  > )-  $     
  ) 
 )  /$ )-    )   / ) 
  )+< /



  % )H &? ,    $>    ! ZH


? & & 
      "H&    
   $$ !% "H&     
 )+< / 

  > )-  $      ) 

 

 )   /$ )-% "H%    


  )  /> =) 
  )+< /
 
  % )H &? ,   $ <   ! ZH
? & & $
      "H&    



  H6H)9 ;"H  <  




O suporte a transaes definido dentro do assembly-descriptor. Nele so definidos,


para cada mtodo do EJB, qual o seu atributo transacional. Observando o exemplo,
verifica-se que para o EJB chamado 
 so definidas dois blocos de transaes. No
primeiro definido o atributo Required para todos os seus mtodos atravs do uso do
wildcard *. Logo em seguida este atributo sobreposto para o mtodo

transferenciaEntreCC, modificando o atributo para     .


O atributo transacional, citado acima, usado para dizer ao container como as
transaes devem ser efetuadas quando os mtodos especificados so chamados.
Deve-se levar em conta que o cliente do EJB, que pode uma aplicao Swing, um
Servlet ou mesmo outro EJB, tambm pode estar usando transaes para efetuar suas
tarefas e a chamada a um mtodo do EJB deve levar isto em conta. Tendo isto em
mente, a segir sero mostrados os possveis atributos transacionais definidos na
especificao EJB 2.0 e o comportamento do container para cada um deles.
Required (Requerido): Configura o bean (ou mtodo) para sempre executar em
uma transao. Se a chamada for feita dentro de uma transao no cliente, a
chamada de mtodo passar a fazer parte desta transao. Caso contrrio, uma
nova transao criada.
RequiresNew (Requer novo): Utilizada para que o mtodo do EJB sempre execute
dentro de uma transao nova. Assim, o mtodo executar dentro de uma
transao prpria que ser encerrada quando o mtodo termina sua execuo.
Caso o mtodo seja chamado dentro de uma transao do cliente, esta

suspensa, criada uma nova transao para o EJB, executada e finalizada, e s


ento a transao do Cliente retomada.
Mandatory (Mandatrio): Indica que o mtodo somente pode ser chamado dentro
de uma transao do cliente. Diferente do Required, que caso o cliente no esteja
numa transao cria uma nova, este atributo gera uma exceo se sua chamada
no for dentro de uma transao.
NotSupported (No Suportado): Usado para indicar que o mtodo no ir executar
dentro de uma transao. o complementar do Required, ou seja, caso o cliente
esteja ou no dentro de uma transao o mtodo ser executado sempre fora de
uma transao.
Supports (Suportado): Nesta modalidade, o mtodo do EJB ser executado em uma
transao caso o cliente esteja em uma transao. Caso contrrio, o EJB ser
executado sem nenhuma transao. Este o caso menos recomendvel para uso
de transaes, uma vez que os resultados da execuo so inesperados, devido
dependncia do suporte transacional do cliente.
Never (Nunca): Utiliza-se este atributo quando o EJB (ou mtodo) no pode ser
chamado por um cliente que esteja dentro de uma transao. Caso isto ocorra
lanada uma exceo. Normalmente usado quando o mtodo acessa algum
recurso que no transacional e portanto no capaz de prover as garantias
definidas para as transaes.
A seguir apresentamos uma tabela que demonstra os efeitos do uso de cada atributo
de transao. No exemplo, temos um cliente e um EJB, os quais apresentam transao
ou no. Temos duas transaes, a transao - T1 - e a transao  - T2. Observe os
efeitos de cada atributo de transao, quando o cliente define e no define uma
transao.
Atributo
Transacional

Transao do Cliente

Transao do Bean

Nenhuma

T2

T1

T1

Nenhuma

T2

T1

T2

Nenhuma

Exceo

T1

T1

Nenhuma

Nenhuma

T1

Nenhuma

Nenhuma

Nenhuma

T1

T1

Nenhuma

Nenhuma

T1

Exceo

Required

Requires New

Mandatory

NotSupported

Supports

Never


 
 !"#%$'&())*(&%+&($-,+./&.0 &'$(%*'(1,2-*%-,30

&$

  "! 

Em uma aplicao J2EE, h duas formas que os clientes devem ser avaliados no acesso
ao sistema e aos componentes que ele utiliza. Para um cliente acessar um sistema,
inicialmente ele dever estar autenticado no mesmo. Autenticar um cliente significa
que o sistema deve verificar se o cliente quem ele diz que . Para isso o mesmo
dever fornecer algumas informaes como usurio e senha, ou algum cdigo de
acesso ou algo parecido. O sistema autenticar o usurio e sendo assim, associar o
mesmo a uma identidade de segurana pr estabelecida, tal como um perfil de
administrador, coordenador ou atendente por exemplo.
Assim que o usurio autenticado e acessa o sistema, este ltimo dever apresentar
formas de autorizar o usurio a acessar operaes do sistema vlidas para o seu perfil
de usurio. Por exemplo, se o perfil do usurio de atendente, o mesmo no poderia
acessar a operao de relatrios gerenciais.
A autenticao feita antes de realizar as operaes nos EJBs e veremos mais adiante
as formas que podem ser utilizadas para tal. J a autorizao realizada durante a
chamada de mtodos dos EJBs, que permitem ou negam o acesso de determinado
perfil de usurio.
Veremos a seguir uma breve explicao da API JAAS e como utiliz-la


JAAS (Java Authenticated and Autorizated Service) apresenta interfaces que
possibilitam que usurio sejam autenticados e autorizados em aplicaes J2EE. Com
isso, permite que o usurio acesse sistema e operaes dele, no importando como
implementado pelo fabricante do servidor J2EE. E assim, o servidor J2EE se encarrega
de localizar os dados dos usurios que esto aptos a acessar o sistema, o perfil de cada
um, possibilitando os mesmos de acessarem operaes especficas oferecidas pela
aplicao em questo.
Um usurio poder acessar um sistema e estar autenticado para o mesmo, sendo ele
uma aplicao Web ou uma aplicao standalone. Isso dever ser transparente para o
usurio, sendo que a aplicao J2EE poderia prover as duas interfaces para o usurio
com as mesmas funcionalidades.

  
 
Em verses mais antigas da especificao EJB no havia uma API que definia os
servios necessrios para operaes de segurana. Com a criao da API JAAS isto foi
possvel e autenticar um usurio ficou mais simples e portvel.
Com foi dito anteriormente, um usurio poder acessar um sistema por uma interface
Web ou standalone, sendo que a aplicao dever prover os mesmos recursos para o
usurio. Em interfaces standalone, a autenticao parece ser mais simplista, tendo a
aplicao que utilizar a API JAAS para autenticar o usurio, a partir das informaes
fornecidas pelo mesmo.
Em interfaces Web isto tambm necessrio, sendo que o usurio tambm dever
fornecer informaes como usurio e senha para o servidor Web que ir verificar a
autenticidade da informao. Para fazer isso, o navegador poder apresentar quatro

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 )-


     HPH



/



"H,$ )-

 6 )-

 H.H







...

Digest Authentication - para este tipo de autenticao usado um algoritmo para


converter o usurio e senha em um texto ilegvel leitura, dificultando que usurios
mau intencionados descubram estas informaes. Esta informao passada ao
servidor que utilizando do mesmo algoritmo, autentica o cliente em questo.
Certificate Authentication - o servidor recebe do cliente um certificado digital pelo
qual ser autenticado.
Assim que o cliente autenticado pela aplicao, o mesmo estar associado a uma
identidade ou perfil, que ser propagado por toda a aplicao e utilizado pelo servidor
para a execuo dos mtodos dos EJBs, isto , o seu perfil ser utilizado na sua
autorizao.

   




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.

   

       



Para realizar a autorizao de forma programtica, se faz necessrio obter as


informaes do usurio autenticado na implementao do EJB. Isto deve ser feito
utilizando a interface javax.ejb.EJBContext que fornece os mtodos  
        e
   
    . 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%  <      ! $0EH,  %  %' 


   H& ,   

 > )- %'(%   )  
    )-  <'(      



 %H     






 &H "H.H, 

HPH)+ 4H&  






 %  
H%  <      ! $0EH,  %  %'   H& ,   
 > )- ,)- > &'(  %  )-

H  

 %H     






 HPH%)0 4"
 H % <
  , H ZH 


   

      


A diferena de utilizar autorizao declarativa ao invs da declarao programtica


que no h a necessidade de programar a autorizao, necessitando somente de
configurar o deployment descriptor, definindo qual para cada EJB a security role a ser
utilizada. Pode-se definir uma security role para todos os mtodos do EJB, ou definir uma
especfica para cada mtodo. H a possibilidade de excluir mtodos que no desejase que seja acessado por nenhum perfil de usurio, e isto tambm deve ser feito no
deployment descriptor.
Observe que se alguma operao realizar uma chamada a algum mtodo com um
perfil inadequado, isto , com um perfil que no foi configurado ou definido para o
mtodo, o container lanar um exceo do tipo ! "#   # ' $       .
Vejamos a seguir um exemplo de deployment descriptor, configurando security roles e
as permisses para os mtodos dos EJBs.


$& H )H




H&"H.H=  





 %  % 
H%  <      ! $0EH,  %  %' 
   H& ,   
 > )- %'(%    )  

H  

 %H     



 &H "H.H, 

HPH)+ 4H&  





)+< / ?%)0 HLH, 


 > )- % '(%    ) 

)  /


  )- >   H   ? )-

)-< / )-    )-<!/ ? )-


 )+ >
/   
 )+< /)+ H.H, 




)+< / ?%)0 HLH, 


 > )- % '(%    ) 

)  /

  ? )-

  )- >   H

)-< / )- &   )- / $ )-


 )  />  

)  /

  ? )-

  )- >   H

)-< / )- % '(  )-< / ? )-


 )+ /> 

)  /

   ? )-
)-< / )- % '(  $  )- /$ ? )-

  )- >   H


 )+ /> 

)  /

  ? )-
)-< / )- & # ZH  )+< 
/  ? )-
) < / % )H  '2  )-/ $  )H
)-< / % )H  '2  )-/ $  )H

  )- >   H

)-< / % )H   '2  )-/ $  )H


 )+ /> 







 )+< /)+ H.H, 


"H % <    "H+) +H, -5= $   H& ,   

)+< /

 
 > )- >   H   
  )- 
)  /$ )- &   "H  )- />  ) 
 )+< /

 <5  ?  H

<5  $?  H



 HPH%)0 4"
 H % <
  , H ZH 




       
  


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=  

  )-




   )-


  !  
ZH;    
?    

H  



 %H     ! 



 &H "H.H, 

H&"H.H=  

  )-    $ )-






H  

 ! 

4 H

!$  $ )- % '%    ? )-


  ; H 

 %H     ! 



 &H "H.H, 

HPH)+ 4H&  






H  

% 

H%  <      ! $0EH,  %  %' 


   H& ,   

 > )- %'(%   )  

 %H     




 HPH%)0 4"H % <


  , H ZH

 

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 * 

 , 

 ) 0%


 H,0ZH 



 
 

0 >    B  H% +) $> 


)

"H



  )H=  <aH,  & H,1      



  )



"H

H,>  ZH >  N 


 *

 )- NO"H %  "H 

    / > 1/  $1$    B<   % KH&+ )+>  1 )

+    

  )H=/ %   &  H - )+$ ?!  / - ) $ "H )   H 
  ) $< ZH1"NO"H "H=  4   H    '2 N -0 <'   

 


 



   7      B "   &4H&   *    



 H,/> %   *    "H,.
 /( H  H,   ;H,  &!:

> 1      /> => *

 )
 H%+) 0!   B 7 %
$$   10ZH,%  

  (  %DH&-    N $DH%0   B< 1 )IH,>  H.H,*
   H,- H,-    ,  





 / dH <'  >5   - 5 "


 N - -     10"
 H,    
     0 '   " .8!/% H <'  $5 $<  
  $+ $!  10ZH,  -$H/
-    -H%  $   HPH%
  H.H&+ $H6  01  $ -+%$!   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%+0 <'($   $ )IH  HPH&*$  H+ H+      
 / dH <'  >5   - 5 "N - H&-0 <'    / 



    0 '( " .8/

<!%- >:

>'

ExamplePrincipal.java

 5 <  

    B< -     10  '$ >7ZH, & -    


H  )+ )- N-(  "H%  6      
%    H $H,  < "   . 


 


>'

 5 <  

  < '(- )    <5= )+   H   (:

 )+? <(  &H      :

 >!H& 0ZH, - H, $$    


 
 H.H
5 )+       > )+ )-GH  & $   

 #)- 7ZH,  

& ( &  & ' > )- -(  :





"H% $1 )H! )+ B<  

 )- >)- 7ZH,  


  5 )+   %     " <! '  )+.
 /( H  > )- + )-:

  )





< 
 )

<!%0 )-:

0$)+ 7EH,  %  



 +)- 0"H&    
  <!& '+'2 )- " .

  )+ )- N 


 +)  >  H 


   DH0>)   0 '  $ "H 

  ) $  < - DH )+   


 

  (  %  H,++ H,  '  > "H*$  H&- H&- !    
    +  H "   &  .
  " 

!/ H,.

% :

  "  " 

 ZH  < 5 )0    $    .;.

%   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 "H,   


DH&1 $  $ 
-'  

  ( > %H+0)H& 


 (   - )
   H,- H,-    ,  
    +  )+ "
 %    ZH&.

<!%- >:

H, "H6H*

 )-( 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 )+  H% .;:
"    ($5= )+  "H )-.
 &  5= )+   H% )- />)-
 ?   )-   &  > % "  *  ,  (5 )+  "H )-   H.H=.;:
 &  5= )+   H% "H -/)+    " .;:

$5, <5 -

 


% H!  >  " .;:





 

ExampleMain.java

< / " 5 <! -5.


5  % $       " .:

  < '(- )    <5= )+   H   (:



 )+? <( &5  $ )+ <'   :


 )+? <( &5  H%     /   :
 )+? <( &5  H%     /   '     :




 
 H.H
5 )+   

  KH%   $ 0)-   "   '   '[H,. !/>

'







 5&  '2  2$5 +


 '   2<5   '   " .;:

 

>'2 

5 <! 

5& " 5= )+  "H .;:



  &4H&   - '   2<5  '(   & " .;:


 

5 )0    H  5 )+    H -


  &    H " H,
   &!*$   .;:

5 )+    H " .;:

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.

 

          !

 

#"

 

  

%$ '& )(  $%+*-,/.10%32541676  89,:(;,=< &?>


 

A quantidade de servidores de aplicao J2EE encontrados no mercado hoje


grande. Existem servidores de aplicao de uso livre e outros proprietrios, alguns
dispondo de alguns servios como diferenciais, outros dispondo de um desempenho
melhor.
Quando decidimos em usar a tecnologia J2EE e precisamos escolher qua servidor de
aplicaes utilizar, devemos levar em considerao aspectos como desempenho,
tamanho da aplicao, recursos que sero utilizados, custos entre outros.
Para executar e exemplificar a aplicao J2EE que iremos apresentar neste captulo,
iremos utilizar o servidor de aplicaes livre Jboss na verso 3.0.1. J existem novas
verses deste servidor de aplicaes, mas no entraremos em detalhes. A escolha
deste servidor de aplicaes, se deve ao seu grande uso em aplicaes J2EE que no
necessitam de um servidor proprietrio. Apresenta uma soluo tima e de alto
desempenho para os custos envolvidos.
No o enfoque deste tpico avaliar outros servidores de aplicao e decidir qual
deles o melhor, mas nas referncias no final do livro, pode-se ter acesso aos links dos
fabricantes de diversos servidores de aplicaes comerciais.

%$ :4@ A8 B( C.-0)DFEG0 7HI, C.C0$ $ J $E  8 C.-0 B K &$ +*-,/.10 L2A416M6


    %

No existem muitos segredos para instalar, configurar e executar o servidor de


aplicaes Jboss.

N PO =QMQ7Q SR

O que devemos fazer copiar o pacote do servidor de aplicaes Jboss na verso



# ! %#   ). O arquivo que foi copiado deve ter sido
3.0.1, do site do prprio Jboss (   
um arquivo compactado. Este arquivo deve ser descompactado em um diretrio ou
sub-diretrio no qual deseja-se ter a instalao do servidor de aplicaes Jboss. Aps
esta fase a instalao est completa.
O interessante que no precisaremos realizar nenhuma configurao para executar
os exemplos contidos neste livro. A configurao padro da instalao do Jboss j nos
proporciona todos os servios necessrios para a nossa aplicao exemplo. Veremos
que necessitaremos de utilizar um banco de dados, mas isto no ser problema e nem
precisaremos nos precocupar em instalar um. O Jboss oferece um banco de dados

para realizar testes e executar exemplos. Assim, a fase de configurao tambm est
completa sem muita dificuldade.
Para executar o servidor de aplicaes Jboss tambm uma operao muito simples.
Execute o prompt de comando do seu sistema operacional e acesse o diretrio de

instalao do Jboss. Entre no diretrio   , isto ,           , e execute o comando
 
run.bat para iniciar o servidor. Ento deve-se ter o seguinte:      
      $ . Com
isto, o servidor de aplicaes inicializar, gravando vrias mensagens no console, at
aparecer a ltima mensagem informando que o servidor foi inicializado com sucesso.
Assim, poderemos realizar a instalao da aplicao exemplo que veremos logo a
seguir, que tambm no apresentar muita dificuldade.

R R

:R R

Observe que tambm no o intuito deste captulo, explorar os recursos e detalhes de


configurao do servidor de apliaes Jboss. Para maiores detalhes consulte a
documentao oferecida e disponvel no site do Jboss. Se no for o suficiente, o Jboss
vende uma documentao mais completa para pessoas que desejam utilizar o servidor
Jboss em aplicaes comerciais, e que necessitam de informaes mais complexas
sobre o servidor.
Veremos a seguir, tpicos que exemplificam na forma de uma aplicao, os tipos de
EJB apresentados nos captulos anteriores deste livro. A aplicao completa se
encontra no final do livro no apndice Aplicao      )   . Ento, cada tpico
seguinte trar explicaes detalhadas do que foi implementado em cada EJB. No fim,
poderemos juntar todos os EJBs e outras classes auxiliares em uma nica aplicao e
fazermos a instalao e acesso aplicao exemplo.
A aplicao exemplo apresentada nos prximos tpicos se trata de uma aplicao de
venda de produtos, no qual um usurio poder escolher alguns produtos, calcular
algumas informaes pertinentes a estes produtos e incluindo estes produtos em uma
cesta de compras. Poder ainda excluir, alterar ou remover todos os produtos de sua
cesta. Na finalizao da compra, os dados dos produtos escolhidos sero persistidos e o
usurio ser avisado do trmino da compra, com os dados dos produtos vendidos.

%$ +, 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.


 
 

 

 

&(   '
(
/ ! H
&(   '
 /(!

  <' 6   H&  "  '(6  *  '( % ' .
) $5 < :
  <' 6      "  <'(6  *  $'2 ! )- H=.
) $5 < :

A seguir vamos analisar a implementao do EJB SalesSupportBean. Iremos somente


comentar os mtodos de negcio deste EJB que so muito simples. Os mtodos de
ciclo de vida do EJB sero somente citados.

No mtodo de ciclo de vida !  


   que apresenta a mesma assinatura da interface
Home SalesSupportHome, no foi necessrio nenhuma implementao, sendo assim
este mtodo no contm lgica. Isto tambm ocorreu para os mtodos ! ) "  ,
!    "
 e !   " 
 , por no necessitar de executar operaes nos momentos de
criao e remoo da instncia do EJB, e na ativao e passivao quando ocorre a
liberao de recursos alocados, mas que no o caso.

SR

Os mtodos de negcio      $  e   %    apresentam operaes simples para o
clculo do desconto concedido na venda do produto e clculo do valor de parcelas
de acordo com o valor da venda.


&(   '   <' 6   H&  "  '(6  *  '( 
  .
 +>
 $'2 "   >      " . "         " .  
 %   

 



  " .;.;.;:

&(   '   <' 6      "  <'(6  *  $'2 !  )- H=.
 +>
 $'2 "   >      " .  ! )-"H      " ?. . :

 



Observe que o mtodo 


    $  retorna o resultado da operao do valor de venda
diminuido do valor de desconto concedido de acordo com o percentual informado. O
mtodo    &  somente divide o valor total da venda pela quantidade de vezes
tambm informada para o mtodo.
Veja que as operaes implmentadas so bem simples e tambm no o escopo
deste livro, detalhar demasiadamente as operaes, sendo que estas servem somente
de exemplo e apresentam uma idia de como deve-se implementar os servios
oferecidos pelo EJB Session Bean Stateless.
Abaixo veremos o deployment descriptor do EJB SalesSupportBean, arquivo que deve
ser criado juntamente com o EJB e utilizado pelo servidor de aplicaes para obter
informaes adicionais do EJB e realizar o deploy do mesmo. Este arquivo tende a ser
simples para EJBs Session Bean. Iremos somente comentar algumas linhas.
As linhas iniciais apresentam o nome de exibio e o nome propriamente dito do EJB,
utilizados pelo servidor de aplicaes. A seguir seguem os nomes das interfaces )* e

)  
 e o nome da classe que implementa o EJB em questo. Depois informado o tipo
de EJB Session Bean, que pode ser Stateless ou Stateful e por fim o tipo de transao,
isto , se ser gerenciada pelo Container ou pelo Bean. Por fim definido o tipo de
transao utilizada para cada mtodo especfico do EJB. Deve-se fazer referncia ao
EJB que se est definindo as propriedades de transao, pelo seu nome anteriormente
definido e a seguir, definir para cada mtodo o tipo de transao que este se
enquadrar. No nosso caso utilizamos um asterstico, com isso todos os mtodos do EJB
informado utilizaro o mesmo tipo de transao que foi definida como Required.




H"H.H  

 
 



 
 


( H= > )-   H (!   H, ? )-
 > )-    H !   > )- 

 
 
 
 
 

/>)- )     %  &     H"H.H,     H  )-  /$)- 
%)  & )      &     H HPH,      H !  )- 
 ;  H6H  )     %  &     HH6H,    H >     ;  H6H

H&"H.H=     < & "H.H  


H "H.H   (
 "H&      >$  $  >  ! ZH &    

 ,H "H.H 

  , H ZH

HPH)+ 4H&  




   4 % "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.

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= <! :
 




 

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 !:




Tambm mantemos no EJB SalesBasketBean os dados do usurio que iniciou a compra,


para no final desta, validarmos seus dados e relacionarmos os produtos comprados

para um determinado usurio. Observe que existe um objeto do tipo & . Este objeto
utilizado para carregar informaes do usurio em questo.


&  & 

H&

"H&:

O mtodo !    do EJB SalesBasketBean somente inicializa a Map que contm os
produtos comprados por um determinado usurio.


 

 

  ( -  # &  " . !/ H # 5 <! 
 / H   H 
 

2 H,/  " ;. :




O EJB SalesBasketBean dispe de um mtodo utilizado par ainicilizar a venda. Para isso,
configura o usurio que estar realizando a compra. Observe que esta operao

poderia ser executada no mtodo !    , passando o objeto & como parmetro
no momento da criao da instncia do EJB.

  ( 0    H " H 


 / H  )H% -"H&:

ZH.

O trecho a seguir implementa o mtodo de finalizao da compra. Esta operao


um pouco mais complexa que as apresentadas at o momento, ento atente para os
detalhes. Inicialmente solicitado uma classe chamada de '  '
"  
    , uma
referncia para a instncia do EJB Entity Bean ProductBean, utilizado para persistir os
dados dos produtos vendidos para determinado usurio. A operao de obter a
referncia para o EJB ProductBean est implementada na classe '  '  "    como
pode-se notar.
Esta classe implementa um Design Pattern bastante conhecido, no qual oculta a
implementao da localizao do EJB e facilita esta operao para as classes que a

utilizaro. No o intuito deste livro detalhar Design Patterns utilizados nos cdigos. Para
maiores detalhes consulte as referncias bibliogrficas.
Aps os detalhes deste mtodo, apresentamos a implementao do mtodo do
SalesServiceLocator que localiza o EJB e retorna a referncia para os seus clientes.

Com a referncia da interface &)    $    )  , podemos realizar a execuo do
mtodo create() para cada produto contido na cesta de produtos. Persistimos cada
produto da cesta do usurio, fazendo isso por meio de um iterador. Este iterador ir
obter cada produto contido na Map e criar uma instncia do EJB ProductBean.





  <(   '           B    " .  / dH 5   
 %  & $   )-     )+
"
 $> &    )-.

   H ?     <$ '2  ZH >  " . 
' <   )- "   H (  >  &   
 



  

 

 



 



<!%0
   " !%.;:
"
  / # & $5   -5.
 /(!
$
5   $ " %

#.;:





 

 "    &  - H <  ! < " .     & " .;:  / H  5& " .;:.
      "   $  (.#  5& " .;:
 $> &
"
 ( &
(
. $> &  '(  > " .;:

"

   )-  &  ( '(< )- " .*  '    " .;*(  '( H%  <   " .*
$
  <'( " (  '(    " .?.;.;:





/(    ( $'+ -    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.


 



  










> )-.

"  =)-.;.

    )--   )-


   )- 2 /$   $ "  )-*>   )-.;:

 

 /(!

" > $  )-.2 <5     "  )-.;:



<!% " >    )-$.     )- 2  /  '( "  )-.;:
  / " 5 <! -5.




  "    )- 2 /$  $  ZH>



H (> /% B<+    8)- '2 >   2)- " <! '
 /(! H   )-5 <  



 
$
  )-5=    " !$
%     )- +5<.;:



/  
  '0-'( +   (/$)+ $  <

A seguir continuamos com os mtodos do EJB SalesBasketBean.

A implementao dos mtodos     $  e 


) "  $ 
 que adicionam e removem
produtos da cesta simples. Utilizamos os mtodos de adio e remoo de objetos do

tipo  $ 
 na Map. Tambm h a implemetao de um servio para limpar todos os
produtos da cesta. Este mtodo tambm aproveita o mtodo   da Map e executa-o.


  ( +   $> & " )      &       ($ &
 / H   H    " $> & *% > &!.;:







%  & .



&(   '     +)-   %   < " )   
  .
  "  / H   H <   )  " % > & .  -  .
 +>
   " .;:

 

   <  (   !   &

   "   H.;:

 +>

 

   - %  H < " .


 /( H   H      " .;:



O EJB tambm apresenta o mtodo de clculo do preo total dos produtos contidos
na cesta. Esta tambm uma operao simples, que consiste em iterar todos os
produtos contidos na cesta, acumulando os valores dos produtos e retornando este
valor.







   $'2   H     " .


 

 #(  
:
 "   <    H     " .    <$ " .;:(  /> H #5& " ;. : .
"   >  (.#  <5 " .;:
    0 $ 
(  >  ";"  ( &
.#  '(   " .;.  '(<  &  " .;:



 +>



 $'2 "   >.;:

Observe que este EJB tambm no apresenta complexidade de implementao de


cdigo, mas como j foi dito, este no o intuito do livro. O enfoque desta aplicao
exemplo de somente validar os conhecimentos de EJBs..
A seguir segue o deployment descriptor do EJB SalesBasketBean. Tambm no
apresenta muitos segredos e a nica diferena para o deployment descriptor do EJB
Session Bean Stateless visto no tpico anterior, na tag tipo de EJB Session Bean. Nesta
configurado o nome Stateful, para informar que o EJB a qual est se referenciando,
se trata de um EJB Session Bean Stateful. Tambm no houve alteraes na
configurao do tipo de transao para cada mtodo, utilizando o mesmo tipo de
transao para todos os mtodos do EJB SalesBasketBean, conforme explicado no
tpico anterior.


  


% H% ZH


H"H.H  






  
  

  
 
 
 

 

 H > )-   H& H    H,  $ )-


 > )-   H,  H     )-

/>)- )      &     H"H.H,      H,  H <)+  /)- 


)-  )      &     H HPH&     H,  H <  %)- 
  ;  H6H < )    %  &     HH6H,     H,  H      ;  HPH
H"H.H   (   &   H&H6H,   ( 
  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,1  &  " <! '  )-*  '(6 *  , '0 (!HLH,*  ' )   .
 /(! H % 5 <! * )- 5 <  :
  H,6    % )-   "  <'(6 .# / H  5   (*
) 5   :

   $!  

 

H

 





O cdigo a seguir apresenta os mtodos de negcio do EJB. Estes mtodos so


definidos nas interfaces )  
 e    . Iremos detalhar somente a interface )   & - pois

a interface   &    - apresenta os mesmo mtodos e a nica diferena que os
mtodos no declaram exceo necessariamente.
Vemos os mtodos de negcio do EJB UserBean. So definidos nesta interface os
mtodos getters e setters para o objeto em questo. A nica particularidade da
interface )    em relao a    como dito anteriormente a exceo )  
    ,
sendo que no acesso remoto utilizado em caso de erro na execuo dos mtodos de
negcio que seguem.



 
  
 
 

 

 

 

5,ZH & 5        


  <!& '+'2 )- " .8!/% H )- 5   :
   <' 6'( # " . !/% H >)-< 5   :
  <!& '+'2 "H.H " .8/ H >)-5   :

   $!  




H

  <!& '+'2 )-   " .8!/% dH >)-< 5   :
   $H& )+ " <! '  )-.8 /(! dH )-$5 < >:
   $H&  HPH "  & '0 >$%H6H,.  / H )-$5= <! :
   $H& )+   " <! '0)-   .8/ H >)-5   :




Veremos em seguida o detalhamento da implementao do EJB Entity Bean BMP UserBean.


Definimos um atributo chamado connection, utilizado para manter a conexo com o
banco de dados responsvel por manter os dados do objeto. Essa conexo obtida
por meio de um nome JNDI definido pelo servidor de aplicaes Jboss como
DataSource padro configura neste servidor. Usaremos este para persistirmos os objetos.
Veremos que definimos um mtodo para obter a conexo, o mtodo   
    
   
utilizado em alguns mtodos de persistncia do objeto.
Seguem tambm alguns atributos definidos como constantes que apresentam as
operaes de seleo, remoo, atualizao e localizao dos objetos em SQL. Estes
atributos so utilizados em determinados mtodos que sero vistos posteriormente, para
realizar as operes respectivas. Observe que essas operaes no banco de dados
poderiam no ser definidas como constantes do EJB, mas serem criadas somente em
cada mtodo. Esta uma deciso do programador e aqui segue somente como
exemplo.



&  &  ! ZH, 





       

      

  

$ 00 )H%LN 


 -- 7>7 2

  

&  &  4   ! '   


    




$> &! -  &   -  :




" )-*

 *

(!H6H,*(>)+   .


$ 0+ <    B N -+  7>7 2


   
&  &  4   ! '

  #  
)+
* 6 %H6H





 

$ 00%)- N - < ++ 2



&  &  4   ! '

   

  #





 


" *

 *  *  .  :

     

*()-  

2  #

     
$

2 



 :

 ?:


                 




               




$ 0+< "N $


  + -7 2

&  &  4   ! '   


)-  






 



 

:

)+*

< *


("H.H,*

!   B    -  H 


   "H 
 H=$
/> &(+& )  & 

&  &  4   ! '  


 ( 
)-* < *  ("H.H*
)-  
 

 
 
:
$



 #, 
 )- $$ 5 - ) 0   + "H $ $   

 % - >5 -+ >  -  H 
&  & 
>   -'( $> <   " .













     2<5 ?5


>
     2$5, " .?:
"


2   $>. <5     " &   ;  
  / " 5 <! -.

 




> &   -  :

 /(!

$

 ? .;:

  )-5=    "   ' "H.H ' " .. :

 - >:

Vemos a seguir a implementao do mtodo ! 


 
 definido na interface &)  e
  )  . Neste mtodo so informados os atributos do objeto a serem persistidos e nele
implementado a operao de gravao dos dados em um banco de dados.
Observe que obtemos uma conexo com o banco de dados, preparamos a operao
a ser executada, realizamos o bind dos atributos e em seguida executamos o
comando. Por fim, so configurados todos os atributos do objeto e retornado o seu
atributo chave-primria para o container. Este tratar essa informao e retornar ao
objeto chamador uma referncia para a interface )    ou   , disponibilizando assim a
execuo dos mtodos de negcio.

No mostramos detalhes do mtodo !  


  , pois no h implementao. Somente
importante salientar que este mtodo deve ter a mesma assinatura do mtodo 
    .
Normalmente ele utilizado para configurar relacionamente entre EJB Entity Beans, mas
isto no detalhado neste livro. Maiores detalhes sobre relacionamentos de EJB Entity
Bean consulte a bibliografia.


 




  

 $'2   %  " <! '  )-*   <'(6  *  , ' (!HLH=*  $'0)   .
(
/ ! H %  5 <! 












   

'( 2$    " .;:

!

 % ! < & )- %H  )-



)   H%  <! ' " * )-.;:


H% )   H%    "  $
*       " .;.;:

H% )  H%  <! ' "  *  HPH&.:
H%

)   H%  <! ' "  *)   .?:


H% )   <5  $ " .;:
H%



   

 &!      <)+ "  

.;:


 



 

)    "H " .;:

    

JH!

    

 > &!    H% " .;:

  / " 5 <! -.

 /(!

% <5   " . :

$

# )- "  )-.;:


H  "  .;:
H  (!HLH " ( HPH&.;:
H

H)-  

"  )-   .;:



  '2  #< " .;:




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 /(










!




    

)   H%    " *  /( H     $


H% )   <5  $ " .;:
H%

MH%

)     H " .;:

     6       H " .;:


  / " 5 <! -.




$)+<$5= <! 

 % ! < & )- %H  )-




dH

 

 /(!

$

'( 2$    " .;:

   

 



 &!      <)+ "   #

 

2.;:

  " .;.;:




)-5   "  !)+<  '0 )-  .;:

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.

  






 


  )-  
"  <'(6 .  /(
 

   $'2   
  


dH

'( 2$    " .;:

   



!

 % ! < & )- %H  )-


)   H%    " *$    

"H,   1JH

 &!      <)+ "  



H%

> $$5= <! 




 
 .;:

  " .;.;:


)   5    " .;:

KH%



!

  " .H  <5, " .;.


/ H  H& )- " LH  '( !% ' " ;. .;:
/ H  H& "H.H " JH  '(  ' "  ;. .;:
/ H  H& )-   " LH  '  <! ' "  .;.;:

  >  

    

/ H  H& # " $

JH   H% " .;:

)    "H " .;:

JH!

 

 /(!

$





 $'2 " JH  ' <   "  .;.;.;:

      > &    "H " .;:


  / " 5 <! -.







 



 &5   " 6  '0  & 






+  .;:



  !/> H  <:

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  )-





)   H%    " * /( H     $   " .;.;:
"H,   1JH KH% )   5     " .;:



H%

!

    

 &!      <)+ "  

  " .H  <5, " .;.


/ H  H& )- " LH  '( !% ' " ;. .;:
/ H  H& "H.H " JH  '(  ' "  ;. .;:
/ H  H& )-   " LH  '  <! ' "  .;.;:





2. :




  >  

    

JH!

JH   H% " .;:

)    "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% )   H%  <!
  ' "  <*  /( H  (H6H,.;:

H% )  H%  <! ' "  <
*  /( H  )-   .;:
H% )   H%    "  * /( H     $   " .;.;:
H%

H%

    

)   <5  $ " .;:

JH!

)    "H " .;:

     6       H " .;:


  / " 5 <! -.




 

 /(!

$

> 5 <!  " > .H& H!  <'0  JH  ?.:

SR

SR

No iremos detalhar os mtodos !  "


 e !   "
 , pois os mesmo no apresentam
implementao. Os mtodos setters e getters tambm no sero explorados por no
apresentarem nenhuma dificuldade. Tambm suprimimos os mtodos            e
$        
     pelos mesmos motivos.
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 EH%)lH,*     

, H $   "H    

/$;       H,  )      

% H% ZH



  











 
 


 H > )-

 $ H,

> =)  
   ? )+
/>)- )     &          H )-  /)- 
)-  )      &         H  )- 
    /)  & )            $    H $   )-     /) 
     )               H%         
  > )-

H

H



 
 


 
 

  ;  H6H < )    %  &         H        H6H


$AH= H   ; (     JH H  4 (
 
 )  ?  H.H  &(   '   <'   & ) < ?  HLH 
 $    H,  $  
 !  

 & H )H

%$ :$ , C.-0 B K 6"G8 ,;8


   

%$




Vamos agora analisar os detalhes da implementao do EJB Entity Bean CMP ProductBean. Este EJB apresenta as interfaces )  , )  
 ,   )* e   que so
   $  )  ,   $ 
 ,   $ 
 
 )  e   $ 
   , alm da classe de implementao do EJB
ProductBean e seu deployment descriptor. H uma novidade para este EJB.
Implementamos a classe da chave- primria que se chamada   $  . Como vimos no
exemplo do EJB Entity Bean BMP - UserBean - este no implementava uma classe para
a chave primria, utilizando uma classe da API Java. Faremos diferente neste EJB para
exemplificar o seu uso.

A seguir vemos um trecho do cdigo da interface )    $  )* . Ela define os mtodos
de ciclo de vida do EJB tais como o 
   , que recebe como parmetros os valores a
serem persistidos no bando de dados e tambm declara as excees 
    ,
quando ocorre algum erro na persistncia do objeto e a )         para outros erros.
Define tambm os mtodos conhecidos como finders, utilizados para localizar objetos j

persistidos. Neste caso, definimos somente o mtodo-padro


       )   & & informando
qual o valor da chave- primria do objeto que deseja-se localizar. Este mtodo tambm
declara as excees       , para erros na localizao do objeto no meio
persistente e a )  
    para outros erros.

A interface    )  tambm define os mesmos mtodos, tendo a nica difereno de
no declarar as excees remotas - )     .


  



 $> &    "  , '  )-*  , ' "H    *  $'2  *
 $> &  0% > &  (.  /> H % & $5   * )+<$5=   $:
 $> &   (  % )-  > "
 > &  0 .  / H
( &5   *
) 5   :

 

 

 

 

A interface )  
   $ 
 - apresenta os mtodos de negcio do EJB. Neste somente
declaramos os mtodos getters e setters para o EJB Entity Bean CMP - ProductBean.
No iremos detalh-los, pois so muito simples. A interface 
    $    - tambm
define esses mesmos mtodos, com a nica diferena de no declarar as excees
remotas - )     .
Logo a seguir apresentamos a implementao da classe de chave-primria, utilizada
para o EJB ProductBean. Esta classe tambm no apresenta nenhuma complexidade,
somente apresentando os atributos de chave-primria que no caso somente um id.
Importante salientar que como esta classe ser utilizada pelos clientes remotos, ela
deve implementar a interface '        .

 
 H.H   &  0

 )+ )-GH    B<  

O prximo cdigo apresenta a implementao do EJB Entity Bean CMP - Product Bean
- propriamente dito. Veremos que tambm no apresenta muita complexidade, pois os
mtodos de persistncia e manuteno do objeto so implementadas pelo container
do servidor de aplicaes, tirando essa responsabilidade do implementador, assim no
havendo cdigos para estes mtodos.
A classe deve ser declarada como abstrata, pois o container ir implement-la quando
esta for instalada no servidor de aplicaes na aplicao exemplo.


 H %  1   H6H  ( &  + )9 )-GH (   (  

Observe que o mtodo !   somente configura os atributos do objeto e retorna o
valor da chave-primria. A persistncia dos seus dados fica a cargo do container.


   

   $> &  +   &  " &$   '    ' > )-*     $'    <'0H& % <  >*
&(   '   <' 1 * )       <      $     ! 
  &  
   .8!/ H # 5 <! 
H # )- "  )-.;:
 H%  <   " H&  <  .;:


H %
   "  .;:
H  ! &   " $> &  (.;:
  '2   %  <   " .;:
H

 

Veja tambm que os mtodos de manipulao do objeto tais como ! ) "  ,  !     e
! ' 
  so desprovidos de implementao, ficando tambm a cargo do container esta
tarefa. Os mtodos de negcio tambm no apresentam implementao, mas a
diferena para os mtodos de ciclo de vida que devem ser declarados como
abstratos, pois sero implementados pelo prprio container novamente.



  ( +  )- " .8 /(

 

$)+<$5= <! 

dH

  ( +    " .



  ( +  < % " .

 
 
 
 
 
 
 
 

 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  )            $     %   < 
%   >  H&  $   

 

 

  )

)+ (.H&     5  )+ (JH  


"H!! & 3H& /)- > )-   !    "H!! & 3H& /)- > )-
)+  $ 


   $ )-  $ )


     )-
 )+     
)+  $ 


 


4  H6H


   $ )-   H, & <!   4  $ )-
 )+     
)+  $ 


   $ )-         ) 

 )+    
)+  $ 

 )+    

%$ +, 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

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.H &'2.#)lH' .  '2  H.H, &' " .;:
"" H, H6H &' . )H' .  ' <  H " .;:
H,
"H,

"
 / H H%()-   "H  '(8H% " .;*(EH  '2      )-   " .;*
 H      &!  *)-  HPH% &' .;:
 & ' ) H.H& &'2



  



  / " 5 <! -5.


EH%)  ,   $   " ?MH&> '0)+  $;$ "H& 

 5 .:



Este EJB tambm apresenta um mtodo privado chamado  


implementado a lgica de envio de emails. Ele no ser detalhado.

 )   ,

no qual

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           ? )-
  ;  H6H  )     %  &     )-  H     &     4  H6H
 "H&      >$  $  >  ! ZH &     
( H= > )-

H#

) H.H& &'  ;(%  4H%   <  



"H!  &!   ( & &5  )H     "H  &    >$ 
H,>"H %   $ ;%     #
%    H,H%  <   (>    

 )-"H.H& &'(; $4H%  $   


 )-"H.H, &' 4( 

%$ 6MK %-EG0-8  C.10   F(:, E  ! 10


 



Para empacotar a aplicao, podemos faz-la de vrias formas. Podemos utilizar os


empacotadores do prprio J2SDK e J2SDKEE que so o jar e o packager
respectivamente. Poderamos utilizar do ANT, uma ferramenta muito utilizada no meio
Java para criar makefiles.

Utilizaremos um arquivo de build do ANT para realizar tal operao. Observe que o
intuito deste tpico no de explicar as particularidades dessa ferramenta. Para
maiores detalhes veja no tpico     
  as referncias para o ANT.

A seguir apresentamos o arquivo $ # ) , utilizado como makefile para compilar a
aplicao, gerar documentao, criar os pacotes (jar) e a aplicao Enterprise (ear).

Build File : build.xml


 

 5 )0$LH,    #  ( '   



  1 )+ ;5=)+ H #<   /> 






















 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

%?

 )-  )-

%?

 )-

%?

 )-

%?
%?

%?

 



$  

 )-      HPH%H


 )-       

%?


 
 
 
 
  
  
 
 
 
 
 
 
 
  
 
 
 
 
 
  

 H, 

$  





 



>      4  H6H"H 


>      4     
>      4    

$  

%?
%?
%?

 )-   $
 
 )-   H=

%?

 

$  

$   4$  
$       )+ 

$  
 )-     "H "H
$  
 )-       < &'  H (  
           'H 


 )-    
$  
>    
   4   


 )-    & 
$  
>     4   

%?



?   %    
 )-
$   ?5 )+   
$     

 )- ; )+    '


 )-      

%?

$  

(   )-

(J H= 


 )-     )
 )-      &'

%?



%?

!    ; H,  


 )-    H  H $(  
    4 <  !H&> "H  
 )-   "H  LH
$  
 
!    ;   "H  < AH 

 )-    
$  
!    ;     

 )- 

$  
!    ; H,    

%?

 )- ;     &'("H

%?
%?
%?
%?



$  

 < /+ 







 

;  H6H, & /

     H6H"H  

!    6   "H , <  

 

  /$$ )-  & /


  "H  
 $ &!/


$ '2
+  HLH=  /+$ H 7> H   "H1+ 


 

$  

)-H! 
0/$$ 
>7>      



 
  
 
  
 
 
 
 

 ?'2 > )- ?/ 


 /

) H.H& &' 

 /

) H.H& &' 

 /

) H.H& &' 

4   )-

      




H,

 /

) H.H& &' 

 /

) H.H& &'  / 

 /

) H.H& &'  ;   

 /

) H.H& &'    

 /

) H.H& &'  ; H

>HH'    H1 !'(GH "  $"H,. 

)

  H%   H +)+"H &'2 )    




)-<(-H%! 
$  '
-    
 
)+  #H  H  &) # &    ,.H# ,   .H     H  
    - <$  7>  "    .   



 
  

 /
  ?'2

) H.H& &'  ; )+  


 
) H.H& &' 

 /



 ?'2 > )- ?   


 < -$ 
  ?'2






 
 



) <$ 6( 
  ?'2 

     


 
 
 




   

  

     B NO$ H >  HPH   H $ 


- )0  N 
 

 ?'2 > )- ?   4 )+   #"H   


) <$ 6(        H.H&H  
) <$ 6( 
) <$ 6( 
  ?'2

       &'("H
        



   

  

 


    
 


"H, H 
   N $  
 +         H&% "H 
  "H    !   H, H 

 



   "H

 



!    

  "H  

  ?'2

      

 +   





       

)+  H  H6H, H  -    N $


 

   H + < 

 ?'2 > )- ?   ?>   #$)H ?  

     B N $
 7  0       N 
 

 ?'2 > )- ?  



     

     B NO$ H H  H

 ?'2 > )- ? )+   #>H  >  4 )+   


 H (     H&
"H        H6H"H
 H6H,  /% ?  H.H  / #>'

  ?'2


 


? )+    '




 


   







     
 
 

  (H 

 ?'2 > )-

ZH

)0  <   H  H   "H +   '  NO H $H& H! )-
        'H ? %H&% "H   

 !4  

4  H% 6$ 

 


     H "H



)+  H  H.H, H 0%  

  )+$ -"H!% !


  ' - 

)0  <
H  H6H, H )  "H1 H 0>


?


 !4  
   $   'H  5 )0   ;    
)+ > ;H!
  H&  $AH ?     

 









    
 
    
   
   
   
 

 

       HPH  H 
   7$ )- 4 )     
     $  



    & )  )  ,   !    H;6H0H , 
 ; , ? ,&%,    JHGH  

4  H% 6$ 

   7$ )- 4 )      


 !  < > ?)-   H.H
   7$ )- 4 )      
  H  H <   HPH  

    &H H6H,  

 

    &H H6H,  

   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 






 ?'2 > )-









             
    
  

!4      
5)+  
4  H% 6$    

  ?'2



     N  

 
     
    


      
  

)+   H  "H  -    N $
  5)0 

   &'H ?  5 )+ 
   

  4
      5 +
)  
 #5=   H
    
   5 )+ 

 ?'2 > )- ?  



    $   'H ? 5 )0   ;   


)+ > ;H!
  H&  $AH ?    
4  H% 6$ 
     HPH H 

 !4  

   


   7$ )- 4 )      


   $ 


   7$ )- 4 )  
  
     

   "H







  
  ?'2 


  
   

   
 
 
 




+   (
 

 ?'2 > )- ?  #>"H %*


&*   

?

   ?           <'(H  5 )+ ;    
5 )+    H  $AH ?       &   5 )+
4  H% 6$ 

       <'(H



   7$ )- 45 )+  ;     


   7$ )- 45 )+ 
   
   7$ )- 45 )+  ;       

   7$ )- ?"H "H   


   "H 
  
  ?'2







 B 0>  -
  N



 ?'2 > )- ?  


  ?'2 







"H 4   *   ?  * )+  *> 



     


    

            
               
   



    

 




 


     




'(


( 
   N

 ?'2 > )- 4 H

>"H ? )+  
    
   
    &   

) <$ 6( 
) <$ 6( 



   


  KH&%  < /


%  H,%
 H 
>    & 
  H6H,  /% ?  H.H  / #  "H6H ?  &  JH=  ( H 6"H,
    5 ( H
      
44   )-        & 
     
?   =)-    $        2 
?   )-
(       )
; )
4   )-
$ &(  
  &'(0 )- ; )     
/> /?     & (  H,  )   H  >   H    
    / H   
/> /?    & (  H,   )      H




  

(H

      ? 44   )-


4  H% 6$ 
    <$   

B D
 B 4



<   B 



 B  

  ?'2

   &


%$ @ "A8 )(  .10


 

 

(;, E  ! -0 C 0  $?*-,S.10  2A41676




A instalao de uma aplicao J2EE no servidor de aplicao Jboss no uma tarefa


muito difcil nem complexa. Configuraes adicionais no prprio servidor de aplicao
no sero necessrias, pois no utilizamos recursos adicionais, mas se isso fosse preciso
tambm no seria uma operao muito complexa.
Tendo em mos o arquivo EAR, a nica tarefa que devemos realizar a cpia do
Enterprise Archive no diretrio de deploy do Jboss. Devemos nos certificar de executar
o Jboss com as configuraes padres, isto , executar o comando
 
 
                $  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 R

=R R

: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 

 


 "$ B K . $  (;0  K $%G8 . $& E  , 8?0%?>


Deployment descriptors ou arquivos descritores so utilizados pelos componentes da
arquitetura J2EE para definir seus detalhes, informaes que so usadas pelo container
para gerenciar esses objetos.
Existem vrios tipos de descritores, um diferente do outro e especficos para cada tipo
de componente.
So alguns exemplos de descritores:
web.xml para componentes Web;
ejb-jar.xml para componentes EJB;
application.xml para o empacotamente de aplicaes enterprise etc.
Para componentes EJB por exemplo, se faz necessrio o uso de um arquivo
denominado ejb-jar.xml, especificado pela Sun MicroSystems Inc. para aplicaes
enterprise e que apresenta informaes dos componentes EJB tais como Session Bean,
Entity Bean e Message-Driven Bean. Alm disso, apresenta formas de definir o escopo
da transao na qual ir sobreviver o EJB, segurana e autenticao, relacionamentos
entre Entity Beans, tipo de sesso, persistncia dos Entity Beans, consultas em EQL para
Entity Beans, tipo de Session Bean, recursos remotos ou locais localizados atravs de
JNDI entre outros.
A seguir veremos mais detalhes do deployment descriptor ejb-jar.xml.

 /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   
 (
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  


  
O elemento-raiz do deployment descriptor ejb-jar.xml o elemento
iremos detalhar seus atributos e elementos.

  

. A seguir

  H % <   


( H= > )-    H,  $ )+
H)-       H)-     



"H  <  

  ?'2?  
% H% ZH   > H&? ZH

  '( 

  &! "H,/ "H 


HPH)+ 4H&     HPH)+ 4H&  

%   ZH,/ H

 ! !  

 ;   $ 

   

  ;   $ 


<description> : atributo que apresenta a descrio do pacote EJB.


<display-name> : atributo com nome do mdulo de EJB a ser utilizado por outras
ferramentas para referenciar a este pacote.
<small-icon> : atributo com o caminho completo de uma figura que ser utilizada
como um cone pelas ferramentas, que manipularo este mdulo. 16x16 pixels.
<large-icon> : atributo com o o mesmo que a small-icon, sendo que esta cone
poder ser maior. 32x32 pixels.
<enterprise-beans> : elemento que define as informaes dos EJBs contidos neste
pacote. Neste elemento estaro as informaes de cada EJB Session Bean, Entity
Bean e Message-Driven Bean.
<relationships> : elemento que apresenta os relacionamentos entre os EJB Entity
Bean CMP.
<assembly-descriptor> : elemento que define as informaes de segurana e
transaes.
<ejb-client-Jar> : elemento usado para conter o nome do pacote com as classe
para acesso remoto aos EJBs.

    !"  #!

SR

O elemento   
        define informaes de cada tipo de EJB, tais como, Session
Bean, Entity Bean e Message-Driven Bean, e no possui atributos. A seguir iremos
detalhar seus elementos.
$& H )H 
H&"H.H=    H&H.H 



 

   

)  H.H& &' 
 ;(% 
  , H ZH 


 )- HPH% &' ;( 




O elemento    define informaes para os EJBs Session Bean contidos no arquivo
de deploy, sendo assim, podemos ter vrias ocorrncias deste elemento. A sua
declarao apresenta alguns atributos e elementos.
H"H.H  

  H % <   


( H= > )-    H,  $ )+
H)-       H)-     



"H  <  

  '( 

  ?'2? 
 
  )- 

  > )- 
/>)-  /)- 
%)    %)-

     /)-

    /$)+
          

    H.H 
H&"H.H=      H"H.H=   $ 
 "H&      >$   ! "H,  <    (
 4!    4$! 
 ;  H6H











   % 
      %    
    % 
H& (   <   H&   ?  
H& (        H&        

 % 




 %"H ? 
%"H ?$ ;   %H& ?$? 
%"H 

 ,H "H.H 






<description>: descrio do EJB Session Bean.


<display-name>: nome utilizado pelo container para se referir ao EJB.
<small-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<large-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<ejb-name>: nome do EJB, utilizado posteriomente dentro do prprio deployment
descriptor para referenciar este EJB.
<home>: nome completo da interface Home do EJB.
<remote>: nome completo da interface Remote do EJB.
<local-home>: nome completo da interface LocalHome do EJB.
<local>: nome completo da interface Local do EJB.
<ejb-class>: nome completo da classe que implementa o EJB.
<session-type>: tipo de EJB Session Bean. Pode ser Stateless ou Stateful.
<transaction-type>: define quem gerenciar a transao. Pode ser Bean ou
Container.
<env-entry>: define propriedades de ambiente para o EJB.
<ejb-ref>: declara referncias para outros EJBs.

<ejb-local-ref>: declara referncias locais para outros EJBs.


<security-role-ref>: declara referncia para regras de segurana para este EJB.
<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.
O elemento       apresenta informaes do EJB Entity Bean e tambm pode ocorrer
mais de uma vez no arquivo de deploy. Alm de apresentar informaes do EJB, pode
definir as querys utilizadas pelo container para um EJB CMP.



$  



"H  <  

  H % <   


   H,  $ )+

( H= > )-


H)-  

 

  '( 

 H )-    


  ?'2? 

 
 > )-     )-
/>)-  /)- 
%)    %)- 




    /$)+      /)-
          

    H.H 
JH H! $ 4     JH H!  $ 4 $
% )  ?  H.H    )  ?  HLH 
%    !  
 ;  H6H

 

 

 )+ (JH  


"H!! & 3H& /)- > )-    H %   3H& /)+ $ )+
)+  $    )+     
)+ (.H& 

 



 4!

 


  & ) <
  4$!

% ) <     

4  

  % 
   
    % 
H& (   <   H&   ?  
H& (        H&        

 % 

     %




 %"H ? 
%"H ?$ ;   %H& ?$? 
($$    
%"H 

 ! 








<description>: descrio do EJB Entity Bean.


<display-name>: nome utilizado pelo container para se referir ao EJB em questo.
<small-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<large-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<ejb-name>: nome do EJB, utilizado posteriomente dentro do prprio deployment
descriptor para referenciar este EJB.

<home>: nome completo da interface Home do EJB.


<remote>: nome completo da interface Remote do EJB.
<local-home>: nome completo da interface LocalHome do EJB.
<local>: nome completo da interface Local do EJB.
<ejb-class>: nome completo da classe que implementa o EJB.
<persistence-type>: tipo de persistncia do objeto. Pode ser BMP ou CMP.
<prim-key-class>: nome completo da classe que define a chave primria da
entidade.
<reentrant> : pode ser True ou False.
<cmp-version>: verso de CMP. Depende da implementao do servidor de
aplicao. Pode ser 1.x ou 2.x.
<abstract-schema-name>: nome do objeto utilizado adiante para criar em EQL,
formas de consulta e manipulao do objeto em questo.
<cmp-field>: apresenta todos os campos de um EJB Entity Bean CMP que sero
persistidos.
<primkey-field>: campo de um EJB Entity Bean CMP que ser considerado como
chave primria.
<env-entry>: define propriedades de ambiente para o EJB.
<ejb-ref>: declara referncias para outros EJBs.
<ejb-local-ref>: declara referncias locais paa outros EJBs.
<security-role-ref>: declara referncia para regras de segurana para este EJB.
<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.
<query>: apresenta uma lista de cdigos de manipulao de objetos, utilizado para
EJB Entity Bean CMP, utilizando a linguagem EQL (EJB Query Language).
O elemento )*   "   define as informaes dos EJB Message-Driven Bean. Como
nos outros casos, o arquivo de deploy pode conter mais de uma ocorrncia deste
elemento, isto , no caso de deploy de mais de um EJB. A seguir os seus atributos e
elementos.
)+HLH, &'24( 


  H % <   


( H= > )-    H,  $ )+
H)-       H)-     



"H  <  

  '( 

 > )-
 ;  H6H

  ?'2? 

   )-

    H.H



 "H&      >$


) H.H& &' 0H&  & 









  % )H% &     


 ) H.H& &'(0H&  &  

 

  '()  

 >

 

 

) H.H& &' ;(% 4H%   <  


 4!    4$! 





  ' )   
 )+ H.H <'(?, (;"H   &  

  % 
 
     %    
    % 
H >   $     H, &  ?   
%"H    %"H ? 

 % 



%"
 H ?$ ;
 )-"H.H, &' 4(  





 %H& ?$? 

<description>: descrio do EJB Message-Driven Bean.


<display-name>: nome utilizado pelo container para se referir ao EJB.
<small-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<large-icon>: caminho completo de uma figura que ser utilizada como um cone
pelas ferramentas, para este EJB.
<ejb-name>: nome do EJB, utilizado posteriomente dentro do prrprio deployment
descriptor para referenciar este EJB.
<ejb-class>: nome completo da classe que implmenta o EJB em questo.
<transaction-type>: define quem gerenciar a transao. Pode ser Bean ou
Container.
<message-selector>: filtra mensagems baseadas no seletor de strings do JMS.
<acknowledge-mode>: especifica como sero as mensagens de confirmao
(acknowledge). Pode ser Auto-acknowledge ou Dups-ok-acknowledge.

<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
SR

O elemento           apresenta o relacionamento entre EJBs Entity Bean CMP, sendo
que podem ocorrer nenhum, um ou mais relacionamentos entre EJBs deste tipo. Define
outro elemento, ! 
    , no qual so configurados cada relacionemento entre dois
EJBs.
 <  "H,/>  H


"H  <  

 H  <  




 % <  

  H % <   


 
 %$   $ )-    
 ? <  ? )-

"H  <  

 %$   $EH,/ ? 


"H % <     H&  <  

  ?   "H&/ %  > )-

  <  "H,/> % > =) 


)0         )+       

   "H&/ % GH&>  


H%  <     >H    
 > )-     )  

 !$   EH,/ ? 3H, 


)+    

 >H     


)+
   
 $ )-   )+
4   )+
)+
   ; 2    )+
   4 (
H%  <  

 )+44  



  ?   "H&/ % 

 %$   $EH,/ ? 


"H  <      H % <  

H&  

  %   ZH,/ ?  )+

  H  ; <




%   ZH,/ ? 3H,%  


"H % <     H&  <  
  )-   ? )+

 % & ZH,/ % 3H% 


)+
   

 %$   $EH,/ ?  )-


)+ !       )+       

 H&  <   


)+     )-   )+      ) 
)+    4    )+   $   ( 
"H % <  

 )+
   

 <  "H,/>  H

  %   ZH,/ ? 

  ? <  






:N

A seguir vemos uma breve explicao dos atributos do elemento         .
<description> : descrio do relacionamento entre EJB Entity Bean CMP.
<ejb-relation> : define o relacionamento entre dois EJB Entity Bean CMP.

SR

=N

Sub-elemento ! 
     do elemento 
       que define define o relacionamento
entre dois EJB Entity Bean CMP.
<description>: descrio do relaciomento entre dois EJB Entity Bean CMP.
<ejb-relation-name>: nome do relacionemnto.
<ejb-relationship-role>: elemento que deve ser configurado para cada um dos dois
EJBs que possuem o relacionemnto.

:N

Sub-elemento !            do elemento


relacionamento dentre dois EJBs.

!       

que descreve um regra de

<description>: descrio da regra de relacionamento.


<ejb-relationship-role-name>: nome da regra de relacionamento.
<multiplicity>: multiplicidade do relacionamento. Pode ser One ou Many.
<cascade-delete>: define se o relacionamento de um para muitos de um EJB Entity
Bean CMP dependente da vida do outro EJB. Sendo assim, s pode ser
configurado para o EJB Entity Bean com multiplicidade um (One) no
relacionamento.
<relationship-role-source>: define qual EJB estar relacionando com este.
<cmr-field> : define qual o campo utilizado para o relacionamento. Apresenta
atributos que definem a descrio do campo de relaciomento, o nome do campo
propriamente dito e o tipo do campo.

 #! !"  

 !     



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  



H& ( 

 

"H % <   




 !$  ) 


)  /)+ H6H,  


  ? )-   !$  ) 




  ? )-


 &H  (%  % 

)  /




"H % <    


  )-   
 ? )+
)+< / ? $;   )- /  

)+< / ? )-  )-/ ? )+


)+< / 1  )$H   )- / ?  )lH
 )- /


 )- /)+ H.H, 


  $$ !% "H&    
"H  <    

)  /




   )-   ? )+


)+< / ? )-  )-/ ? )+
 )- /


 "H ; < &      "H ; &?! 


     "H&     

 H6H)9 ;"H  < 




<security-role> : define a regra de segurana utilizada para acesso aos EJBs. Como
atributos define uma descrio da regra de segurana e o nome da regra
propriamente dita.
<method-permission> : quais mtodos podem ser acessados por quem a partir da
regra de segurana definida em  %$        . Para cada mtodo, informa-se o nome
do EJB que o contm, alm de informar se este mtodo acessado para alguma
interface, o seu nome e os parmetros que ele recebe. Pode-se definir uma regra
para todos os mtodos de um EJB, utilizando o asterisco (*) no elemento <methodname>, por exemplo. Este elemento pode aparecer quantas vezes for necessrio,
para configurar uma regra de segurana para um mtodo de um EJB.
<container-transaction> : define atributos de transao para cada mtodo de cada
EJB. Pode conter um atributo que descreve a transao e deve conter para cada
mtodo o nome do EJB e o nome do mtodo que ser utilizado um tipo de
transao, configurada no elemento        $
  .

<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.



      

!


#"

 

 

Este apndice apresenta um guia de referncia rpida para a API Enterprise


JavaBeans. Observe que a API da plataforma J2EE muita mais extensa, sendo que
esta apresentada neste tpico somente uma parte dela. No visamos tambm
explicar em detalhes a API EJB. Para detalhes consulte a documentao oficial da API
e a especificao EJB 2.0.
Iremos apresentar o pacote ! "

@ C8 +H -E

#


   


# !

explicando as suas interfaces e excees.

  $  $ 


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        "   ' %$ # )-.;:
H,   )H% &!  '2 H   "H&     " .8 /(
  9 H

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 )  
  (.  /


# 




   

IR

)+5  *  5   :

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=   :

   

R

Permite que o cliente acesse informaes dos metadados do EJB. Esta interface no
muito utilizada, mas pode ser obtida atravs da chamada ao mtodo ! ) #    
      
 . As informaes contidas nesta interface e fornecidas ao cliente remoto em forma de
um objeto serializado, pode ser utilizado para obter dinamicamente informaes sobre
o EJB.
   $!  +&>  1

<
> 2 )- '  > )- " .;:



# HLH ' 8)- ?  

 H6H " .;:



# 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     " >

  &  .  /

)+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  


#     


Quando implementamos EJB EntityBean, devemos implementar esta interface.


Apresenta os mtodos de ciclo de vida do EJB, executados pelo container nos
momentos apropriados.
Define os mtodos para configurar e desconfigurar o contexto associado ao EJB Entity
Bean, mtodo de remoo da entidade persistente, ativao da entidade caso tenha
sido passivada pelo container, passivao da entidade em caso de falta de recursos ou
porque muitos EJBs esto instanciados por exemplo, carrega uma entidade do meio
persistente para a memria quando o container precisa atualizar os dados do objeto,
ou atualiza os dados no meio persistente de acordo com os valores dos atributos
constantes em memria.

Alm destes mtodos, se faz necessrio a implementao do mtodo !    j


mencionado anteriormente, o qual ir criar a instncia do objeto em memria e persistir
o mesmo.



 

   $!  +(   (  -5)H % H&  


   DH& $  
5 "     <5,1 &5.



 /

> 5= <  * $)+<$5= <! :







5& " 8
. !/% H
> 5 < * )-5 <  :
      )-< " .8 / H )-5   * 5   (* >)-< 5 $<  >:
           " .  /% H  >
 5   * )- 5 <  :
       HPH, ( & " .  /% dH  > 5   * )- 5 <  :



 



   7"H<!  







        " 2


.  /
"
      % .  /








> 5= <  * $)+<$5=   :

 5 <! * )+<$5=   $>:


H


#      


Apresenta a interface especfica do EJBContext para um EJB Entity Bean. Ela


associada ao objeto aps a criao da sua instncia.





   $!  +(   2$ 5& 5& $)H &


 > 5,
>      < '( &$       " .  / H    '2   & 
 5 <! :
>   & '2      " .  / H    '2   & 5  :

 

  & '    )-  


 


#
 






" .8!/%






   '(   <$5=   :

Um Handle uma referncia persistente de um componente EJB. Ela implementada


por todos os EJB Handles. Muito til quando a aplicao necessita persistir a referncia
para um objeto EJB e recuper-la posteriormente.

   $!   2  


5"H      %   B  
     & '2>    " .  / H )-$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 MessageDriven Bean deve oferecer o mtodo      , implementado da API JMS. Este
mtodo ser invocado pelo container no recebimento de mensagens dos clientes e
deve executar a lgica de negcio para o EJB em questo.

   $!   H6H &'2



 $H& "H.H% '(




 +  >)-<$ " 8


.  /


#

 !"! 


 



 >    5$$H 


 &% H%  
 ( 25& "  HLH &'     25 ?5<.  /(!

> 5   :

dH

dH

> $5 $<  >:

   




Apresenta a interface especfica de EJBContext para um EJB Message-Driven Bean.


Tambm associa o contexto ao EJB, depois que sua instncia criada.

   $!   H6H &'2



  2 5 5"H > 2 <5


#
# ! !  


Deve ser implementada por todo EJB Session Bean. Apresenta os mtodos do ciclo de
vida do EJB, tais como associao do contexto ao EJB, remoo da instncia do
objeto, ativao e passivao do objeto pelo container, alm de definir o mtodo
!      que criar uma instncia do objeto pelo container.


 

 



   $!   HLH=   -5)H % H&  


 $H&  HPH&   <5, " "H.H   <5, <5.  /







 +  >)-<$ " 8


.  /
 +   <  ( < " .2/


#
# ! ! 



> 5 <  * $)+<$5= <! :


H

 > 5= <! * >)-< 5   :


H

 +   H6H, $ < " 2


. /%





> 5   * )+5 <! :

dH

 > 5=   * >)-< 5   :

# 

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   >*

/46 JFE $&!"# $ 




$)+<$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.

  

 
#  




Informa ao objeto chamador que ocorreu uma falha no recupervel, ou um erro


inesperado. lanada quando ocorre erros deste tipo nos mtodos de ciclo de vida ou
nos mtodos de negcio. a nica exceo do pacote !  " # ! que extende a exceo
de $  )* &$   )*    - e no permite ao chamador se recuperar do erro. As excees
e     $   
   
e
( '$          ,
( '$   !
         ,
       
                 extendem esta exceo.

 N

N IR
PR
         


SR



Deve ser utilizada em todos os mtodos finders, normalmente usados em EJB Entity
Bean. So lanadas quando um erro de localizao do objeto ocorre.

       
   


lanada pelo container quando em um EJB Entity Bean executado um mtodo,


para o qual no existe o objeto em questo. Pode ser utilizada pelos mtodos de
negcio do EJB e pelos mtodos de ciclo de vida !  e ! '   de um EJB Entity
Bean.

   


   




  
 

Parecida com a exceo ('$        , diferindo que esta lanada para objeto
locais que no exitem mais.

 



    












  
 

lanada por um mtodo


   , para avisar que um objeto no existe. Deve-se utilizar
esta exceo quando um mtodo finder retornar somente um objeto. No caso de
vrios objetos, deve-se retornar uma coleo nula.

  





 


A exceo RemoveException lanada quando o container no pode remover a


instncia do objeto. utilizada no mtodo ! ) "  .

 



   !"




  
 








   


Informa que a requisio no encontrou uma transao e a mesma era requerida.

 
 

   !"







 











 


Indica que a transao foi marcada com rollback ou estava sendo executado o
rollback, mas ocorreu algum erro nesta operao.



  A 

    I

 ! 

 

A seguir apresentamos o cdigo completo da aplicao exemplo. Esta aplicao


consiste de cinco EJBs, sendo um para cada tipo de EJB definido pela especificao
EJB 2.0. Ento sero:
EJB Session Bean Stateless - SalesSupportBean
EJB Session Bean Stateful - SalesBasketBean
EJB Entity Bean BMP - UserBean
EJB Entity Bean CMP - ProductBean
Message-Driven Bean - UserNotifierBean

SR

Observe que existe um deployment descriptor  ! !  # ) para cada EJB nesta aplicao
exemplo. Isto no necessrio nem possvel em uma aplicao J2EE, na qual faam
parte dela todos esses EJBs. Para isso preciso criar um nico deployment descritor !
!  # )* , no qual inclumos todas as informaes de todos os EJBs contidos na aplicao
J2EE em questo. Este arquivo mostrado no final deste apndice.

Iremos apresentar tambm o arquivo especfico para o servidor de aplicaes Jboss,


utilizado para criar as tabelas do banco de dados utilizado para persistir os objetos da
aplicao. Este arquivo, chamado de ! )  ! # ) est mostrado no final deste
apndice tambm. Salientamos que este arquivo no faz parte da especificao J2EE
e um arquivo complementar e de uso exclusivo para o servidor de aplicaes Jboss.

+R

Vejamos o cdigo completo do EJB Sesison Bean Stateless - SalesSupportBean.


Apresentamos as interfaces )  e )    , '  '$   )  e '  '$  respectivamente, a
implementao do EJB SalesSupportBean e por fim o deployment descriptor ejb-jar.xml
deste EJB.

Interface Home : SalesSupportHome.

  < '(- )           H&H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

     2)-*> ) )-


% ;.F   
+ $   )+*"H
    )- 
$  "
 HH,?  N "H >DH? -
 "H % $"H 
   $!     "H (!)-  5"H & &5      )-

 

 

 

    H >?   " .  /



% <$5   * >)-5   :

Interface Remote : SalesSupport.

  < '(- )           &H H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

 

  ?   )--0      "H (!    


  >"H$ KH&!> NH +   (  +"H, -0 %  H 
 ! )
   $!     "H (! 5$$H <( &5        &
&(   '
 / H
&(   '

 

 
 

 

 

 /

  $)

( 

  '26    H, ( "  <'(6  *  $'2  '2.


)+<$5= <! :
  '26       "  $'( (  *  <' 6 )-H.
)+<$5= <! :

Session Bean Stateless : SalesSupportBean.

  < '(- )           &H H.H :

 )+? <( &5      :


  >"H$
"HH&?  N H  %
  
  *>H& $ *(  $!H 0  
  
 $
     
 (B<"H (--   ( ZH&  '( 
 ZH"H)H&?  N HH      B<  H  "H! (ZH,#   B<  2 8$$ H2( H 

 

 
 H.H   "H ?  + )+  )-H  HPH,   



$5,  H6H, + $  

& ( & H6H, 



 5&aH&H6H=  2$5 :

& +)-
 "H $  + + -    



 

% < $5 <  5 N +  N + 7 )H >     
   +   & " .  / H ! <5   

 /



dH

 

 )-N-  ZH > 


>   + -    
   +  )-< " .





    B< - - $     -     +$   (-"H   HPH  


"
   +       .



    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 $    (   )- *4  # )
  ) (  
  1 H,   -+"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% ZH






 
 




 
 


H"H.H  

 H > )-   H >   H,  $ )-


 > )-   H !    )- 

 
 
 
 
 

/>)- )      &     H"H.H,      H !)+  /)- 


)-  )      &     H HPH&     H !  %)- 
  ;  H6H < )    %  &     HH6H,     H       ;  HPH

H"H.H   (   & HLH  %


H H6H, $  (
  ZH  <      $    ! ZH  &!   

 %H HLH= 

  , H? ZH

H6H)+ ;"H  <$




    "H&    

)-< /

 

  )-   H >?    )-


)- /> ? )-   )- /> > )- 
 )  /> 



 % ZH
? &!%      ! "H
? & $
     ZH  <!  

   

 H6H)+ ?H%  < 




/$; 
    ,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.

Interface Home : SalesBasketHome.

  < '(- )           H&H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

     2)-*> ) )-


% ;.F   
+ $   )+*"H
    )- 
$  "
 HH,?  N "H $ 
+  & /
> )+ H 
   $!     "H,  H < )-  5"H & &5      )-





 

    H&  H  %  " .  


/ 



% <5   * >)-5   :

Interface Remote : SalesBasket.

  < '(- )           H&H.H :

 )+? <( &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= <! :

  

 



       > & " )       &       &
>$> & .  /
$)+<$5=   :
 
&(   '    +%)-  %    " )         (   $> &
% ($  .8!/% H )- 5 <  :
 
&(   '   '26    H <  &  " .  /> H )-5 <  :

   
 %  H < " .  /
 

 )  5  :


"
  +  />   & H&  )  
      &    H 
 / H )+<$5= <! :
H

Session Bean Stateful : SalesBasketBean.

  < '(- )           &H H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? )  
 
 )+? )  
 )+? )  

     (
   :
         :
             :


 

"H&&.

  >"H$
$H!> N - ,% />*> +
)  ) H

) >
  
 +) )+ $ -)H,   
 ZH"H  HH $7)    H1) >)+ *>0)H,1 <    B< H,*
 %) (  H 0 "H H   & /
>  )+ H 

"H,     )+ ) 0%'  H%  - )-+%> %  H%
)+! 



 
 H.H   "H,  H <  + )+  )-H  HPH,   

5- "H.H 0   

"H% +("H 



& ( & H6H, 




 5&aH&H6H=  2$5 :



& ( & + H <!:



& ( &



H,

EH,:

& N  -  "H%  


 H- <0$     



H,% -- H


)+%

 

  

% < $5 <  5 N +  N + 7 )H >  7 > 
   +   & " .  / H ! <5   
 /( H   H  -
 H,/  " .;:

 /

 

dH

 )-N-  ZH > 


>7 > *>   $  $$ 
   +  )-< " .





    B< - - $     -     +$   (-"H   HPH  


"
   +       .



    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  ZH -"H,,:

)H%$%.

 (    B<


- )+ 
 )H%
 N+LH, H -H  "H > (> * & &

H

0"H,-+>   

 

 ) HLH,+   0$     


0)H&  $H,> "HPH%  ;H= )9 

   (  %  H,+ - )+ /$ KH, 7%   B< 
)IH,> "HPH% 

 / dH 5   -5 "N0
& N $ +$    -  ("H 






  (   '          B   " .  /( dH 5 < 
 $> &    )-+    2 ) 
"
  ($ &   )-.
   H ?   $  <  '2 "H >  " .  '(<    2 )+
"    H (  >  <  
   #.;:



!

 
 










 






/   ! ( '9 - $   B<    

5.;:


% +- , /-+ )+> H 

   )



%+>
   " !.;:
< / "  &$5=   -5 .
 /

5    " ?%

 "  % &   - H <  !  " .   % & " .;:(  /> H #<5, " .;: .
  >  0 < "     (.   5& " .;:
 ( &
"
 ! ( & . ( &  '(<  

  " .;:

"

"

"
    )- % &  ( '(< )- .;*$ '(   .;*  '( "H  <   " .;*

 '( " (  '(    " .;.;.;:




 



  )   % $ 


H  Z
 H& +  & >/ 
 + )+ H 
   +    > & " )     %  &     ( &
> $> & .
 /( H   H    "  ($ &!*! &.;:





 )-(-)  


>  & />
+ )+ H 

  )   % $ 
H )- ( -+ &, /
> )0 H 

  (  %  H,+ +)-NH,
   (  *$  H+ H&+    ,  
 
&(   '    +%)-  %   " )         (   $> &









% ($  .
  "  /( H   H   %)-< " ( & . 
>  .
%+>
   " !.;:

<!%0



   " ;  H.;:

 > -(  1"H >$ H   H 


"H% 0! &
 H-(   
  (  6  0("H1   "H  "H 








   <' 1   $ H     " .


 

 $   
:
 "    &  - H <  ! < "
"   
    0  
";"   > & .#!
  >

<!%0

.     & " .;:  / H


 (.#  5 " .;:



 '(<   " .;.  '2    " .;:

 $'2 " $  .;:

 )-( H


!"H1 "H -+ )+ H 
   - %  H < " .



 

 /( H   H      " .;:

5& " .;:.




)H& 
 
    

   +   
0ZH, & *,    DH%+0)+H&)- 0

)

 )
 H%
 N-( KH&$ )+  H )+ < *) H  $ +0  > -H% 5 )+ 
 (     H%
 N*"H&> H6H= )+*"H $ N 
 H&$ 7 H% $DH, )+  H 


  ) )H "H,   
DH&1     






  (  %  H,$H%


    *  H&  H& ! 
   
    -  />  & H& " H&
ZH.




<!%0

   " !%.;:

Deployment Descriptor : SalesBasketBean.

 
 

 5 )0$LH,   #  ( ' 


   -       (






 

 





 

  
 %H EH%)lH,*     

, H $   "H    

/$; 
    H,  )      

 

% H% ZH



H"H.H  




  
  
  
 
 
 

 

 H > )-   H& H    H,  $ )-


 > )-   H,  H     )-

/>)- )      &     H"H.H,      H,  H <)+  /)-


)-  )      &     H HPH&     H,  H <  %)- 
  , H3H ,)  %,  ,  , ?     H;.HGH ,    .H  JH % % !     JHGH

 (   &   &H H6H,   ( 


  ZH  <      $    ! ZH  &!   
H"H.H 

 %H HLH= 

 & H )H

HPH)+ 4H&  




   4 % "H,  <  

)  /





  )-    H=  H <    )- 


)-< / )-    )-< !/ ? )-
 )+ /> 



  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.

Interface Home : UserHome.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

  ?      )-   


$    B< 
- "H6H0)- 
  ! )F-0) <+ %
, N+
    0    B< N -    
  >
DH&
/ + )   
















 
 

)--5)H &( <5     > )-


H,1  &  " <! '  )-*   <'(  *  , ' 
(!HLH=*  $'0)   .
 / H # 5 <! * >)-5 $<  >:
H,6    % )-  > "  <'(1  .  /
H  5 <! (*

   $!  

H

$)+<$5=   :





Interface Remote : User.

 

  < '(- )           $   (:

 )+? <( &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   :

Interface LocalHome : UserLocalHome.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :

  ?     )-   


$    B< 
  "H.H&+   
  ! )F-"H 
) H +  N-
$  > +"H  
0     B N
 - < - &!% & H $H,>
/> 7> )  





 

 

 

H

 

Interface Local : UserLocal.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :



   )-
5"H  5     > $  )-
H, > > % < "  & '  )+*  $'2 < *  $'0  HPH&*  & '0)-   .
 / H # 5 <! :
"   '1 . !/% H  %5   :
H, > $  >   )-  

   $!  









  ?     >)-<   


!   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)-   .;:

Entity Bean BMP : UserBean.

 

  < '(- )           $   (:

 )+? <(  % )0   :


 )+? <(  H   :

 )+? <( &5      :


 )+? <( &5  $ )+ <'   :

  >
    $    *;"H,EH &()+ GFH2 "H "H,  ,  ) ) )-  LH, H%$ 
  
  >"H$
"H )  H > $  ' % N +< "N >H1  "H H !% "H
  $!  * & N $*)+N * <    B N -0    B< N $  -$   

 >7)- 
+LH, HF  
 
 H.H



H&%  +







 5&    25&!:



5 
 - )

& ( &- % )H& 




0 2

 &  -  &   -(  :



  
       
     





   
         


             




                




 00 ZH.N 


 -  ++ 2

& ( &-    '   



 
  
 " )-*


5-7 > >!  0   

& ( &0$  


)+ )-GH    (  

 *

( HPH,*)-   .

 0+  $   B N -+  ++ 2


   
& ( &-    '

  #  

)+
* 6%H6H



  #

2  #

  #



2  #

 0+< EN 


 -+  + 2

& ( &-    '  


)-  



*()-  

" *

.:

?:


 00)-N--$ 7$7 2

& ( &-    '






 



$ 
:

) * #< *

(!HLH,*

   B     1"H  H  DH


/ &0& )   

:



           

& ( &-    '  


)-  



 



 

:

)-*

< * 6
 "H.H=*

 #)- 7ZH,  

& ( &  & ' > )-:




 +
 >7ZH, &  

& ( &  <' 1 < :


 ($ N 0"H,    

& ( &  & '0 %"H.H=:


 ()-  +)H&  

& ( &  & '0)-   :






 
 
 
 


    B< - - $     -   + 7ZH,  


  )  )- >)- 7ZH,  



  )

  +)H,    

  )

("H.H $$"N +ZH,%  


$)-  )-  +)H,   

  )

 - /> &(+ )    -$  > +"H,    


 /

 



 

  

% < $5 <  5 N +  N +H%  "H   
 <' 1    "  ' > )-*   '$6  *  & ' (
 "H.H* <! '0)+   .
 / H # 5 <! 

dH















  
  


!



'( 2    " .;:

> <  



    & )-aH )7

!

)   H  $' " *> )-.;:


)   H   " *       " .;.;:
H )   H  $' " * $%H6H,.;:
H )   H  $' "  * )+   .:
H
H

H

)   5   " .;:

  >  

JH

)    "H " .;:

 > &!    H% " .;:


"
< / 5 <! -.
    
 /



 5 <!  " . :

)- " $ )-.;:


H,<  " < .;:
H,<  "H.H " "H.H,.;:
H,<

H,<!)-  

   

$> &!    ! < )- "  

" )-   .;:



<!%-'( < " .;:

 
 5     H 
 N $  + ZH >  
   H,     B<  
 % %    B<   '2)-  N+"H0)-)- 

.;:



    B< -    '2  H


%$  $ )-"H  %
0  -$  
  )  )- >)- 7ZH,  


 
 
 
 


  )

  +)H,    

  )

("H.H $$"N +ZH,%  


$)-  )-  +)H,   

 

  

  )

 



% < $5 <   5 N +   N +H%  "H   
       H  &  "  , '  )+*  $ '2 < *  $'0 %H6H,*  & '0)-   .

/  H # 5 <! 

 /

dH



 )-N-  ZH > 


>7 > *>   $  $$ 

 / dH )-(5   -5 N + -)-N  >    
   +  )-< " .8 / H )+5  



 

!

















)   H   " *  / H     6  $ " .;.;:


H )   5   " ;. :

  >  

)    "H " .;:

JH

 

 /

)-$5= <!  " ? (% )+( '0 )-  ; .;:



  ' % 0>)- 7ZH,  



  )  )- >)- 7ZH,  


   $H& )+ " <! '  )-.
 /( H  > )- +
 )-:





  ' % +  0"H   

  +)H,   


   $H&  "  '2  .
 /( H  
:
  )







  ' % +"N -+)H&  

("H.H $$"N +ZH,%  


   $H&  HPH "  & '0 >$%H6H,.
 /( H  $%H6H
"H.H:
  )






  ' % +)-  +"H   



  )

$)-  )-  +)H,    

$> &!    ! < )- "    

H

      > &!    H% " .;:


< / " 5 <! -.




    & )-aH )7


!

'( 2    " .;:

> <  

 

 


(.;:

   $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 +
     B< N > 
   + KH
/ (+ )   

  )    +)H,    

 - /> &(+ )   +
  -) ) )  

 / dH ( 5   -5 N -)  H& > %+ 0     B 1   
   <' 1      )-  > "  $'$6 .# / H  %5  











 


!


 

'( 2    " .;:

> <  



    & )-aH )7

!

H



$> &!    ! < )- "  

)   H   " *       " .;.;:


;H )   <5  
 " .;:



"H,   JH

!

  " LH  5& " .;.


!/ H  H,< )- " LH  '(< <! ' " ;. .;:
!/ H  H,< "H.H " AH  '( !% ' "  ;. .;:
!/ H  H,< )-   " .H  '(  ' " .;.;:


    

 

!/ H  H,< < " 

%JH   "H " .;:



 '( " LH  '2   "  .;.;.;:

 (
 .;:

)    "H " .;:

JH

     6 > <      H " .;:


< / " 5 <! -.

 





  >  

 /

 >$5= <!  " ? (%6 $$ '0  & 





 .;:



<!%- / H  < :



    B< - - $     - &<'  "H  "H   -+)+ 
 +LH= HF   %
+)-)  
   +    " .



!






'( 2    " .;:

> <  




    & )-aH )7


!



    

$> &!    ! < )- "  

.;:

)   H   " * / H     6  $ " .;.;:
"H,   JH ;H )   <5   
  " .;:

 


H

!



  " LH  5& " .;.


!/ H  H,< )- " LH  '(< <! ' " ;. .;:
!/ H  H,< "H.H " AH  '( !% ' "  ;. .;:
!/ H  H,< )-   " .H  '(  ' " .;.;:








    

  >  



JH

      > &!    H% " .;:


< / " 5 <! -.

 

 /



%JH   "H " .;:

)    "H " .;:

> 5 <   "  %    '0  GH   .;:

    B< - - $     +$LH, H  1"H  H )H   H )
  ! () )+ -7JH H%GF>  
   +   " .

 









)-) 

!

> <  

'( 2    " .;:



    & )-aH )7

!

)   H  $' " * / H


)   H   $' "  * / H
H )   H  $' " 
*  / H
H )   H   "  * / H  

$> &!    ! < )- " 

H

 $ )-.;:

H

 (!H6H,.;:
 )-   .;:
  6  $ " .;.;:

#

 


(.;:

)    H% " .;:

MH

 

 /

> 5 <   "  % LH, H  <'0  H   .?:



    B< - - $     -     +$   (-"H   HPH  


     " .

   + 



6 > <      H " .;:


"
< / 5 <! -.



)   5   " .;:

H

  >  

    




 <+ &!  

    B< - - $         HLH, $+)


   +   H.H= ( & " .



"H $4 ' (! +  <5, +  -$  


   0"H    25& " .

 /( H    









 <5
  :



  ' % + 5 +  -$  



  )



  

  








$!  2$ 5& $ 5-+&> -  0   





   $H& 


 $  
5& "     <5,6$! 

 /( H    
  <5
 
5&!:

 

 5&!.

0  -+ "H 


    

 - 5 -7$  -- H
& ( &
> & 7'(     " .
& +)- 5 
 - )






!



>  :




 (    2$56 5 -


     25& " .:
" 2 <  . ?5      "  &(
   

"
< / 5 <! -.

 




   - 

 /

.;:



  )-5    "   '(< "H.H% '( " .. :



<!%+ :

 
 

Deployment Descriptor : UserBean.

 5 )0$LH,   #  ( ' 


   -       (






 

 





 

% H% ZH



  

  
 %H EH%)lH,*     


, H $   "H     

/$; 
    ,H   )      

 












 
  

 $ H, > =)  


   ? )+
/>)- )     &          H )-  /)- 
)-  )      &         H  )- 
    /)  & )            $    H $   )-     /) 
     )               H%         

 H > )-


 > )-

H

H




 

 
 

  ;  H6H < )    %  &         H       H6H
$AH= H   ; (     JH H  4 (
 



 )  ?  H.H  &(  '  '  )  ;  HPH 
 $    H,  $  

"H & GH& />)- > )-


 ! 

H

 H% %   ,H /)  ) 




 & H )H

HPH)+ 4H&  




   4 % "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.

Interface Home : ProductHome.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

  ?      )-   


$    B< 
- "H6H0)- 
  ! )F-0) <+ %
, N+
    0    B< N -    
  >
DH&
/ > )  


  

   $!     )-


5>"H &( &5
 % > & % < "  & ' $ )-* 
 
 % > &  9%  &  .  /% H
 





  

     )-



&  ' "H  <  *  $'2 & *


# &$5=   >* ) 5   :

"   > &  9 .



 %  > &      )-  


 / H  5   * >)-< 5 $<  >:

Interface Remote : Product.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :



  ?      >)-<    0 +-$  > +(+!   B 7$ 
  "H.H&7%)     )F-  HPH&- "H  H >H!
    

   $!      5"H  5     >   &


  <!& '+'2 )- " .8!/% H )- 5   :

 
 
 
 

 

 
 
 

  <!& '+'2 "


 H  <   " .8 / H )-5 <! (:

   <' 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   :

Interface LocalHome : ProductLocalHome.

 

  < '(- )           $   (:

 )+? <( &5      :


 )+? <(  !    :

  ?     )-   


$    B< 
  "H.H&+   
  ! )F-"H 
) H +  N-
$  > +(-0    B< N $
 
 - < - &!% & H $H,>
/>  )   



  
  
 

 $!      $  2)-


5,)H < $ <5     >    )-
 % > &     &  " <! '  )-* <! '0"H& ,  *
 
 <'  % *  $$   0! &  (8
.  / dH % <$5 < >:



"

  % > &     
% )-  >
!    9 .8!/> H
( 5   :

 

Interface Local : ProductLocal.

 

  < '(- )           $   (:

 )+? <( &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 .;:

   $H&  $> & 

"
 %  &  0

>$$   (
 .;:


PrimaryKey : ProductPK.

 

  < '(- )           $   (:

 )+? <(      :

 # H6H >


4 -()- /$ 7> )   
-$  > +( 
 
 H.H   &  0 )+ )-GH    B<  

         + +  

& ( &  & '  :



"H% $ $ ( 


  
   % > &   " .



"H% $1 )H! )+ B<  



  )  0      +  


   % > &   " <  '  .

 /( H   





 (:

- /$  )    +>


   > %   

 - /> &(% )  %  +
!   %  
  <!& '+'2   " .

< 
 )

<!%- 
/  H   :



 


)+ $ H&-+$  &  0



 '2     H, )+$   
  ) $  < - DH )+   



   &- H&-+$ DH&  ' >  *  H&  H+ $! 
   
    +  H "   &  .





  " 

<!%-;  H:


 




 -  .
"
  
/  H  '(  HPH " .     H "   ' <  HPH " .?.;.
 ( &  7 / 
"
 ! &  (.  :
;
"
;
"
"

%!>
 / H   -  . "  / <   
  / H        H "  / &   .;.;.;:






 >
0) <   +/ H&/ 2 " . 
 - /> &(-7/> H,/ 

 

    /> H,/ 2 " .

  .;.  "  / H   




( 




<!%0   / 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&    & 
 H %  1   H6H  ( &  + )9 )-GH (
    (  
 5-7 > >!  0   





& ( &0$  







 5&    25&!:


 
 
 
 
 

    B< - - $     -   +


  7>$  
  )  )- >)- 7>$  



  )
  )
  )

 0     (>  7>$  

H&    -"H, & N-+  


 0"N -+  

 - /> &(+ )   0% ( 


 /

 

 

dH
% < $5 <  5 N +  N +H%  "H   
 %  > &     % &  " &   $'  <  '  )-*    '  <  $'7>H%  <  *
&(   '   '21> *> )                $> &  
% ($   (.8 / H % <5  



 

)- " $ )-.;:


H,< "H     " H& ,   .;:
H,<    " , $.;:
H,<

  

     "  ($ &  (.;:


<!%-'(       " .;:

H,<

 
 5     H  N $  + ZH >  
   H,     B<   % %   B<   '2)-  N+"H0)-)- 
     B< -    '2  H
%$  $ )-"H  %
0  -$    



 
 
 




  )
  )
  )

 0     (>  7>$  

H&    -"H, & N-+  


 0"N -+  

 

  )
 /

 )- >)- 7>$  

dH

% < $5 <  5 N 


 +  N 
 +H%  "H   



   

       H  &  " &$   <'   & ' $ )-*     $'    <'0"H % <  >*
&(   '   '21> *> )           
      $> &  
% ($   (.8 / H % <5  

 

 )-N-  ZH > 


>7 > *>   $  $$ 

 / dH )-(5   -5 N + -)-N  >    
   +  )-< " .8 / H )+5  

 





 

    B< - - $     - &<'  "H  "H   -+)+ 
 +LH= HF   %
+)-)  
   +    " .



    B< - - $     +$LH, H  1"H  H )H   H )
  ! () )+ -7JH H%GF>  
   +   " .

 



    B< - - $     -     +$   (-"H   HPH  


"
   +       .



 <+ &!  

    B< - - $         HLH, $+)


   +   H.H= ( & " .





"H $4 ' (! +  <5, + 


 -$  
   7"H<!  
5& " .

 /( H    







 <5
  :



  ' % + 5 +  -$  

  

  



$!  2$ 5& $  5-+&> -  0   


   DH& $  
5 "     <5,1! 
 5 .
 /( H      <5
 
5&!:



  )



  

  ' % 0>)- 7>$  



  )+ )-  


  -   1 %
0    



  )  )- >
 )- 7>$ 
 
 H %   $ $H,< )- " &   '   ' 
 )-.;:



  ' % -"


 H  N -0( 
  )+ )-   -   1 %
0    



  ) H&    -"H, & N-+ 
 
 H %   $ $H,< "H     " &(   $'  < , '0"H  <  .;:



  ' % 0>"N-+ 

)-) 

  )+ )-   -   1 %


0  

  )  0"N -+  



 H %   $ $H,<    " <$   '   '21> .;:

 



 

  ' % - /> &0, )   >7! 


  )    + / &0% )   +  
 
 H %   $ $H,<      " )     %  &           > & 
% ($   (.;:





 



0$)+ 7% $ 

< 
 )

  )+ )-  


  -   1 %
0  

 +)- 
 0% ( 
 
 H %   &(   <'    '+'  )- " .;:

 





< ) -  H, & N-7>$  


  )+ )-   -   1 %
0    

 - H, & N-+  
 
 H %   &(   <'    '+'  H& , <   " .;:






  )+ )-  


  -   1 %
0  

 +!N >
 7%  
 
 H %   &(   <'    <'( ' <    " .?:












0%N-7>$  

< 
 )

 

- /$ 7> ) 
 
0% ( 
 - /> &(+ )   0% ( 
 
 H %   )      &          !  & 
< 
 )



 

'(    


" .;:

Deployment Descriptor : ProductBean.

 
 

 5 )0$LH,   #  ( ' 


   -       (






 

 





 

  
 %H EH%)lH,*     

, H $   "H     

% H% ZH



  





 H > )-     <  (


  H& > )- 
 > )-   !      $ )- 
/>)- )      &          %  & )-  /)-
)-  )      &           ($ &  )+< 

 
 
 
  

 
 

 
 
 

    /)  & )             $       <    2)-      ?/)-
     )                  <         
  ;  H6H < )    %  &          ( &     4  H.H 
$AH= H   ; (  2$  $   LH, H%>  ; 2  
 )  ?  H.H  )                   < 
 $    H,  $   


  )

)+ LH,     5  )+ $AH=  


"H & GH& />)- > )-     <  "H & GH& />)- > )-
)+    


 


  H6H


/$; 
    ,H   )      

 

    )-   )-      )-


 )+     
)+    


    )- <  H, & <      ? )-

 )+    

)+    


    )-  %      )-


 )+    
)+    

    )-  ! & 

 )+    

 

 & H )H



 % )  ;  




   4 % "H,  <  

HPH)+ 4H&  


)  /

    )-




 )  4    > > & 


 !  

  )-  $> &    )- 


)-< / )-    )-<!/ ? )-
 )+ /> 



  ZH
? & &   >      )H &? ,  
    !% )H% &! 

 HPH%)0 4"H % <

   

Apresentamos a seguir, o cdigo do EJB Message-Driven Bean - UserNotifierBean. A


implementao do EJB segue logo a seguir. Aps segue a implementao da
mensagem utilizada para notificar o EJB MDB UserMessage e por fim o deployment
descriptor deste EJB.

Message-Driven Bean : UserNotifierBean.

  < '(- )           )-:

 )+? <(  !    :


 )+? <( &5      :
 )+? <( &5  )H   :

 )+? <( &5  )     :



 )+? <( &5 $ )+ <'   :
 )+? <( &5  )-     <   :
 )+? )        (   :

 >H"H &(>   4 10"H,   


 H <( H &!   B NO$ H -"H - > 
 
  H&9
  *  H ) 7% +     B< *(-$( *(   >   B<   

) 
 H6H &'2 " . 0%H&"H & % $ >) )-)H% &'() -     5,  H.H <'(
 +   ) )-   %
0"H,   
$) "H% 7)-"H, &') 

 
 H.H H&#     + )+ ) GH "H.H& &'(
 5- H.H& &'   $+   

& ( & "H.H <'(



 (

5,1)-HLH '(

 (

 (  * "H.H '  H

  "H $  +$  +>DH!(   -    

 5& :



 & " .

   + 

 >)-<(
+ EH  
+ +H,(  
  ( +  )- " .



 1    +)+EH &' ) %  


+$( >)+
     N 
 - +)H&  )
 +)+"H &'2) 5,7%  
)-7$  )-  



)$H!' )+EH &' ) 


H, 
 <!   
  ( + H6H &'  " <$ <5  
) H  H.H &'2 )lH' .

  )





  " )H'  "H%   

H

H6H &'2.
"?" H& "H.H &'2.#)lH' .  2
'   H.H, &' " ;. :
"" H, H6H &' . )H' .  ' < H " .;:
H,
"H,
 / H  H%()-   " "H  '(8H% " .;*(EH  '2      )-   " .;*
  H
     &! 
 *)-  HPH% &' .;:
 & ' ) H.H& &'2



 



  / " 5 <! -5.


EH%)  ,   $   " ? MH&> '0)+  $;$ "H& 




 5 .:


 
 ( ) )-  +  4 N + %
0"H   

  ) >
/ H% /"H +ZH,%  

  )  +)+  -H%  > &    









  )H      
> <! 4 N 



  )
 /!

 7>    N $
  

 5& )-)H% &'()

$5   - 5 "N+ H0$ ZH, '2 $   +$)-   

dH




& ( &- $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& &'(      $ & ( &5 )-    H.H, &'  >     (   

  %  $! HLH " .;.;:

)-"H.H& &'( H%    & " H&  &!.;:

 )- H.H% '( ) H.H& &'(



 


)-"H.H& &'(  H%   5, "  5& .;:


% >  +)+"H ')

  ZH,?  H> " )- H.H& &'(.?:


< / " 5 <! -.

 

 /



5    " ? %H&$$ ' )-    

.:


*








  2 5& $ 5- 
   $H& HLH '(  (  5& " H6H &'2   2 5& )+ H.H& &'(
 /( H  )-"H.H% '(  $ 2 <5
) H.H& &'    25 :



 ' 


+ $5, +

  )

)+H6H &'2






Mensagem : UserMessage.

  < '(- )           )-:

 )+? <(      :
 )+? )        (   :



DH&1'   %
0ZH,  
+   >H%   

  (-  


 )

"H,     )+ 


 )

 
 H.H



 "H.H& &'(+ )+ )-JH    B<  

H&

H,% -

& ( &

7) "H &'2)

$> "H&

H,

 EH &' )

(  +)-ZH &'() 

EH,:
H, $> 
 %
0ZH,  

& ( &  & ' ) H.H& &' :



"H% $ $ (  


  H, "H.H ' " .






"H% $1 )H! )+ B<  



  )



  )

 

)H "H,   


 ( ZH,







$>  7) "H &'2) 

)+H6H &'2 +
) "H &'2) DH&   
  0)H,    
"
H, "H.H '
H
)H%$%*  & ' )  H.H& &' .

 /( H  ZH -"H,,:


 /( H  )-"H.H% '(
)- HPH% '(:

< 
 )

+)-ZH &'()



DH& $(  -  0"H,    


DH%$ (    -0"H,    

 +)-"
 H, &')
  <!& '+'2 H6H &'  " .

<!%0)-H6H &'2:



H&   


  0)
D
 H,   
)+H6H &'2 )+"H &'2) DH&   
  0)H,    
   $H& HLH '( " < , ' )-H6H '.
 /( H  )-"H.H% '(
)- HPH% '(:



  ' % +)+"H &'2)


  )



 $ 2 <5,.





0EH,  %   ( ZH

 ( 
+)+"H &'2) 
 +"H  
  )H& 
  
+)+"H &'2) 
  H,
'( H% " .
< 
 )



<!%0"H:



  ' % 0ZH, -  EH,  2 - 7)-)H% &'() 



)H "H,   


 (
  ZH,
   $H& H& " H
 
 H,,.
"
 /( H  ZH -"H,,:
  )




$>  7) "H &'2) 




Deployment Descriptor : UserNotifierBean.

 
 

 5 )0$LH,   #  ( ' 


   -       (






 





 

  
 %H EH%)lH,*     

, H $   "H     

/$; 
    ,H   )      

 

% H% ZH







 

 



 



)+ H.H, &'24( 

    $
  H, > )- 
  > )-  H#    
     ? )-
  ;  H6H < )    %  &     )
  H#          H6H
  ZH  <      $    ! ZH  &!    
 H > )-

H#<

) H.H& &'2 ; $ 4H%  $   



"H  &   (  &5  )H   $  H!! $ &!   ( 
H&"H     ;%      
    H, H  <  4    

 )+HLH, &'(?,  ;"H     


 )+ H.H& &'(& 
 & H )H

   4 % "H,  <  

  4     )-



)-< / )-   ) <!/ ? )-

  )-
 )+ /> 

HPH)+ 4H&  


)  /

H%



  ZH
? & &   >      )H &? ,  
    !% )H% &! 

 HPH%)0 4"H % <

   

Foi criado um EJB Session Bean Stateless - ProjecSupportBean - com o intuito de


preparar o ambiente da aplicao exemplo. O cdigo do EJB, tais como suas
interfaces, implementao e deployment descriptors no foram comentadas pois
utilizado somente como um servio auxiliar para a aplicao. Segue os cdigos do EJB.

Interface Home : ProjectSupportHome.

  < '(- )           &H H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :

     2)-*> ) )-


% ;.F   
+ $   )+*"H
    )- 
$  "
 HH,?  N "H >DH? - >   N - 5)9  

   $!      ?2)-
5)H <$ <5     > )-





 

   %  <   &  " . !/>



% < $5   * )-$5= <! :

Interface Remote : ProjectSupport.

  < '(- )           &H H.H :

 )+? <( &5      :


 )+? <(  !    :

 )+? <(  %)0   :



  ?   )--0     %  & ?      


  >"H$ KH&!> NH $H,(?+ !
  N- 5 )+  




 
 

   $!       ? 5,ZH < 5        


   0> ( %)- " .8!/% H >)-< 5   :
   +   %( )-  " .8!/% H )- 5   :

Session Bean Stateless : ProjectSupportBean.

  < '(- )           H&H.H :

 )+? <(  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 > 
   +   & " .  / H ! <5   

dH



 

 )-N-  ZH > 


>7 > *>   $  $$ 
   +  )-< " .





    B< - - $     -     +$   (-"H   HPH  


   +       " .



    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 :

   
  



    + )+ 7 


-5  ZN  +    N  +5 )0  
   0> ( %)- " .




   %    "    & <'0  )-<  .;:

EH%)

!

 
   

                  
    

      

 (    2$56 5 -


     25& " .:
" &( &5  H   <  .
&( &5  H(   ! -)H
5     "  
 ; (  .;:



"H  ' <  &!  " . :

> <  - 



    &  )-aH )7


$>  
 !  < &)- "  (    
" 
" .;*    #  " .;* 




"
 *


.;*
         
!



  >  




    

H








"
.;*
"  >. ..;:

)   5   " .;:

H

)    H " .;:

    H " .;:

< / " 5 <! -5.


  

 

 /
EH%)



> 5 <   "  %  , '0$( %)- 

   %    "




     ;. :

 ( )+ + )+  +5= ZN $


      N 
 +5 )+  
"
   +   %( )-  .




EH%)

!

   %    "

  & <'0  )-<  .;:

 (    2$56 5 -

     25& " .:

5  '   HPH &'2 " .;.;:

    





" &( &5  H (  & > .


&( &5  H   &   -)H
5     "  
  ; (  .;:
> <  - 
"H  ' < 
  &!  " . :





    & )-aH )7


!






    

 


>

 


?.;:



)    H " .;:

H

(   H& " .;:

< / " 5 <! -5.

 


  

 /

> 5 <   "  %   & '   )- $ 



   %    "

EH%)




)   5   " .;:

H

  >  

$>  !  < &)- "

5  '  H.H, &' " .;.;:

     ;. :

 
 

Deployment Descriptor : ProjectSupportBean.

 5 )0$LH,   #  ( ' 


   -       (






 

 





 

  
 %H EH%)lH,*     

, H $   "H     

% H% ZH











 
 


H"H.H  



 H > )-      & ?  ( H,  )  


 > )-   !  & ?   ? )+
/>)- )      &     H"H.H,     
 &  ? )-  /)-
)-  )      &     H HPH&      & $   )+< 





 
 

  ;  H6H < )    % 


 &     HH6H,       & >?     4  H.H

H"H.H   (   & HLH
H%H6H, $  (
  ZH  <    
 %H HLH=  
 & H )H

  )-    & ?   > )-


)-< / )-    )-<!/ ? )-

 )+ /> 



 % ZH
? &!%      ! "H
? & $
    !% )H% &! 

 HPH%)0 4"H % <


    

   4 % "H,  <  

HPH)+ 4H&  


)  /

$    ! ZH  &!   

/$; 
    ,H   )      

 

Deployment Descriptor da Aplicao Exemplo : ejb-jar.xml

 
 

 5 )0$LH,   #  ( ' 


   -       (






 

 

  
 %H EH%)lH,*     



 



, H $   "H    

% H% ZH






 
 




 
 


H"H.H  

 H > )-   H >   H,  $ )-


 > )-   H !    )- 

 
 
 
 
 

/>)- )      &     H"H.H,      H !)+  /)- 


)-  )      &     H HPH&     H !  %)- 
  ;  H6H < )    %  &     HH6H,     H       ;  HPH

H"H.H   (   & HLH  %


H H6H, $  (
  ZH  <      $    ! ZH  &!   

 %H HLH= 



H"H.H  




  
  
  
 
 
 

 

 H > )-   H& H    H,  $ )-


 > )-   H,  H     )-

/>)- )      &     H"H.H,      H,  H <)+  /)-


)-  )      &     H HPH&     H,  H <  %)- 
  , H3H ,)  %,  ,  , ?     H;.HGH ,    .H  JH % % !     JHGH

H"H.H 

 (   &   &H H6H,   ( 



$    ! 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  <    
 %H HLH=  



$    ! ZH  &!   











 
 

  

 H > )-




H

 $ H,

> =)  
   ? )+
/>)- )     &          H )-  /)- 
)-  )      &         H  )- 
    /)  & )            $    H $   )-     /) 
     )               H%         
  > )-



 
 


 
 

H

  ;  H6H < )    %  &         H        H6H


$AH= H   ; (     JH H  4 (
 
 )  ?  H.H  &(   '   <'   & ) < ?  HLH 
 $    H,  $  

"H & GH& />)- > )-


 ! 



  

 H% %   ,H /)  ) 

H








 H > )-     <  (


  H& > )- 
 > )-   !      $ )- 
/>)- )      &          %  & )-  /)-

 

/$; 
    H,  )      

 








 

 


)-  )     


 &
    /)  & )      
     )         

          ($ &  )+< 


       $       <    2)-      ?/)-
        <         

  ;  H6H < )    %  &          ( &     
 4  H.H
$AH= H   ; (  2$  $   LH, H%> ; 2  
 )  ?  H.H  )                  <    
  )
 $    H,  $   

)+ LH,     5  )+ $AH=  


"H & GH& />)- > )-     <  "H & GH& />)- > )-
)+    

 


    )-   )-      )-


 )+     
)+    

    )- <  H, & <      ? )-

 )+    


)+    


    )-  %      )-


 )+    
)+    




    )-  ! &        )- 


 )+     
 )  4   > > &    % )  ;  
 ! 

 









 

 



 



)+ H.H, &'24( 

    $ H, > )- 


       ? )-
  ;  H6H < )    % 
 &     )
  H#        
   H6H
  ZH  <  
     $    ! ZH  &!    
 H > )-
  > )-

H#<

H#

) H.H& &'2 ; $ 4H%  $   



"H  &   (  &5  


) H   $  H!! $ &!   ( 
H&"H     ;%      
    H, H  <  4    

 )+HLH, &'(?,  ;"H     


 )+  H.H& &'(
 & 
 & H )H 

HPH)+ 4H&  

   4 % "H,  <  

 

)  /


  )-    H $    


  )-
)-< / )-    )-<!/ ? )-
 )+ /> 



  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  
   4 % "H,  <  

)  /





  )-    H=  H <    )- 


)-< / )-    )-< !/ ? )-
 )+ /> 




  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  

  H6H


   4 % "H,  <  

)  /

  
 > )- 
) < / )-    )-<!/ ? )-
-

  )-
 )+ /> 

H



  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  
   4 % "H,  <  

)  /


  )-  $> &    )- 


)-< / )-    )-<!/ ? )-
 )+ /> 



  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  
   4 % "H,  <  

)  /

  4    


  )-
) < / )-    )-<!/ ? )-
-

  )-
 )+ /> 

H%



  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  
   4 % "H,  <  

)  /

  )-    & ?   > )-


)-< / )-    )-<!/ ? )-
 )+ /> 



  Z
 H
? & &   >      )H &? ,  
    !% )H% &!  

 HPH%)0 4"H % <


    

Deployment Descriptor especfico para o JBoss : jboss.xml


 

 5 )0$LH,   #  ( '   


    $H6H     > "H.H  




"H.H





>



   

% H% ZH

 
 

H"H.H  

 > )-   H !   


  )- 
 $ )-    H !  $(
  ;> )-

 %H HLH= 




H"H.H  




 > )-   H,  H    


  )-
 $ )-    H,  H   $(
  ;> )-

 %H HLH= 




H"H.H  

 > )-   !  
 & ?   ? )+

 $ )-   
 &    
  $ )-




 %H HLH= 
  

/;


 

 H.H  ?'        HLH


 



  
 ? )+
)-  ( ; )-
    (  )   H      $ )-

 > )-

 $ )-

 ! 

H

H









  

  > )-   !       $ )- 


 $ )-     )    $ )- 
    (  )     &        )-

 ! 

)+ H.H, &'2 4( 

H#       
 ? )-
H!! $ &!    )  %    H!    H%   <    ? )-

  > )-

 )+ H.H& &'(& 

 & H )H

  "H.H

Deployment Descriptor especfico para o JBoss : jbosscmp-jdbc.xml


 




 5 )0$LH,   #  ( '    


    $H6H )0 (      >  H.H  






( 

 



"H.H& )+ 


;  GH



 




&(
   > 



  

   H 


  & H )-  '
>JH

  H )-  ' 


 &     %!%   &4   
)-<(4   %  )+<$   

% H% ZH



  

 > )-   !      


 $ )- 
   )- 
    > )-

 

)+    

    )-   )-      )-


 )+$ )-      )+;> )-
 )+    

)+    

    )- <  H, & <      ? )-
  )+; )-
 )+$ )-  
  

 

 )+    

)+    


    )-  %      )- 


 )+$ )-       >)+; )-



 )+    


)+    


    )-  ! &       )-


 )+$ )-    )+; )-

 )+    
 ! 

  H 

 > ; > H



 & H )H




/$; 




 H6H  ?'         H6H )9

  "H.H& )+ 






     

 3 

 

 

 

GNU Free Documentation License

@ ACB-"D, E-GF EH3 =-I"!#$!#/!%7"$& "!##!(-0')J#$&J !I! !*$L K ,M+, .-# -08N$P/#O #Q1"2,3!H)4-5'#'"+6') R67#'J#89#!#3 S : T */U8%Q $<;"8#=?>
*V6W1`-X*" *:8"M`-YEH:*="MY-*8*-M6-[ZD9" "#=#- 7D*9[-*"8" GI$<=" #^"7"\G3*= 8""9Y389#::H8"M]Y Ha^#7" H-MYW8" "-][_^"3*3 :E#E"UDG 2-#=U 9bH> U-,M

Version 1.2, November 2002

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
document and put the following copyright and license notices just after the title page:

FU -&D#:M M  " *8`4:=]MC 43V Q8U#-"9[:" GT="U Q*O?V $> 9::M6.*^#7U#-03#8"9 # PD* #9#*16\":M 9# ="7DH-8"
2(7  8"L9#3-]08 [8" GEHU-Y3";"#8 W --3 &WD:U3-M`8" M 1 /" -80=""# -# 7#
#^U*E*8*Ta#MMH$L+("- 8Z -#9[- ^+([ ".  #8"=#7UD*- R4 #-* 8"+W".-#-3#-0: B/#  -8 *1U, 2,HMN3="$ -#Z-3*8*8"M9a-I+_ $ 7#8", [8U9#-3 K :3#M = UU  (88[R4 " 'W >- 
B  -
**TGMI+,> .-#Q- #=U  *=#7D -108U##3#"#-\U E 8 *=" -**8*=U-M-\8HM#- M0 > *8#=E:7U9#-"9a 80"-\M-=U:U 8C-8: HEH-"9

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the
"with...Texts." line with this:

2(+, .# #08"R4 U-a W ;#-]8 W B3-&* ,3*8"MY0^/#-:-*H="8":U ";"8H/MYB ^$ -:3*H8"8"9 2(" ;"/B0 B*U-\V ;K  3*B= ;(B R4 " V W/I-$  2]B-0:#M "-^U-: 8"";"/ B >

If you have Invariant Sections without Cover Texts, or some other combination of the
three, merge those two alternatives to suit the situation.
If your document contains nontrivial examples of program code, we recommend releasing
these examples in parallel under your choice of free software license, such as the GNU
General Public License, to permit their use in free software.

Você também pode gostar