267
Jsp, Servlets e J2EE CPqD Telecom & IT Solutions. Departamento de Ciências da Computação Instituto de Ciências Matemáticas e de Computação. Universidade de São Paulo CPqD Telecom & IT Solutions. Telecom & IT Solutions. Copyright (c) - 2004 – André Temple, Rodrigo Fernandes de Mello, Danival Taffarel Calegari and Maurício Schiezaro

Jsp servlets j2_ee

Embed Size (px)

Citation preview

Page 1: Jsp servlets j2_ee

Jsp, Servlets e J2EE

����������� �������CPqD Telecom & IT Solutions.

�������������������������� � !� �#"$�%�&���

Departamento de Ciências da ComputaçãoInstituto de Ciências Matemáticas e de Computação.

Universidade de São Paulo

'(�����*)��������+,+-�.�����0/(���1���������

CPqD Telecom & IT Solutions.

"2�.3���4657�*�8�5�9��*��:����;�

Telecom & IT Solutions.

Copyright (c) - 2004 – André Temple, Rodrigo Fernandes de Mello, Danival TaffarelCalegari and Maurício Schiezaro

<�=?>A@-BDC,C,B,EGFHBDCJI?>LKMF�N-=PO!NPERQPEMS�T�UVODBDCWN?>XBGY-Z�N-=[K-FPO,\-E?>]@GE-O-BG^WT_NM`PBDCaO-EMQPZb@c=MFPNZ,FPO-=d>eNM`�=�N,=?>A@DCHEM^fNM`P=JgDhGikjl>m=-=!nPEMQ-Z�@G=GFPNPK-NDBbEMFpo,BcQP=-FGC�=7Urqs=?>tC,B�EMF!u?vxwE�>yKMFbT!zcKPN-=?>V{D=?>tC,BbEMF[S-Z-Y�zGB-Cc`P=,O!YbT!NM`�=|jM>X=-=[}-EM^�N�~sK?>m=|j;EMZ-F�O-K,NDB�EMF��~lB,NM`[FPER�PF�{DK�>tB�KMFPNp}P=MQPN-B,E-FGC�UyF�E|jl>XE-FPN��L�-E�{D=?>��s=P�GNsC�U�KGFPOkFPE!�,K-QD�l�L�PE,{D=�>�D=P�MNGC7v ��Q�EMSbTpEM^[N-`P=_z,BGQP=GFGC�=_B-C[BGF-QbzDZ�O-=POkB,F[NM`P=_Cb=MQ�NDB�EMFJ=MF�NDB,Nczc=PO�Ag-hGiRjs>X=-=[n-EGQ-Zb@,=MF�N-K-N-B�EMFpo,BGQ�=MFcCb=���v

Page 2: Jsp servlets j2_ee

����� �����

Parte I......................................................................................................................................................7Desenvolvendo Interfaces e Controles de Interação com o Usuário..........................................7Capítulo 1...............................................................................................................................................8Introdução.............................................................................................................................................81.1 Colocar Nome do tópico?...........................................................................................................81.1 Comparando Servlets com CGIs.................................................................................................91.2 O que são Servlets?.....................................................................................................................101.3 O que são páginas JSP?.............................................................................................................11Capítulo 2............................................................................................................................................12Instalação e Configuração...............................................................................................................122.1 Colocar Nome do tópico?.........................................................................................................122.1 Instalação e configuração no Apache Tomcat.....................................................................122.2 Instalação e Configuração de uma Aplicação Web............................................................13Capítulo 3............................................................................................................................................22Servlets – características básicas......................................................................................................223.1 Colocar Nome do tópico?.........................................................................................................223.2 O protocolo HTTP..........................................................................................................................223.3 Hierarquia de um Servlet.............................................................................................................243.4 Ciclo de vida de um Servlet.......................................................................................................243.5 Inicialização ..................................................................................................................................253.6 A classe “ServletContext” ..........................................................................................................293.7 Finalização ....................................................................................................................................333.8 Atendimento de Requisições ....................................................................................................343.9 Concorrência no atendimento de requisições.......................................................................353.10 Retornando informações sobre o Servlet ..............................................................................37Capítulo 4............................................................................................................................................39Servlets – Geração da saída.............................................................................................................394.1 Geração de saída HTML simples ..............................................................................................394.2 Headers da resposta HTTP...........................................................................................................414.2 Geração de outros tipos de saídas...........................................................................................444.3 Gerando conteúdo XML.............................................................................................................464.4 Status HTTP.....................................................................................................................................474.5 Código de Status de erro............................................................................................................524.6 “Buffering” da resposta...............................................................................................................52Capítulo 5............................................................................................................................................55Servlets – Captura de parâmetros da requisição..........................................................................555.1 Informações sobre o servidor ....................................................................................................555.2 Informações sobre a requisição\: ............................................................................................565.3 Formulários HTML e parâmetros da requisição\: ...................................................................605.4 Captura de parâmetros da requisição\: ................................................................................615.5 Headers da requisição HTTP.......................................................................................................635.6 Upload de arquivos......................................................................................................................655.7 Atributos da requisição................................................................................................................66

Page 3: Jsp servlets j2_ee

Capítulo 6............................................................................................................................................67Servlets – Cookies e Sessões..............................................................................................................676.1 Colocar Nome do tópico?.........................................................................................................676.1 Campos escondidos de formulários HTML...............................................................................676.2 Informações adicionais de caminho.........................................................................................696.3 Cookies...........................................................................................................................................706.4 Gerenciamento de sessões........................................................................................................73Capítulo 7............................................................................................................................................84Páginas JSP..........................................................................................................................................847.1 Formatação do conteúdo da resposta com Servlets............................................................847.2 Formatação do conteúdo da resposta com páginas JSP....................................................867.3 Funcionamento interno...............................................................................................................877.4 Ciclo de vida.................................................................................................................................897.5 Elementos dinâmicos...................................................................................................................897.6 Diretivas..........................................................................................................................................897.7 Expressões......................................................................................................................................917.8 Scriptlets.........................................................................................................................................927.9 Objetos implícitos.........................................................................................................................937.10 Declarações................................................................................................................................957.11 Comentários................................................................................................................................967.12 JavaBeans...................................................................................................................................967.13 Bibliotecas de Tags (Tag Libraries)...........................................................................................99Capítulo 8..........................................................................................................................................104Modelo MVC.....................................................................................................................................1048.1 Colocar Nome do tópico?.......................................................................................................1048.1 Arquitetura básica......................................................................................................................1048.2 Forward de requisições..............................................................................................................1058.3 Atributos de requisições............................................................................................................1068.4 Juntando as partes....................................................................................................................107Capítulo 9..........................................................................................................................................111Tópicos adicionais ...........................................................................................................................1119.1 Arquivos WAR..............................................................................................................................1119.2 Autenticação HTTP.....................................................................................................................1119.3 Pools de conexões a base de dados.....................................................................................114Parte II.................................................................................................................................................121Desenvolvimento de Aplicações Distribuídas Utilizando EJB.....................................................121Capítulo 10........................................................................................................................................122Novas Técnicas de Desenvolvimento...........................................................................................12210.1 Desenvolvimento de Clássico de Aplicações.....................................................................12210.2 Sistemas Distribuídos.................................................................................................................12410.3 Primeiros Ensaios de Arquiteturas para Sistemas Distribuídos no Mercado.....................13010.4 Mercado Atual para Sistemas Distribuídos...........................................................................132Capítulo 11........................................................................................................................................134J2EE e Enterprise JavaBeans...........................................................................................................13411.1 O que é J2EE?..........................................................................................................................13411.2 Visão da plataforma................................................................................................................13411.3 Instalando o J2SDKEE..............................................................................................................13611.4 O que são Enterprise JavaBeans?.........................................................................................13611.5 Para que servem e por que utilizá-los?.................................................................................13711.6 Componentes EJB....................................................................................................................138

Page 4: Jsp servlets j2_ee

11.7 Classes e interfaces..................................................................................................................13811.8 Acesso local e/ou remoto......................................................................................................13811.9 EJBObject e EJBHome.............................................................................................................14011.10 Como construir, executar e acessar os componentes....................................................141Capítulo 12........................................................................................................................................143Session Beans.....................................................................................................................................14312.1 O que são Session Beans?......................................................................................................14312.2 Quando usar um Session Bean?............................................................................................14612.3 Session Bean Stateless..............................................................................................................14612.4 Ciclo de vida - Session Bean Stateless..................................................................................147Session Bean Stateful........................................................................................................................148Ciclo de vida - Session Bean Stateful............................................................................................150Capítulo 13........................................................................................................................................151Entity Beans........................................................................................................................................15113.1 O que são Entity Beans?.........................................................................................................15113.2 Quando usar um Entity Bean?...............................................................................................15213.3 Entity Bean Bean-Managed-Persistence..............................................................................15213.4 Ciclo de vida – Entity Bean BMP............................................................................................15413.5 Entity Bean Container-Managed-Persistence......................................................................15513.6 Ciclo de vida – Entity Bean CMP...........................................................................................15813.7 Relacionamento EJB Entity Bean CMP.................................................................................15813.8 EJB-QL........................................................................................................................................162Capítulo 14........................................................................................................................................165Message-Driven Beans.....................................................................................................................16514.1 O que são Message-Driven Beans?......................................................................................16514.2 Quando usar um Message-Driven Bean?............................................................................16614.3 Ciclo de vida - Message-Driven Bean..................................................................................16714.4 O que é e para que serve o JMS?........................................................................................167Capítulo 15........................................................................................................................................173Transações e Segurança.................................................................................................................17315.1 Transações.................................................................................................................................173Segurança.........................................................................................................................................179Capítulo 16........................................................................................................................................190Descobrindo Enterprise JavaBeans ..............................................................................................19016.1 Qual servidor J2EE utilizar?......................................................................................................19016.2 Instalando, configurando e executando um Servidor J2EE..............................................19016.3 Criando um Session Bean Stateless.......................................................................................19116.4 Criando um Session Bean Stateful.........................................................................................19316. 5 Criando um Entity Bean BMP................................................................................................19716.6 Criando um Entity Bean CMP.................................................................................................20316.7 Criando um Message-Driven Bean.......................................................................................20616.8 Empacotando a aplicação...................................................................................................20716.9 Instalando a aplicação no servidor J2EE.............................................................................211Apêndice A.......................................................................................................................................212Deployment Descriptor....................................................................................................................212A.1 O que é um deployment descriptor?....................................................................................212A.2 Elementos do deployment descriptor ejb-jar.xml.................................................................212Apêndice B........................................................................................................................................221API Enterprise JavaBeans................................................................................................................221B.1 Interfaces.....................................................................................................................................221

Page 5: Jsp servlets j2_ee

B.2 Exceções.....................................................................................................................................225Apêndice C.......................................................................................................................................228Aplicação J2EE – Exemplo..............................................................................................................228Apêndice C.......................................................................................................................................260

Page 6: Jsp servlets j2_ee

� ����� ��� �

Este livro é dividido em duas partes. A primeira parte trata do desenvolvimento deaplicações Web utilizando, principalmente, Servlets. A segunda parte aborda oparadigma de desenvolvimento de aplicações distribuídas utilizando a tecnologiaEnterprise Java Beans.

A primeira parte do livro aborda de forma consistente e didática o conteúdorelacionado a Servlets. Nesta abordagem é definido um histórico do desenvolvimentode aplicações Web, passando por CGIs e linguagens de script. Além dos tópicosrelacionados a Servlets são abordados tópicos relacionados tais como Java ServerPages (JSP), Java Beans, Taglibs, modelo MVC, instalação de configuração de um WebContainer para desenvolvimento, além de tópicos avançados tais como controle depooling de conexões com banco de dados.

A segunda parte do livro aborda o paradigma de desenvolvimento de aplicaçõesdistribuídas, destacando a evolução das técnicas de desenvolvimento desde aprogramação estrutura até o atual uso de sistemas distribuídos. A tecnologia utilizadapara prover distribuição é a plataforma J2EE (Java 2 Enterprise Edition). São detalhadosos componentes e possibilidades que esta plataforma oferecem ao desenvolvedor.

O livro foi dividido em partes para oferecer um conteúdo mais abrangente e completar.A primeira parte trata da construção de interfaces e controles para interação com osclientes de uma aplicação Web. A segunda parte aprofunda nos aspectos dedistribuição de um sistema, permitindo que este execute em diversos computadores,dividindo sua carga e, conseqüentemente, aumentando seu desempenho.

O intituito de todo o livro é ser prático nos temas que apresenta. Todos os capítulosapresentam exemplos que simplificam o processo de entendimento dos temas.

Page 7: Jsp servlets j2_ee

���������

��� �������������������������� ��!#"%$�&'�� (�*)+�,�-�.!/���0�� 1���2�3���4��!#$�5�67��&8�:9 �;< >=�?�!#@��

Page 8: Jsp servlets j2_ee

� ����� ����� �

�� �� � �� �����

Introduzimos, nesse capítulo, a tecnologia de Servlets e Páginas JSP e mostramosalgumas características que tornam essas tecnologias bastante atraentes para odesenvolvimento de aplicações na Web.

��������� �"!"#%$'&(*),+.-$0/1)'2Se um dia a Internet era composta, principalmente, de páginas estáticas comconteúdo institucional, hoje ela oferece uma infinidade de aplicações com conteúdodinâmico e personalizado.

Diversas tecnologias possibilitaram essa revolução: seja para construir um simples sitecom conteúdo dinâmico ou para construir um complexo sistema de Business-To-Business, é necessária a utilização de ferramentas que possibilitem consultas a bancosde dados, integração com sistemas corporativos, entre outras inúmeras funcionalidades.

Dentre as diversas tecnologias disponíveis atualmente para o desenvolvimento dessaclasse de aplicações, destaca-se a de Servlets e a de páginas JSP (Java Server Pages).

A utilização de Servlets e de páginas JSP oferece diversas vantagens em relação ao usode outras tecnologias (como PHP, ASP e CGI). As principais vantagens são herdadas daprópria linguagem Java:

�3 Portabilidade: a aplicação desenvolvida pode ser implantada em diversasplataformas, como por exemplo Windows, Unix e Macintosh, sem que seja necessáriomodificar ou mesmo reconstruir a aplicação.

�3 Facilidade de programação: a programação é orientada a objetos, simplificando odesenvolvimento de sistemas complexos. Além disso, a linguagem oferece algumasfacilidades, como por exemplo o gerenciamento automático de memória (estruturasalocadas são automaticamente liberadas, sem que o desenvolvedor precise sepreocupar em gerenciar esse processo).

�3 Flexibilidade: o Java já se encontra bastante difundido, contando com uma enormecomunidade de desenvolvedores, ampla documentação e diversas bibliotecas ecódigos prontos, dos quais o desenvolvedor pode usufruir.

Além dessas vantagens, a arquitetura de Servlets e páginas JSP possibilita algunsbenefícios adicionais:

�3 Escalabilidade: na maior parte dos servidores de aplicações modernos, é possíveldistribuir a carga de processamento de aplicações desenvolvidas em diversos

Page 9: Jsp servlets j2_ee

servidores, sendo que servidores podem ser adicionados ou removidos de maneira aacompanhar o aumento ou decréscimo dessa carga de processamento.

�Figura 1.1 � Exemplo de arquitetura distribu ída com Servlets e Páginas JSP.í

�3 Eficiência: os Servlets carregados por um servidor persistem em sua memória até queele seja finalizado. Assim, ao contrário de outras tecnologias, não são iniciados novosprocessos para atender cada requisição recebida; por outro lado, uma mesmaestrutura alocada em memória pode ser utilizada no atendimento das diversasrequisições que chegam a esse mesmo Servlet.

�3 Recompilação automática: páginas JSP modificadas podem ser automaticamenterecompiladas, de maneira que passem a incorporar imediatamente as alteraçõessem que seja necessário interromper o funcionamento da aplicação como um todo.

����������� �*$�� $*-�� � )���� � )�� + #���������� +O CGI, ou Common Gateway Interface, surgiu como uma das primeiras tecnologiasdisponíveis para a geração de conteúdo dinâmico em servidores Web: odesenvolvedor implementa uma aplicação que deve ser executada a cada requisiçãorecebida, sendo que o servidor Web passa para essa aplicação, através de variáveisde ambiente e entrada padrão, os parâmetros recebidos, e retorna a saída daaplicação como resposta da requisição.

�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 utilização de Servlets: aoinvés de iniciar um novo processo a cada requisição recebida, um Servlet ficacarregado em memória e atende as requisições recebidas através de novos “threads”.

Page 10: Jsp servlets j2_ee

Além disso, um Servlet pode tirar proveito dessa persistência para manter também emmemória recursos que demandem grande processamento para serem inicializados. Umexemplo típico, para esse caso, é a manutenção de conexões com banco de dados:ao invés de inicializar uma nova conexão com o banco de dados a cada requisiçãorecebida, um Servlet pode inicializar diversas conexões ao ser carregado, esimplesmente alocar uma conexão desse pool a cada requisição recebida (e retornara conexão ao pool após o atendimento da requisição).

Além destes ganhos de performance, a utilização de um Servlet possibilita uma maneiramais padronizada e portável de se distribuir / implantar sua aplicação. Conformeexplicado mais adiante no íçãçãCapí tulo 2 – Instalaç ã o e Configuraç ã o, o ambiente ondesua aplicação será implantada não precisa ser igual ao ambiente onde foi feito odesenvolvimento: seus Servlets podem ser “instalados” em qualquer ambiente ondehaja um Servidor de Aplicações que implemente a especificação de Servlets.

Por fim, estaremos apresentando ao longo deste livro as diversas características efuncionalidades da tecnologia de Servlets que tornam o seu desenvolvimento muitomais simples, e o resultado, muito mais eficiente e robusto.

�����������,) +� � �')�� � �")� +

Servlets são classes Java, desenvolvidas de acordo com uma estrutura bem definida, eque, quando instaladas junto a um Servidor que implemente um Servlet Container (umservidor que permita a execução de Servlets, muitas vezes chamado de Servidor deAplicações Java), podem tratar requisições recebidas de clientes.

Um cenário típico de funcionamento de uma aplicação desenvolvida com Servlets é oseguinte:

�Figura 1.3 � Exemplo de funcionamento de uma aplica ção com Servlets.ç ã

Ao receber uma requisição, um Servlet pode capturar parâmetros desta requisição,efetuar qualquer processamento inerente a uma classe Java, e devolver uma páginaHTML por exemplo.

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

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#��8�%�$9��: �; <=� 9��:>@?BA�C:D��!����#�9�E�#��F#�G���H I-.- E��JD!' � #!9%�8#73�5�#J#�".�8;LK8�,M�#�9�E��J����D�#�"2"$� !5ON�' � D:D�' ��".":P�#����Q�8#�H I / #!���@' #��#��Q�8#�9�E�"�>6�8�& / #%�&�(' #���R

Page 11: Jsp servlets j2_ee

�5�N�' � D��O�!� E�E6���B#Q���>(�8�& / #!�)��' #��&P�#�3�56#�"F� �� �.#�3�5�#�"$����>6���& / #�����' #Q�&P6#�" ��!9�"$# �� �$#�"Q ��!9�" #��&*O�F�� "0H � ����DQ#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9����"� " #!5 #%9%E!#��F#�G�� H I$#&%' ! )( ���F#�3�5�#�"$�&� <�#��&P�#��J�Q�8#�*E�E%����� (+� %' , !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

00

���,1������,) +� � �3254*! -$,+76 �38

As páginas JSP, ou Java Server Pages, foram criadas para contornar algumas daslimitações no desenvolvimento com Servlets: se em um Servlet a formatação da páginaHTML resultante do processamento de uma requisição se mistura com a lógica daaplicação em si, dificultando a alteração dessa formatação, em uma página JSP essaformatação se encontra separada da programação, podendo ser modificada semafetar o restante da aplicação.

Assim, um JSP consiste de uma página HTML com alguns elementos especiais, queconferem o caráter dinâmico da página. Esses elementos podem tanto realizar umprocessamento por si, como podem recuperar o resultado do processamento realizadoem um Servlet, por exemplo, e apresentar esse conteúdo dinâmico junto a página JSP.

Existe também um recurso adicional bastante interessante na utilização de páginas JSP:a recompilação automática, que permite que alterações feitas no código da páginasejam automaticamente visíveis em sua apresentação. Assim, não é necessáriointerromper o funcionamento da aplicação para incorporar uma modificação delayout, por exemplo.

Exemplo de Página JSP��9 ::I�;Q<(� 9��3; / I / � �� �' #�" 3�5�#J� �� ��.� �J#:#!96E�#!�$#�G���H IJE�� �J;Q3�5�� 9���3�5�#J#�"$�&;�K8��M�#�9�E��:����D�#�"." �7�J#�".�8�� �; <(� 9���:<���>�?BA�C��

������������ "2#�5�#�9�E�#��F#�G���H I=#>���@? �:�$#�3�56#�"$�&� <�#��&P�#��J�Q�8#�*E�E%������?���

� - ��� ���.�� - >(? A0C��

Page 12: Jsp servlets j2_ee

� ����� ����� �

�� �� ������� � � � � � � � � � ����

Nesse capítulo são apresentados os tópicos referentes a instalação e configuração deum ambiente básico para a implantação e execução de aplicações Web com Servletse páginas JSP.

�'� � 8 ���� � ) ���,! + ! � � +��O primeiro passo para desenvolver aplicações Web com Servlets e páginas JSP é aconfiguração de um ambiente básico para a implantação e execução dessasaplicações. Esse ambiente básico pressupõe a instalação de dois componentesprincipais: o Java 2 Standard Development Kit (J2SDK), utilizado para compilaraplicações Java, e um Servlet Container, que irá executar os Servlets desenvolvidos.

Alguns sistemas operacionais já possuem um J2SDK instalado por “default”. Caso esseainda não se encontre instalado, pode-se obtê-lo no site oficial do Java ( ��������� ��������� �"! #�$&%�! ')("* ).Neste site é possível selecionar entre as versões de J2SDK para as diversas plataformasde mercado tais como Windows, Linux, Solaris e outros.

O outro componente necessário para o desenvolvimento de Servlets e JSP é umservidor que implemente um Servlet Container. Esse servidor será responsável por proverum framework básico para as diversas aplicações desenvolvidas, inicializando-as,distribuindo as requisições entre elas e tratando os resultados do processamento decada aplicação.

Apesar de existirem diversos servidores disponíveis no mercado, para efeito dosexemplos apresentados neste livro, utilizaremos o Apache Tomcat, disponível no site��������� �������&+,�"- ���&! �&�.��' ��/"! ("-�0 . Esse servidor de aplicações atende às especificações mencionadasanteriormente e pode ser utilizado sem nenhum custo para o desenvolvedor.

Um último componente normalmente utilizado para o desenvolvimento de Servlets epáginas JSP é um ambiente gráfico de desenvolvimento (IDE). Porém, a escolha econfiguração de um ambiente desse tipo foge do escopo deste livro, sendo deixadopara o leitor a tarefa de escolher a ferramenta que melhor atenda às suasnecessidades.

�'� � �"- + � $*�"$'& � ��) #�� -21 !!44��� $ & � � -��� � $,#43)65 ���.#$ �No site do Apache Tomcat são disponibilizadas versões do software com instaladorespara os diversos sistemas operacionais.

Page 13: Jsp servlets j2_ee

Normalmente esse processo de instalação é simples, e, uma vez finalizado, tem-se umservidor de aplicações pronto para produção. De qualquer forma, o site disponibilizatoda a documentação necessária para resolver problemas encontrados e esclarecerdúvidas com relação ao processo de instalação e configuração do servidor.

Para entender um pouco mais a fundo o funcionamento do Tomcat, deve-se examinaros diretórios criados durante o processo de instalação. Os principais diretórios criadossão:

Diretório Descrição

bin Executáveis, incluindo os aplicativos para iniciar e para encerrar a execução do servidor

conf Arquivos de configuração do Tomcat. O arquivo “server.xml”, em particular, define uma

série de parâmetros para a execução do servidor, como por exemplo, a porta onde o

servidor irá receber requisições (essa porta é, por default, 8080), devendo ser examinado

com cuidado e modif icado conforme as necessidades.

logs Arquivos de log do servidor. Além de gerar arquivos de log contendo entradas para cada

requisição recebida, como qualquer servidor Web, o Tomcat também pode gerar arquivos

de log com tudo o que as aplicações desenvolvidas enviam para as saídas padrão do

sistema: tipicamente, o que é impresso através do “System.out ” é acrescido no arquivo

“stdout.log”, e tudo o que é impresso através do “System.err ” é acrescido no arquivo

“stderr.log”.

work Diretório temporário do Tomcat. Esse diretório é utilizado, por exemplo, para realizar a

recompilação automática de páginas JSP (esse processo é explicado mais adiante no

capítulo “Páginas JSP”).

webapps Nesse diretório são instaladas as diversas aplicações web desenvolvidas por você ou por

terceiros.

�Figura 2.1 � Subdiret órios na instalação do Apache Tomcat.ó

�'�&� � -+ � $ �"$,&�� � ) ��� - 1 !!4���� $ & � � ,) ���.$0��� �"!"# $ & � � /�)'2Conforme vimos anteriormente, existe um diretório no Apache Tomcat chamado“webapps” onde devem ser instaladas as diversas aplicações desenvolvidas por vocêou por terceiros.

Para que possamos mostrar como são feitas essas instalações, precisamos antes definiro que é uma aplicação Web: a partir de agora, estaremos chamando de umaaplicação Web um conjunto de Servlets, páginas JSP, classes Java, bibliotecas, ícones,páginas HTML e outros elementos, que podem ser empacotados juntos e que provêemas funcionalidades previstas pela aplicação.

Page 14: Jsp servlets j2_ee

Essa definição está contida, na verdade, na própria especificação de Servlets Java,não sendo específica, portanto, à utilização do Servidor de Aplicações ApacheTomcat. Isso significa que as aplicações desenvolvidas por você podem ser instaladasem qualquer servidor que implemente a especificação de Servlets (como o IBM®Websphere® e o Bea Weblogic®): com isso, segue-se o princípio da linguagem Java dedesenvolver o código uma só vez e implantá-lo em múltiplas plataformas.

Aplicação Web: Aplicação composta de Servlets + Páginas JSP + Bibliotecas e classes Java +imagens + páginas HTML e outros componentes estáticos que podem ser empacotados juntos einstalados em qualquer Servlet Container.

De acordo com a especificação de Servlets, existem duas maneiras pelas quais umaaplicação web pode ser instalada junto a um Servlet Container: por meio de umarquivo WAR (Web Application Archive), explicado mais adiante no íCapí tulo 9, ou pormeio de uma estrutura de diretórios criada junto ao servidor. No caso específico doTomcat, essa estrutura deve ser criada abaixo do diretório “webapps”.

Para uma determinada aplicação Web, a estrutura de diretórios mínima que deve sercriada abaixo do diretório “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 diretório � / � �&����# ,um diretório com o nome da aplicação. Esse diretório deve conter pelo menos umsubdiretório ������� � � ; podem haver além do subdiretório �������� ��� , por outro lado, outrossubdiretórios e arquivos, como páginas html, páginas JSP etc.

O diretório �������� � � , por sua vez, deve conter um arquivo chamado “web.xml” e doissubdiretórios: “classes”, com todas as classes, e “lib”, com as bibliotecas utilizadas.Obviamente, abaixo do diretório “classes” podem haver subdiretórios para refletir o“path” relacionado aos “packages” Java (mais informações sobre packages podemser obtidas em qualquer livro introdutório sobre a linguagem Java).

Utilizando como exemplo uma aplicação chamada ��/"* (���/� � , contendo o Servlet“RemoteIPServlet” do exemplo do capítulo 1 desse livro, uma estrutura possível abaixodo diretório webapps seria a seguinte:

Page 15: Jsp servlets j2_ee

� ��Figura 2.3 � Exemplo de estrutura para aplica ção �RemoteIP �.ç ã

Obviamente, podem haver diversas aplicações instaladas, gerando diversas árvores dediretórios abaixo do diretório “webapps”:

�Figura 2.4 � Exemplo de algumas aplica ções instaladas abaixo do diretórioç õwebapps.

Cada uma dessas aplicações é carregada pelo Servidor em um “Servlet Context”(Contexto do Servlet). Cada contexto dá à sua aplicação uma URL base, chamada de“Context Path” (Path do Contexto), e provê um ambiente comum para todos osServlets da aplicação.

Page 16: Jsp servlets j2_ee

O path do contexto serve para que o Servidor possa mapear e distribuir as requisiçõesrecebidas para as diversas aplicações instaladas. No Apache Tomcat, o path docontexto coincide com o nome do subdiretório criado abaixo do “webapps”.

Assim, no nosso exemplo, supondo que o endereço IP do servidor onde instalamos oApache Tomcat é � ��� ! � ��� ! � ! � , teremos os acessos às URLs iniciadas por

*��8�& � -F-��� � ���� � � � � � � � � - P%#!�J�Q�8#�H I

direcionadas para a aplicação �&/&* (�� / � , os acessos às URLs iniciadas por*��8�& � -F-��� � ���� � � � � � � � � -�� �QE���"F�&�$� � ' � #�9��8#�"

direcionadas para a aplicação � ��� � # � - (���� � /�%&� /&# , e assim por diante.

�Figura 2.5 � Exemplo de mapeamento de requisi ções para aplicações instaladasç õno Tomcat.

Por fim, conforme o leitor pode ter reparado nos exemplos citados anteriormente, paracada aplicação há um “Deployment Descriptor”: trata-se de um arquivo, chamado“web.xml” e localizado abaixo do diretório ������� � � , e que contém informações deconfiguração da aplicação, tais como, parâmetros de inicialização, mapeamentos deServlets, entre outros.

Deployment Descriptor: Arquivo XML com as informações de configuração de uma Aplicação Web.Esse arquivo fica abaixo do diretório “WEB-INF” e se chama “web.xml”.

Um possível Deployment Descriptor para a aplicação “RemoteIP”, por exemplo, seria oseguinte:

Exemplo de Deployment Descriptor ���Q��� '!�%#��$"2� �!9���� � ��� #!96D���E�� 9�< ����H / ��� ������� � � �����9 � � � ? �(I��$ #�N!���� � �I" �!C6H � �#� -$-2/ 5�9 A�� D!�)�!"�$�"F�&#��J" ��H 9�D�� -.- �(?-� � #!N$*� � �' � DQ���&� ��9 � % -F- ��& �8*%�+�& !� -F- � �Q����� "25�9�� D��!� - E��8E - #�N!��! � �� �'% � E��8E� !��@ #!N(� �! � ���QE�� "Q �' ��$)��9����J#���P�#��:���8#!H I�� - E�� "2 �' �*$+�896�Q��#�

� " #����(' #�����Q".#����@' #��,�F9��!�J#��QP�#!�J���&#!H I�� - ".#!�)��' #Q�,�F9����J#���Q".#����@' #��,��D!' ��"."��QP�#��J�Q�8#�H I / #��F��' #���� - "2#��F��' #Q�,��D!' ��"."��

Page 17: Jsp servlets j2_ee

� - " #����(' #�����Q".#����@' #��,�F�J�! � �� 9�<���Q".#����@' #��,�F9��!�J#��QP�#!�J���&#!H I�� - ".#!�)��' #Q�,�F9����J#���Q5��$' �� �� �8�8#��.9�� - P�#!� �Q�8#�H I�� - 5��.' �8 ����+�&#��.9 �

� - " #����(' #��,�F�J�� � �� 9�<��� - #!N��+�! � ��

Como o Deployment Descriptor é composto de muitas seções, procuraremosapresentar as principais e suas respectivas funções, usando como exemplo a aplicação� � �"��# ��-�(��+� � /�%&� /�# mencionada anteriormente. Uma apresentação mais detalhada eaprofundada desse arquivo pode ser encontrada na própria especificação de Servlets.

Pressupomos, para essa apresentação um conhecimento mínimo de XML; caso vocênão tenha familiaridade com esse tipo de documento, sugerimos que você tenteacompanhar os exemplos, e os utilize como templates para criar seus própriosDeployment Descritor’s.

Estrutura geral do Deployment Descriptor���Q��� '!�%#��$"2� �!9��� � ���B#�9�D���E�� 9�<��� FH / � � ������� � � ��

��9 � � � ? �(I��$ #�N!���� � I" ��C�H � �,� -.- / 5�9 A0� D!�F��"#$�"$�8#��J" ��H 9�D!� -.- �(?-�/� #!N$* � �' � DQ�Q�&� �!9 � % -F- �)& ��*��8�& � -F- � ���%��� "2569�� D��!� - E��&E - #!N�+�� � �� �'%B� E��8E� !�

�@ #!N(� �! � ������ - #!N��+�! � ��

Assim, como em qualquer documento XML, inicialmente são colocados os elementosde declaração do XML e do tipo de documento (“XML declaration” e “Document typedeclaration”). Na figura anterior, esses elementos correspondem às 6 primeiras linhaslistadas.

Em seguida, vem o elemento � / � ���.��� : esse é o elemento - (�(�� (raiz) desse XML, ou seja,deve haver somente um elemento � / � �����&� , e abaixo dele devem ficar todos os outroselementos do XML.

Os principais elementos abaixo do elemento - (�(&� são os seguintes: �!� #)��� � � � %"�.* / , '�(�%.��/��"� � �.�"-���* ,# /�# # � (�% � '�(�%�� � 0 , � /!� ')("* / � �,� � / � � � #)� , /�-�- (�-�� �&��0�/ , # / - ��� /�� e # / - ��� /�� � * ���&�!� %"0 .O elemento ��� #)�!� � � � % �.* / deve conter um nome da aplicação a ser apresentado porferramentas GUI de gerenciamento/desenvolvimento de Aplicações Web. Esseelemento é opcional, porém caso você decida utilizá-lo, é importante que hajasomente um desses elementos por Deployment Descriptor.

Exemplo de utilização do elemento “display-name”�QE�� "Q �' ��$)��9����J#�� � ��E��Q"$�&�.�JE�# � ' � #�9��&#�" � - E�� "2 �' �*$+�89���� #�

O elemento “context-param” serve para que se possam definir parâmetros deinicialização do contexto da aplicação; esses parâmetros estarão disponíveis paratodos os Servlets e páginas JSP da aplicação. Cada elemento presente deve conter o

Page 18: Jsp servlets j2_ee

nome de um parâmetro e o seu valor correspondente. O desenvolvedor pode tambémoptar por não utilizar nenhum desses elementos em seu XML.

Exemplo de utilização do elemento “context-param”�QD���9��&#��Q�,�F ����.���/�

�Q ����F��� �+96���J#��& ���J#���Q"2#��O�QE���"�� - ����F��� �89����J#���Q ����F��� � �O�!' 5%# � E�N��� �' � D� - ����$��� � �O��' 56#�

� - D���9��F#Q�Q�,�F ����$���/��QD���9��&#��Q�,�F ����.���/�

�Q ����F��� �+96���J#�QH I�����96DQ��O�QE6��" � - %���.��� ��9����J#���Q ����F��� � �O�!' 5%# � �� � ��� � �=� � - ����.��� � ����' 5�#��

� - D���9��F#Q�Q�,�F ����$���/�O elemento seguinte, # /&# # � ("% � ',("% � � 0 , serve para que se possa especificar o período máximo,em minutos, de uma sessão (esse recurso é explicado mais adiante no livro, no capítulo6 – Sessões). Assim como o elemento �!� #,��� � � � %"�.* / , esse elemento é opcional, mas caso odesenvolvedor opte por utilizá-lo, deve existir somente uma instância desse elemento noarquivo.

Exemplo de utilização do elemento “session-config”�Q".#�"."Q� ��9)� D��!9%K8� <.�

� " #�".",� �!9 � �&� �J#���5�� � � � - "$#�" "2� ��9(� �)� �J#��!5%���� - "2#�"."Q� ��9)� D���9�K8� < �

Os elementos � /�� '�( * / � �#� � /�� � � # � e /"-�-�(�-�������0�/ contém, respectivamente, a lista ordenada depáginas a serem utilizadas como “index” e as páginas a serem apresentadas em casosde erros “HTTP” ou exceções não tratadas pela aplicação. Esses dois elementos sãoopcionais, sendo que somente o primeiro admite uma instância por DeploymentDescriptor.

Exemplo de utilização dos elementos “welcome-file-list” e “error-page”�@ #!' D����J#!� K&� ' #!�F' � "$���

� #�' D��!�J#� K&� ' #��Q� 9�E�#Q��� *!�&��' � - #!' D����J#!� K&� ' # �� #�' D��!�J#� K&� ' #��Q� 9�E�#Q��� � "2 �� - #�' DQ���J#(� K&� ' #��

� - #!' DQ���J#!� K&� ' #(�8' � "$����Q#!� �F���*�8 �� <@#�

��#!� �F��� � D���E�# � � � � � - #!� �F��� ��D���E�#��Q' ��DQ�Q�&� �!9�� -�� � � ���.�)�%�$� *��&��' � - ' ��D�� �)� �!9��

� - #��2�F��� �F ���<�#��Q#!� �F���*�8 �� <@#�

��#Q��D�#� ��&� ��9)� � $� �#��QDQ�!� � �J� 9�*%�Q#!�� ��$#�"$��� #���DQ#! ��&� ��9�"2� �.� � �!9�9��!�,D�#! ��&� �!9�� - #���DQ#� Q�&� ��9(� � $6 %# ��Q' ��DQ�Q�&� �!9�� - �.�����2�)�!� � *��&��' � - ' ��D�� �&� �!9��

� - #��2�F��� �F ���<�#�De acordo com o que é apresentado na listagem anterior, se tomarmos como exemplonossa aplicação �� �"� # ��-�(��)� � /�% ��/�# , quando é feito um acesso a URL��������� ��� � ��� ! � ��� ! � ! � � � � � ����� � �&��#�� - (���� � /�%.��/.#�� , o Servidor tentará retornar a página “index.html”, conformeespecificado na lista do � /� '�(&* / � � � � / � � � #)� . Caso essa página não exista, o Servidor tentaráutilizar a página “index.jsp”.

Page 19: Jsp servlets j2_ee

A figura anterior também demonstra a utilização do elemento /�-�-�("-�� �&��0�/ duas vezes: aprimeira vez para mapear erros HTTP 404 (página não encontrada) a uma página deerro-padrão, e a segunda, para mapear exceptions “com.minhaempresa.exceptions.DBConnException” a uma outra página de erro.

Os últimos dois elementos, # /"-�� � /�� e # /"-�� � /�� � * ������ %&0 , servem para definir, respectivamente, osServlets da aplicação, com seus respectivos parâmetros, e os mapeamentos de URLs acada Servlet da aplicação.

Cada elemento # /�- ��� /.� , por sua vez, é composto dos seguintes elementos:

�3 servlet-name: deve conter o nome do Servlet.

�3 servlet-class: deve conter o nome da classe (incluindo a informação sobre opackage, se existir).

�3 init-param: deve conter um parâmetro de inicialização do Servlet; pode havernenhum, somente um, ou mais de um elemento deste tipo para cada Servlet.

�3 load-on-startup: deve conter um inteiro positivo indicando a ordem de carga desteServlet em relação aos outros Servlets da aplicação, sendo que inteiros menores sãocarregados primeiro; se este elemento não existir, ou seu valor não for um inteiropositivo, fica a cargo do Servlet Container decidir quando o Servlet será carregado(possivelmente, no instante em que chegar chegar a primeira requisição a esseServlet).

Exemplo de utilização do elemento “servlet”�Q".#����(' #����

� " #����(' #��,�F9����J#��QI��F��DQ#�" "2� � �QE��Q"$�&�.��� - "2#��F��' #Q� �896���J#�� " #����(' #��,��D�' ��"."�� D������ ��� 9�*��Q#!�� ��.#�".��� � �QE��Q"$�&�.� � ' � #!9%�8#�"Q� I��F��D � �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#Q�8#�9��8#�� - ��!�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#!9�E���"����� 9�*%�Q#��� !�$#�"$��� DQ����� N�� � - %���F�!� � ����' 5�#���� - � 9�� � �8 ����$���/��Q� 9�� ���8 ����.���/���Q ����$��� �+96���J#�����J��� ' � *"."25�9��F�� - ����$��� �89���� #���Q ����$��� � ����' 5�#���& �Q���LD���E���"F�)�$�7E�#

D!' � #�9��&#�� - ��!�F��� � ���!' 5�#���� - � 96� �,�� ����$���/��Q' ���QE(�8��9)� ".�F���F�&56 ���� � - ' ����E � ��9(��"F�&�����)5� ��

� - "2#����@' #����Por fim, um elemento servlet-mapping contém um nome de Servlet, conforme definidoem # /"-���� /.� � %"�.* / , e um padrão da URL do Servlet no servidor (URL pattern).

Exemplo de utilização do elemento “servlet-mapping”�Q".#����(' #��,�&�J�� 6 !� 9�<��

� " #����(' #��,�F9����J#��QI��F��DQ#�" "2� � �QE��Q"$�&�.��� - "2#��F��' #Q� �896���J#��Q5O�.' �F �� ���8#��.9�� - I��$��D�#�"2"$����#�9%�8�� - 5��$' �� ��Q�8�8#��.9��

� - "2#����@' #��,�F�J�! � �� 9�<��No exemplo anterior, todos as requisições com URLs iniciadas por ��� � � � # � - (�� � � /�%.��/.# ����- ( '�/�#)# �&* /�%.��(��serão mapeadas para o Servlet cujo nome é ��- ("')/&# #)� � � �&� # � - ( .Outros mapeamentos interessantes podem ser obtidos através de padrões de URL dotipo � ! � / �&� /�%.#�� (�� , como por exemplo, � ! � * ou � ! � ��� , de maneira que o acessos a todas as

Page 20: Jsp servlets j2_ee

URLs com o sufixo indicado sejam tratados por um mesmo Servlet. Um último exemplode mapeamento interessante diz respeito ao padrão � , que define o Servlet default paratodos os acessos que não se encaixarem em nenhum outro padrão.

Juntando então todos os elementos apresentados anteriormente, temos o DeploymentDescriptor de exemplo apresentado a seguir:

Exemplo de Deployment Descriptor completo para a aplicação“CadastroClientes”���Q��� '!�%#��$"2� �!9��� � ���B#�9�D���E�� 9�<��� FH / � � ������� � � ��

��9 � � � ? �(I��$ #�N!���� � I" ��C�H � �,� -.- / 5�9 A0� D!�F��"#$�"$�8#��J" ��H 9�D!� -.- �(?-�/� #!N$* � �' � DQ�Q�&� �!9 � % -F- �)& ��*��8�& � -F- � ���%��� "2569�� D��!� - E��&E - #!N�+�� � �� �'%B� E��8E� !�

�@ #!N(� �! � ��� E�� ", �' ��$)�896���J#� � ��E��Q".�&�$�JE!# � ' � #!9!�&#�"@� - E�� " !' �*$+��9�����#����D��!9!�&#Q�Q�,�F ��!�$���/�

�� ��!�)�!� �89%���J# �*&B���J#��Q��".#�O�QE6��"�� - ����.��� ��9�����#���� ��!�)�!� � ����' 5�#�� E�N��! �' � D� - ����$��� � ����' 5�#��

� - D���9��&#��2� �& ����.���/��QD��!9��F#Q�Q�,�F ����$���/��� ��!�)�!� �89%���J# �QH I�����9%DQ��O��E���"'� - ����$��� �89����J#��� ��!�)�!� � ����' 5�#�� �� � ��� � � � � - ����$��� � ���!' 5�#��

� - D���9��&#��2� �& ����.���/�� " #�".",� �!9 �+D��!9%K � <��

�Q".#�"."Q� ��9)� �)� �J#��!5%��� � � - ".#�"."2� ��9(� �.� �J#���5����� - " #�"."2� �!9 �+D��!9%K � < �� #�' D��!�J#� K&� ' #�F' � ".���

�@ #�' D��!�J#!� K&� ' #��Q� 96E�#Q��� *��&��' � - #!' DQ�!�J#(� K8� ' #���@ #�' D��!�J#!� K&� ' #��Q� 96E�#Q��� � "Q �� - #!' DQ�!� #!� K&� ' #�

� - #!' DQ�!� #!� K&� ' # ��' � "$�����#!� �F��� �� �� <(#��

�Q#��2�$�!�*�+D��!E�#�� � � � � - #��.�)�%� �8D���E�#����' �!DQ���&� �!9�� - � � � ���.�F���.� *��&��' � - ' ��D�� �)� ��9��

� - #�� �F��� �F ��Q<O#���#!� �F��� �� �� <(#��

�Q#���D�#! !�&� ��9(� � $� �#��D��!��� ��� 9�*��Q#��� !�)#�".��� #Q��DQ#� ��)� �!9�" � �.� � ��9�9����QD�#� Q�.� ��9�� - #Q��D�#! ��)� �!9(� � $( �#����' �!DQ���&� �!9�� - �.���O�.�F���.� *��&��' � - ' ��D�� �)� ��9��

� - #�� �F��� �F ��Q<O#�� " #����(' #����

�Q".#����@' #��,�F9��!�J#��QI!�)�!DQ#�"." � � �QE6�Q".�&�$�� - " #����(' #Q����9����J#���Q".#����@' #��,��D!' ��"."��QDQ�!� � ��� 9�*%�Q#!�� ��F#�"$�!� � ��E��Q".�&�$� � ' � #�9��8#�",� I��F��D � �QE��Q"$�&�.��� - " #%�&�6' #��,��D�' �Q"2" ���� 9�� � �8 ����$���/���� ����$��� �89����J#������J�Q� ' � / #!�)��� E���� / A ?BI�� - ����$��� �+9����J#����Q ��!�)��� � ����' 5�#��

" �J�& �� ��� 9!*6� #!�� ��F#�" ��� D��!��� N!� � - ����F��� � ���!' 5�#��� - � 9�� ���� ����.���/���� 9�� � �8 ����$���/���� ����$��� �89����J#������J�Q� ' � P�#��J#Q�&#�9��8#� - ����F��� ��9����J#���Q ��!�F��� � ����' 56#�

"Q� �F#��1��� 9�*��Q#��7 ��)#�".��� DQ�!��� N�� � - ����$��� � ����' 5�#���� - � 9�� �,�� ��!�)���>���� 9�� � �8 ����$���/���� ����$��� �89����J#������J�Q� ' � �O#�"F�)� 9�� �8�!�$� ��� - ����.��� ��9��!�J#����Q ����F��� � ���!' 5�#��

��#�9�E��Q"�� �J� 9�*%�Q#!�� ��F#�"$�!� DQ��� � N�� � - ����.��� � ����' 56#��� - � 9�� �,�8 ����F���>�

Page 21: Jsp servlets j2_ee

��� 9�� � �8 ����$���/���� ����$��� �89����J#������J�Q� ' � *"."Q5�9��8��� - ����.��� ��9����J#����Q ����$��� � ���!' 5�#�& �����7D���E���"$�&�$�7E�#JD!' � #!9��F#� - ��!�)��� � ����' 5�#���� - � 9�� � �8 ����$���/�

��' �!�QE(���!9 ��"F�&���)�&5� ���� � - ' ���QE(���!9(��"$�8�!���.5� ��� - " #����(' #����� " #����(' #����

�Q".#����@' #��,�F9��!�J#��������.��5�' ���$� � � �QE��Q"F�.�F��� - "2#��F��' #��,�F9���� #��Q".#����@' #��,��D!' ��"."��QDQ�!� � ��� 9�*%�Q#!�� ��F#�"$�!� � ��E��Q".�&�$� � ' � #�9��8#�",� �����.� � ��E��Q"$�&�F��� - " #!�)�6' #��,�8D�' ��"."'�

� - " #����(' #����� " #����(' #��,�F�J�� � �� 9!<��

�Q".#����@' #��,�F9��!�J#��QI!�)�!DQ#�"." � � �QE6�Q".�&�$�� - " #����(' #Q����9����J#���Q5��$' �� �� �8�8#��.9�� - I��F��D�#�" ".��� #!9��8��� - 5��.' �8 ����8�8#��.9��

� - " #����(' #��,�F�J�� � �� 9�<��� " #����(' #��,�F�J�� � �� 9!<��

�Q".#����@' #��,�F9��!�J#��������.��5�' ���$� � � �QE��Q"F�.�F��� - "2#��F��' #��,�F9���� #��Q5��$' �� �� �8�8#��.9�� - �����.��5�' ���.� ��� - 5��$' �F ��Q�+�&#��.9 �

� - " #����(' #��,�F�J�� � �� 9�<��� - #!N��+�! � ��

Page 22: Jsp servlets j2_ee

� ����� ����� �� � � ��� � � � � � � � � � � � ��� � � � � � � � � � � � ���

Nesse capítulo, exploramos as características básicas de Servlets, mostrando ofuncionamento e sua interação com o Servlet Container. Implementamos tambémnossos primeiros Servlets de exemplo.

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

Antes que você possa iniciar o desenvolvimento de seus Servlets, é imprescindível quevocê tenha disponível a biblioteca de Servlets Java (normalmente, um arquivochamado # /�- ��� /.� ! � �&- ; se você estiver utilizando o Apache Tomcat, você pode encontraresse arquivo abaixo do diretório de instalação do Tomcat, no subdiretório '�(&* * (�%� � � � ). Essabiblioteca contém todas as classes e interfaces necessárias para o desenvolvimento deServlets, e deve estar contida em seu classpath.

Outro item importante, embora não imprescindível, é a documentação da API deServlets. Por meio dessa documentação, você poderá verificar todos as classes, comseus respectivos métodos e variáveis, com os quais você poderá contar durante oprocesso de desenvolvimento. Essa documentação pode ser obtida diretamente do siteoficial do Java ( � � ��� � � � � � � � ! #)$ %�! ',(&* ).

1 �&� � ��� � � � # � � �� 5�5>8Embora Servlets possam ser utilizados não só para o desenvolvimento de aplicaçõesHTTP, a maior parte das aplicações desenvolvidas são destinadas a esse fim. Sendoassim, vale a pena estudar um pouco mais a fundo o funcionamento e característicasdesse protocolo.

O protocolo HTTP é utilizado na navegação nas páginas da Internet: quando você abreuma janela de um browser, acessa uma página Web e navega em seus links, você está,na verdade, utilizando esse protocolo para visualizar, em sua máquina, o conteúdo queestá armazenado em servidores remotos.

O HTTP é um protocolo # ��� � /� /.# # de comunicação cliente-servidor: o cliente envia umarequisição para o servidor, este processa a requisição e devolve uma resposta para ocliente, sendo que, a princípio, nenhuma informação é mantida no servidor em relaçãoàs requisições previamente recebidas.

Page 23: Jsp servlets j2_ee

Assim, quando digitamos o endereço de uma página em um browser Web, estamosgerando uma requisição a um servidor, que irá, por sua vez, devolver para o browser oconteúdo da página HTML requisitada.

A requisição enviada por um cliente deve conter, basicamente, um comando (tambémchamado de método), o endereço de um recurso no servidor (também chamado de“path”) e uma informação sobre a versão do protocolo HTTP sendo utilizado.

Supondo, por exemplo, que utilize-se o método � ��� , o path � � % ��/ �&! ����* � e a versão 1.0 doprotocolo HTTP (o que equivale a digitar um endereço ��� ����� �)� � /�%���/�- /��.( �&/ ��� 0.$&* # /�- � � ��(�- �� � %��&/ �&! ����* �em um browser), temos a seguinte requisição enviada:

Exemplo de requisição HTTP� ��? - � 96E�#Q�!� *��&��'�>(?=? I - � �

Existem diversos métodos HTTP que podem ser especificados em requisições, sendo osmais comuns o método � ��� , normalmente utilizado para obter o conteúdo de umarquivo no servidor, e o método ����� , utilizado para enviar dados de formulários HTML aoservidor. Além desses métodos, o protocolo HTTP 1.0 admite também o método � � ��� ,que permite que o cliente obtenha somente os headers da resposta; já o protocoloHTTP versão 1.1 admite os seguintes métodos:

�3 “PUT”: transfere um arquivo do cliente para o servidor

�3 “DELETE”: remove um arquivo do servidor

�3 “OPTIONS”: obtém a lista dos métodos suportados pelo servidor

�3 “TRACE”: retorna o conteúdo da requisição enviada de volta para o cliente

Além do método, path e versão, uma requisição pode conter parâmetros adicionais,chamados “headers”. Dois headers comuns são, por exemplo, o header � # /�-���� 0 /�%&� , quecontém informações sobre o cliente que está gerando a requisição (tipo, versão dobrowser etc.) e o header �'.',/&��� , que serve para especificar os tipos de recursos aceitospelo cliente para a requisição enviada.

Exemplo de requisição HTTP com headers� ��? - � 96E�#Q�!� *��&��'�>(?=? I - � �"@" #!�*� *<@#!9��,�OA4�!M�� ' ' � -�� � � �+DQ��� �� �&� N6' #!�6A / H � � � �=��� � 9�E��� " � � ���@� <.���Q���* DQD�#� ����%�8#��Q� - *��&��'

Uma vez processada a requisição, o servidor, por sua vez, manda uma resposta para ocliente, sendo que essa resposta também tem um formato predeterminado: a primeiralinha contém informações sobre a versão do protocolo, um código de status daresposta e uma mensagem associada a esse status; em seguida são enviados tambémheaders (com informações do servidor que gerou a resposta, por exemplo); efinalmente, é enviado o conteúdo, propriamente dito, da resposta.

Exemplo de resposta HTTP com headers>�? ? I - � ��� ���/ #��F��#�� � *� ��QD�*�# - � % � �� � " 9�� ��C���"F� �8A���E�� K8� #�E)� / 5�9 � � � #!D ��� �� � ��� � ��� �A ?� �!9%�8#!9%�,� ?'$� �#���8#��Q� - *��&� '� �!9%�8#!9%�,�8C6#!9!<��&*)�% �

Page 24: Jsp servlets j2_ee

��>�?BA�C�������������� - ���������� - >(? A0C��

Assim, no exemplo anterior, o código de status � �� indica que houve sucesso noatendimento da requisição enviada pelo cliente, os headers indicam o tipo, tamanho edata e hora de última modificação do conteúdo requisitado, e por fim, temos umapágina HTML em branco, com o conteúdo propriamente dito.

Outros códigos de status bastante comuns são o � ��� , que indica que o recurso não foilocalizado no servidor, e o código � �!� , que indica que houve erro no processamento darequisição enviada.

1 �!1 �! ) � $���� �,!�$ )������ )���� � )��Conforme descrito anteriormente, um Servlet nada mais é que uma classe Java queobedece a uma estrutura bem definida. Em especial, essa classe deve implementar ainterface ����� � �&! # /�- ��� /���! ��/"- ��� /.� .Existem duas classes, na biblioteca de Servlets, que implementam essa interface:� � � � � ! # /�- ��� /.��! � /�%&/�- � '���/�- ��� /�� e sua sub-classe, ����� � �&! # /"- ��� /&��! �������&! �"�������/�- ��� /&� . A classe � /�% /"- � '���/"-���� /�� , como opróprio nome indica, serve para atender requisições genéricas (utilizando qualquerprotocolo), e a classe � ������ /�- ��� /.� , para atender requisições HTTP.

�Figura 3.1 � Hierarquia de classes associadas a um Servlet.

No desenvolvimento do Servlet de nossa aplicação exemplo � � � ��# ��- (��)� � /�%.��/�# , temos assim aseguinte declaração de classe:

Declaração do Servlet ProcCadastro� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.�J ��F��DQ#�"."2���J#�9��8�LE��7D���E���"$�&�$�7E�#�9�������"�D!' � #!9��8#�" !5ON�' � D:D�' ��".":I��.��D � �QE��Q".�&�$�J#�� �&#�9�E�" >(�8�& / #!�)�6' #���R

� � �0

1 ��� ��!"# � � ) �,! $ ,) ����� )���� � ) �

Page 25: Jsp servlets j2_ee

Todo Servlet segue, por outro lado, um ciclo de vida composto de 3 fases: inicialização,atendimento de requisições e finalização.

A inicialização ocorre quando o Servlet Container carrega o Servlet: se o parâmetro � ( ��� �(�% � # ���&- ��$&� , do Deployment Descriptor (vide seção 2.2), estiver presente e contiver uminteiro positivo, essa carga ocorre quando o próprio servidor é iniciado; caso contrário,essa carga ocorre quando é recebida a primeira requisição a ser mapeada para aaplicação que contém o Servlet.

Após a inicialização, o Servlet pode atender requisições. Assim, enquanto o servidorestiver ativo, e a aplicação que contem o Servlet estiver carregada, este permanecerána fase 2 de seu ciclo.

Um ponto importante com relação a essa fase, e que na verdade constitui umavantagem da tecnologia de Servlets e páginas JSP com relação a outras tecnologias, éque o fato do Servlet permanecer carregado permite que dados armazenados emvariáveis de classe persistam ao longo das diversas requisições recebidas. Assim, épossível manter um pool de conexões ao banco de dados, por exemplo, de maneiraque não seja necessário iniciar e estabelecer uma nova conexão ao banco de dados acada requisição recebida.

Finalmente, quando o servidor é finalizado, ou quando a aplicação é tornada inativapelo Servlet Container, o Servlet é finalizado.

�Figura 3.2 � Ciclo de vida de um Servlet.

Cada uma das fases se traduz, na verdade, em métodos do Servlet que são chamadospelo Servlet Container nos diversos instantes do ciclo.

Apresentamos, nas seções subsequentes, os métodos relacionados às fases deinicialização, finalização e de atendimento de requisições.

1 ��� �"-!"# ! $,� !��,$,& � �Conforme apresentado nos parágrafos anteriores, a inicialização do Servlet ocorre noinstante em que é feita a carga da aplicação pelo Servlet Container.

Nesse instante, o Servlet Container executa o método “init” do Servlet, dando chanceao Servlet de executar quaisquer passos necessários para sua inicialização, tais como:

1) leitura de parâmetros de configuração

2) inicialização de variáveis de classe (variáveis estáticas)

3) inicialização de conexões ao banco de dados, etc.

Assim, podemos ter implementado em nosso Servlet “ProcCadastro”, por exemplo:

Inicialização do Servlet “ProcCadastro”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���

Page 26: Jsp servlets j2_ee

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

-.-0/ #����(' #�� ����.�J ��F��DQ#�"."2���J#�9��8�LE��7D���E���"$�&�$�7E�#�9�������"�D!' � #!9��8#�" �6�7D��QE��796�Q���JD��QE6��"F�.�F� N%#!� ",5%D�#�EO� E���-.- #�9��(� �:#!� ��� '�D���� ��"�E���E���" E��JD��QE6�Q".�&�$� !5ON�' � D:D�' ��".":I��.��D � �QE��Q".�&�$�J#�� �&#�9�E�" >(�8�& / #!�)�6' #���R

� � � �5�N�' � D��O�!� E � 9�� �5���R

� � �0� � �

0

As assinaturas do método � %!� ����� são:

Assinaturas do método “init ()” !5ON�' � D����!� E � 9�� ������� !5ON�' � D����!� E � 9�� ���� �Q��� �!� ".#�����' #Q�)� / #����(' #Q� � �%9!K � < ��=D��%9!K � < �8�

Conforme pode ser visto, o método � % � ����� admite duas assinaturas, sendo que em umadelas, é recebido como parâmetro um objeto da classe ��� ��� �&! # /�- ��� /���! � /"- ��� /.� � (�% �#� 0 : atravésdesse objeto, o Servlet pode obter os parâmetros de inicialização do Servlet, contidosno Deployment Descriptor (veja seção 2.2). Por outro lado, caso você opte porimplementar o método � %!� ����� sem nenhum parâmetro, é possível também obter umareferência para o objeto ��/"- ��� /&� � (�% �#� 0 por meio da chamada 0�/.� ��/"- ��� /.� � (�% �,� 0���� da própria classe� � � � � ! # /�- ��� /.��! � /�%&/�- � '���/�- ��� /���� ����$&� ��%�(.#)#)�2'*� � # # /2/&# � /"% ��/�� .Assinatura do método “getServletConfig ()”

!5ON�' � D7� ����� �!� ".#�����' #Q�.� / #%�&�(' #�� � ��9�K&� <�<@#�� / #��)�6' #�� � �!9%K8� < �����Para obter um parâmetro de inicialização do Servlet usando o objeto ��/"-���� /.� �(�% �#� 0 , deve-seutilizar o método 0�/.� %!� � �"� -��.* /.��/"-�� � , passando como parâmetro o nome do parâmetro que sedeseja obter.

Assinatura do método “getInitParameter ()” !5ON�' � D7� ������� ' ��9�<(� / �.�.� 9�<�<@#Q�&H 9�� �&I����.���J#��8#%� � � � ����� ' ��9�< � / �&�.� 9�< �� ����$���J#Q�F#!� & ���J# ���

Temos, a seguir, um exemplo de uso desse método:

Exemplo de uso do método “getInitParameter()” de um objeto“ServletConfig” !5ON�' � D����!� E � 9�� ��� / #�����' #Q� � ��9�K8� < �� ".#��)�6' #�� � �!9%K8� <�� �&*O�F�� " / #!�)��' #Q� �!�,D�#% ��&� �!9�R

"25O �#!� � � 9�� ���+ ��="$#!�)�6' #�� � �!9%K8� <����

/ �&� � 9�< ' �=" #%�&�6� E��!� / A ? I=�7 � ".#����(' #Q� � �!9!K � <(� <�#��&H 9�� �&I����$���J#Q�8#�� ���,���J��� ' � / #%�&�6� E��!� / A ?BI� !�+�� K!�+' �=" #!�)��� E���� / A ? I 9 �:9�56' ' �BR

� � �0

0

Obviamente o método 0 /��� %!� ���"�&- ��* /�� /"-��� pode retornar um valor nulo caso o parâmetroinicial a ser obtido não tenha sido definido, e por isso é importante que você faça averificação do String retornado pela chamada do método antes de utilizá-lo.

Page 27: Jsp servlets j2_ee

É possível também, a partir de um objeto da classe ��/"- ��� /&� � (�%�� � 0 , percorrer a lista dosparâmetros de inicialização do Servlet, bastando utilizar o método 0�/��� %�� ��� � - ��* /.��/�- ���* /�# ��� .Assinatura do método “getInitParameterNames ()”

!5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9L<�#��&H 9�� �&I����$���J#Q�8#�� & ���J#�"@���+�Temos, a seguir, um exemplo de uso deste outro método:

Exemplo de uso do método “getInitParameterNames()” de um objeto“ServletConfig” !5ON�' � D����!� E � 9�� ��� / #�����' #Q� � ��9�K8� < �� ".#��)�6' #�� � �!9%K8� <�� �&*O�F�� " / #!�)��' #Q� �!�,D�#% ��&� �!9�R

"25O �#!� � � 9�� ���+ ��="$#!�)�6' #�� � �!9%K8� <����

��965��J#!�F���&� ��9�' � %���.���J#��&#!� &=���J#�"3�J �� ".#����(' #�� � �!9%K8� <(� <�#��&H 9�� �8I����F���J#Q�F#!� & ���J#�" ���8�� K!�+' � ����F���J#��8#%� &=���J#�" 9 �:9�56' ' �

*�� ' #�+' � ����$���J#Q�8#�� & ���J#�"Q� *��Q".A����F#�6' #!�J#�9��8" ���,�R

/ �&� � 9�<0' � ��!�)���J#��8#�� & ���J# �&� / �)�.� 9�< �' � ����$���J#Q�&#�� & ���J#�"2� 9�#��Q����' #��J#!9�� �����/ �&� � 9�<0' � ��!�)���J#��8#�� � �!' 5%# � ��"8# � �!' #F� � �29$K � <!� <�#)� H 9Q� � I.�.� �.�4#F� #2��� ' �� $�)� �&��#�� # � &��.�4# � �� � �

00

0

Assim, em nossa aplicação de exemplo � ���&��# � - (���� � /�%&� /�# , podemos implementar o métodode inicialização do Servlet ��-�(&' � � �"��# ��-�( como:

Inicialização do Servlet “ProcCadastro”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.�J ��F��DQ#�"."2���J#�9��8�LE��7D���E���"$�&�$�7E�#�9�������"�D!' � #!9��8#�" �-.- �JD���E!��9������7D���E���"$�&�F� N�#�� "25�DQ#�E�� E6���#�9��(� �:#!� ��� '�D��!����"�E��QE���" E���D��QE6��"F�.�F� !5ON�' � D:D�' ��".":I��.��D � �QE��Q".�&�$�J#�� �&#�9�E�" >(�8�& / #!�)�6' #���R

-.-�/ #%�&�(� E���� / A ? I:�J" #%�45�"$��E�� ����F�7��#�9���� �:E�#J#��J��� ' �� � ��� �8#�"F�F�Q�&� D / �)�$� 9�<+� / #����@� E���� / A ?BI&�J9�5�' ' �

-.- P�#��J#Q�F#!9��8#���E�#�".�&� 9��Q�8;�� � �J#��Q" "25�9!�8�7E���#!� ��� '��J" #%� #�9��(� �QE6�:�7D���E��JD��QE��Q"$�&�.� �� � ��� �8#�"F�F�Q�&� D / �)�$� 9�< � P�#��J#��8#!9��F# �79O5�' ' ��� � #!")�)� 9%� �&���.� � �J9�56' ' �� *"2" 5�9��&�&�79�5O' ' �

�5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�-.- P�#�D�5� �#��F��9�E��7��" ��������J#Q�.�F��" E�# � 96� D�� ��' � M���G�����E�� / #����(' #��� / #%�)��� E���� / A�? I=�J ��=" #!�)�6' #�� � �!9%K8� <(� <�#��)H 9O� �&I����F���J#��8#!� �,�!���J��� ' � / #!�)��� E���� / A ? I ,�+�� P�#��J#Q�F#!9��8#/�7 �="2#��F��' #�� � �!9%K � <(� <�#Q�&H 9�� �&I����)����#Q�8#�� �!�,���J��� ' � P�#!�J#��&#�9%�8# ,�+��-�O#�"F�.� 9�� �F���.� � �� �� ".#����(' #Q� � �%9!K&� <(� <�#��&H 9�� �&I����F���J#Q�F#!� ���,���J��� ' � �O#�"F�&� 9��Q�8���.� �� !�+�� *" "25�9��F� �� �� ".#����(' #Q� � �!9!K&� <(� <�#��&H 9�� �&I����$���J#Q�8#�� ���,���J��� ' � * "$"25�9��8�� !�+�� � �

Page 28: Jsp servlets j2_ee

0

0

Outro uso comum para o método de inicialização do Servlet é para o despacho de umou mais Threads, que deverão ser executados durante o período em que o Servletpermanecer carregado. Assim, um serlvet pode, por exemplo, iniciar um Thread que iráverificar continuamente a disponibilidade de uma conexão com o banco de dados,independente de qualquer requisição que receba. Este Servlet de exemplo éapresentado a seguir:

Inicialização do Servlet “VerificaConBD”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.� ��#!� � K&� D����4D���9�#�� ���7D��%��N���96DQ�JE�#7E6�QE���"���' ��9�G����&*O�F#��QE�3%56#���#��.� K8� DQ�7"$�8�Q�&5�"4E��:D��%9%#�� ���� �#��.� ��E�� DQ����#�9��F# !5ON�' � D:D�' ��"." � #��.� K&� D�� � ��9 �.�L#Q�Q�F#!9�E�" >(�+�) / #!�)��' #���� �� �' #!�L#!9!�&" P�5�969���N�' #7R

-.- P�#�K8#!� � 96D�� �:���J�&*��)#!�QE�3�5�#�� �.; K8��M�#�� �L��#��.� K � DQ��G ���JE��:D��!96#������? *��F#���E$� ? *��F#���E � #��.� K �7965�' ' �

-.- H 9�� D�� ��' � M��QG ���JE�� / #����(' #Q� �5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R

"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

-.- C���9�G���9�E�� ? *��$#��QE � � �� ? *��.#��QE � #��2� K5�79%#� ?B*O�F#���E�� �&*�� " �+�� ? *��.#��QE � #��2� K&� "F�F���F�5������ � �

0

-.- ����#�D!5�G����JE��J�&*��F#��QE �5�N�' � D��O�!� E � 5�9����BR

*�� ' #� � ?B*��)#��QE � #��.� K59 �J9�5�' ' �BR� K!��9 � �!9���@� ���>���!�BR

� � �0

00� � �

0

Uma observação importante com relação a esse processo de inicialização é que oServlet somente poderá receber requisições após a conclusão de seu processo deinicialização.

O desenvolvedor pode, por outro lado, indicar que esse processo de inicialização nãofoi bem sucedido, através do lançamento da exceptions ��/"- ��� /&��� �"'�/ � �,� (�% ou � %"��� ��� � � � � / � ��')/"� � � (�% ;nestes casos, o Servlet Container irá deixar o Servlet em um estado inativo, ou seja, sem

Page 29: Jsp servlets j2_ee

poder receber requisições. A exception � %"��� ��� � � � � /�� �"'�/"��� � (�% , em particular, pode recebercomo parâmetro em seu construtor, um número de segundos com uma estimativa dequanto tempo o Servlet deverá ficar inativo.

Exemplo de uso da exceção “UnavailableException” para indicarfracasso na inicialização !5ON�' � D ���!� E�� 9�� ��� / #�����' #Q� � ��9�K8� < ��=" #!�)�6' #�� � �!9%K8� <��

�&*��)�� " / #��F��' #Q� ����DQ#� ��&� ��9��(" 9��Q����� ' ��N�' #����QD�#� ��&� ��9 R"25O �#!� � � 9�� ���+ ��="$#!�)�6' #�� � �!9%K8� <����� � �-.- P�#�D!5� �#��F��9�E��J#J����' � E���9�E��J ���� ���J#��)�F��" E�#�� 9�� D�� ��' � M��QG ���JE�� / #�����' #��� / #����(� E��!� / A ?BI&�7 �� " #!�)��' #�� � ��9�K8� <@� <@#Q�&H 9O� �&I����F���J#��&#�� �����!� �,� ' � / #��F��� E!��� / A ?BI� !�+�� P6#!�J#��&#!9!�8# �J ��=" #!���(' #�� � �!9%K8� <(� <�#��&H 9�� �&I����F���J#Q�F#!� ���,���J��� ' � P�#��J#Q�8#�9��8#� !�+�� � #!")�)� 9%� �&���.� � �J �� "$#%�&�6' #�� � ��9�K&� <@� <�#��&H 96� �&I����.���J#��8#!�@���!���J��� ' � �O#�"$�&� 9�� �F���.� � !�+��.* " "25�9!�&� �J �� "$#%�&�6' #�� � ��9�K&� <@� <�#��&H 96� �&I����.���J#��8#�� ���!���J��� ' � * " "25�9!�8� !�+�� K!��� � / #!���@� E���� / A0? I&���L9�5�' ' ��� � � � P6#!�J#��8#!9%�8# ���J9�5�' ' ��� � � � * "."2569��&� ���7965�' ' ���

�&*��)�� 9%#� "=96� ����� ' ��N�' #����QD�#� Q�.� ��9����!�O�.�F�(�� ��������J#Q�.�F��" E�# � 96� D!� ��' � M���G���� 9 ���#�9�D��!9��.�F�QE���" 9 ��+�

No caso de você não ter percebido, todos os métodos � %!� � ��� apresentados até agora nosexemplos foram declarados de maneira a possibilitar o lançamento do exception� /�- ��� /�� � �"'�/&���,� (�% : isso é necessário devido à chamada do método #)$���/"-�! � %!� � ��� , que pode, por si,lançar essa exceção para indicar problemas em sua execução.

1 ��� � #�"$,+�+ )�� �,) � � � )�� � � - � )�����Além da referência ao objeto da classe � /�- ��� /�� �(�%�� � 0 recebido como parâmetro nainicialização, o Servlet pode obter também uma referência a um objeto da classe� � � � � ! # /�- ��� /.��! ��/�- ��� /�� � (�%&� / � � através do método 0�/�� ��/�- ��� /�� � ("% � / �"� ��� ��/�- �"� ��( � �2' � � # #)/ � /�%./"- � '���/�- ��� /�� .Assinatura do método “getServletContext ()”

!5ON�' � D7� ����� �!� ".#�����' #Q�.� / #%�&�(' #�� � ��9��&#��2� <(#�� / #!�)��' #�� � ��9��8#�� �����8�Esse objeto � /"- ��� /�� �(�%�� / � � contém os atributos e informações sobre o contexto em que oServlet está sendo executado e, sendo assim, é compartilhado por todos os Servlets quefazem parte da Aplicação Web.

Analogamente ao que acontece com o objeto ��/�- ��� /.� � (�% �#� 0 , existem métodos pararecuperar os parâmetros iniciais do contexto definidos no “DeploymentDescriptor” (videseção 2.2).

Assinatura dos métodos “getInitParameterNames ()” e “getInitParameter()” !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9L<�#��&H 9�� �&I����$���J#Q�8#�� & ���J#�"@���+� !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9L<�#��&H 9�� �&I����$���J#Q�8#�� �+� �Q����� ' ��9�<(� / �.�.� 9�< �� ����F����#��8#�� & ���J#�+�

Por outro lado, é importante fazer a distinção entre os parâmetros iniciais do Servlet e osparâmetros iniciais do contexto, lembrando sempre que esses parâmetros são definidosem seções distintas do “DeploymentDescriptor”.

Page 30: Jsp servlets j2_ee

Exemplo de uso do método “getInitParameter” do objeto “ServletConfig”e do objeto “ServletContext” !5ON�' � D����!� E � 9�� ��� / #�����' #Q� � ��9�K8� < �� ".#��)�6' #�� � �!9%K8� <�� �&*O�F�� " / #!�)��' #Q� �!�,D�#% ��&� �!9�R

"25O �#!� � � 9�� ���+ ��="$#!�)�6' #�� � �!9%K8� <����

-.- P�#�D!5� �#��F��9�E��� ��������J#Q�)�)��" E6#7#���#�D�5�G ���7E6� / #�����' #��/ �&� � 9�< ' � ����$���/���Q#!D&�7 �� " #!�)��' #�� � ��9�K8� <@� <O#Q�&H 96� �8I����F���J#��&#�� ���8I����)���J#��&�)��%�,#�D�5�DQ��� ��+�

-.-�/ # 9 ���J#Q�!� "F�&� �1�8��'� %�!� ���J#��&�F�JE�� / #�����' #������F#!9��F���J��"4D��!�J�� ��������J#��&�.�:E6�7D��%9!�&#Q�Q�8�� K!�+' � ����F���/���Q#�D&���J9�5�' ' �BR

/ #!�)�6' #�� � ��9��&#��2� ' �B".#����(' #Q� � ��9��F#Q� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' � ����F���/�%�,#�D ��' �B".#����(' #�� � �!9��8#�� �)� <O#��&H 9�� �&I����$���J#Q�8#�� ����I����$���J#Q�&�$��!��#�D�56DQ��� ��+�

0� � �

0

Além dos parâmetros de inicialização do contexto do Servlet, podemos usar esse objetopara atribuir e recuperar atributos que serão compartilhados por todos os Servlets docontexto. Assim, temos os métodos:

Assinatura dos métodos “getAttribute ()”, “getAttributeNames ()”,“removeAttribute()” e “setAttribute()” !5ON�' � D � � ����� ' ��9�<(� �N!� #�D �<(#��!*B�8�&� � N�5��8#��+� � ����� ' �!9�< � / �&� � 9�< ��B� �8�&� � N�5��&#�& ���:#��+� !5ON�' � D � � ����� 5��.� ' � ��9�5��J#��F� �)� �!9L<@#Q�!*B���&�2� N!5!�8# & ���J#�" ���+� !5ON�' � D ���!� E��.#�������#�*B�8�&� � N�5��F#�+� � ����� ' �!9�<(� / �&�.� 9�< ��B� �8�&� � N�5��8#(& ���J#�+� !5ON�' � D ���!� EJ"2#���*�+�.�.� N�5��8#�+� � ����� ' �!9�<(� / �&�2� 9�< �� � �8�&� � N�5��F#�&B���J#�

� � ����� ' ��9�<(� �N!� #�D �� ��=�Q�+�.�.� N�5%�8# � ��' 5�#��+�No exemplo a seguir, temos dois Servlets que fazem parte de uma mesma AplicaçãoWeb e que utilizam os atributos do contexto para indicar falhas em suas respectivasinicializações.

Exemplo de uso dos métodos “getAttribute” e “setAttribute” do objeto“ServletContext”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- I��$� �J#�� �F� / #����@' #�� E��J#Q��#��� �' � !5ON�' � D:D�' ��".":I��2� �J#!� �F� / #!�)��' #�� #�� �&#!9%E�" >O���& / #����(' #���R

�5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

-.- � �!� �F#�<���9�E��J� ��!� ��� #Q�&�$� � 9�� D�� ��'N�����' #��!9�' �="256DQ#�"." � � �)�.56#!�/ �&�2� 9�< ' � ����F����H 9�� D�� ��' �

��=" #!�)��' #�� � ��9�K8� <=� <�#��)H 9�� �&I����F���J#��8#!�@���8I����F����I��.� �J#!� �F� / #!�)��' #��� !�+�� K"�+' � ����F��� H 9�� D�� ��' ���7965�' ' �B' �B"25�D�#�"2"$� � K8�!' "2#��

Page 31: Jsp servlets j2_ee

� � �-.- "@".��9�E��7��� �.�.� N�5��8�7E6#7D��!9%�8#�� �&�� ����$�7� 9%E�� DQ��� "$�8�Q�&56" E�� � 9�� D�� ��' � M��QG ���/ #!�)�6' #�� � ��9��&#��2� ' �B".#����(' #Q� � ��9��F#Q� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �="2#��F��' #�� � �!9%�8#�� �&� ".#Q�,*B�8�&� � N�5��8#����8I��.� �J#!� �)� / #!���@' #��� !�O9�#�������!' #���9��+' �="25�D�#�"2"$����8�

-.- � #��.� K � DQ��9�E��7"$�8�Q�&56" E���".#�<(5�9%E!� / #����@' #�����!��' #���9�' �=".�8���&5�" / #�<(5�9�E�� / #!�)��' #��5�&�����!��' #���9��

' �=" #!�)��' #�� � ��9��8#�� �&� <@#Q�,* �+�.�.� N�5��8#��� / #�<(5�9�E�� / #����(' #Q� ,�+� *�� ' #�+' � "F�F� �&5�" / #Q<=5�9�E�� / #!�)��' #�� ���J9�5�' ' � R

? *��)#!�QE�� "2' #�#! �� � ����� �+� -.- �6"2 �#��.� � ".#�<(5O9�E���" #J��#��.� K8� D��:��"$�8�Q�&5�"�9��������J#!9!�8#' �="$�8�Q�&5�" / #�< 5�9�E6� / #��F��' #�� �&�!�����!' #!��9��

' �=" #!�)��' #�� � ��9��8#�� �&� <@#Q�,* �+�.�.� N�5��8#��� / #�<(5�9�E�� / #����(' #Q� ,�+�0

-.-:/ # *6�!5���#LK&�.�QD���"." � 9��7� 9�� D�� ��' � M!�QG ���7E�#�".�8# / #����(' #�� ��5�E���"$#�<@5�9�E���-.- ' ��96G����J��"05��J�:#���D�#�G ���� K"����' � " 5�D�#�"."2�/��� K+�!' ".#�� � �@�+' �="$�8�Q�&5%" / #Q<(5�9%E!� / #!���(' #��&� N����!' #���9 � �!' 5%# ������� K8��' "2#����

�&*O�F�� 9�#� "=9����%��� ' ��N!' #�%�,D�#! ��)� �!9����,���$�F�!�6��":E���� " / #��)�6' #��&"09 ���� !5%E�#!�$�,� " #��D��!�.�$#Q<@�QE���" D�����"256D�#�"2".��9 !�+�

0

� � �0

-.-0/ #�<(5�9�E�� / #����(' #�� E���#��Q#!�� 6' � !5ON�' � D:D�' ��"." / #Q<(5O9�E�� / #�����' #�� #��2�F#!9�E6" >O�+�) / #!�)��' #���R

�5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

-.- � �!� �F#�<���9�E��J� ��!� ��� #Q�&�$� � 9�� D�� ��'N�����' #��!9�' �="256DQ#�"." � � �)�.56#!�/ �&�2� 9�< ' � ����F����H 9�� D�� ��' �

��=" #!�)��' #�� � ��9�K8� <=� <�#��)H 9�� �&I����F���J#��8#!�@���8I����F��� / #�<(5�9�E�� / #!�)��' #��� !�+�� K"�+' � ����F��� H 9�� D�� ��' ���7965�' ' �B' �B"25�D�#�"2"$� � K8�!' "2#��� � �-.- "@".��9�E��7��� �.�.� N�5��8�7E6#7D��!9%�8#�� �&�� ����$�7� 9%E�� DQ��� "$�8�Q�&56" E�� � 9�� D�� ��' � M��QG ���/ #!�)�6' #�� � ��9��&#��2� ' �B".#����(' #Q� � ��9��F#Q� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �="2#��F��' #�� � �!9%�8#�� �&� ".#Q�,*B�8�&� � N�5��8#���� / #Q<(5�9%E!� / #!�)�6' #��� !��96#�������!' #���9��8' �=" 5�D�#�"."2�����8�

-.- � #��.� K � DQ��9�E��7"$�8�Q�&56" E���".#�<(5�9%E!� / #����@' #�����!��' #���9�' �=".�8���&5�"2I��$� �J#!� �F� / #��F��' #��5�&�������!' #���9��

' �=" #!�)��' #�� � ��9��8#�� �&� <@#Q�,* �+�.�.� N�5��8#����I!� � �J#!� �.� / #�����' #Q�� ��+� *�� ' #�+' � "F�F� �&5�"2I��$� �J#!� �F� / #����(' #��5���J9�5�' ' �R

? *��)#!�QE�� "2' #�#! �� � ����� �+� -.- �6"2 �#��.� � ".#�<(5O9�E���" #J��#��.� K8� D��:��"$�8�Q�&5�"�9��������J#!9!�8#' �="$�8�Q�&5�" I��.� �J#�� �F� / #!���(' #Q�5�/�������!' #���9��

' �=" #!�)��' #�� � ��9��8#�� �&� <@#Q�,* �+�.�.� N�5��8#����I!� � �J#!� �.� / #�����' #Q�� ��+�0

-.-:/ # *6�!5���#LK&�.�QD���"." � 9��7� 9�� D�� ��' � M!�QG ���7E�#�".�8# / #����(' #�� ��5�E�� �� � ��#�� �F���-.- ' ��96G����J��"05��J�:#���D�#�G ���

Page 32: Jsp servlets j2_ee

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

0

� � �0

Por fim, há um outro método da classe � /�- ��� /�� �(�%&� / � � que vale a pena conhecer: o método� ("0�� � permite que você adicione mensagens em um arquivo de log do Servidor deAplicações. Você poderá utilizar esse método para depurar seus Servlets, gerar alertasde problemas na sua execução etc.

Assinatura dos método “log ()” !5ON�' � D����!� E ' ��<.�+� �Q����� ' ��9!<(� / �)�.� 9�< �� �J"F<��+�

Em alguns Servidores de Aplicação você pode também tentar usar as saídas-padrão(“System.out”, “System.err”) para gerar suas mensagens de log, porém, é muito maisinteressante que você use o método anterior, de maneira que o ServletContainer possaseparar as suas mensagens em um log diferenciado. No caso específico do Tomcat, asmensagens geradas por meio do método � (&0 ��� são adicionadas a um arquivo de lognormalmente chamado � (&' ��� � (.# ����� ( 0"! / � ��! � �&� , onde / �&� é uma extensão contendo a datacorrente.

Exemplo de uso do método “log ()” (da classe “ServletContext”)� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.� �&#�"$�8#�E�#J<�#��.�QG ���JE�#���#!9%".� <(#�9�" E�#�' �Q< !5ON�' � D:D�' ��"."0? #�"$�8#!C6�Q< #��Q�8#�9�E�"0>6���& / #����(' #Q��R

-.- � ��' ��� E�#�K8��5�' � ����$�7 ��!�)����#Q�&�$�7� 9�� D!� ��'6E�� / #��)�6' #�� �� � ��� �8#�"F�F�Q�&� D�K&� 9���' / �.�.� 9�</� � ��' �!� � #QK8��5�' �&I����.���JH 96� D�� ��'��&�� ��

�5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

-.- P�#�D�5� �#��F��9�E��7��" ��������J#Q�.�F��" E�# � 96� D�� ��' � M���G�����E�� / #����(' #��/ �&�2� 9�< ' � ����$����H 9�� D�� �!' � ��=" #!�)�6' #�� � �!9%K8� <(� <�#��)H 9�� �&I����F���J#��8#!�@���8I����F���J#��&�F��H 9�� D�� ��' ,�+�� K"�+' � ����F��� H 9�� D�� ��' ���7965�' ' �BR

/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � �J �� ".#����@' #Q� � ��9�K&� <(� <�#�� / #����(' #Q� � �!9!�&#Q� �5�,�+�' �=D��!9��F#Q�Q�&� ' ��<���� *��� "2���9 ���JK+���� %�!"$"�� �%#�'�" #�D���� �$#Q<@��� � ���� ���J#��&�.�7� 9�� D!� ��' �

�Q�&� � N�5O� 9�E�������' ��� E�#�K8��5�' ��� � � !�+�' � ��!�)����H 9�� D�� ��' ��� � ��' �!�@�O#QK8��5O' �&I����$����H 9�� D�� ��' �

0� � �

0

� � �0

Page 33: Jsp servlets j2_ee

1 �����%! - $ � !��$'& � �

A finalização de um Servlet deve ser tratada através da implementação do método��/�# � - ( � : no instante em que o Servlet é “descarregado”, seu método ��/�# � - ( � , se tiver sidoimplementado, é chamando, permitindo a execução de rotinas de finalização (comopor exemplo, o encerramento de conexões com bancos de dados, finalização dethreads que tenham sido lançados etc.).

A assinatura do método �./�#�� - ( � ��� é a seguinte:

Assinatura do método “destroy ()” !5ON�' � D����!� E�E�#�"$�)�)��$ ���+�

Utilizando nosso exemplo de cadastro de clientes, temos a seguir um exemplo de nossoServlet � /"- � �#� ',��� (�%�� � com os métodos � %!� ����� e �&/�# � - ( � ��� implementados:

Inicialização do Servlet “VerificaConBD”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.� ��#!� � K&� D����4D���9�#�� ���7D��%��N���96DQ�JE�#7E6�QE���"���' ��9�G����&*O�F#��QE�3%56#���#��.� K8� DQ�7"$�8�Q�&5�"4E��:D��%9%#�� ���� �#��.� ��E�� DQ����#�9��F# !5ON�' � D:D�' ��"." � #��.� K&� D�� � ��9 �.�L#Q�Q�F#!9�E�" >(�+�) / #!�)��' #���� �� �' #!�L#!9!�&" P�5�969���N�' #7R

-.- P�#�K8#!� � 96D�� �:���J�&*��)#!�QE�3�5�#�� �.; K8��M�#�� �L��#��.� K � DQ��G ���JE��:D��!96#������? *��F#���E$� ? *��F#���E � #��.� K �7965�' ' �

-.- H 9�� D�� ��' � M��QG ���JE�� / #����(' #Q� �5�N�' � D��O�!� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B".#��F��' #�� � �!9%K � <�� �&*O�F�� " / #��)�6' #�� ���QD�#� ��&� �!9�R

"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

-.- C���9�G���9�E�� ? *��$#��QE � � �� ? *��.#��QE � #��2� K5�79%#� ?B*O�F#���E�� �&*�� " �+�� ? *��.#��QE � #��2� K&� "F�F���F�5������ � �

0

-.- ����#�D!5�G����JE��J�&*��F#��QE �5�N�' � D��O�!� E � 5�9����BR

*�� ' #� � ?B*��)#��QE � #��.� K59 �J9�5�' ' �BR� K!��9 � �!9���@� ���>���!�BR

� � �0

00

-.- ��� 9���' � M��QG ���JE�� / #����(' #Q� �5�N�' � D��O�!� E�E6#�"$�)�F��$ ���R

� ? *��.#��QE � #��2� K5�7965�' ' �0

Page 34: Jsp servlets j2_ee

� � �0

No exemplo, o método �./�#�� - ( � ��� serve para indicar que o thread deve ser finalizado: aatribuição do valor %"$ � � à variável � � � -�/ � � � /"- � � faz com que o looping principal do método-�$ % � � seja finalizado.

1 � � ��� ) - ! � )*-� � )�� ) ���,! + ! &(*),+Conforme descrito anteriormente na seção sobre o ciclo de vida de um Servlet, entre asfases de inicialização e finalização, existe uma fase onde o Servlet irá, efetivamente,atender as requisições recebidas.

No caso da classe �/"% /�- � '���/"-�� � /�� , que é a classe utilizada para Servlets genéricos (classe-paipara a classe � �������/"- ��� /&� , que atende requisições HTTP), o método relacionado a essa faseé o método #)/"- � � ',/ ��� .

Assinatura do método “service ()” !5ON�' � D ���!� EJ"2#����@� D�#��8� �Q��� �!� ".#����@' #Q�.� / #!�&�(' #��&P�#�3%5%#�"$�� �� �F#�3�5�#�"$���

� � ��� �!� ".#����@' #Q�.� / #!�&�(' #��)P�#�"2 ��!9%".# � �.#�", ��!96".#��+�Assim, para cada requisição recebida de um cliente, o ServletContainer efetua umachamada a esse método # /"-�� � '�/ ��! ! ! � do Servlet; os parâmetros desse método sãoreferências para um objeto que encapsula a requisição recebida e para um objeto queencapsula 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 método; em vez disso, para classes queextendam a classe � ������ /�-���� /�� , você deverá implementar um ou mais dos seguintesmétodos: ��( � /!� /.��/ , ��(�� /.� , ��( � ��� � ("% # , �&(���(.# � , �.( � $�� ou ��( � - ��',/ .Assinatura dos métodos de atendimento de requests da classe

HttpServlet !5ON�' � D ���!� EJE����B#�� �+� �����Q��� ".#����(' #Q�.� *��+�& �� >6�+�& / #�����' #Q�&P6#�3�5�#�"F�� �� �$#�3�5�#�"F���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#��� !5ON�' � D ���!� EJE��!I%��"F� �+� �Q��� �!� ".#����(' #��)� *��+�) �� >6���& / #�����' #Q�&P�#�3�5�#�")�� �� �$#�3�5�#�"F���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#��� !5ON�' � D ���!� EJE��� #!' #Q�8#��� �Q���Q��� " #!�)��' #��&� *%�+�& �� >(�+�& / #����(' #��&P�#�3�5�#�"$�� �� �F#�3�5�#�".���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#��� !5ON�' � D ���!� EJE��!I�5%���+� � ��� ��� ".#!�)��' #Q�&� *��+�& �� >(�+�& / #��F��' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#��� !5ON�' � D ���!� EJE����1 Q�.� ��9�" �+� � ���Q��� " #!���(' #Q�.� *��+�& �� >6�+�) / #��F��' #Q�&P%#!3�5�#�"F�� �� �$#�3�56#�"F���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#��� !5ON�' � D ���!� EJE���? �F��DQ#��+� � ������� "2#��F��' #��&� *��8�& �� >(�+�& / #��F��' #��&P%#�3�5�#�"F� �� �)#!3�5�#�".���

� � ��� �!� ".#����@' #Q�.� *��+�. �� >6�8�& / #%�&�(' #��)P�#�"2 ��%9%".# ���F#�"2 ��!9%".#���

Quando uma requisição HTTP é recebida por uma classe que estende HttpServlet, seumétodo # /�- � � ',/ ��� é chamado, sendo que a implementação default desse método iráchamar a função ��(������ ��� correspondente ao método da requisição recebida. Ou seja,caso uma requisição com método � ��� , por exemplo, seja recebida (vide seção 3.2,sobre o protocolo HTTP), o método �&(�� /.����� implementado por você será chamado.

Page 35: Jsp servlets j2_ee

Geralmente, desenvolvedores de Servlets implementam somente os métodos �&(�� /.����� e��(���(&#�� ��� ; os métodos restantes só são implementados em casos especiais, e requerem umconhecimento mais avançado por parte do desenvolvedor. Por ora, estaremosutilizando o método �&(�/������ ; nos capítulos seguintes demonstraremos com mais detalhesalguns dos outros métodos (principalmente, o método �&(���(.# ����� ).Um exemplo simples de implementação do método �.(� /.� ��� pode ser observado a seguir:

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

-.-0/ #����(' #�� ����.�J �; <(� 96�:>O#�' ' ��� �!�$' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$���

>(�+�& / #����@' #Q�.P�#�"Q ��!9�"$# �� �$#�"Q ��!9�" #� �.*��.�� " H �����QD�#� ��&� ��9�RI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9�����>@#!' ' � � ���.' E 9 ,�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

00

1 ��� ��� -'#���� ��� -# !"$ -� $ � ) - ! � ) - � � ,) � )4���! + ! &(*),+Durante o ciclo de vida de um Servlet, o ServletContainer irá fazer a carga de umServlet instanciando um único objeto e chamando seu método � %!� ����� ; a finalizaçãotambém é efetuada chamando o método �./�#�� - ( � desse objeto.

Na fase de atendimento de requisições, por outro lado, o método # /�- � � ')/ ��� (e,consequentemente, os métodos ��( � ����� � , no caso de Servlets HTTP), são chamados namedida em que são recebidas as requisições, ou seja, pode haver, em um determinadoinstante, um ou mais threads do ServletContainer executando métodos # /�- � � '�/ ���simultaneamente.

Page 36: Jsp servlets j2_ee

�Figura 3.3 � Concorr ência no atendimento de requisições.ê

Por isso é muito importante que você se preocupe com acesso a variáveis de instânciaou classe e concorrência no seu desenvolvimento (maiores detalhes sobre esses tópicospodem ser obtidos, por exemplo, no livro Aprendendo Java 2, da Editora Novatec).

Nesse sentido, uma opção para garantir a execução livre de problemas deconcorrência é a implementação da interface ��� %"0 � / ���"- /&� ����(���/� em seu Servlet.

Essa interface não define, na verdade, novos métodos ou variáveis de classe, ela servesomente para indicar ao ServletContainer que o atendimento de requisições do Servletem questão deve ser feito de forma a serializar as chamadas ao método # /�- � � '�/ � � . Ouseja, somente uma requisição será atendida por vez pelo seu Servlet.

Exemplo de Servlet que implementa a interface “SingleThreadModel”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#��8�%�$9��: �; <=� 9��:>@?BA�C:D��!� � 9����J#��F�JE�#-.- �$#�3%56� "2� G �%#�"0�F#�D�#�N�� E6�Q" �Q�!#�� �J���J#!9��F� !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!��� #��Q�8#�9�E�"0>6���) / #����(' #Q� � �� �' #��J#!9!�&" / � 9�<@' #�? *��)#��QE�A4�!E�#�'�R

-.- � ��9��8��E!��� E!��"0�$#�3�56� "2� G �!#�"0�F#�D�#�N�� E6�Q" �� � ��� �8# � 9�� � � �!9%�8�QE��!��� �B�

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".# ���.#�", ��!9%"2#��@�.*��$�� "0H �����QD�#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9�����P�#�3�5�� "2� G ��#�"0�$#�D�#%N�� E��Q" ��� ( H 9!�&#Q<O#%�$� �&� / �.�.� 9�< ��(�($� � ��9��8��E!��� ���+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

0

No exemplo anterior, o Servlet utiliza uma variável de instância ���(�%.�����.("- e, por isso, há anecessidade de se preocupar com a concorrência no acesso a esta variável.

Imagine, por exemplo, que esse Servlet não implemente a interface ��� %�0�� / ���"- / � ��� (��&/�� , ereceba duas requisições simultaneamente: o primeiro ��(�/������ poderia incrementar ocontador, seguido do segundo �&(�/������ incrementando o contador, seguido dos doisthreads, cada um por sua vez, imprimindo o valor do contador. Nessa situação, omesmo valor de contador seria impresso nas duas páginas HTML resultantes.

Resultado da primeira requisição��>�?BA�C��������������P�#�3%56� "2� G �!#�" �.#�D�#�N�� E��Q"�� � - ����������� - >�? A0C��

Resultado da segunda requisição

Page 37: Jsp servlets j2_ee

��>�?BA�C��������������P�#�3%56� "2� G �!#�" �.#�D�#�N�� E��Q"�� � - ����������� - >�? A0C��

Obviamente a implementação dessa interface tem um custo na performance deexecução do Servlet, pois, no Servlet anterior, por exemplo, não só o acesso a variável���(�%.��� �&(�- é serializado, mas a execução do método �&(�� /.����� como um todo. Em particular, aexecução dos códigos de geração do header e do footer HTML não precisariam serserializados, mas são.

Por isso, em vez de implementar esta interface, na maioria das vezes é maisconveniente implementar diretamente um código de sincronização nos trechos queprecisam ser serializados. O Servlet � /�- ��� /�� �(�%&��� ��(�- , por exemplo, poderia ser implementadoda seguinte forma (com exatamente o mesmo resultado):

Exemplo de Servlet que substitui a implementação da interface“SingleThreadModel” por código de sincronização� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#��8�%�$9��: �; <=� 9��:>@?BA�C:D��!� � 9����J#��F�JE�#-.- �$#�3%56� "2� G �%#�"0�F#�D�#�N�� E6�Q" �Q�!#�� �J���J#!9��F� !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!��� #��Q�8#�9�E�"0>6���) / #����(' #Q��R

-.- � ��9��8��E!��� E!��"0�$#�3�56� "2� G �!#�"0�F#�D�#�N�� E6�Q" �� � ��� �8# � 9�� � � �!9%�8�QE��!��� �B�

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".# ���.#�", ��!9%"2#��@�.*��$�� "0H �����QD�#� ��&� ��9�R

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%�I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- * �2�J�,M!#!9���9�E��L���!' ��� E��7D��!9%�8��E��!� #�� 5��J�4����� � ;Q��#�'�' ��DQ�!'O5�"$��9�E��7"Q� 9�D��F�!9O� M���G ���� 9%��' �BDQ��9��8��E��!� �" $�96D�*��$�!9�� M�#!E�� �&*�� " �BR

' �=D��!9��F�QE��!��� (�($� � ��9��8��E!���2�0

-.- H �� ��.� ��� 9�E��:9 �6�J#!�F�JE�# �$#�3%56� "2� G �!#�"0�$#�D�#�N�� E6�Q" # �F��E��� �#' � � � ��.� 9!�)' 9�����P�#�3�5�� "2� G ��#�"0�$#�D�#%N�� E��Q" ��� ( H 9!�&#Q<O#%�$� �&� / �.�.� 9�< �+' �=D��!9��8�QE6�!� �����' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

0

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

Page 38: Jsp servlets j2_ee

Além dos métodos �&( � ����� � , � %!� ����� e ��/&# ��- ( � ��� , você também pode implementar o método0�/�� ��/�- ��� /�� % ��( ��� de um Servlet.

Assinatura do método “getServletInfo ()” da classe HttpServlet !5ON�' � D / �.�2� 9�<�<(#�� / #!�)��' #��&H 9%K+� �����

A implementação desse método deverá retornar um texto contendo informaçõesgerais sobre o Servlet desenvolvido, como por exemplo, o autor, versão e informaçõesde copyright de seu Servlet.

Implementando esse método para o nosso Servlet � /!� � (�� ("- � � , temos:

Servlet “HelloWorld” com implementação do método “getServletInfo()”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.�J �; <(� 96�:>O#�' ' ��� �!�$' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#

���.#�", ��!9%"2#��@�.*��$�� "0H �����QD�#� ��&� ��9�RI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9�����>@#!' ' � � ���.' E 9 ,�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- P�#��&���.9���9%E!�J� 9!K8�!�.�J��G ��#�"4".��N!�$#J#!" ".# / #!�)��' #Q� �5�N�' � D / �)� � 9�<�<@#�� / #��)�6' #��&H 9%K �/���R

�.#��)5��$9>� * 5%�8�!�*��* 5��F�!�$#�"�E�� ' � ���F��� � #%�$" �%�!� � � +�0

0

Caso você não implemente esse método, um texto vazio será retornado pelaimplementação “default” desse método.

Page 39: Jsp servlets j2_ee

� ����� ����� �

��� � � � � � � � � � � � ��� � � � � � � �

Embora já tenhamos visto um pouco sobre o funcionamento da geração de umaresposta simples de um Servlet, estaremos neste capítulo analisando esse processo maisa fundo e apresentando algumas funcionalidades mais avançadas.

� � ��� ) � $,&�� � ,) + $�� $ 5����0+ ! �.� �"),+Quando o Servlet recebe uma requisição, sem método ��( � ����� � é chamado com doisparâmetros: uma referência a um objeto da classe � ��� � �&! # /�- ��� /���! �������"! �"������ /�-���� /���� / �.$ /&# � , queencapsula a requisição recebida, e uma referência a um objeto da classe� � � � � ! # /�- ��� /.��! � ����� ! � ����� � /�- ��� /.� ��/.#)��("%&# / , que encapsula a resposta do Servlet.

�Figura 4.1 � Atendimento de uma requisi ção por um Servlet.ç ã

Sendo assim, a manipulação da resposta do Servlet passa, na verdade, pelamanipulação do objeto dessa classe � ��� � ��! #)/�- ��� /.� ! ������� ! � �������/�- ��� /.� ��/.#)� (�%&#�/ .Para gerar uma saída simples, por exemplo, você deve utilizar o método 0�/&�� - � � /"-���� desseobjeto. A chamada desse método irá retornar uma referência a um objeto da classe� � � � ! � ("! ��- � %.��� - � � /�- , que encapsula um stream de saída para um conteúdo do tipo texto. Essestream deve ser utilizado para enviar a resposta de seu Servlet para o cliente queenviou a requisição.

Assinatura do método “getWriter ()” !5ON�' � D7� ������� � �!� I��.� 9���� �.� �8#��1<@#Q��� �.� �&#�� ��� �.*��.�� "0� �Q���!� � ��� H �����,D�#! ��)� �!9O�

Embora a análise dos métodos dessa classe fuja um pouco ao escopo deste livro (trata-se de uma classe do próprio core Java), é interessante apresentar alguns de seusmétodos aqui.

Page 40: Jsp servlets j2_ee

Os métodos �"- � %�� ��� e �&- � %&�,� % ��� dessa classe, por exemplo, podem ser utilizados paraadicionar Strings ao stream de saída do Servlet; como a saída é mantida em um bufferpor questões de performance, você pode também utilizar o método ��� $�#)� ��� para forçar aliberação desse buffer de saída, fazendo que o conteúdo da resposta definido porvocê seja imediatamente enviado para o cliente.

Exemplo de geração de saída simples de Servlet� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.�J �; <(� 96�:>O#�' ' ��� �!�$' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#��

�&*O�F�� "0H � ����DQ#� ��&� ��9�RI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!� � �!�Q>@?BA�C��������������� ��+�' � � � ��.� 9!� � �8>O#�' ' �=� ���.' E�9 ��+�' � � � ��.� 9!�)' 9�� �!� - ����������� - >�?BA�C��� �8�' � � � K8' 56"2*/���+�

0

0

Assim, nesse exemplo, utilizamos o objeto da classe � � � � ! � ("! �"- � % ��� - � � /"- para adicionar umconteúdo texto (no caso uma página HTML) ao stream de saída do Servlet. A respostarecebida pelo cliente será justamente essa página HTML.

Se você observou o exemplo anterior com cuidado (e, na verdade, todos os exemplosanteriores que incluiam algum método �&( ����� ��� ), você percebeu que o método �&(�/�� ��� foideclarado de maneira a possibilitar o lançamento de uma exceção ����� �"! � (�! � � �"'�/ ��� � (�% : essaexceção pode ser lançada pelo método 0 /.��� - � ��/"- ��� caso haja algum problema geraçãode saída do Servlet.

Outra opção de implementação para o Servlet � /!� � (�� ("- � � seria, portanto:����#!�� �' �:E�#L<�#��.�QG ���JE�#J"2� � E��:"Q� �� �' #�" E�# / #%�&�(' #�� DQ����D��� ��&5��)�:E�#J#��QD�#�G����!�� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #�<(5�9�E��:� �� �' #!�J#�9��8�QG ���7E�� / #!�)��' #��� ����F�7 �; <=� 9%� > #!' ' ��� �!�$' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R

�)� $ RI�� � 9���� �.� �&#�� ' � ���7 �� �$#�"Q ��!9�" #!� <(#���� �.� �F#!� �����' � � � !�$� 9����,�!�Q>�?BA4C��������������� !�+�

Page 41: Jsp servlets j2_ee

' � � � !�$� 9����,�8>O#!' ' � � �!� ' E�9 ,�+�' � � � !�$� 9��&' 9����!� - ����������� - >�? A�C��� !� �' � � � K ' 5�"2*/���+�

0 D����&D�* �H ���%�,D�#! ��)� �!9 ��B# �1R/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(�F9 ��� K8�!� ���"."�� ��#�'=5��.� ' � M���� � �)#�K8#�� � 9�D�� �B���1��N�� #��8��I�� � 9���� � � �8#�� ,�+�

00

0

Dessa forma, podemos capturar e tratar a exceção ����� �"! � (�! � � �"'�/ ��� � (�% caso ela ocorra,gerando, por exemplo, uma mensagem de log.

Mais detalhes sobre essas exceções lançadas durante o processo de geração da saídado Servlet, incluindo suas possíveis causas, são apresentadas ao longo das próximasseções desse capítulo.

� �&� )'$ ,)�� + $ � ),+ ��� + � $ 5 5>8Conforme apresentado na seção 3.2 deste livro, a resposta a uma requisição HTTP écomposta de diversos elementos, sendo que alguns desses elementos são headers(cabeçalhos) HTTP.

Exemplo de resposta HTTP do Servlet “HelloWorld”>�? ? I - � ��� ���/ #��F��#�� � *� ��QD�*�# - � % � �� � " 9�� ��C���"F� �8A���E�� K8� #�E)� / 5�9 � � � #!D ��� �� � ��� � ��� �A ?� �!9%�8#!9%�,� ?'$� �#���8#��Q� - *��&� '� �!9%�8#!9%�,�8C6#!9!<��&*)� � �

��>�?BA�C��������������Q>O#�' ' � � ���.' E 9 � - ����������� - >�?BA�C��Embora alguns headers sejam adicionados por default pelo “ServletContainer”, comono caso da resposta do Servlet “HelloWorld” acima, podem haver situações em quevocê queira definir ou modificar seus próprios headers HTTP, e para fazer isso, você deveutilizar o método “setHeader ()”.

Assinatura do método “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 não deve ficar armazenadaem nenhum cache (armazenamento temporário) do browser do usuário, nem emnenhum proxy, podemos definir alguns headers adicionais especiais por meio doseguinte trecho de código:

Headers para evitar cacheamento da resposta de um Servlet !5ON�' � D����!� E�E����B#�� �B>O���& / #��F��' #��&P�#�3�5�#�"F�� �� �$#�3�5�#�"F���O>6�8�& / #����(' #��&P�#�"2 ���9�".#� ���.#�", ���9�"2#&� R

� � � �� �$#�"Q ��!9�" #!� "2#��&>@#��QE�#!� � � � ��D�*�#� � �!9%�&�$�!' ,� ��9���+D���D�*6#�O��5�".�,���.#����!' � E�� �8#� ���� �� �$#�"Q ��!9�" #!� "2#��&>@#��QE�#!� � �8I��F� <@�J� ����F9���8D��QD!*�#� )�+�

Page 42: Jsp servlets j2_ee

�� �$#�"Q ��!9�" #!� "2#��&>@#��QE�#!� � �!�%�� �� �F#�"� !���&A4��9�� �� ;�5O' ��� � � � � ����� ���+� A ? �8� �� �$#�"Q ��!9�" #!� "2#����@� �8#�>O#��QE�#%� � �FC��Q"$�,�FA4��E�� K � #�E� ,� / $�"F�&#���� D�5��.�F#�9�� ? � �J#!A�� ' ' � " �,���+�� � �

0

Nesse código, o header “Expires” indica a data de expiração, o header “Last-Modified”indica a data de última modificação, e os headers “Cache-Control” e “Pragma”indicam o tratamento que o documento (ou seja, a resposta do Servlet) deve receberse houver cacheamento.

Com a inclusão do código anterior, a resposta do Servlet passa a ser:

Exemplo de resposta HTTP do Servlet “HelloWorld” com headersadicionais>�? ? I - � ��� ���/ #��F��#�� � *� ��QD�*�# - � % � �� � " 9�� ��� ��D�*6#!� � ��9%�&�.��' �O9��(�+D���D!*�#�����56"F�,���.#����!' � E�� �8#I!�$� <(�J����96�!��D���D�*6#���! �� �)#�"���A��!9�� �� ;(5�' ��� � � � � ����� ���+� A ?C���"F� �8A���E�� K8� #�E)� / 5�9 � � � #!D ��� �� � ��� � ��� �A ?� �!9%�8#!9%�,� ?'$� �#���8#��Q� - *��&� '� �!9%�8#!9%�,�8C6#!9!<��&*)� � �

��>�?BA�C��������������Q>O#�' ' � � ���.' E 9 � - ����������� - >�?BA�C��Uma observação muito importante é que essas adições / modificações de headersHTTP devem acontecer antes da geração do conteúdo da saída, para garantir aordem dos elementos da resposta HTTP (ou seja, primeiro status, depois headers e, porfim, conteúdo). A alteração de um header após a escrita de parte ou de todo oconteúdo pode gerar uma exceção � ��� �&! � � % 0 ! � � / 0&� � ������� / � ��')/"� �,� ("% e interromper o processo degeração da saída do Servlet.

Assim, o código completo para o Servlet � /!� � ( � (�- � � sem cacheamento pode ser escritocomo:

Servlet “HelloWorld” com headers para evitar cacheamento da página� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- ? #��FD�#�� �$�7� � �' #!�J#�9��8�QG ���7E�� / #!�)��' #Q�� ����$�7 �; <=� 9%� > #!' ' ��� �%�$' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R

�)� $ R

-$- I��Q" ".� �� �@#�K&� 9�� 9�E�� *%#���E�#��F" ���.#�", ��!9%"2#�� " #Q�&>@#��QE�#!� �!� � ��D�*�#� � �%9!�)�F��' ,� ��9��!��D���D�*6#�O��5�"F�����.#�����' � E��Q�8#� !�+� ���.#�", ��!9%"2#�� " #Q�&>@#��QE�#!� �!�+I��F� <@�J�� !����9���8DQ��D!*�#� ,�+� ���.#�", ��!9%"2#�� " #Q�&>@#��QE�#!� �!�!�!�� �� �$#�"@ ����8A4�!9 � �� ;�56' ���� � � � � ����� ���/�BA0? ,�+�

Page 43: Jsp servlets j2_ee

���.#�", ��!9%"2#�� " #Q���@� �F#!>O#��QE�#�� ���8C��Q"$�,�8A ��E�� K&� #�E� �� / $�"$�8#!� � D�5�� �F#�9���? � �J#�A�� ' ' � " ���,�+�

-$- I��Q" ".� � �=#��$��9�E��7�� �; <(� 9���E�#��F#�"Q ���"F�F�I�� � 9���� �.� �&#�� ' � ���7 �� �$#�"Q ��!9�" #!� <(#���� �.� �F#!� �����' � � � !�$� 9����,�!�Q>�?BA4C��������������� !�+�' � � � !�$� 9����,�8>O#!' ' � � �!� ' E�9 ,�+�' � � � !�$� 9��&' 9����!� - ����������� - >�? A�C��� !� �' � � � K ' 5�"2*/���+�

0 DQ�Q�&D�*��H � ����DQ#! !�&� ��9� ��=#/� R/ #��F��' #Q� � ��9��8#��2��' �=D��%9!�8#�� �5� <(#�� / #!�)��' #�� � ��9��8#��Q�5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F��.9 ���K8���2 ���"2" � ��#�'��!N��8#�� �F#�K8#!� � 96D�� � ���J�%N�� #Q�F� I��.� 9���� �.� �8#�� !�+�

00

0

Se você observou atentamente o código para a modificação dos headers, você deveter reparado no uso de um método # /�� � ����/ �"/&���./"-���� : esse método é, na verdade, umavariante do método # /�� �&/"� �./�-���� que simplifica a definição de um header com uma data.Assim como esse método, existe um outro método # /.� %.� �"/"� �./"-� � para a definição deheaders que contenham valores inteiros.

Assinaturas dos métodos “setDateHeader()” e “setIntHeader()” !5ON�' � D����!� E�"2#���� � �&#!>O#��QE�#�� �+� � ����� ' ��9�<(� / �&�$� 9�< �� *6#��QE6#!� & ����#��6' ��9�< ��BE!���8#��� !5ON�' � D����!� E�"2#��&H 9��&>O#��QE�#�� �+� ���%��� ' ��9�<(� / �)�.� 9�< �� *�#���E�#�� & ���J#��' ��9�< �� � 9����+�

O segundo parâmetro do método # /�� � � ��/ �"/&���./"-���� deve conter o número de milisegundosdesde “epoch” (meia-noite, do dia 1º de Janeiro de 1970); o método '.$&- -�/�%&� �� * /��'� � � � # ��� doobjeto ��� ���&! � � %�0&! � � # � /&* retorna esse valor para o instante corrente.

Além dos métodos anteriores, existe o método '�(�%.����� % # � / ����/�-���� , para verificar se um headerjá foi definido, e os métodos � ��� � /&� �&/"-���� , � ��� � ����/ �"/&���./"-� � e � ��� %&� � /"� ��/�-���� que permitem a adiçãode mais de um valor para um mesmo header.

Assinaturas dos métodos “containsHeader()”, “addHeader()”,“addDateHeader()” e “addIntHeader()” !5ON�' � D7N�����' #���9�D��!9%�8��� 9�"2>O#��QE�#%� �+� �Q����� ' ��9!<(� / �)�.� 9�< �� *�#��QE�#�� & ���J#�+� !5ON�' � D����!� E���E�E�>O#���E�#!�@�+� ���%��� ' ��9�<(� / �)�.� 9�< �� *�#��QE�#!�*& ���J#�F� � ���!� ' ��9�<@� / �&�.� 9!< �� *�#��QE�#!� � ��' 5�#��+� !5ON�' � D����!� E���E�E��O� �F#!>@#��QE�#!� �8� � ����� ' ��9%<�� / �&�.� 9�< �� *6#��QE�#�� & ����#���' �!9%< �� E��Q�8#��8� !5ON�' � D����!� E���E�E�H 9��&>O#��QE!#�� �+� �Q����� ' ��9�<@� / �.�.� 9!< �� *�#���E�#%� &=���J#���' ��9�< � � 9!���+�

Podemos usar o método “containsHeader()” para verificar, por exemplo, se o header“Content-Type” já foi definido, e defini-lo em caso negativo:

Servlet “HelloWorld” com definição do header “Content-Type”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-�� 5%���F�8�7� �� �' #��J#!9��8�QG ���JE�� / #��F��' #Q� ����.�J �; < � 9��:>@#�' ' ��� ���.' E !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E7#�� �&#!9%E�" >O�+�. / #��F��' #���R

Page 44: Jsp servlets j2_ee

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R

�)� $ R-$- I��Q" ".� � �O#�K � 9�� 9�E��7*�#��QE�#��F"� K!��9 ���F#�"Q ��!9�E6#!� D��!9��8��� 9�" >O#��QE�#�� ��� � �!9%�8#!9�� � ?'$� �#� ,���

�� �$#�"Q ��!9�" #!� ".#��)>O#���E�#!� �,� � ��9��8#!9%�,� ?'$� �#� !� � �&#��Q� - *��&��' !�+�

-$- I��Q" ".� � �=#��$��9�E��7�� �; <(� 9���E�#��F#�"Q ���"F�F�I�� � 9���� �.� �&#�� ' � ���7 �� �$#�"Q ��!9�" #!� <(#���� �.� �F#!� �����' � � � !�$� 9����,�!�Q>�?BA4C��������������� !�+�' � � � !�$� 9����,�8>O#!' ' � � �!� ' E�9 ,�+�' � � � !�$� 9��&' 9����!� - ����������� - >�? A�C��� !� �' � � � K ' 5�"2*/���+�

0 D����&D�* �H ���%�,D�#! ��)� �!9 ��B# �1R/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(�F9 ��� K8�!� ���"."�� ��#�'��!N��F#!�=�)#�K8#�� � 9�D�� ���� ��N�� #��8� I�� � 9���� �.� �&#�� ��+�

00

0

A função desse header �(�%�� /�% � � � � ��/ é informar o tipo do conteúdo que está contido naresposta, para que o browser (ou dispositivo cliente que está fazendo o acesso) saibacomo esse conteúdo deve ser interpretado e apresentado.

Nos exemplos anteriores esse header não foi definido explicitamente em código: nessescasos, o ServletContainer automaticamente define seu valor como � / �"� �,����* � . Esse valorindica que o conteúdo deve ser interpretado pelo browser como uma página HTML.

Outro header que é definido automaticamente pelo ServletContainer, caso odesenvolvedor não o defina explicitamente, é o header � (�%.� /"% � � ��/�%"0 ��� . Esse header indica otamanho em bytes do conteúdo contido na resposta.

Podem haver casos em que seja necessário se alterar esse comportamento “default”:nesses casos, o desenvolvedor pode utilizar os métodos # /�� ����� � / � �./�- ��� apresentadosanteriormente, ou o método # /&� � (�%.� /"% ���,/�%"0���� ��� diretamente.

Assinatura do método “setContentLength()” !5ON�' � D����!� E�"2#�� � �!9%�8#!9%�&C�#!9�<6�&*��B� 9%� � DQ��9��8#!9%�&C�#�9�<��&*/�+�

� �&� � ) � $'& � � ,) ��� � � � + � !"� � + ,) + $ � $,+Conforme mencionado no na seção anterior, o header � (�%.� /"% � � � � ��/ serve para indicar otipo do conteúdo contido na resposta do Servlet. Dessa maneira, o valor ��/ � ��� ����* � indicauma página HTML, o valor � * �&0�/ � ����/&0 indica uma imagem JPEG, e assim por diante.

Devido a sua importância, existe uma função especial utilizada para a definição dovalor desse header.

Assinatura do método “setContentType()” !5ON�' � D����!� E�"2#�� � �!9%�8#!9%� ? $� �#�+� �Q����� ' ��9�<@� / �.�.� 9!< ��=D���9��&#�9�� ?'$6 �#��+�

Page 45: Jsp servlets j2_ee

Embora a geração de uma saída HTML seja a situação mais comum, podem haversituações em que você deseje gerar outros tipos de saída. Nesses casos, você deveutilizar o método #)/�� � ("%.� /�%.� � � � / para especificar o tipo do conteúdo desejado.

Assim, podemos usar o seguinte trecho de código para retornar uma imagem JPEGcontida em um arquivo:

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

-.-0/ #����(' #�� ����.� <(#��.�QG ���JE�#7" � � E��:D������ �J� <�#!� ;6I���� !5ON�' � D:D�' ��".":H �J� <@# / #����(' #�� #��Q�8#!96E�"0>O�+�& / #�����' #Q��R

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R��� ' #�H 96 !5�� / �&�$#�����' � � �J� <�# ��� ' # �J9�56' ' ��)� $ R

-$- �O#�K8� 9O� 9�E��:�J�.� ���E��7D���9��&# ��E�� ���.#�", ��!9%"2#�� " #Q� � ��9��8#�9�� ?�$� �#��!��� �J� <�# - � �#Q<. !�+�

-$- �N��&#�9�E��7�����F3�5�� ���7D��!����� �J� <@#!� ;6I���� �� ����F�&� � E���"� ���� ���J#��)�F��"-$- E�#�� 9�� D�� �!' � M���G ����E�� / #����(' #��' � � �J� <�# �O� ' # �796#� �6� ' #!H 9� �5�� / �&�.#����/� <�#Q� / #�����' #Q� � ��9�K8� <

�!�+� <�#��&H 9�� �&I��!�F���J#��&#!� ��� ;6 �#�< ��� ' #!9����J#� !���+�

-$- C%#!9�E��J��D��!9%�8# �6E��7E�#�5�� �!�$3�5�� ���JDQ��9��&#�9�E�� 56�J� � ��� <�#�� #-$- �)#��8���.96��9�E��:#�"$�8#�D��!9%�8# �6E��7DQ���J���.#�", ���"F�F�/ #��F��' #Q��� 5!�& !5!� / �&�$#�����' �=��"3�J �� �$#�"Q ���9�" #!� <O#��!�5��& �5�� / �&�$#���� ���8�N $��F#���� ' � N�5�K+K+#�� �J9�#� N�$��F#�� � � �+�� 9�� ' � N�$��&#�"3� �B�

*O� ' #���+' � N $!�F#�" �7' � � �J� <@# �6� ' #�� �$#��QE �+' � N�5�K+K #�� ��� 9 � � �' �=��"2� �.� �8#�+' � N�5�K K8#!�@�)� ��' � N $��&#�"'�+�

-$- �6� 9���' � M���96E��7 ��.��DQ#�"." �7E6#:<@#��F��G����JE!#�" � � E��:#JK8#�D�*���9�E��J�����.3�5O� ���' �=��"2� K8' 5�"Q* �,�+�' � � �J� <�# �O� ' #!� D�' ��".#/���8�

0 D����&D�* �+H �����QDQ#� ��)� ��9� ��=#��R�.� $ R

� K"��' � � ��� <�# ��� ' # 9 �79�56' ' �B' � � �J��<�# �6� ' #�� D�' ��".#/�!�+�0 D��Q�FD�* ������DQ#� ��)� �!9� ��=# � R 0/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(��9 �%�:K8���@ ���" "�� ��#!'O' #�� � �J� <�#�� E�#7���F3�5�� ��� ,�+�

00

0

Page 46: Jsp servlets j2_ee

No exemplo anterior, você poderá observar também a utilização do método0�/�� � $ ���&$ � ����- / �&* ��� . Esse método deve ser utilizado, em substituição ao método 0 /.��� - � ��/"- ��� quefoi usado nos exemplos anteriores, para obter uma referência a um stream de saídabinária do Servlet.

Assim, quando você desejar que seu Servlet retorne um conteúdo binário (não-texto),como uma imagem JPEG no código anterior, você deverá utilizar esse método0�/�� � $ ���&$ � ����- / �&* ��� , e obter uma referência a um objeto da classe ����� � ��! # /"-���� /���! ��/"- ��� /.� � $�����$�� � � - /&��* .

Esse stream “ServletOutputStream” extende, na verdade, a classe � ��� � ! � (�! � $����.$�� ����-�/ ��* e,sendo assim, herda os diversos métodos � - � � / ��� e o método ��� $�#)� ��� da classe-mãe.

Assinaturas dos métodos “write()” e “flush ()” !5ON�' � D����!� E& �.� �8#��+N $��8#���� �� N�$��F#�*��.�$�*$ �8� !5ON�' � D����!� E& �.� �8#��BN�$��8# � �1 �� N $��8#�* � �F�*$��O� 9%� �� ��K+K8".#������ 9�� �� ' #�9�<��&*/�+� !5ON�' � D����!� E& �.� �8#��B� 9!�� �� N $��8#/�8� !5ON�' � D����!� EJK&' 56"2*����+�

Obviamente, a utilização dos métodos anteriores e até mesmo a obtenção dessestream de saída binária do Servlet podem gerar exceções do tipo ��� ���&! � ("! � � ��'�/&� � � (�% , emsituações em que o usuário que está operando o browser aperta o botão ��� (&� , antes detodo o conteúdo gerado pelo seu Servlet seja enviado, por exemplo. Por isso éimportante que você se preocupe em capturar essas exceções, e fazer os tratamentosnecessários caso isso ocorra.

� ��1 � ) � $ - �� # � -� ) � ��� ���Dentre os diversos tipos de conteúdos que podem ser gerados como resposta de umServlet, apresentamos aqui, como mais um exemplo, a geração de documentos XML.

Documentos XML são normalmente usados para estruturar um conjunto de dados demaneira simples, bem-definida e eficiente. Um exemplo de documento XML já foiapresentado no íçãçãCapí tulo 2 – Instalaç ã o e Configuraç ã o: o “Deployment Descriptor” éum arquivo XML que descreve a maneira como o ServletContainer deve carregar egerenciar uma “Aplicação Web”.

Um outro tipo de documento XML bastante utilizado atualmente é o WML (definidodentro do padrão WAP, ou Wireless Application Protocol): através desse formato, umservidor pode formatar um conteúdo que será visualizado na tela de telefones celulares.

Embora a explicação detalhada do formato de um documento WML fuja ao escopodeste livro (mais detalhes podem ser obtidos no site do WapForum, ��������� �)� � � � ! � �.� ��(�-�$.*4! ("-�0 ),apresentamos abaixo o código de um Servlet que gera uma página WML apenas paraexemplificar a geração de um documento XML.

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

-.-�� 5%���F�8�7� �� �' #��J#!9��8�QG ���JE�� / #��F��' #Q� ����.�J �; < � 9��:>@#�' ' ��� ���.' E���E6#!")�&����#!MJD��!���L<�#��$�QG ���JE��7�$#�"2 ���".�8�:#�� K8���.��� �8�$� A�C !5ON�' � D:D�' ��".":>@#�' ' ��� ���.' E�� A�C:#�� �&#!9%E�" >O�+�. / #��F��' #���R

Page 47: Jsp servlets j2_ee

-.- *�&#�9�E�� �J#�9��8�7E�# �$#�3�5�� "2� G��!#�"�>(?=? I:D��!� � #Q�8��E�� � �%? �5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R

�)� $ R-$- I��Q" ".� �� �@#�K&� 9�� 9�E�� *%#���E�#��F"-$- �6� 56� E6��D!5�� #!9��8���@A0C�9%�%�$�J��' ���>� � ��9��8#�9����+? $( �#� # 96�!�.� ��' �J#�9��8#:E�#�K&� 9�� E!�-$- DQ���J�/� �8#�� � - ��� ' 8��9���DQ��"2��#�", �#�D � K � DQ��E��$� A�C:#�"$�8# *�#��QE�#!� E!#���#J".#��-$- E�#�K8� 9�� E��7DQ���J�/� �F#�� � - �(9%E%� �� �� ��' �� ���.#�", ��!9%"2#�� " #Q� � ��9��8#�9�� ?�$� �#��!� �8#�� � - ��9�E�� �� !� ��' !�+�

-$- I��Q" ".� � �=#��$��9�E��7�� �; <(� 9���E�#��F#�"Q ���"F�F�I�� � 9���� �.� �&#�� ' � ���7 �� �$#�"Q ��!9�" #!� <(#���� �.� �F#!� �����' � � � !�$� 9��&' 9����!� �Q����'Q�O#%�)",� �!9 � %' � � % ��� ,�+�' � � � !�$� 9��&' 9����!��9 � � � ? �(I�� �!��'�I" �!C�H � %' � - - �7* I � � P�"=A -F- ��?-�+� A C � �-F- �(& %

�"% &*!�+�& (� -.- � �� �K+�!� 5��J� ����< - �@? � - ��' � � � ����' % ,�� ��+�' � � � !�$� 9����,�!� ��' ��� DQ���FE �� !�+�' � � � !�$� 9����,�!�Q L�!' � <(9��'% �DQ#�9��8#��,%' ,�Q>@#�' ' �$� ���.' E � - �� ,�+�' � � � !�$� 9����,�!� - DQ���FE ��� - ��' �� ,�8�' � � � K ' 5�"2*/���+�

0 D����&D�* �+H �����QDQ#� ��)� ��9� ��=#��R/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(�� )( ��B#!� <(#��&A #�"2"$� <(# �,���+�

00

0

É interessante observar no exemplo anterior a utilização do método # /&� � (�%.��/�% � � � ��/ ��� paraindicar o tipo do conteúdo na resposta; embora para documentos XML esse tipo sejageralmente o ��/��&��� ��* � , no caso específico do WML ele deve ser definido como� / �&� �,��%��"! � ��� ! � * � .

� ��� � � $ ���,+ 5�5>8Como explicamos na seção 3.2 deste livro, além dos headers e do conteúdopropriamente dito, a resposta a uma requisição HTTP deve conter também ainformação do status da resposta, sendo que essa informação é composta por umcódigo numérico mais um string com uma mensagem.

Esse status é utilizado não só para indicar se o processamento da requisição recebidafoi bem-sucedida ou não, mas também para indicar algumas outras situações possíveis,como por exemplo que o documento solicitado encontra-se disponível em uma outraURL.

Um Servlet pode definir esse status através do método # /�� � ��� ��$�# ��� da classe � �������/�- ��� /&����/�#,� (�%&# / ,sendo que, conforme explicado anteriormente, para preservar a ordem dos elementosda resposta HTTP, a chamada a esse método deve ser feita antes de qualquerdefinição de headers ou início da geração do conteúdo da resposta.

Assinatura do método “setStatus()” !5ON�' � D����!� E�"2#�� / �8�Q�&56" �+� 9�� ��=".�F� �&5�" � ��E�#��+�

Page 48: Jsp servlets j2_ee

Nos exemplos apresentados anteriormente, como esse status não foi atribuídoexplicitamente em código, automaticamente o ServletContainer o definiu como sendo200, ou status ��� . Vemos a seguir, por exemplo, a resposta do Servlet � /�� � ( � (�- � � :Exemplo de resposta HTTP do Servlet “HelloWorld”

>�? ? I - � ��� ���/ #��F��#�� � *� ��QD�*�# - � % � �� � " 9�� ��C���"F� �8A���E�� K8� #�E)� / 5�9 � � � #!D ��� �� � ��� � ��� �A ?� �!9%�8#!9%�,� ?'$� �#���8#��Q� - *��&� '� �!9%�8#!9%�,�8C6#!9!<��&*)� � �

��>�?BA�C��������������Q>O#�' ' � � ���.' E 9 � - ����������� - >�?BA�C��

Temos, a seguir, uma tabela com alguns dos códigos de status HTTP existentes e seusrespectivos significados:

Código de Status Mensagem Significado

200 OK Requisição foi processada com sucesso.

302 Moved Temporarily O documento solicitado encontra- se disponível em outra

URL.

404 Page Not Found O documento solicitado não foi encontrado.

500 Internal Server Error Erro no processamento / obtenção do documento

requisitado.

503 Service Unavailable O serviço não se encontra disponível.

Assim, no caso de nosso Servlet de geração de imagem JPEG “ImageServlet”, podemosmodificá-lo de forma que ele retorne um código �� � caso o arquivo com a imagem aser gerada não exista.

Servlet “ ImageServlet” com possível uso do código de status HTTP 404� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.� <(#��.�QG ���JE�#7" � � E��:D������ �J� <�#!� ;6I���� ��<@#��F�:D��!E�� <��JE�#�"F�&���&5�" � � �

-.- D���" �7�����F3�5�� ���:D�������� �J� <O#!��9 ���J#���� "F�F��� !5ON�' � D:D�' ��".":H �J� <@# / #����(' #�� #��Q�8#!96E�"0>O�+�& / #�����' #Q��R

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R��� ' #�H 96 !5�� / �&�$#�����' � � �J� <�# ��� ' # �J9�56' ' ��)� $ R

-$- � #%�$� K8� DQ�!9�E��J"2#������$3�5�� �O�:D���� � � ��� <�#�� #���� "F�&#/ �&� � 9�< ' � K � ' #�9�����#=� <(#�� / #!�)��' #�� � ��9�K8� < ���8� <�#��&H 9�� �&I����$���J#Q�8#�� ����;6 �#�< ��� ' #�9����J#� !���� K!�+' �=K8� ' #!9����J#&9 �L9�5�' ' �R

��� ' #�' �@K&� ' #/�79�#� ��� ' #��+' �@K&� ' #�9����J#��+�� K"�,9 ' �=K8� ' #!� #���� "$�8"3�,���' � K � ' #!9����J#/�7965�' ' �

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

-.- � ���J�7�����F3�5�� ��� 9 �%�7#���� "F�&#����$#Q�F�%�$9����J��"4��D���EO� <@� � � �

�� �$#�"Q ��!9�" #!� ".#�� / �8���&5�"@�+ �� �$#�"Q ��!9�" #!� /�� �'& � ? � ����"�& �.�+��$#Q�)56�.9��

Page 49: Jsp servlets j2_ee

0

-$- �O#�K8� 9O� 9�E��:�J�.� ���E��7D���9��&# ��E�� ���.#�", ��!9%"2#�� " #Q� � ��9��8#�9�� ?�$� �#��!��� �J� <�# - � �#Q<. !�+�

-$- �N��&#�9�E��7�����F3�5�� ���7D��!����� �J� <@#!� ;6I���� �� ����F�&� � E���"� ���� ���J#��)�F��"-$- E�#�� 9�� D�� �!' � M���G ����E�� / #����(' #��' � � �J� <�# �O� ' # �796#� �6� ' #!H 9� �5�� / �&�.#����/�+' �=K8� ' #!96���J#��+�

-$- C%#!9�E��J��D��!9%�8# �6E��7E�#�5�� �!�$3�5�� ���JDQ��9��&#�9�E�� 56�J� � ��� <�#�� #-$- �)#��8���.96��9�E��:#�"$�8#�D��!9%�8# �6E��7DQ���J���.#�", ���"F�F�/ #��F��' #Q��� 5!�& !5!� / �&�$#�����' �=��"3�J �� �$#�"Q ���9�" #!� <O#��!�5��& �5�� / �&�$#���� ���8�N $��F#���� ' � N�5�K+K+#�� �J9�#� N�$��F#�� � � �+�� 9�� ' � N�$��&#�"3� �B�

*O� ' #���+' � N $!�F#�" �7' � � �J� <@# �6� ' #�� �$#��QE �+' � N�5�K+K #�� ��� 9 � � �' �=��"2� �.� �8#�+' � N�5�K K8#!�@�)� ��' � N $��&#�"'�+�

-$- �6� 9���' � M���96E��7 ��.��DQ#�"." �7E6#:<@#��F��G����JE!#�" � � E��:#JK8#�D�*���9�E��J�����.3�5O� ���' �=��"2� K8' 5�"Q* �,�+�' � � �J� <�# �O� ' #!� D�' ��".#/���8�

0 D����&D�* �H ���%�,D�#! ��)� �!9 ��B# �1R�.� $ R

� K"��' � � ��� <�# ��� ' # 9 �79�56' ' �B' � � �J��<�# �6� ' #�� D�' ��".#/�!�+�0 D��Q�FD�* ������DQ#� ��)� �!9� ��=# � R 0/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(��9 �%�:K8���@ ���" "�� ��#!'O' #�� � �J� <�#�� E�#7���F3�5�� ��� ,�+�

00

0

Podemos ver, nessa implementação, que o código de status é definido pela constantenumérica � � � �� � � ��� � � � da classe � � �����/"-���� /.� � /.#)� (�%�# / .Utilização de constante SC_NOT_FOUND da classe

“javax.servlet.HttpServletResponse”� � � ���.#�", ���9�"2#�� " #Q� / �8�Q�&5%" �8 �� �F#�"2 ���9�".#�� /�� �'& � ? � ���'" & �.�+�� � �

Para cada código de status HTTP existente, a classe HttpServletResponse define umaconstante correspondente, sendo que você deve dar preferência ao uso dessasconstantes (em vez do número em si) para aumentar a legibilidade de seu código.

Código de Status Mensagem Constante

200 OK SC_OK

302 Moved Temporarily SC_MOVED_TEMPORARILY

404 Page Not Found SC_NOT_FOUND

500 Internal Server Error SC_INTERNAL_SERVER_ERROR

503 Service Unavailable SC_SERVICE_UNAVAILABLE

Page 50: Jsp servlets j2_ee

Vale observar também que, para alguns códigos de status, existem headers auxiliaresque contém indicações sobre o que o cliente deve fazer ao receber aquele código destatus.

Assim, no caso do código ����� ( ��� � ��� � � � � � � � � �� � � � � � ), você pode definir o valor do header��/&��- � � � ����/�- para indicar o tempo estimado em segundos até que o serviço volte a ficarativo.

Outro exemplo é o código de status � � � ( � � � � � � ��� � � � � ��� � � � ��� ): ao definir esse código destatus, você deve definir também o valor do header ��("',��� � (�% para indicar a URL onde onovo documento pode ser encontrado.

Temos a seguir o exemplo de um Servlet que, dependendo do endereço IP do clienteque envia a requisição, redireciona o acesso para uma nova página contendo umamensagem de acesso negado.

Servlet “CheckIPAccess”� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #�� ����.� ��#!� � K&� D��QG ���JE�� H IJE���D�' � #�9��&#L3�5�#LK8��ML���.#�3�5�� "2� G �����-.- " #�� ��.#�K8� �Q�JE�� H IJ9 ���LK8�����.#�D��!9O*�#�D!� E�����E�� �F#�D�� ��9��7 ����.�756�J� %;Q<(� 9��-.- D��%��5O�J�:�J#!9�" � <�#!� E�#���D�#�" ".� 9�#�<��QE���� !5ON�' � D:D�' ��"." � *%#!D���H I�*D�DQ#!" " #�� �&#�9�E�" >O���& / #��F��' #�� R

-.- I��F#�K8� �Q�JE���":H I%" �#!� ��� �&� E���" ���F#�E!#�' ��D��!' � �� � ��� �8#�"F�F�Q�&� D�K&� 9���' / �.�.� 9�</� *�' ' �� #�E�H I�I��F#�K8� �=� � �� � ���� � �@� ��

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#��R�)� $ R

-$- � #%�$� K8� DQ�!9�E��J� ��F#�K8� �Q��E��7D�' � #!9%�8#J3%56#�K8#!M � �$#�3�5O� "2� G ���/ �&� � 9�< ' � � /�: ���F#�3�5�#�"$�&� <�#��&P�#��J�Q�8#�*E�E%�����8�� K!���8' � � &9 �J9�5�' ' ����� �+' � � �� "F�8�!�&�&"�� � �.*�� �.* ' ' �� #�E%H I�I!�)#�K8� ���!���B' � � /�J9�5�' ' �� K!�+' � � /���J9�5�' ' �BR

�� �$#�"Q ��!9�" #!� ".#�� / �8���&5�"@�+ �� �$#�"Q ��!9�" #!� /�� � A � � ����� ? �6A0I��P�* P�H C����+� �� �$#�"Q ��!9�" #!� ".#��)>O#���E�#!� �,�8C���D�� �&� �!9� ,��� - ��D�D�#�" "2E�#�9�� #�E�� *��&��' !�+��$#Q�)56�.9��

0

-$- *D�#!"$"2�� �#��.��� �&� E��!�6� �� ��2� ��� 9�E��7 �; <(� 9���E�#J"256DQ#�"2".�I�� � 9���� �.� �&#�� ' � ���7 �� �$#�"Q ��!9�" #!� <(#���� �.� �F#!� �����' � � � !�$� 9��&' 9����!�Q>@? A0C��������������� ,�+�' � � � !�$� 9��&' 9����8I����F��N�#�9�" ��" #!5 ��D�#!"$"2�LK8���� �#��.��� �&� E���9 ,�+�' � � � !�$� 9��&' 9����!� - ����������� - >�? A�C��� !� �' � � � K ' 5�"2*/���+�

0 D����&D�* �+H �����QDQ#� ��)� ��9� ��=#��R/ #��F��' #Q� � �!9!�&#Q� ��' � DQ��9��8#�� � � <�#�� / #!�)��' #�� � ��9��8#�� �5���8�' �=D��!9��F#Q�Q�&� ' ��<����!�O�.�F�(���)( ��B#!� <(#��&A #�"2"$� <(# �,���+�

0

Page 51: Jsp servlets j2_ee

0

0

Essa situação de redirecionamento do acesso mostra-se tão frequente que um outrométodo, chamado # /�%�� ��/���� - /&'�� ��� , é disponibilizado pela API de Servlets para a obtençãodesse mesmo efeito.

Assinaturas do método “sendRedirect()” !5ON�' � D����!� E�"2#�9�E�P�#�E�� �)#�DQ��� / �&� � 9�< ��' ��DQ�Q�&� �!9��+�

Desta forma, poderíamos trocar, no Servlet anterior, o trecho de código:� � �� K!�+' � � /���J9�56' ' �BR

�� �$#�"Q ��!9�" #!� "2#�� / �8�Q�&5�" �� �� �F#�"2 ��!9%".#!� /�� � A�� � ����� ? �!A�I��P�* P�H C���� � �� �$#�"Q ��!9�" #!� "2#��&>@#��QE�#!� ����C���DQ�Q�&� �!9� !��� - ��D�D�#�" ".E�#�9�� #�E�� *!� ��' !�+��F#��&5O�.9��

0� � �

Pelo código:� � �� K!�+' � � /���J9�56' ' �BR

�� �$#�"Q ��!9�" #!� "2#�9�E�P�#�E�� �F#�D � ��� - ��D�D�#�"2"$E�#!9�� #�E�� *��&��' !�+��F#��&5O�.9��

0� � �

Veremos a seguir uma variação do ServletContador, apresentado anteriormente nestelivro, que utiliza o método # /"%�����/���� -�/&',����� para redirecionar o milésimo acesso para umapágina especial:

Variação do ServletContador: redireciona milésimo acesso� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#��8�%�$9��: �; <=� 9��:>@?BA�C:D��!��� 9 ���L#��F�:E�#��.#�3�5�� "2� G ��#�"-.- �$#�D�#!N�� E��Q" ����#J� ���!�J#�9��8�!�6�.#�E�� �$#�D�� �!96�:� � ' #�"Q� �J�:��D�#�"." � !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!��� #��Q�8#�9�E�"0>6���) / #����(' #Q��R

-.- � ��9��8��E!��� E!��"0�$#�3�56� "2� G �!#�"0�F#�D�#�N�� E6�Q" �� � ��� �8# � 9�� � � �!9%�8�QE��!��� �B�

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- * �2�J�,M!#!9���9�E��L���!' ��� E��7D��!9%�8��E��!� #�� 5��J�4����� � ;Q��#�'�' ��DQ�!'O5�"$��9�E��7"Q� 9�D��F�!9O� M���G ���� 9%��' �BDQ��9��8��E��!��� �=�" $�96D�*��$�!9�� M�#!E�� �&*�� " �BR

' �=D��!9��F�QE��!��� (�($� � ��9��8��E!���2�

Page 52: Jsp servlets j2_ee

0

-.-:/ #�#�"F�F#:K8���4� ��� ' #�" � �J�:��D�#�" ".���O�.#�E�� �F#�D�� �!9%�7 ����$�75��J�: �; <=� 9��:#�", �#�D�� ��'� K"�+' � DQ��9��8�QE6�!� ��� ����� �=R

���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ��� - ��F#!��� ��#�"2 �#�D!� ��' � *%�&�7' !�+��$#Q�.5��.9��

0

-.- � � ��D���".��D��!9%�&�.;�� � ����� � ��.� �J#:9 ���J#!�)�:E�# �F#�3�5�� "Q� G ��#�"0�$#�D�#�N!� E��Q"I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9�����P�#�3�5�� "2� G ��#�"0�$#�D�#%N�� E��Q" ��� ( H 9!�&#Q<O#%�$� �&� / �.�.� 9�< �+' �=D��!9��8�QE6�!� �����' � � � K8' 56"2*/���+�

00

� ��� ��� !�4 � ,) ��� $ ���'+ ) ) � � �Além dos métodos # /&� � ������$ # ��� e # /�%�����/�� � - /"')� ��� que permitem a manipulação do status daresposta do Servlet, é possível também utilizar o método #)/"%�� � -�- (�- ��� para indicar erros noprocessamento da requisição recebida.

Assinaturas do método “sendError()” !5ON�' � D����!� E�"2#�9�E���� �F��� �+� 9�� ��=".�F� �&5�" � ��E�#��+� !5ON�' � D����!� E�"2#�9�E���� �F��� �+� 9�� ��=".�F� �&5�" � ��E�#���� �Q����� ' ��9%<�� / �&�.� 9�< �� ")�&� �&56"2A4#�"." � <�#���

Esse método deve ser utilizado para a definição de códigos de status nas faixas dos � ��e ���� , como por exemplo, os códigos � � � � � � � ��� � � � � �� � � e ��� � ��� � � � � � � � � ��� ��� � � � � � � ��� , sendoque, se o segundo parâmetro for utilizado, este deve conter a mensagem descritivaque acompanha o código de status.

Vale lembrar que de acordo com a configuração das páginas de erro da AplicaçãoWeb (descrita no “Deployment Descriptor”, vide seção 2.2), a definição de um códigode status de erro pode levar à apresentação de uma página alternativa de erro.

� ��� � �:� 1 1 )�� ! - 4�� $ � ),+ ��� + � $Um último recurso interessante relacionado ao processo de geração de resposta doServlet é o buffering do conteúdo dessa resposta.

Esse buffering é controlado através dos seguintes métodos da classe � ����� � /�- ��� /�����/&#)� (�%&# / :Assinaturas dos métodos relacionados ao buffering de resposta do

Servlet !5ON�' � D7� 9%�B<(#�����5�K+K+#%� / � M�#����+� !5ON�' � D����!� E�"2#�����5%K K8#�� / � M�#��� 9%� �� " � M�#/�+� !5ON�' � D7N�����' #���9 � " � �!����� �+�8#!E����+� !5ON�' � D����!� E �.#�".#����,�+� !5ON�' � D����!� EJK&' 56"2*���5�K K8#!�@���+�

Page 53: Jsp servlets j2_ee

Ao invés de simplesmente repassar para o cliente conteúdos parciais a cada chamadaaos métodos de escrita da classe �&����� � /"-���� /.� � /.#)� (�%.# / (como por exemplo, os métodos �"- � %��#� % � �e � - � � / ��� ), para otimizar o desempenho da aplicação o ServletContainer armazena esseconteúdo em um buffer, sendo que esse conteúdo é repassado para o cliente somentequando o buffer enche ou quando é encerrada a execução do Servlet.

Dessa forma, embora tenhamos dito anteriormente que há uma ordem de definiçãodos elementos HTTP de resposta de um Servlet a ser obedecida, utilizando essas funçõesde manipulação do buffer de resposta, é possível contornar essa regra.

No exemplo a seguir, utilizamos essa funcionalidade para, dependendo doprocessamento realizado, redefinir os elementos da resposta do Servlet.

Servlet com manipulação dos buffers da resposta� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��13%56#7�$#���' � M��75��� ��$��D�#�" ".�!�J#�9��8�73�56��' 3�5�#�� ��#��6D���9�K+���.�J#7��D��Q"2���-.- � ��9�� �5�' �0� N�5%K K8#��4E!# �$#�"Q ���"F�&� !5ON�' � D:D�' ��"." / #!�)��' #�����5�K K8#!�.P6#�" ���"F�F�:#��2�F#!9�E6" >O�8�& / #!�)��' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- H �� ��.� ��� 9�E����J�&��� ��9�*��:E���N�5�K K8#�� E�#��$#�"Q ���"F�F�79���' �Q< E��:�! �' � D��QG ���<(#�� / #%�&�(' #�� � ��9��&#��2� ���+� ' ��<������ �&��� ��9�*��:E�#�K8��5�' � E�� N�5�K+K #��4E�# �F#�"2 ���".�8�&#&% � )(

H 9��8#�<(#��.� �8� / �&� � 9�<��+ �� �$#�"2 %�!9�".#�� <@#Q����5%K K+#�� / � M�#>������(+��% � !�+�

-.- �O#�K � 9�� 9�E��79������:�F������9�*��LE�# N�5%K K8#�� E�# �$#�"Q ���"F�&�:E�# � �� �$#�"Q ���9�" #!� " #Q����5�K+K+#�� / � M�#�� � � �+�

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%� >�? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- ����#�D�5��&��9%E!��5�� ��.��D�#�"." ���J#!9��8�J3�5���' 3�5�#!�N�����' #��!9�' �="256DQ#�"." �!I��.��D�#�"2".��� #�9��8�/�=�%��#�D�5��8�!I��F��DQ#�"." ���J#!9��8�����+�

-.-:/ #���D����2�$#!5 5�� #!� �F� 9��� ��F��D�#�"2" ���J#!9!�8�7��9%�8#��.� �!� �-.- �J��E�� K � D����J��" ��"$�8�Q�&56" E�� �)#!" ���"$�8�� K"��9 ' �="Q5�DQ#�"." �!I��$��D�#�"2"$�!�J#!9!�8��BR

-$- * �#�"2��� E�#J�8#��.�J��" E�#�K � 9�� E��:#��! !' � D�� �8���J#�9��&#L�J�&���J��9�*��JE�� N65�K+K #�� � #�"$#%�� ��F#-$- N���� �O#%�$� K8� DQ�!�4".#���" #!5 D��!9%�8# �6E�� � ; 9 ���:K8���@�F#� ���"." �QE�� %�!�F�:��D�' � #!9%�8#-$- ���� �J#�� �:E�� �&#Q�F��E���� " � �!����� �8#�E/�!�� K!��9 ���F#�"Q ��!9�" #!� � " � �!����� �+�&#�E/���!�BR

-.- C�� �� ����J��" ��D���9��8#���E��JE!� N�5�K+K8#��4� �)�F��� #�"�E�� �&#Q�F��E�� �$#�" #Q� # �$#�E�#�K8� 9�� �J��"-.- ��"F�F�Q�&5�"4E��7�$#�"Q ���"F�F�7 ����$�7H &B? ��P(& * C�� / ��P � ��P� ��P�P��P&�+5�"2�QE��� ����$�-.- � 9%E%� DQ���43�5�#J�!D��!� �.#�5 5�� #��2�F� 96�� !�$��D�#�" "2���J#�9��&�LE��7�$#�3�5�� "2� G ����� �� �$#�"Q ��!9�" #!� �F#�"2#��5�!�+�

Page 54: Jsp servlets j2_ee

�� �$#�"Q ��!9�" #!� ".#�9�E����2�)�!�@� � �.#�"2 ��!96".#�� /� � H & ?-��P(& * C�� / �6P � ��P�� �6P�P��P �+��$#Q�)56�.9��

00

-.- H �� ��.� ��� 9�E��4K&� 96��'�E����.#�", ���"F�F�7>�? A0C' � � � ��.� 9!�)' 9���� / 5%DQ#�" ".� 9%� ��$��D�#�" "2���J#�9��&��9 � - ����������� - >�? A�C��� ��+�' � � � K8' 56"2*/���+�

00

Page 55: Jsp servlets j2_ee

� ����� ����� �

��� � � � � � � � � ��� � � � � � � ��� ����� � � � � � � � ��� � � � � � ��

Além de gerar uma resposta para cada requisição recebida, outro trabalho importanteque deve ser realizado por um Servlet é o de capturar e tratar os parâmetros darequisição (gerados, por exemplo, a partir de um formulário HTML). Conforme oresultado desse tratamento, um Servlet pode gerar respostas diferentes.

Esse capítulo explora exatamente esse processo de captura dos parâmetros darequisição recebida.

� � � � - 1 ��� �.$'&(*) + + � 2�� ) � + )�� �,! ����No ííáCapí tulo 3 – Servlets – caracterí sticas bá sicas desse livro (seções 3.5 e 3.6),apresentamos algumas das funções para a obtenção de parâmetros e atributos doServlet e de seu contexto.

Além dos métodos apresentados anteriormente, é possível obter algumas informaçõesadicionais relevantes, como o nome do Servlet corrente, e os dados referentes a versãoda API de Servlets suportada pelo ServletContainer (disponível somente paraServletContainer’s que implementem a especificação de Servlets 2.1 ou superior).

Assinaturas dos métodos “getServletName ()”, “getMajorVersion()” e“getMinorVersion()” !5ON�' � D / �.�2� 9�< / #%�&�(' #�� � ��9�K8� <=� <O#Q� / #!�)��' #��,&B�Q�J# �!�+� !5ON�' � D7� 9%� / #����@' #�� � ��9��&#��Q�&� <@#Q�&A4��� ��� � #!�F"Q� ��9/�!�+� !5ON�' � D7� 9%� / #����@' #�� � ��9��&#��Q�&� <@#Q�&A�� 9���� � #!�F"Q� ��9/�!�+�

Existem também métodos para a obtenção de informações sobre o servidor em si, taiscomo: nome do servidor, que pode ser o próprio nome da máquina na rede(dependendo de como o servidor foi instalado); a porta onde o servidor recebe asrequisições; e um texto de identificação do servidor, que normalmente contém o nomee versão do software que implementa o ServletContainer.

Assinaturas dos métodos “getServerInfo ()”, “getServerName()” e“getServerPort ()” !5ON�' � D / �.�2� 9�< / #%�&�(' #�� � ��9��&#��Q�&� <@#Q� / #!�)��#��.H 9%K �/���8� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q� / #!�)��#�� & ���J# �!�+� !5ON�' � D7� 9%� >O�8�& / #!�)��' #��&P�#�3%56#�")�&� <@#Q� / #!�)��#%�$I������ ���8�

Page 56: Jsp servlets j2_ee

Em particular, os métodos 0�/&� � /�- �./�- ���* / ��� e 0�/�� ��/"-��./�-��&("-�� ��� devem ser chamados a partir doobjeto da classe � ����� � /�- ��� /.� ��/ ��$�/�# � : como cada servidor pode definir diversos servidoresvirtuais, através de uma técnica chamada de “virtual hosts”, é necessário se utilizar opróprio objeto da requisição para distinguir qual o servidor (virtual) que gerou achamada ao servlet. Mais informações sobre esse recurso de “virtual hosts” podem serencontradas, geralmente, na documentação de servidores Web.

No próximo exemplo, utilizamos os métodos apresentados anteriormente para construiruma página HTML com todas as informações conhecidas sobre o servidor, o Servlet eseu contexto.

Servlet para apresentação de parâmetros do servidor� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- *� 6�F#�".#!9%�8�7� 9%K+�%�$�J�QG��!#�"4E��7" #����(� E!��� !5ON�' � D:D�' ��"." / #!�)��' #��&H 9%K � / #%�&�(� E����1#��Q�8#%9%E!"�>6�8�& / #����(' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%� >�? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- H �� ��.� ��� 9�E��:� 9�K8�!�.� �QG �%#�"4"2��N��F#J��"2#����@� E����' � � � ��.� 9!�)' 9����+?B#��2�8�JE�# H E�#�9��)� K � DQ��G ���JE�� / #!�)�6� E��!�*�� ( <(#�� / #����@' #Q� � ��9��8#��2�

����� <�#�� / #%�&��#!� H 9�K8�/����(+������P��� �� �' � � � ��.� 9!�)' 9���� &=���J#:E�� / #����(� E��!�*�� )( ���F#�3�5�#�"$�&� <@#Q� / #!�&��#!� & ���J# ��� (+�!����P �� !�+�' � � � ��.� 9!�)' 9�����I������&��E�� / #����(� E���� � (� �� �)#!3�5�#�".�&� <�#�� / #�����#��2I����F�5��� (>������P��� !���

-.- H �� ��.� ��� 9�E��:� 9�K8�!�.� �QG �%#�"4"2��N��F#J� / #%�&�(' #�� #�" #!5 D��!9%�8#��2�F�' � � � ��.� 9!�)' 9���� &=���J#:E�� / #����(' #��,� )(J<@#�� / #��F��' #Q� � �!9%K � < ����� <�#�� / #����@' #��,& ���J#

���)(>�,����P��� ,�+�' � � � ��.� 9!�)' 9���� � #��F" ���JE��=* I�H6"25� %�!���F�QE��7 �#!' � / #��F��' #Q� � ��9��8�!� 9�#!� �

( H 9%�8#Q<@#!�.� �8� / �&� � 9!<�� <�#�� / #����@' #Q� � ��9��&#��2�5�,�+� <@#Q�&A4�!� �!� � #!�)",� �!9>����� (��� �( H 9��F#Q<�#��.� �&� / �)�.� 9�< � <@#Q� / #!�&�(' #�� � ��9��&#��2� ���+� <�#Q�&A�� 9��!� � #!�$"2� �%9/����� (>������P��� !�+�

-.- H �� ��.� ��� 9�E��:�.��E��! �#�>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

0

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

Page 57: Jsp servlets j2_ee

Conforme mostramos na seção 3.2 desse livro, uma requisição HTTP é recebida por umServlet é composta de alguns elementos básicos: método, path, informações sobre aversão do protocolo e headers.

A API de Servlets permite que o desenvolvedor acesse todas essas informaçõesassociadas a cada requisição recebida. Assim, temos de início as seguintes funções:

Assinaturas dos métodos associados a captura de informações derequisição !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&P�#��J�Q�F#�*E�E�� �!�+� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&P�#��J�Q�F#!>O��"F�5����� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&A4#Q�&*6��E/���8� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&P�#�3�5�#�"F�,"=P�H����8� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q� / D�*6#!�J# ���+� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&I��$�Q�&��D���' ���+�

Essas funções permitem recuperar o endereço IP do cliente que gerou a requisição, onome da máquina associada a esse endereço IP (se for possível obter esse nome), e ométodo, path, e protocolo e sua versão associados a essa requisição. O protocolo darequisição pode também ser chamado de esquema (= “scheme”).

Temos, a seguir, um Servlet que imprime essas informações para cada requisiçãorecebida.

Servlet que imprime informações sobre cada requisição recebida� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- H �� ��.� �J#J� 9%K ���.�J�QG ��#�" " �!N��$#JD��QE��7�$#�3�5�� "2� G����7�$#�D�#!N�� E�� !5ON�' � D:D�' ��"." / #!�)��' #��&H 9%K ��P�#�37#��Q�8#�9�E�"0>6���& / #�����' #Q� R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%� >�? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- H �� ��.� ��� 9�E��:� 9�K8�!�.� �QG �%#�"4"2��N��F#J� �F#�3�5�� "Q� G����' � � � ��.� 9!�)' 9����,��9�E�#!�$#�G��7E�#J"256�7�J;�3�5�� 96���� ( �� �$#�3�56#�"F�&� <�#��&P�#��J���8#�* E�E%�����

(+�����!P��� !�8�' � � � ��.� 9!�)' 9���� &=���J#:E�#�"25����J;Q3�5�� 9����� ( �� �F#�3�5�#�".�&� <�#��&P�#!�J���&#!>O��".� �,��(>������P��� !�+�' � � � ��.� 9!�)' 9�����A #��8��E��LE��7�F#�3�5�� "2� G ���� )( ���F#�3�5�#�"$�&� <�#��&A4#Q�&*%��E>����(+������P��� ,�+�' � � � ��.� 9!�)' 9�����I�� �&*JE����.#�3�5�� "2� G ���(�� ( ���F#�3%5%#�"$�&� <�#��&P�#�3%56#�")�,"=P�H���� (>������P��� !�+�' � � � ��.� 9!�)' 9�����I!�)�Q�&��D���' �JE�� �)#!3�5�� ",� G �%�!�� ( �� �.#�3�5�#�"F�&� <�#Q� / D�*6#!�J# ���)(/������P��� !�+�' � � � ��.� 9!�)' 9���� � #��F" ���JE�� ��F���8��DQ��' ��E�� �)#!3�5�� ",� G �%�!��

( �� �$#�3�5�#�"F�)� <�#Q�&I��$�Q�F��D���'��!� (>������P��� !�+�

-.- H �� ��.� ��� 9�E��:�.��E��! �#�>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �

Page 58: Jsp servlets j2_ee

' � � � K8' 56"2*/���+�0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D��O�!� E�E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$� �� �.#�3�5�#�"F� ��>(�8�& / #!���@' #��&P�#�"Q ��!9�" #7 �� �$#�"2 ��!96".#�

�&*��)�� "�H � ����DQ#� ��&� �!9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

0

0

Assim, uma saída possível para esse Servlet poderia ser:

Exemplo de página retornada pelo Servlet ServletInfoReq��>�?BA�C����������������9�E�#��.#�G��JE�#7"Q5��7� ;Q3�5�� 9���� � � � � �@� ����P��&=����#:E�#�"256�7�J;Q3�5�� 9�����' ��D��!' *%�!")������P �A #��8��E��:E��7�$#�3�5�� "2� G����!� �-��?�����P��I����&*JE��7�$#�3%56� "2� G �%�!� - ' � �(�F��".#����(' #Q�F" -2/ #��)��#��&H 9�K+�!P%#!3 - �!� *��&��' ����P �I!�$�Q�F��D��!' �7E6�7�F#�3�5�� "2� G ���!�O*����& �����P��� #��." �%�7E6� ��$�Q�F��D��!' �7E6�7�F#�3�5�� "2� G ���!�O>�?B?BI - � ����P��� - ����������� - >�? A0C��

Além do método 0 /.� ��/ ��$�/�# � ��� ��� utilizado em nosso exemplo, a API de Servlets disponibilizaalgumas funções adicionais para a obtenção de informação relacionadas ao path darequisição.

Assinaturas de métodos adicionais para a obtenção de informações depath !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q� � �!9%�8#�� �&I��Q�&*/����� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q� / #!�)��' #��&I��Q�&*/����� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&I��Q�&*6H 9�K+� ����� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&I��Q�&*�?B�F��96"2' � �F#�E/�!�+� !5ON�' � D:".�8���&� D / �)�.� 9�< ��5�K K8#!�4>6�8�& " �&� ' "2� <�#Q�&P6#�3�5�#�"F�,"=P�C��+>6�+�& / #����(' #��&P�#�3�5�#�"$� �� �.#�3�5�#�"F� �+�

Os métodos 0�/�� �(�%&� / � � �&����� ��� , 0 /&� � /"-�� � /���� ��������� e 0 /.� �"����� % ��( ��� retornam, respectivamente, o caminhodo contexto, o caminho do Servlet abaixo do contexto, e o restante do “path” darequisição (se excluírmos as duas primeiras informações).

Em particular, no ambiente apresentado no íçãçãCapí tulo 2 – Instalaç ã o e Configuraç ã odesse livro (utilizando o Apache Tomcat), o caminho do contexto equivale aosubdiretório criado abaixo da pasta � / � �&���"# , ou seja, o subdiretório da aplicação Web.Por outro lado, o caminho do Servlet, corresponde ao mapeamento (“servlet-mapping”) que originou a chamada ao Servlet.

Se o Servlet anterior, � /"-���� /�� % ��(��&/ � , estivesse instalado junto a uma aplicação Web � � �.- (&# /"-���� /.��# ,por exemplo, e, no “Deployment Descriptor” dessa aplicação Web, houvesse ummapeamento da URL ����/"- ��� /&� % ��(���/ � � para esse Servlet, teríamos os seguintes resultados paracada requisição recebida:

Entra tabela

Page 59: Jsp servlets j2_ee

A função seguinte, 0 /.� �"������� - � %&#�� ����/�� ��� , tenta traduzir a informação de path da requisiçãopara o caminho real do recurso no disco. É importante observar que essa função sófunciona caso a aplicação web não tenha sido implantada como um arquivo WAR(explicado mais adiante no íóCapí tulo 9 – Tó picos Adicionais).

A última função, 0 /.� �&/ ��$�/.# � ��� � ��� , serve para construir a URL que gerou a requisição aoServlet, incluindo as informações de esquema, protocolo, método etc. Essa funçãodeve ser chamada diretamente a partir da classe � ������ �,� � # do pacote � � ��� � ! # /"- ��� /.��! � ����� , poistrata-se de um método estático dessa classe.

Agregando, então, essas novas funções ao Servlet � /�- ��� /��� % ��(��&/ � , temos o código a seguir:

Servlet que imprime informações sobre cada requisição recebida� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- H �� ��.� �J#J� 9%K ���.�J�QG ��#�" " �!N��$#JD��QE��7�$#�3�5�� "2� G����7�$#�D�#!N�� E�� !5ON�' � D:D�' ��"." / #!�)��' #��&H 9%K ��P�#�37#��Q�8#�9�E�"0>6���& / #�����' #Q� R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%� >�? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- H �� ��.� ��� 9�E��:� 9�K8�!�.� �QG �%#�"4"2��N��F#J� �F#�3�5�� "Q� G����' � � � ��.� 9!�)' 9����,��9�E�#!�$#�G��7E�#J"256�7�J;�3�5�� 96���� ( �� �$#�3�56#�"F�&� <�#��&P�#��J���8#�* E�E%�����

(+�����!P��� !�8�' � � � ��.� 9!�)' 9���� &=���J#:E�#�"25����J;Q3�5�� 9����� ( �� �F#�3�5�#�".�&� <�#��&P�#!�J���&#!>O��".� �,��(>������P��� !�+�' � � � ��.� 9!�)' 9�����A #��8��E��LE��7�F#�3�5�� "2� G ���� )( ���F#�3�5�#�"$�&� <�#��&A4#Q�&*%��E>����(+������P��� ,�+�' � � � ��.� 9!�)' 9�����I�� �&*JE����.#�3�5�� "2� G ���(�� ( ���F#�3%5%#�"$�&� <�#��&P�#�3%56#�")�,"=P�H���� (>������P��� !�+�' � � � ��.� 9!�)' 9�����I!�)�Q�&��D���' �JE�� �)#!3�5�� ",� G �%�!�� ( �� �.#�3�5�#�"F�&� <�#Q� / D�*6#!�J# ���)(/������P��� !�+�' � � � ��.� 9!�)' 9���� � #��F" ���JE�� ��F���8��DQ��' ��E�� �)#!3�5�� ",� G �%�!�� ( �� �.#�3�5�#�"F�&� <�#Q�&I��)�Q�&��D���' ���

(+�����!P��� !�8�

' � � � ��.� 9!�)' 9��� �����P��� !�+�' � � � ��.� 9!�)' 9��� � ����� 9�*6��E��7D��!9%�8#��2�F�!� ( �� �F#�3�5�#�".�&� <�#�� � �!9!�&#Q� �)I�� �&*/�,��(>������P��� !�+�' � � � ��.� 9!�)' 9��� � ����� 9�*6��E�� / #��F��' #Q�,� ( �� �$#�3�56#�"F�.� <�#�� / #!�)�6' #��&I����&*/��� (+�!����P��� !�+�' � � � ��.� 9!�)' 9�����H 9�K+���.�J�QG �%#�"4�QE�� D�� ��9���� " E�#JD������ 9�*��(�� )( �� �$#�3�5�#�"F�&� <�#��)I�� �&*�H 9!K �/���

(+�����!P��� !�8�' � � � ��.� 9!�)' 9���� � ����� 9�*6�4�)�F��E%5�M�� E���� ( �� �$#�3�56#�"F�&� <�#��&I�� �&*!? �.�Q9�" ' � �&#�E>���

(+�����!P��� !�8�' � � � ��.� 9!�)' 9���� "=P�CBD��!�� �' #Q�F� E�� �$#�3�5�� "2� G����!� ( >(�8�& "O�&� ' " � <�#��&P�#�3%5%#�"$�,"=P�C��+ �� �.#�3�5�#�"$���

(+�����!P��� !�8�

-.- H �� ��.� ��� 9�E��:�.��E��! �#�>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

Page 60: Jsp servlets j2_ee

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

0

0

Com essas novas funções, uma possível saída para esse Servlet passaria a ser:

Exemplo de página retornada pelo Servlet ServletInfoReq��>�?BA�C����������������9�E�#��.#�G��JE�#7"Q5��7� ;Q3�5�� 9���� � � � � �@� ����P��&=����#:E�#�"256�7�J;Q3�5�� 9�����' ��D��!' *%�!")������P �A #��8��E��:E��7�$#�3�5�� "2� G����!� �-��?�����P��I����&*JE��7�$#�3%56� "2� G �%�!� - ' � �(�F��".#����(' #Q�F" -2/ #��)��#��&H 9�K+�!P%#!3 - �!� *��&��' ����P ���"23�5�#��J��E��7�$#!3�5�� "2� G ���(��*%�+�) �����P��� #��." �%�7E6� ��$�Q�F��D��!' �7E6�7�F#�3�5�� "2� G ���!�O>�?B?BI - � ����P�����!P �� ����� 96*��:E��JD���9��F#Q�Q�8�(� - ' � �@�F��" #����(' #��&" ����P �� ����� 96*��:E�� / #%�&�(' #��,� -2/ #��)�6' #��)H 9!K ��P�#�3 ����P��H 9%K ���.�J�QG ��#�" ��E�� D�� �!9%�!� " E6#7D��!��� 96*��!� - ��� *!�&��' ����P��� ����� 96*����)�$�QE�5%M�� E��!� � � %QI!�$�Q<@�.��� ��� ' #�" % * ���D�*�# ? ����DQ� � � � ��% #!N��� � �"�%,' � �(�)��" #!�)�6' #��8" %.�!� *��&��' ����P��"=P�CJD��!�� �' #Q�&��E��J�.#�3�5�� " � G����(��*��+�. � -.- ' ��D���' *6��"F� � � � � � - ' � ���F��".#��F��' #��8" -./ #�����' #Q�.H 9�K8��P�#�3 - ��� *��&�J' ����P��� - ����������� - >�? A0C��

� ��1 � � � � �*��2 � ! � + 5����.)��*$���� � )�� � � + $ � )4��� !�+�! &�� � �Se você já construiu páginas HTML, ou até mesmo navegou na Internet, você já deveter se deparado com formulários HTML.

Formulários HTML possibilitam, por exemplo, que digitemos textos ou selecionemosvalores em campos de uma página HTML, sendo que, ao final, normalmente clicamosem um botão para que essas informações sejam enviadas para o servidor.

Ao fazermos isso, há, na verdade, uma requisição que é gerada pelo browser, sendoque as informações digitadas e selecionadas por nós são “anexadas” como parâmetrosdessa requisição.

Temos, a seguir, um exemplo de página HTML com um formulário de cadastro.

Exemplo de página HTML com formulário de cadastro��>�?BA�C��������������� ���P�A A$�!?B> ���.�� 8I�� / ?- * � ?BH ��& �� - ' � �(�F��".#��F��' #��8" -./ #��F��' #Q�&I%���F����"2P%#�3� !��@� <@� �&#L"2#�5 96�!�J#!� ����P����QH & I�"(? ? �(I����� �F#Q� � �& * A ���� �9��!�J#� / H � ���� � ,������P�������P��/ #�' #�D!� �!96#:"Q5��� " � D��!�@�+#�"'�B ��$#QK8#��2� E���� " � � ����P��� / �6C�� � ? & * A3� �� +DQ���F#�" 1A "=C!? H I�C�������I�?BH ��& � * C(" ���� �,M�5�' �� �,M�5�' � - �I�?H ��& ���@�I�?BH �'& � * C(" ���� ��#%�F� #!' *%� !�$�O#!�.�J#�' *���� - � I,? H ��& ����I�?BH ��& � * C(" ���� ��#%�)E!#� ��$��#!�FE6#� - �I�?BH �'& ����� I�? H ��& � *�C�" ���� +���J���F#�' �� !�����J���F#!' �� - � I�? H � & ����I�?BH ��& � * C(" ���� �N��F��9�DQ�� ��QN!�$��9�D��� - �I�?BH � & ����� I�? H �'& � * C�" ���� 8 ��F#��8� ��Q ��.#��8��� - �I�? H ��& �

Page 61: Jsp servlets j2_ee

� -./ ��C�� � ?�� ���!P�������P����H &BI"(? ? �(I����� "25�N���� �� �& *�A�� �� #!9�� � * C)" ���� !�69��(� ��� !�� - ���P�A �� - ����������� - >�? A0C��

Nesse formulário, existem 3 parâmetros que serão enviados junto com a requisição aoservidor quando clicamos no botão “Enviar”: % (&* / , ')(�- /�# e /�%&� . Em particular, o parâmetro')(�- /�# pode estar associado a mais de um valor, dependendo de quantas cores foremselecionados pelo usuário que visitar essa página.

Uma outra forma de enviar parâmetros é a sua concatenação diretamente no path darequisição, bastando para isso acrescentar o caractere � ao final do path, seguido depares � %.("* / �&( �&�&-��.* /�� - ( ��� �� � � (�- ��( ���&-��.* /&��-�(�� , separados pelo caractere � . Poderiamos, porexemplo, simular um envio de informações do formulário anterior através do seguinte������� de requisição:

“ �*� � ��- (&# /"-�� � /&��#�����/"- ��� /&��� � -��.* #���/ �.����% (&* /���* /&$ %.("* /� ',("- /&#�����.$ � ��'�("- /&#���"- /.��(� /�%&�� �)%&�*� � - ”Nesse caso, todo o texto que segue o caractere � é chamado de texto da “query”. Éimportante observar que os nomes e valores dos parâmetros contidos nesse textodevem estar codificados no formato MIME “x-www-form-urlencoded”.

Infelizmente, um estudo mais aprofundado da linguagem HTML e do protocolo HTTPfoge ao escopo desse livro, sendo deixado para o leitor a opção de consultar aliteratura específica para maiores esclarescimentos.

� ��� ��$ � ����� $ ,) �,$�� � � ) � � � + $ � )4���,! + !�& � � �A API de Servlets disponibiliza diversos métodos para capturar os parâmetros de umarequisição:

Métodos para a captura de parâmetros de formulários HTML !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&I��!�)���J#Q�&#�� � / �&�2� 9�< �� ��!�)����#Q�8#�� & ���J#��+� !5ON�' � D / �.�2� 9�< � �1>6�8�& / #����(' #��&P�#�3�5�#�"$�&� <�#��&I����$���J#Q�8#�� � ��' 5�#�" � / �)�.� 9�< �� ����.���J#��8#�� &B���J#�+� !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9�>6�8�& / #�����' #Q�&P6#�3�5�#�"$�&� <O#��&I����$���J#Q�8#�� & ���J#�" �,�+� !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q� � 5�#�� $ / �&�2� 9�< ���8�

O primeiro método para a obtenção de parâmetros da requisição é o método0�/���� �"- �.* /&� /"-�� � : ele recebe um nome de parâmetro e retorna o valor associado a esse nomede parâmetro.

Por outro lado, conforme vimos no formulário de exemplo da seção anterior, podemexistir campos com diversos valores associados a um mesmo nome (vide campo '�("- /&# doexemplo). Nesses casos, devemos utilizar o método 0 /&��� � - ��* /.��/�- � � � $�/&# ��� , que irá retornar nãoum único valor, mas sim um array de valores.

O método seguinte, 0�/���� � -��.* /.��/"-�� ��* /�# ��� , retorna uma lista enumerada com todos os nomesde parâmetros recebidos. Dessa forma, é possível iterar nessa lista e obter os respectivosvalores de parâmetros.

Por fim, o último método, 0 /.� � $�/�- � ����- � %"0 ��� , retorna justamente o texto da “query” explicadona seção anterior, ou seja, a parte do path de requisição que vem após o caractere �(se existir).

Page 62: Jsp servlets j2_ee

O Servlet ��/"-���� /&��� �&- �&* #���/ � usa os métodos apresentados anteriormente para capturar osparâmetros enviados pelo usuário e apresentá-los em sua saída

Servlet que imprime parâmetros de cada requisição recebida� �� �������� ������� � ��� ���� �� �������� ������� 5!�)� ' � �,�� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- H �� ��.� �J#J ���� ���J#��)�F��" E�#JD���E�� �F#�3�5�� "2� G �����F#�D�#�N�� E6� !5ON�' � D:D�' ��"." / #!�)��' #��&I����F��� "2P�#�3J#��2�F#!9�E6" >O�8�& / #!�)��' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- H �� ��.� ��� 9�E���D���N�#�G���' *%� >�? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- H �� ��.� ��� 9�E����J�&#�� �&��E�� � � 5�#�� $ � K"�1 �� �F#�3�5�#�"$�&� <@#Q� � 5�#��#$ / �&�.� 9�<>�!��9 �:965�' ' �

' � � � !�$� 9��&' 9���� ? #Q� �8�JE!� � 5�#��#$)�� ( �� �$#�3�5�#�"F�&� <�#Q� � 56#!� $ / �&� � 9�< ����(+������P��� !�+�

-.- H �F#!�$��9�E��796��"�9��!� #�" E���"0 ���� ���J#��)�F��"��9�5��J#��.� �&� �!9�' � ����$��� & ���J#�" �J �� �.#�3�5�#�"F�&� <�#Q�&I����)���J#��8#�� &B���L#�" �!�+� *�� ' #�+' � ����$��� &=�Q�J#�"Q� *���"2A4�!�F#���' #���#!9��F" �!���BR

-$- H �� ��.� ��� 9�E�� %�!� 9%�!��# - ����' ���/ �&� � 9�< ' � ����$��� & ���J# �=� / �&� � 9!<��B' � ����F��� &B�Q�J#�"Q� 9�#��2����' #!�J#�9��5���+�/ �&� � 9�< ' � ����$��� � ��' 5�# �J �� �$#�3�5�#�"F�&� <�#��&I����F���J#Q�F#!� ��' � ��!�)��� &=���J#��+�' � � � !�$� 9��&' 9����8I���� ���J#��&�F�� )( ' � ����$��� & ���J#<(+������P��� !�+�' � � � !�$� 9��&' 9������ � ��' �!�*� )( ' � ��!�)��� � ��' 5�# (/������P��� !�+�

-$- H �� ��.� ��� 9�E�� �F��E!��"4�!" ���!' ���F#�": ��!�$�:� ��!�����J#Q�.�F�7D����.�.#�9��8#/ �&� � 9�< ��� ' � ��!�)��� � ��' 5�#�" �7 �� �$#�3�5�#�"F�&� <�#��&I����F���J#��8#!� � ��' 5�#�" �+' � ����$��� & �,�J#��+�' � � � !�$� 9����,� � ? ��E���" ��"����!' �%�)#!"*� ��+�� K!�+' � ����F��� � ��' 5�#�"39 �J9�5�' ' �

K8��� �8� 9���H ���=�6H �Q' � ��!�)��� � �!' 5�#�"2� ' #!9�<��&*6��H (�(�� R� K!�1H ��� � �' � � � ��.� 9����8' � ����$��� � ��' 5�#�" �H �!�+�#%' "2#�' � � � ��.� 9���������� ( ' � ����F�!� � ��' 5�#�" �H �!�+�

0' � � � !�$� 9��&' 9����!����P��� ,�+�

0

-.- H �� ��.� ��� 9�E��:�.��E��! �#�>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

Page 63: Jsp servlets j2_ee

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

0

0

Se utilizarmos o formulário apresentado na seção anterior para enviar informações paraesse Servlet, uma saída possível seria:

Exemplo de página retornada pelo Servlet ServletInfoReq��>�?BA�C��������������I���� ����#��&�.���96�!�J#����P �� � ��' ��� �6��#!569��!�J#����!P��� ? ��E���"4�!"4����' ���.#�" ��� #!5�9%�!�J#����P��I���� ����#��&�.���D����$#�"�����P��� � ��' ��� �%��M�5O' ����P �� ? ��E���"4�!"4����' ���.#�" ����M�5�' ����#��FE�#�����P��I���� ����#��&�.���#�9�������P��� � ��' ��� ����9���� ��� ���!P��� ? ��E���"4�!"4����' ���.#�" � �O9���� ��� ����P �� - ����������� - >�? A0C��

Frequentemente, quando você quiser adicionar interatividade a sua aplicação Web,permitindo que o usuário envie dados ao servidor, você irá utilizar formulários HTML, epor isso, é muito importante que você domine os métodos apresentados nessa seção.

� ��� �)'$� )�� + $ � )0���,! + ! & ��� 5 5>8Assim como acontece na resposta de um Servlet, a requisição recebida também podeconter headers. Esses headers podem servir para indicar, por exemplo, característicassobre o cliente que gerou a requisição.

Métodos para a captura de informações de headers da requisição !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q�&> #��QE�#�� � / �&�2� 9�< �� *�#��QE�#�� & ���J#�+� !5ON�' � D7' ��9�< >(�8�& / #!���(' #��&P�#�3�5�#�"F�&� <�#����@� �8#�>O#���E!#�� � / �&�.� 9�< �� *6#��QE�#�� & ���J#�+� !5ON�' � D7� 9%� >O�8�& / #!�)��' #��&P�#�3%56#�")�&� <@#Q�&H 9%�&>O#��QE6#!� � / �&� � 9�< �� *%#���E�#�� &B���J#�+� !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9�>6�8�& / #�����' #Q�&P6#�3�5�#�"$�&� <O#��&>O#��QE�#��F" � / �&� � 9�< �� *%#!�QE�#�� & ���J#�+� !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9�>6�8�& / #�����' #Q�&P6#�3�5�#�"$�&� <O#��&>O#��QE�#�� & ���J#�" ���+�

Os métodos 0�/.� � / ����/�- ��� , 0�/�� � � � / � / � ��/�- ��� e 0�/&�� %.� �"/&� ��/�- ��� servem para recuperar o conteúdo de umheader e se comportam de maneira análoga aos respectivos métodos #)/���! ! ! � /"� ��/�-����apresentados na seção 4.2 desse livro: o método 0�/.� �����/ �&/"� ��/�- ��� recupera o conteúdo deum header contendo uma data, e o método 0�/��� % � �"/&� �&/"- ��� recupera o conteúdo de umheader contendo um número inteiro.

O método 0 /.� � / � ��/�-�# ��� , por sua vez, permite obter todos os valores associados a umdeterminado header: caso você saiba de antemão que um header irá ter diversosvalores associados, você deve utilizar esse método para garantir a recuperação detodos esses valores.

Page 64: Jsp servlets j2_ee

Por fim, o método 0�/&� � /&���./"-�� ��* /�# ��� retorna uma lista enumerada de todos os nomes deheaders recebidos. Com isso, você pode usar essa função para iterar na lista de todosos headers recebidos.

Um uso frequente para esses métodos é o de verificação do header $�# /�-����.0 /�%&� , que indicao tipo e versão do software do cliente que enviou a requisição. Por meio desse header,você pode gerar um documento diferenciado para cada tipo de browser que acessaa sua aplicação.

O header �&','�/"��� também é bastante importante: ele indica os tipos de conteúdos aceitospelo cliente. O Servlet ��/�- ��� /.� �/�- � '.'�/ � � a seguir verifica o conteúdo desse header e,dependendo de seu valor, retorna uma página de saudação em formato HTML ouWML; dessa forma, ele pode ser usado tanto para atender requisições de browsersnormais da Internet, como também para atender requisições de browsers de telefonescelulares (vide seção 4.3).

Servlet “ServletVerAccept” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- � #��.� K � DQ�J�J�%��' �!� E6� *6#��QE�#�� ����DQD�#! �� B# �$#��8���.96�: �; <=� 9��:>(? A�C-.- ��5&� A�CLE�#! �#�9�E�#!9�E��JE�#�".#�5�D���9��8# ��E�� !5ON�' � D:D�' ��"." / #!�)��' #�� � #��,*1D�DQ#� �� #��Q�8#%9%E!"�>6�8�& / #����(' #���R

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#�� �&*O�F�� "�H � �!�,D�#! ��&� �!9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�

-.- � #��.� K � DQ��9�E��7D��!9%�8# ��E��JE�� *�#���E�#!�4�QD�D�#% ��/ �&�2� 9�< ' � �QD�D�#! ��&>O#��QE�#�� �J �� �$#�3�5�#�"F�&� <�#Q�&> #��QE�#�� �!� �QD�DQ#� �� ,�+�� K"����' � �QD�DQ#� Q�.>O#���E!#�� 9 �:9O5�' ' � ��� ' � �QD�D�#� ��&>@#��QE�#!�.� #�3%5%��' "���� �8#��2� - �696E�� �� �� ��' ,���=R

-$- �LD�' � #�9��8#�QD�#�� �&�:D��!9%�8# �6E!�$� ALC!�6 ��.� �J#�� �F�:�8#�����" 3�5�#JE�#�K � 9�� � ��DQ��9��&#�9���� � $( �# ���.#�", ��!9%"2#�� " #Q� � ��9��8#�9�� ?�$� �#��!� �8#�� � - ��9�E�� �� !� ��' !�+�

-$- �O#� ��!� "1<@#��F������" ��DQ��9��&# ��E��=� A�C' � � � !�$� 9��&' 9����!� �Q����'Q�O#%�)",� �!9 � %' � � % � ��� ,�+�' � � � !�$� 9��&' 9����!��9 � � � ? �(I�� �!��'�I" �!C�H � %' � - - �7* I � � P�"=A -F- ��?-�+� A C � �-F- �(& %

�"% &*!�+�& (� -.- � �� �K+�!� 5��J� ����< - �@? � - ��' � � � ����' % ,�� ��+�' � � � !�$� 9����,�!� ��' ��� DQ���FE �� !�+�' � � � !�$� 9����,�!�Q L�!' � <(9��'% �DQ#�9��8#��,%' ,�@�' ;�� - �� !�+�' � � � !�$� 9����,�!� - DQ���FE ��� - ��' �� ,�8�

0#�' " # R

-$- � D�' � #!9!�&#79 ���7��D�#�� �F�:D���9��8# ��E�� � A�C���<@#!�$���J��"�5��J�: �; <=� 9��7>�? A�C' � � � !�$� 9��&' 9����!�Q>@? A0C��������������� ,�+�' � � � !�$� 9��&' 9����!�QI��@� ' ;�� - I��� !�+�' � � � !�$� 9��&' 9����!� - ����������� - >�? A�C��� !� �

0' � � � K8' 56"2*/���+�

0

Page 65: Jsp servlets j2_ee

0

� �������*� � $ ) $����0� ! � � +Além dos campos normais de input, seleção e botões de um formulário HTML, existe umtipo de campo especial que permite o upload (ou transferência) de arquivos damáquina do usuário para o servidor.

Exemplo de página HTML com formulário para upload de arquivo��>�?BA�C��������������

�����P�A A �!? >.���.�� 8I�� / ?- * � ? H ��&��� - ' � ���.��".#����(' #��&" - / #��F��' #��," �' ���QE�*��F3 - ��& � ? �(I����� +��5�' �&� ������ - K8�!� � �+E����&�� !�

/ #!' #�D�� �!96#:�����.3�5�� ���!� ����P ���QH &BI�"(? ? �(I����� K � ' #� �& *�A � �� +���$3!5O� ���� !������P�������P����H & I"@? ? �(I����� ",56N���� �� & * A3���� +#!9!�6� �� � * C(" � �� ,��9���� ���@ !�

� - ���P�A �� - ����������� - >�? A0C��

Nesse formulário de exemplo, o campo � -��&$�� � ( é do tipo �#� � / ; esse campo permite que sejaselecionado um arquivo do disco local que será enviado junto com a requisição. Vale apena observar também que existe um atributo adicional ������� � � � , com conteúdo* $!� �,� ���&- ��� ��(�-�* � �&����� , que deve ser especificado junto ao elemento � � � � .

A maneira mais fácil de se tratar esse tipo de parâmetro de requisição em um Servlet éutilizando classes prontas de terceiros. Um exemplo de uma biblioteca que pode serutilizada para esse tipo de tratamento pode ser encontrada no endereço��������� ����# (&$"-�',/ ��(�-�0�/�! %&/.�����"- (.� /&',��#�� * $!� �����"- ��- / �.$ /&# ��� .O Servlet � /"-���� /�� � ��� ( ���� -� a serguir utiliza essa biblioteca para tratar arquivos carregadospelo formulário HTML do exemplo anterior.

Servlet “ServletUploadArq” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

� �� �������*����& !� 5��&� ' "2� ��5�' �&� %�����)�F#�3�5�#�"F�&� / #!�)��' #Q�&A�5�' �&� ����F�&P�#�3�5�#�"$�&�� �� �������*����& !� 5��&� ' "2� ��5�' �&� %�����)�F#�3�5�#�"F�&� A�5�' �&� ����F�&P%#�3�5�#�"$�&�

-.- ? �$� �&�:���$3�5�� �%��"1�.�.��9�"$K8#!� � E���" E��JD!' � #�9��8#� ��!�$�:��".#��)�6� E��!� !5ON�' � D:D�' ��"." / #!�)��' #��,"= �' ���QE�* �F3�#�� �&#�9�E�" >O���& / #��F��' #Q� R

�5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#��&*O�F�� "0H � ����DQ#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�

-.- �NQ�F#!9�E���� 9%K ���.�J��G �!#!"4".��N��.#J���!�F3�5O� ���JD��!�$�.#�<(�QE��-.- � ��.� �J#!� �$�7 ���� ����#��&�.�&#��7�$#�3%56� "2� G �%��6��".#�<(5�9�E��&#�� 9��!�J#JE�# 5�� E�� �$#Q� ���2� �-.- �8#!�� ����.;��$� � �!96E!# E�#Q��#�� ���1" #!�@���$���,M�#�9��QE���"=��"=���$3�5�� �%��"=D��!�.�$#Q<@�QE��!"=96�" #!�)��� E���� �-.- �J�8#��FD�#�� �$�&#��J�&���J�!9�*6�7�J; �!� �L�:#���N�$��8#�"0 %#!�.��� �&� E���"'��#���3�56���F�8�� ���E!#-.- E�#�K8� 9O� � ��#!9�D���E�� 9�< �J"2#��05!�)� ' � M!�QE!�� �#�' � ��!�F" #!���+�JE�#�K ��5�' �)#>�&H / � � ������� � ,�A�5�' �&� ������)P%#�3�5�#�")��' � ����F" #!� �79%#� / #!�)��' #��&A:5�' �&� ������)P%#�3�5�#�")� �+ �� �.#�3�5�#�"$���

� � � %�%.�&#��� � !��A:5�' �&� ����)�&P�#�3�5�#�"F�&� A * ��� P�� * ��� ���6? � / ��9�5�' ' ���

Page 66: Jsp servlets j2_ee

/ �&�2� 9�< ' � 9����J#�* �.3/�J' � ����F"2#��2� <�#�������".# ��� ' #!9%���:#����+���)3%56� ���� !�+� -$- &=���J#:E6�7���F3�5�� �%�

-.- ? ���J��9�*6��E������$3%56� ���/ �&�2� 9�< ' �=�8���&* �F3>�JC���9�<(� �8� / �&�.� 9�< �+' � ��!�F".#��.� <�#�� ��� ' # / � M!#��� �!�F3�5�� �%�� ,���+�

-.- & �!�J#7' ��DQ�!'6E��J�!�F3�5�� ���!�6��D���9��8#���E��:E������$3�5�� �O�:D����2�F#�<���E�� #J<=�F�Q����E!�J#!� 5��-.- ���.3�5�� �����F#!� ����.;��.� ��' ��DQ�!'6�!N���� �Q�7E���E�� �.#�� �!� � �J#�"2 �#�D!� K&� D��QE���9��JD���9�"$�&�.5%�8�!�4E��-.- D�' �Q"2" # / #��F��' #Q�&A:5�' �&� ������&P6#�3�5�#�"F���� ' #�' �=�!�F3�C���DQ�!' �:' � ����$".#��.� <@#Q� �O� ' #�������F3�5�� �%�� ,�+�/ �&�2� 9�< ' � 9����J#�* �.3�C���DQ�!' �7' � ���$3�C���D���' � <�#Q�,& ��� # ���+�

-.- H �� ��.� ��� 9�E��:*�#���E�#!�4>(? A0C' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- H �� ��.� ��� 9�E��:� 9�K8�!�.� �QG �%#�"4"2��N��F#J���!�$3�5�� �����F#�D�#�N�� E��' � � � ��.� 9!�)' 9���� &=���J#:E������.3�5�� ���!� )( ' � 9��!�J#�* �F3/(>������P��� ,�+�' � � � ��.� 9!�)' 9����+?B�Q�J��9�*���E������$3�5�� �O�!�� ( ' �@�F���$*��F3/(>������P��� �� �' � � � ��.� 9!�)' 9���� &=���J#BE!�����F3�5�� ���:�8#��� ����F;��2� � ' ��D���' �� ( ' � 9����J#�*��)3%C%��D���' (>������P��� ����

-.- H �� ��.� ��� 9�E��:�.��E��! �#�>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C� ,�+�' � � � K8' 56"2*/���+�

00

No Servlet anterior, usamos alguns dos métodos disponíveis na biblioteca ��$ � � � ���"- ����/ �&$ /�# � .Para conhecer todos as suas funcionalidades, você deve fazer o download dabiblioteca, e observar a documentação de sua API.

� � � ��� � ! 2�� � � + $ � )4���! + !�& � �

Finalmente, além de todos os métodos apresentados anteriormente, existem métodospara definir e recuperar atributos da requisição. Esses atributos funcionam como osatributos do contexto do Servlet apresentados na seção 3.6, exceto que seu escopoestá limitado à requisição.

Métodos para definir / recuperar atributos da requisição !5ON�' � D / �.�2� 9�< >O���& / #����(' #��&P�#�3�5�#�"F�&� <@#Q��*�+�.�.� N�5%�8#� / �)�.� 9�< �=�Q�+�)�$� N�5��8#& ���J# �+� !5ON�' � D75��)� ' � ��9�5��L#!�$� �&� ��9J>O�8�& / #!�)��' #��&P�#�3!56#�")�&� <O#Q�!*B�+�.�.� N�5��F#!& ���J#�" �,�+� !5ON�' � D����!� E >O���& / #��F��' #��&P�#�3�5�#�"F�&� ".#Q�,* ���&�2� N�5��8#� / �&� � 9�< � � �8�&� � N�5��8#&B�Q�J# ��� N�� #�D��� ��=���+�)�.� N!5%�8# � ��' 5%# �8�

Embora estejamos falando desses métodos pela primeira vez nesse capítulo, exemplos euma explicação mais detalhada de seu uso serão apresentados no íCapí tulo 8 –Modelo MVC.

Page 67: Jsp servlets j2_ee

� ����� ����� �

��� � � � � � � � � �� � � � � � � � ��� � �

Nesse capítulo são explorados os conceitos de Cookies e Sessões: através dessastécnicas, veremos como é possível armazenar informações sobre os usuários queutilizam nossas aplicações.

�'� ��� � �.$ �')*- $*- � ! - 1 � � �.$ &(*) + �� �'+ � 2 � ! �Como explicamos na seção 3.2, o HTTP é um protoloco stateless, ou seja, ele nãomantém um histórico das requisições recebidas de um mesmo cliente.

Assim, imaginando uma aplicação simples como um carrinho de compras de umalivraria virtual, por exemplo, como devemos proceder para manter o histórico dos livrosjá selecionados pelo nosso cliente? Se a seleção de cada livro gera 1 ou maisrequisições, no momento do fechamento da compra, como fazemos para saber quaisforam todos os livros selecionados?

Existem algumas maneiras diferentes de resolver esse problema, de maneira a contornaressa limitação do protocolo HTTP, como veremos a seguir.

�'�&� � $�� ��� + ) + #�� - ! � + ) 1 � � � � ��2 � ! � + 5����Além dos tipos de campos de formulários HTML apresentados na seção 5.3 desse livro,existe também um tipo, chamado “hidden”, que pode ser usado para esconderparâmetros da requisição.

Na página HTML seguinte, o campo '�(�%������.("- é do tipo “hidden”.

Exemplo de formulário HTML com campo “hidden”��>�?BA�C��������������

�����P�A A=�!? > ���.�� 8I�� / ? * � ? H ��& �� - ' � �@�F��" #!�)��' #��8" -./ #!�)��' #Q� � ��9��8��E��%�$P�#�3 - ,�� ��9��8��E!��� E�# �)#!3�5�� ",� G �%#�"��(� ����P����H & I"@? ? �(I����� �*�� E�E�#!9� �& * A � �� +DQ��9��8�QE���� � * C(" ���� � !������P�������P����H & I"@? ? �(I����� ",56N���� �� & * A3���� *B�)5���' � M���� � *�C(" ���� �*B�&5���' � M���� ��

� - ���P�A �� - ����������� - >�? A0C��

Se você tentar abrir essa página em um browser, você poderá observar que o campo')(�%.��� �.(�- não é visível; por outro lado, o nome e valor desse campo serão recebidosnormalmente como um parâmetro de requisição pelo seu Servlet.

Page 68: Jsp servlets j2_ee

Assim, podemos construir o Servlet a seguir para contar o número de requisiçõesrecebidas de cada cliente:

Servlet “ServletContadorReq” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- � �%9!�&�:� 9��6�J#!�F�JE�# �F#�3%5O� " � G ��#�"0�$#!D�#!N�� E���" E�#JD���E!�JD!' � #�9��8# !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!���2P%#�3J#��Q�8#�9�E�"�>6�8�& / #%�&�(' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�

-.- *B�)5���' � M���9%E��:��D���9��8��E��!�� ��!�F�J��D�' � #!9%�8#JD����.�$#!9��F# � E�#�"2"$�7�.#�3�5�� "2� G �����-.- ���� ����)�&� D�56' ��� ��"2#�#�"." ��K8���4� 6�.� �J#�� �)�7�F#�3�5�� "Q� G����7�$#�D�#!N�� E����-.- �J���!' ��� E�� ���� ���J#��)�F�/��DQ�%9!�8��E��!�@ �# 965�' ����#���96#�" ".#�DQ��" � � 96� D�� ��' � M����J��"-.- ��DQ��9��&�QE���� D��!���J����' ��� � �� 9%��' �BDQ��9��8��E��!��� �=��)� $ R

' �=D��!9��F�QE��!���7H 9��8#�<(#��.� ����$".#�H 9!���+ �� �$#�3�5�#�".�&� <�#��&I����.���J#��8#%� ���+D���9��&�QE���� ,���+�(�( ' �BDQ�!9%�8��E��!� �

0 D����&D�* � & 5���N�#!� �����.�J� �����QDQ#� ��)� ��9� ��=#��R' �=D��!9��F�QE��!��� �B�

0

-.- * ��F#�".#!9%�8��9�E��L�J����' �!�4E��7D��%9!�&�QE���� #��JK8�!� ��5�' ;!�.� �7>(? A0CJ3�5�#�� �F;-.- �#%�$��� �&� � � � 96D��.#��J#!9��8�JE�� �J#�"2�J�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9���������� P�A A �!? >���� � % �I�� / ? %' * � ? H ��&�� % - ' � ���.��".#����(' #Q�&"

/ #��F��' #Q� � �!9!�&�QE����.P�#�3 - % ��� !���' � � � ��.� 9!�)' 9���� � �!9!�&�QE��!� E�# �$#�3�5O� "2� G ��#�" ����(�H 9��8#�<�#!� � �8� / �&� � 9!<��+' �=D��!9��F�QE!��� �

(�������P��� ,�+�' � � � ��.� 9!�)' 9������QH & I"(? ? �=I�� � % &*�� E�E6#!9�% �& * A ���'% D���9��&�QE����,%' � *�C(" ���@% ,

( H 9%�8#Q<@#!�.� �8� / �&� � 9!<��+' �=D��!9��F�QE!��� � ( � %� !������P�������P��� �� �' � � � ��.� 9!�)' 9������QH & I"(? ? �=I�� � % 8" 5�N���� ��% & * A ���@% *�&5���' � M���� %

� * C(" � � % *�&5%�!' � M�����% ��� !���' � � � ��.� 9!�)' 9������ - ���P�A �� !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Page 69: Jsp servlets j2_ee

O Servlet � /�- ��� /�� �(�%&��� �.(�-���/ � anterior usa o campo escondido '�(�%.��� ��(�- para armazenar o valordo contador na última requisição recebida, sendo que esse valor é repassado de voltapara o Servlet cada vez que o cliente pressiona o botão � ��$.�!� � � � - .Assim como acontece nesse Servlet, você pode utilizar campos escondidos deformulários HTML para armazenar informações e fazer com que sejam passadas paraseus Servlets junto com as requisições futuras recebidas.

Por outro lado, esse método tem uma grande desvantagem: para utilizá-lo, vocêprecisa garantir que, uma vez armazenado um valor em um campo escondido, todasas requisições recebidas carregarão esse parâmetro junto.

Isso pode gerar um grande trabalho na construção de sua aplicação, além de nãofuncionar em todos os casos: se o usuário de sua aplicação sair de sua página, ou atémesmo usar os botões de navegação de seu browser (como o botão de voltar, porexemplo), ele automaticamente irá perder os últimos parâmetros definidos.

�'��1 � - 1 � � �.$,& ( ),+ $ !"#%! � -'$,! + ,)�# $��.! - 3�Outra forma de armazenar / passar informações entre requisições subsequentes de ummesmo cliente é utilizando as informações adicionais de caminho.

O Servlet ��/�- ��� /&� � (�% ��� �&(�-��&/ � da seção anterior, por exemplo, poderia ser modificado parapassar o valor atual do contador como uma informação adicional do caminho.

Servlet “ServletContadorReqMod” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- � �%9!�&�:� 9��6�J#!�F�JE�# �F#�3%5O� " � G ��#�"0�$#!D�#!N�� E���" E�#JD���E!�JD!' � #�9��8# !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!���2P%#�3�A4��EJ#�� �&#�9�E�" >(�8�& / #!���(' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�

-.- ���Q�&�$��� 9�E��J� 9%K ���.�J�QG ��#�" ��E�� D�� �!9%�!� "4E�#7D��!��� 96*��/ �&�2� 9�< ' � � 9!K ��I�� �&*/�� �� �F#�3�5�#�"$�&� <O#��&I�� �&*OH 9�K+� �,�+�� K"� �+' � � 9�K+�!I��Q�&*/9 �:965�' ' � � � ' � � 9�K8�!I��Q�&*6� "F�F�����&"�� � �)*���� - ,�����

�+' � � 9�K+�!I��Q�&*6� ' #�9�<��&*/����� ���' �� 9�K8��I�� �)*/�:' � � 9�K+�!I�� �&*O� "256N�")�&�.� 9%<�� � �

-.- *B�)5���' � M���9%E��:��D���9��8��E��!�� ��!�F�J��D�' � #!9%�8#JD����.�$#!9��F# � E�#�"2"$�7�.#�3�5�� "2� G �����-.- ���� ����)�&� D�56' ��� ��"2#�#�"." ��K8���4� 6�.� �J#�� �)�7�F#�3�5�� "Q� G����7�$#�D�#!N�� E������J�O��' ��� E��-.- ��!� ��� #Q�&�$� ��D��!9%�8�QE���� �# 965�' ����#��O9�#�"."2#JD��Q" � � 9O� D�� ��' � M����J��" ��D���9��F�QE!���-.- DQ�����J���!' ��� � �� 9%��' �BDQ��9��8��E��!��� �=��)� $ R

' �=D��!9��F�QE��!���7H 9��8#�<(#��.� ����$".#�H 9!���+' � � 9%K+�!I�� �&*��+�(�( ' �BDQ�!9%�8��E��!� �

0 D����&D�* � & 5���N�#!� �����.�J� �����QDQ#� ��)� ��9� ��=#��R' �=D��!9��F�QE��!��� �B�

0

Page 70: Jsp servlets j2_ee

-.- * ��F#�".#!9%�8��9�E��L�J����' �!�4E��7D��%9!�&�QE���� #��JK8�!� ��5�' ;!�.� �7>(? A0CJ3�5�#�� �F;-.- �#%�$��� �&� � � � 96D��.#��J#!9��8�JE�� �J#�"2�J�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9���� � �!9!�&�QE��!� E�# �$#�3�5O� "2� G ��#�" �� ( H 9%�8#Q<@#!�.� �8� / �&� � 9�<.�+' � DQ��9��&�QE���� �

(+�����!P�������P �� !�+�' � � � ��.� 9!�)' 9������ * >@P � ��� %' - ' � �(�)�!"$#!�)�6' #��8" -2/ #����(' #�� � ��9��F�QE!���.P%#�3�A4��E -

( H 9%�8#Q<@#!�.� �8� / �&� � 9!<��+' �=D��!9��F�QE!��� � ( � %� !�@*B�&56��' � M���� � - * �� !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Em relação a utilização de campos escondidos, essa técnica possui a vantagem desimplificar um pouco a construção de seus Servlets. Por outro lado, ela não resolve osproblemas apontados anteriormente com relação a perda dos parâmetros definidos.

�'��� �������! ),+Para resolver esse problema da persistência das informações associadas a um cliente, énecessária a utilização de “Cookies”.

Cookies são pacotes de dados, gerados pelo servidor, e que são enviados junto com aresposta de uma requisição, ficando armazenadas pelo browser do usuário.Posteriormente, a cada requisição enviada, o browser anexa também as informaçõesdesses Cookies, permitindo que o servidor recupere os valores definidos anteriormente.

Um estudo completo de Cookies foge ao escopo desse livro; para obter mais detalhessobre eles, deve-se consultar a RFC 2109 (mais informações no site��������� ��� � � � ! �.���"#,! � /�� ��! ("- 0 � - � ' ��- ��' ��� � � ! ����* � ), que contém sua especificação.

Por outro lado, vale a pena conhecer os principais atributos de um Cookie; além de umnome, que identifica o Cookie para um determinado servidor e path nesse servidor, e ovalor, que contém os dados em si, um Cookie possui também alguns atributosadicionais:

�3 Comentário (Comment): deve conter um texto descrevendo o propósito e funçãodo Cookie;

�3 Período de expiração (MaxAge): determina por quanto tempo (em segundos) oCookie será válido;

�3 Domínio (Domain): por default, uma vez definido, um Cookie só é retornado juntocom requisições para o mesmo servidor que o gerou. Esse atributo permite, por outrolado, que esse Cookie seja enviado para todos os servidores abaixo de um mesmodomínio (conforme especificado na RFC 2109);

Page 71: Jsp servlets j2_ee

�3 Caminho (Path): por default, uma vez definido, um Cookie só é passado junto comas requisições para os recursos abaixo do diretório virtual do recurso que gerou oCookie. Se esse caminho for definido, por outro lado, o Cookie passa a ser enviadojunto com as requisições para qualquer recurso abaixo caminho especificado;

A API de Servlets disponibiliza uma classe especial para representar um Cookie, a classe� � � � � ! # /�- ��� /.��! � ����� ! � (&(&+�� / , sendo que os métodos dessa classe permitem definir / recuperar osvalores de seus diversos atributos.

Métodos para definir / recuperar os principais atributos do Cookie !5ON�' � D / �.�2� 9�<�<(#��,& ���J# �,�+� !5ON�' � D / �.�2� 9�<�<(#�� � ��' 5�#/���8� !5ON�' � D����!� E�"2#�� � ��' 56#� / �&�.� 9�< ��=����' 5�#��+� !5ON�' � D / �.�2� 9�<�<(#�� � �!���J#!9!� ����� !5ON�' � D����!� E�"2#�� � �!���J#!9!� � / �&�$� 9�< ��BDQ�!���J#�9����+� !5ON�' � D / �.�2� 9�<�<(#����O������� 9&�!�+� !5ON�' � D����!� E�"2#���� �!�J��� 9�� / �)�$� 9�< ��=E����J��� 9��+� !5ON�' � D / �.�2� 9�<�<(#��&I��Q�&*/����� !5ON�' � D����!� E�"2#��&I��Q�&*�� / �&�$� 9�< �� %� �&*��8� !5ON�' � D7� 9%�B<(#��&A4� ��*B<�# ����� !5ON�' � D����!� E�"2#��&A4�Q�@*B<(#��+� 9�� �� �J��� *B<@#�+�

Para usar um Cookie, primeiro devemos criá-lo, passando como parâmetros de seuconstrutor o nome e valor do Cookie, e, em seguida, devemos definir seus atributos.Finalmente, o Cookie deve ser adicionado ao objeto � ����� � /�- ��� /.� ��/&#)� (�%&# / para que sejaenviado para o browser do usuário.

Exemplo de código com definição de Cookie�� ��� ��� #�' �=D���� ��� #/�796#� � ��� ��� #���� � ��9��8�QE6�!� ���� � ��+�' �=D���� ��� #�� ".#�� � �����J#!9������ � ������� #:E6#7#���#!�� �' � - �&#�"F�&#� ��+�' �=D���� ��� #�� ".#��&A4� ��*B<�#� � � �+� ���.#�", ���9�"2#�� �QE�E � ������� #�+' �BDQ������� #��+��

No código anterior, estamos gerando um Cookie de nome � (�%.��� �.(�- , com o valor � , e queterá validade de 60 segundos a partir do instante em que for recebido pelo usuário;passado esse período, o Cookie é automaticamente descartado pelo browser. Umvalor negativo para o período de expiração indica que o Cookie deve ser válidoenquanto o browser não for encerrado, e o valor � indica que o Cookie deve serremovido imediatamente pelo browser.

É importante observar também que, a menos que você esteja fazendo o controle dobuffer de resposta conforme descrito na seção 4.6, esse procedimento de criação eadição de Cookies a resposta do Servlet deve acontecer antes de gerar o conteúdoda resposta propriamente dito, de forma a preservar a ordem dos elementos HTTP daresposta do Servlet.

Após gerarmos todos os Cookies desejados, podemos recuperá-los nas requisiçõesseguintes através do método 0 /�� �(.(&+�� /�# ��� da classe � ����� � /"-�� � /�����/ ��$�/�#)� . Esse método retorna % $ � � senão houver nenhum Cookie na requisição recebida, ou um Array com os Cookiesrecebidos.

Page 72: Jsp servlets j2_ee

Infelizmente, não existe um método para a recuperação direta de um Cookieespecífico; é necessário utilizar esse método para recuperar todos os Cookies, e, então,iterar nessa lista até acharmos o Cookie que estamos procurando.

Assim, podemos utilizar o trecho de código a seguir para obter o valor do Cookie � ("%.�����.("-definido anteriormente.

Exemplo de código para obtenção de um Cookie�� ��� ��� # � � ' �=D�������� #�"3�J �� �F#�3�5�#�".�&� <�#�� � ��� ��� #�" �!�+�H K!�+' �=D�������� #�"39 �:965�' ' �

K8��� �+� 9�� � ���=�O� ��' � DQ��� �!� #�"Q� ' #!9�<O�&*���� (�(��� K"����' � DQ��� ��� #�" �+� �+� <�#���& ���J# ����9 �:9�5O' ' � � � �+' � DQ��� ��� #�" �+� �+� <�#���& ���J#

�!�+� #�3%5%��' " �,� � ��9��8�QE���� !���,��.� $ R

' �=D���9��8�QE���� �JH 9%�8#Q<@#!�.� ����$".#!H 9����+' � DQ��� ��� #�" �� �+� <�#�� � ��' 5�#/�����8�0 D��Q�FD�* � &B5���N�#!� �6�!�.�J� ���%�QDQ#% ��&� �!9� �=# �BR

' �=D���9��8�QE���� � �B�0

Com os métodos e recursos apresentados, podemos reimplementar nosso Servlet� /�- ��� /�� �(�%.��� �.(�-��&/ � da seguinte forma:

Reimplementação do Servlet “ServletContadorReq” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- � �%9!�&�:� 9��6�J#!�F�JE�# �F#�3%5O� " � G ��#�"0�$#!D�#!N�� E���" E�#JD���E!�JD!' � #�9��8# !5ON�' � D:D�' ��"." / #!�)��' #�� � ��9��8��E!���2P%#�3J#��Q�8#�9�E�"�>6�8�& / #%�&�(' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- *B�)5���' � M���9%E��:��D���9��8��E��!�� ��!�F�J��D�' � #!9%�8#JD����.�$#!9��F# � E�#�"2"$�7�.#�3�5�� "2� G �����-.- ���� ����)�&� D�56' ��� ��"2#�#�"." ��K8���4� 6�.� �J#�� �)�7�F#�3�5�� "Q� G����7�$#�D�#!N�� E����-.- �J���!' ��� E�� ���� ���J#��)�F�/��DQ�%9!�8��E��!�@ �# 965�' ����#���96#�" ".#�DQ��" � � 96� D�� ��' � M����J��"-.- ��DQ��9��&�QE���� D��!���J����' ��� � �-.- ��� / �� 6�F��D�5��.���J��" �J����' ��� E��JD���9��F�QE��!� #!9%�&�.#J��"0DQ��� ��� #�"-.- �F#�D�#�N�� E���" D���� � �F#�3�5�� "Q� G����� ������� #����' � DQ������� #�"3�J �� �)#!3�5�#�".�&� <�#�� � ��� ��� #�"3���+�� 9%��' �BDQ��9��8��E���� � �B�� K"�+' � DQ��� ��� #�" 9 �L9�5�' ' �

K8��� ��� 9�� � ��� ��� �Q' �BD���� ��� #�"2� ' #!9%<��&*���� (�(��� K"�,�+' �BDQ�!� ��� #�" �+� ��� <�#���& ���J# ����9 �:965�' ' � ��� ��' �BDQ�!� ��� #�" �+� ��� <�#���& ���J#

�,�+� #�3�5���' "���� � ��9��8�QE���� !�,���

Page 73: Jsp servlets j2_ee

�)� $ R' �=D���9��8��E��!� �JH 9%�8#Q<@#!� � ����$".#!H 9����+' � DQ������� #�" �+� �+� <@#Q� � ��' 5%# �������' �=D���9��8��E��!� (�(��

0 DQ�Q�FD�* � &B5��JN�#!� �6�!�$�J� � ���QDQ#� Q�.� ��9� ��=#��R' �=D���9��8��E��!� � �B�

0

-.- � 5����FE���9�E��:�J�O��' ��� D��%� �F#�9��8#JE���DQ��9��&�QE���� #�� 5�� � ��� ��� #� ������� # ' �=D���� ��� # �J9�#� � ������� #���� � �!9%�8�QE��!� ���H 9��8#�<(#��.� �8� / �&� � 9�<��+' � DQ��9��&�QE���� ���+�' �=D���� ��� #�� " #Q� � �!���J#!9!����� � ������� #JDQ����DQ��9��&�QE���� %���.� / #��F��' #Q� � �%9!�&�QE����.P�#�3� ��+�' �=D���� ��� #�� " #Q�&A4� ��*B<�#�� � � � � � � � �+� -.- � �!' � E��QE�#/� � �@" #Q<(5�9%E!��" � � �=��� 9�5��8��" � � *��!�)��"3� E�� � �� �$#�"Q ���9�" #!� ��E�E � ��� ��� #�+' �=DQ������� #��+�

-.- * ��F#�".#!9%�8��9�E��L�J����' �!�4E��7D��%9!�&�QE����I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9���� � �!9!�&�QE��!� E�# �$#�3�5O� "2� G ��#�" ��� ( H 9%�8#Q<@#!�.� �8� / �&� � 9�<.�+' � DQ��9��&�QE���� �

(+�����!P�������P �� !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Nessa nova implementação do Servlet, vale a pena observar que não é necessário queo usuário de nossa aplicação clique em nada para que o contador seja atualizado,basta que ele recarregue a página. Até mesmo se o usuário visitar outra página edepois voltar para o endereço desse Servlet, o contador é incrementado.

Infelizmente, existem situações em que Cookies não funcionam: geralmente issoacontece quando o browser do usuário está configurado explicitamente para nãoaceitar Cookies. Com as crescentes preocupações em torno da privacidade de quemnavega na Internet, alguns usuário passaram a bloquear o armazenamento de Cookiesem seus browsers.

�'��� � )�� ) -'# !"$�� ) - � � ,) + ),+ +%(*),+A API de Servlets disponibiliza um módulo extremamente útil no controle de informaçõesassociadas ao usuário que acessa nossa aplicação: o módulo de gerenciamento desessões de usuários.

Basicamente, esse módulo funciona da seguinte forma: a primeira vez que o usuárioacessa nossa aplicação, é criado para ele um identificador de sessão, ao qual éassociado um objeto da classe ��� ��� �&! #)/"- ��� /&��! � � ���&! � � �����/�# # � (�% na memória do servidor deaplicações. A partir daí, o servidor de aplicações procura fazer com que todas as

Page 74: Jsp servlets j2_ee

requisições vindas daquele usuário carreguem esse identificador de sessão, seja atravésda definição de Cookies, ou através da reescrita das URLs (com informações adicionaisde caminho) para que incorporem essa informação. Recebido esse identificador, a APIautomaticamente disponibiliza para o Servlet o objeto � � �����/�# #�� (�% criado anteriormente.

Dessa forma, um Servlet pode utilizar esse objeto � ����� � /.# # � (�% em memória para armazenarinformações que queira associar a um usuário específico que acessa a aplicação. Essasinformações estarão disponíveis em todas as requisições posteriores recebidas não sópelo Servlet que as armazenou, mas também para todos os Servlets quecompartilharem do mesmo contexto.

Para obter uma referência ao objeto dessa classe � ������ /&# # � ("% , um Servlet deve utilizar ométodo 0 /�� ��/�# # � (�% ��� da classe � � �����/"-���� /.� ��/ �&$ /&#�� ; esse método possui, na verdade, duasassinaturas.

Assinaturas para o método “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 sessão, sendo que esse objeto podeter sido criado nesse instante, ou ter sido criado em uma requisição anterior (ou seja, jáhavia uma sessão criada).

A segunda assinatura, por sua vez, admite um parâmetro que, se for � -�$�/ , faz com que ométodo tenha o mesmo comportamento da primeira assinatura. Caso contrário, ométodo pode retornar null: se ainda não houver uma sessão criada, ao invés de criaruma nova sessão, o método retorna null.

Podemos, então, utilizar o seguinte trecho de código para obter o objeto com a sessãocorrente:

Primeira alternativa de código para obtenção do objeto “HttpSession”para a sessão corrente

>O�+�& / #!"$"2� �!9�' �="2#�"."Q� ��9/�7 � �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� K8��' " # ���� K!�+' �="2#�"2" � ��9/9 �J9�5�' ' �R

-.- ? �.� �8���J#!9��8�JE��J�!N�� #��8�JD���� " #!"$" ����0

#%' "2#R

-.-�/ #!"$" ������� 9�E��79 �%�:K8���OD!�.� �QE�����# 9�#�DQ#�"2"$;!�.� �:" #�D��2� ����5��J�:96�Q���:" #�" " �%�!��0

O código anterior utiliza a segunda assinatura do método 0 /.� � /&# # � (�% ��� para obter a sessãocorrente. Uma alternativa melhor de código é apresentada a seguir, utilizando aprimeira assinatura do método 0�/�� � /&# # � (�% ��� :

Código para obtenção do objeto “HttpSession” para a sessão corrente

Page 75: Jsp servlets j2_ee

>O�+�& / #!"$"2� �!9�' �="2#�"."Q� ��9/�7 � �F#�3�5�#�"$�&� <O#�� / #�".",� �!9����+�� K!�+' �="2#�"2" � ��9�� � " & #� �!���R

-.- "=�J�79%�����:" #�"." ���J��DQ�!N���5JE�#J"2#�� D!� � ��E����6D���E�� <@� ����.���.�F�Q�8��� #�"." #�D��Q" ��0

#%' "2#R

-.- * " #�" " ��� � ; *%�Q��� �:"Q� E6�7D��.� �QE��:#!� 5��J�:�.#�3�5�� " � G����7��9��&#��2� �!� �-.- D���E�� <@� ����.���.�F�Q�8��� #�"." #��!5%�&�.�JD���".�

�0�

No código anterior, podemos observar também a utilização de um método � # � / � ��� daclasse � ����� � /�#)# � ("% : esse método indica se o identificador da sessão já foi enviado para obrowser cliente ou não (ou seja, se a sessão acabou de ser criada). Além dessemétodo, a classe � � ������/�# ##� (�% oferece diversos outros métodos:

Métodos da classe “HttpSession” !5ON�' � D����!� E�"2#���*�+�.�.� N�5��8#� / �)�$� 9�< ��=���+�)�.� N�5��8#&=���J#����N�� #�D �� � � �8�&� � N�5��8# � ��' 5�#��+� !5ON�' � D=�N�� #�D �<@#���*�+�)�.� N�5��8#�� / �&�$� 9�< ��B� �8�&� � N�5��8#&B���:#��+� !5ON�' � D����!� E �.#������%#�*B�8�&� � N�5��8#�� / �)�.� 9�< �� �Q�+�.�.� N�5%�8#!& ���J#�+� !5ON�' � D7� ������� 5��&� ' � ��9�5��J#��F� �&� �!9L<�#��!*B���&�.� N!5!�8#!& ���J#�" ���8� !5ON�' � D / �.�2� 9�<�<(#��&H E>���8� !5ON�' � D7' ��9�<�<@#�� � �F#��Q�&� �!9�?B� �J# �,�+� !5ON�' � D7' ��9�<�<@#��&C���"F��*1D�DQ#�"." #�E%? � �J# �����

Os primeiros quatro métodos apresentados permitem gerenciar os objetos quequeremos associar a sessão do usuário de forma similar a manipulação de umaHashtable. Dessa forma, para cada objeto que queremos armazenar na sessão HTTP,nós devemos associar um nome de atributo, e manipular o objeto como valor desseatributo.

Assim, se quisermos definir um atributo de sessão de nome � ("%.�����.("- , contendo o valor docontador de requisições usados nos Servlets � /�- ��� /�� �(�%.��� �.(�-��&/ � , podemos utilizar o seguintetrecho de código:

Código com exemplo de definição de atributo de sessão�

>O�+�& / #!"$"2� �!9�' �="2#�"." �Q�/�7 �� �$#�3O5�#�"$�&� <�#�� / #!"$"2� �!9�� �.�.5�#�+�' �=" #�" ".�Q��� " #Q�,*B�8�&�.� N�5��8#�,� � ��9��8�QE���� !�O9�#� H 9!�8#�<O#%� �+' � DQ��9��8�QE6�!� ������

Para recuperar o valor desse atributo posteriormente, podemos utilizar esse outro trechode código:

Código com exemplo de recuperação de atributo de sessão�

>O�+�& / #!"$"2� �!9�' �="2#�"." �Q�/�7 �� �$#�3O5�#�"$�&� <�#�� / #!"$"2� �!9�� �.�.5�#�+�H 9%�8#Q<@#!� ' �=D��!9��F�QE��!�.H 9�� �&�+H 9%�8#Q<@#!� � ' �=" #�" ".�Q��� <@#Q��* �+�)�.� N!5%�8#��� � ��9��&�QE���� !�+�

Page 76: Jsp servlets j2_ee

Os três métodos seguintes, 0�/��� � ��� , 0�/&� � -�/ � �,� (�% �� * / ��� e 0�/&��� � # � �' '�/.# #�/�� �(� * / ��� , retornam,respectivamente, o identificador dessa sessão, o instante de criação da sessão e oinstante de último acesso do usuário com a sessão corrente (esses dois últimos valoresem milisegundos, desde 1º de janeiro de 1970 GMT).

O Servlet a seguir utiliza os métodos apresentados anteriormente para construir umapágina HTML com todas as informações sobre a sessão corrente do usuário:

Servlet “ServletInfoSessao” � �� �������� ������� � ��� ���� �� �������� ������� 5!�)� ' � �,�� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- H �� ��.� �J#J� 9%K ���.�J�QG ��#�" " �!N��$#J�7".#�" " ���JD���� �F#�9��8#JE�� 56"25�;��.� � !5ON�' � D:D�' ��"." / #!�)��' #��&H 9%K � / #!"$"2�Q�J#��Q�8#%9%E!"�>6�8�& / #!�)�(' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- H �� ��.� ��� 9�E��:*�#���E�#!�4>(? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- �N��8#�9�E��7� 9�K8���.���QG �%#�" " �!N6�F#7��"$#!"$" ����D��!� �.#�9��&#JE���5�",5%;��.� �>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� �.�.5�#��8�� K"��9 ' �=" #�" ".���!� � " & #� �,���R

' � � � !�$� 9��&' 9����8H � E��J"2#�"2" ���!�.�)( ' � " #�" ".����� <@#Q�&H E/����(>������P �� ,�+�' � � � !�$� 9��&' 9����8H 9�"F�8�!9!�8#:E�#�D�� � ��G ���E��1"2#�"2" ��� �+#!����� ' � ".#Q<@5�9�E���"���E�#�" E�##� ���D�* � ��

( C6�!9!<(� �8� / �.�.� 9!<��+' �=" #�"." �Q��� <�#�� � �F#��Q�&� ��9%? � �J# ���!� (>�!����P �� !�+�' � � � !�$� 9��&' 9����8H 9�"F�8�!9!�8#:E�# ��' �&� ������D�#�"." � � #!��� � ' � "$#�<�5�9%E���" �%E�#�" E�#7#� ���D�*�� �

( C6�!9!<(� �8� / �.�.� 9!<��B' �=" #�" ".���!� <�#Q�&C6�Q"F�,* D�DQ#�"2".#�E!?B� �J# �!��� (>�!����P��� !�+��69�5��J#!�$� �&� ��9�' � 9����J#�"�*�&� � N�" �J' � ".#�"." �Q��� <�#���*B�8�&� � N�5��8#(& ���J#�" ����� *O� ' #�B' � 9����J#�"�*�&� � N�"2� *��Q"2A4���F#�6' #!� #�9��&" ���,�R

/ �&�2� 9�< ' � 9����J#�*�&�$� N/�&� / �&� � 9!<��B' � 9%�!�J#�"�*B�)�.� N�"2� 96#Q� � ��' #!�J#�9�� �!�+��N�� #�D � ' �B�!N�� / #�".".��� �J' �="2#�"." �Q�!� <�#��!*B�+�)�.� N�5��8#��+' � 9%�!�J#�*B�&� � N��+�� K"��' �=��N�� / #�" ".�Q� � 9�".�8��96DQ#��QK�� �Q���!� ' ��9�<=� / �&�2� 9%<��

' � � � ��.� 9��.' 9���� & ���J#:E�#&* �.�.� N�5��8�(����� ( ' � 9����J#�*B�)�.� N/(>�,����� � �!' ��� E�#*�&� � N�5%�8�!� ��� (+� / �)�.� 9�<��B' �=�!N6� / #�"." �Q�/(>��������P��� ��+�

#�' " # ' � � � !�$� 9��&' 9���� & �!�J#LE!#&*B�.�.� N!5!�&�!���!�)( ' � 96�!�J#�*�&�.� N/(>�!� ��� � �!' �!� E�#*�&� � N�5%�8� � �N�� #Q�F� 9 �%� / �)�.� 9�<.�����!P��� !�+�

0

Page 77: Jsp servlets j2_ee

0#�' " # ' � � � ��.� 9��&' 9���� & �Q����" #�" " ����D�� � ��E��9 ����P��� �� �

-.- �����Q�F#!��>�?BA�C' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

A outra característica importante desse módulo de gerenciamento de sessões é queele permite que sessões criadas automaticamente expirem após um determinadotempo de inatividade. Obviamente, o desenvolvedor também pode expirar uma sessãoexplicitamente através de sua programação.

Essa funcionalidade, presente em diversas tecnologias de desenvolvimento deaplicações para a Web, pode ser observada, por exemplo, em sites que exigem aautenticação do usuário, como por exemplo, em um site de Internet Banking.

Nesses sites, após o login, se o usuário ficar um longo período de tempo sem interagircom o site, sua sessão é “expirada”, de forma que ele não consiga utilizar maisnenhuma função do site antes de efetuar o login novamente. O mesmo ocorre se ousuário clicar no botão ou link de sair / logoff.

Isso ocorre dessa maneira para reforçar a segurança do sistema; uma segunda pessoaque utilize o mesmo browser do usuário que acessou a aplicação terá que efetuar ologin para conseguir ter acesso as funções do sistema. Caso contrário esse segundousuário poderia simplesmente usar o sistema em nome do primeiro usuário.

A API de Servlets oferece as seguintes funções para controlar a expiração da sessão dousuário.

Métodos para controle da expiração da sessão !5ON�' � D7� 9%�B<(#��&A4� ��H 9��QD �.� ��#�H 9��8#�������'��!�+� !5ON�' � D����!� E�"2#��&A4�Q��H 9%��D �&� ��#!H 9%�8#!�)����' ��� 9�� �� � 9��&#�������' �+� !5ON�' � D����!� E � 9�����' � E��Q�8#/���8�

As duas primeiras funções permitem, respectivamente, obter e definir o período máximode inatividade em segundos antes que o ServletContainer invalide a sessão do usuário,e o terceiro método permite que essa sessão seja expirada (ou invalidada)explicitamente pela aplicação.

Para exemplificar o uso de todas as funções apresentadas nessa seção, vamos construirum “esqueleto” de uma aplicação que requer a autenticação de usuários. Mais tarde,você poderá utilizar os códigos apresentados a seguir para construir sua própriaaplicação “autenticada”.

Primeiro devemos construir um Servlet que apresenta a tela de login propriamente dita:

Page 78: Jsp servlets j2_ee

Servlet “FormLogin” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- *� 6�F#�".#!9%�8�7 �; <(� 9��:>�? A0CJD��!� K8���.��56' ;��.� �:E�#�' �Q<=� 9 !5ON�' � D:D�' ��"." �����.��C���< � 9J#��Q�&#�9�E�" >O�+�. / #��F��' #Q� R

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- H �� ��.� ��� 9�E��:*�#���E�#!�4>(? A0CI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

-.- * "2#�"." ���&#�D!�$� �QE6�79�#�"." # / #!�)��' #Q�)�6".#���"�E�#!�J�!� " / #%�)��' #��8"�E��:�! �' � D��QG ���-.- �F#�D�#�N�#!�$#!���F#�3�5�� "2� G �!#!"4".#!� ���%N�� #��8��E�#J"2#�"." ���JD!�$� �QE6��6E�#Q��#����.#�E�� �F#�D�� �!9%�!�-.- � �)#!3�5�� ",� G �%�7 ��!�)�:#�"2".# / #��F��' #Q�>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� �.�.5�#��8�� K"��9 ' �=" #�" ".���!� � " & #� �,���R

-$- * " #�"." ����� ;J*��Q��� �:"2� E��7D��.� �QE��:#����!5%�&�.�J�F#�3%5O� " � G ���!�6E�#Q�O#!�J��" ��#!� � K&� D����-$- "$# *�;7��' <(5��J�7�J#�9�".� <@#!� �:" #�� �� 6�F#�" #!9%�8�QE��: ��!�)�:� 5�" 5�;!�.� �7# M!#!�$���4�-$- � 9�K8�!�$�J��G �%�7E�#�' �Q<=� 9J".#�#�"$�&� ��#�� ��$#�".#!9%�8# 96��"2#�"." ���/�+� K&� 9��!' ��".#�� 56"25�;��.� �-$- D�*6#Q<@�!5J���!#�#�"."2�� �; < � 9�����# ����F3�5�#JE�#�"2#�� �4K8��M�#!�4� ' �Q<=� 9�9%�Q�����J#�9��8#��/ �&� � 9�< ' � �J"$< � � / �.�.� 9�< �=' �=" #�"."2�Q��� <�#Q�,* ���&�2� N�5��8#�,�8A / � C�� �BH & !�+�� K!�+' � �J"F< 9 �:9�56' ' �B' � � � ��.� 9��&' 9��+' � �J"F< (+������P��� �� �' �=" #�" ".����� �$#!�J����#�*�+�&� � N�5��8#�����C�� � H & !�+�

0

-.- H �� �� � ��� 9�E��:� �$#�"$�8�!9!�&#:E��� �; < � 9��:>(? A0C' � � � ��.� 9!�)' 9���������� P�A * � ? H ��&�� % �C���<(� 9�� *��8��' %' A �!? > ���.�@% 8I�� / ? % !�� ��+�' � � � ��.� 9!�)' 9�����C��Q<(� 9(����H &I�"=? ? �(I�� � % ?-� �%? %' & * A3���@% 8C�� �BH & % �������P��� ,�+�' � � � ��.� 9!�)' 9���� / #�9�*������QH &BI!"@? ? �=I���� % 8I�* /�/ � �P�� % �& * A ��� %' / �(&B>�*�% ,������P��� !�+�' � � � ��.� 9!�)' 9������QH & I"(? ? �=I�� � % / " ��A H ? %' & * A ���'% ,�(&=?BP�* P�% � * C)" ��� %' ,��9��&�$����% !������P��� !�+�' � � � ��.� 9!�)' 9������ - ���P�A �� !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

0

Page 79: Jsp servlets j2_ee

0

Em seguida, temos um Servlet que faz, efetivamente, a autenticação. Se aautenticação for bem sucedida, esse Servlet armazena, como atributo da sessão, onome do usuário, e redireciona a requisição para o menu principal de nossa aplicação.

Servlet “Login” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- �%K8#Q�.5��:�J��5��8#�9��&� D��QG ���7E6� 56"25�;��.� � - " #!9O*��: ��F#�#!96D�*�� E!��" 96�:K8���2��56' ;��.� �:E�#�' �Q<=� 9 !5ON�' � D:D�' ��".":C���<(� 9J#�� �&#�9�E�" >(�8�& / #!���(' #���R

-.- � #��.� K8� DQ�7".#�#��!� ".�8#�5�" 5�;!�.� �7D��!��� ' ��<(� 9J#�" #!9�*6�: ���"$"2�QE���" D��!���J ��!� ���J#��&�F� �� � ��� �8# N����!' #���9 � �!' � E!��C6�Q<@� 9 / #!9�*���� / �)�.� 9�< �� ' ��<@� 9�� / �)� � 9�< � ".#�9�*����BR

N�����' #��!9�' �="256DQ#�"." � � K8��' "2#��� K"���� �� ' ��<(� 9/9 �:9�5O' ' � � � �+ ��=" #!96*�� 9 �J9�5�' ' ���BR

-$- � �!D � E�#Q��#B� �� �' #��J#!9��8�����Q3�5��)� D��!E�� <(�B ����.� ����' � E������ ' �Q<@� 9J#�" #!9�*6�=E��15�"25%;!�.� �-$- �+ ���� #��Q#!�� �' ���D���9�"25O' �8��9�E��J5��J�7N���".#�E�#JE��QE���"'�

0�.#��)5��$9 ' �B"25�D�#�" ".���

0

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- P�#�D�5� �#��F��9�E��7E6�QE!��"4E��:".#�" " �����" #��7" #�" " �%� 9 ���J�&� �%#�� ",� E!��D�� � �QE��:�!� 9�E����-.- �F#�E�� �)#!D�� �!96���J��" ���.#�3�5�� ",� G ���� ��!�F�J� / #����@' #��5�8C6�Q<@� 9 �����.�/ !�%3%56#=#�� ���9��8�JE�#-.- #!9��.�F��E��:E��J�! �' � DQ��G ������D���".��D��!9%�&�.;�� � �����$#!�J����#!�J��" �����&�2� N!5!�&� �FC�� � H & BE��-.- ".#�"." ����O ���� "�#!' #J" �JE�#���#%�);:#�".�8��� E�#�K8� 9�� E��7DQ��"2��� ��$��D�#�" ".��E�#J�!5��8#�9��&� D��QG ���-.- ".#�� ��N�#!� ",56DQ#�EO� E��!�>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� K ��' ".#��+�� K"�+' �=" #�" ".���/���J9�5�' ' �BR

���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ����C��Q<=� 9 �%�!�.�J� *��&��' !�+��$#Q�.5��.9��

0' �="2#�"2".���!� �F#��J����#�*�+�&�2� N�5��8#�� ��C����BH & ��+�

-.- P�#�D�5� �#��F��9�E��7��": ��!� ��� #Q�&�$��"4D��!� ' ��< � 9J#�".#�9�*��:#J����' � E6��9�E��:#�"2".#�"�E���E���"/ �&�2� 9�< ' � ' ��< � 9/�7 ���F#�3%5%#�"$�&� <�#��&I����.���J#��8#�� ���8C�� �BH & !�+�/ �&�2� 9�< ' � ".#�9�*��=�J �� �$#�3�5�#�"F�)� <�#Q�&I����F���J#Q�F#!� �,� / ��& >�* ��+�� K"� � �!' � E��!C���<(� 9 / #!96*����+' � ' �Q<@� 9���' � ".#�9�*%����� R

Page 80: Jsp servlets j2_ee

-$- C%�Q<(� 9J#�".#�9�*���" ���L��;!' � E���" �O ���E�#!� ��" E�#�K8� 9O� �1�����)�.� N�5��8�JE�#7" #�" " �%� �FC�� � H & -$- � D��!9��F#!9�E��J� ' �Q<(� 9JE�� 56"25�;��.� ���B# ���E!#�����"0�F#�E�� �$#�D�� �!96��� ���F#�3�5�� "2� G ���� ����$�

-.- � �J#!9�5� ��.� 9�D�� ���'�E��J�� �' � D��QG ���' �=" #�" ".����� " #Q�,* ���&�2� N�5��8#�,�8C�� � H & ,��' � ' ��<(� 9��+� ���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ����A #�9�5�I��F� 9�D�� ���' � *��&��' ��+�

0#�' " # R

-$- / #�� ' �Q<(� 9J#�".#�9�*��:9 ���:K8���$#!� ��;�' � E6��" �6D���' ��DQ��� ��"056�J� � #!9�"$�Q<�#�� E�#LK8�!' *��-$- 9%�:��5��8#�9��&� D��QG ��� � 569��8�7�J" #�" " ���JE�� 5�"25%;!�.� �7D��%�$�.#�9��&#���# �$#�E�� �F#�D�� �!9����J��" �-$- �)#!3�5�� ",� G �%�7 ��!�)�:� / #%�)��' #��5��C���<(� 9 �%�!�.�/ ' �=" #�" ".����� " #Q�,* ���&�2� N�5��8#�,�8A / � C�� �BH & !����C��Q<=� 9J# - �!5 "2#�9�*%� � 9��O;�' � E���" 9 !�8� ���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ����C��Q<=� 9 �%�!�.�J� *��&��' !�+�

0

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #���� �� �$#�3�5�#�"F���O �� �.#�", ���9�"2#/�+�

00

Um detalhe interessante com relação ao Servlet anterior é que ele não retorna nenhumconteúdo HTML por si, ele simplesmente efetua um processamento e, conforme seuresultado, redireciona a requisição para Servlets que apresentarão um conteúdo. Essemodelo de funcionamento será explorado com mais detalhes no íCapí tulo 8 – ModeloMVC.

Finalmente, teremos o Servlet que apresenta o menu principal da aplicação (caso aautenticação tenha sido bem sucedida).

Servlet “MenuPrincipal” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- *� 6�F#�".#!9%�8�:� �J#!965� ��.� 96D�� ���'6E��7�� �' � DQ��G �%� !5ON�' � D:D�' ��".":A4#!9�56I!�$� 9�D�� ���'�#��2�F#!9�E6" >O�8�& / #!�)��' #���R

�5�N�' � D��O�!� E�E6���B#Q����>6�8�& / #����(' #Q�&P6#�3�5�#�".� �� �$#�3�5%#�"F� ��>O���& / #����(' #��&P�#�", ���9�"2#J �� �.#�"2 ���9�".#�� �&*O�F�� "�H � �!�,D�#! ��&� �!9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- P�#�D�5� �#��F��9�E��7E6�QE!��"4E��:".#�" " ���������D�#�"." �7�J#�"2".# / #��F��' #Q� " �/# �#��.��� �&� E��7"$#��-.- ".#�"." ����� ; �)� �O#!�4"2� E��7D��.� ��E��:#�D���9��&� ��#!� � ' �Q<=� 9JE���5�"256;��.� �7DQ���J�J�Q�&� � N�5��F�:E�#

Page 81: Jsp servlets j2_ee

-.- ".#�"." ���!�6" # 5O�J��E�#�" ".��"4D���9�E�� G �%#�"4K ��' *6��� ��# ��!�$3�5�#7� 5%"25�;!�$� �JD����.�$#!9��F# 9 �%�-.- #QK8#��&5���5J�J�!5��8#�9��&� D��QG ���/ �&�2� 9�< ' � ' ��< � 9/�7965�' ' �>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� K ��' ".#��+�� K"�+' �=" #�" ".���/9 �J9�5�' ' � ' � ' ��< � 9/� � / �&� � 9�<.� ' �=" #�" ".����� <@#Q��*�+�.�.� N�5%�8#����C�� � H & ,�+�� K"�+' � ' �Q<(� 9/���J9�5�' ' �BR

���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ����C��Q<=� 9 �%�!�.�J� *��&��' !�+��$#Q�.5��.9��

0

-.- H �� �� � ��� 9�E��:� �J#�9�5J ��.� 9�D�� ���'�E��L�! �' � DQ��G����I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9����"� ' ;�� �)( ' � ' ��<@� 9/(>�,�O#�"$�8#/#�� �J#!9�5� �� � 9�D�� ��!'%E�#7" 5��

�� �' � DQ��G��������P �� !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Caso a aplicação venha a ter mais Servlets “autenticados” (que só poderão seracessados após o login do usuário), pode valer a pena criar uma hierarquia de classespara facilitar o processo de desenvolvimento.

Assim, podemos criar uma classe abstrata � /�-���� /�� ��("0.� �&( que faz a validação da sessão dousuário, verificando se o usuário já efetuou o login, e, se isso não tiver acontecido,redirecionando a requisição para o Servlet � (�-�* ��( 0�� % .Servlet “ServletLogado”

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

-.- � ' �Q" ".#���N�"$�&�$� �&�7 ����$����#��2� K&� D��!� " #�5�"25%;!�.� � � ;:#�K+#��&56�!5J� ' ��< � 9 !5ON�' � D:��N�"$�&�.�QD�� D!' �Q" " / #����(' #��&C���<(�QE��J#Q�Q�F#!9�E�" >(�+�) / #!�)��' #���R

-.- C���<(� 9JE6� 56"25�;��.� ���".#��J�!5!�&#!9!�&� DQ��G �%� � ;:�&� ��#�� "Q� E��LK8#!� �8��-.- D���' ��DQ���J�!" 96#�" ".���O�!�.� ; ��#�'�� ' ��<@� 9JE���5�" 5�;!�.� �73�56#�K8#!MJ�J��5%�8#!9%�&� D��QG ��� ��$���8#�D �F#�E / �)�.� 9�< �$� ' ��<(� 9/�J9�5�' ' �

-.-�/ #%�&�(' #��8" 3O5�# 9%#!DQ#�" "2� �F���.#�� E��:��5%�8#!9%�&� D��QG ���JE�#Q�O#!� #��Q�8#%9%E!#��-.- #�"2".�JD!' ��"." #J# � �� �' #!�J#!9!�8��� � �&#��8��E��L�!N��!� �,� �5�N�' � D ��N�".�&�$�QDQ��O�%� E�E��!C%��<6<�#�E��=#����+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".���

>(�+�& / #����@' #Q�.P�#�"Q ��!9�"$# �� �$#�"Q ��!9�" #� �.*��.�� " H �����QD�#� ��&� ��9��

Page 82: Jsp servlets j2_ee

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE��7 �; <@� 9%� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- P�#�D�5� �#��F��9�E��7E6�QE!��"4E��:".#�" " ���������D�#�"." �7�J#�"2".# / #��F��' #Q� " �/# �#��.��� �&� E��7"$#��-.- ".#�"." ����� ; �)� �O#!�4"2� E��7D��.� ��E��:#�D���9��&� ��#!� � ' �Q<=� 9JE���5�"256;��.� �7DQ���J�J�Q�&� � N�5��F�:E�#-.- ".#�"." ���!�6" # 5O�J��E�#�" ".��"4D���9�E�� G �%#�"4K ��' *6��� ��# ��!�$3�5�#7� 5%"25�;!�$� �JD����.�$#!9��F# 9 �%�-.- #QK8#��&5���5J�J�!5��8#�9��&� D��QG ���>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� K ��' ".#��+�� K"�+' �=" #�" ".���/9 �J9�5�' ' � �&� ' ��<@� 9/�=� / �&� � 9!<��B' �=" #�" ".���!� <@#Q��* �8�&�.� N�5��8#����C�� � H & ,�+�� K"�+�$�' �Q<@� 9/���J9�5�' ' �BR

���.#�", ��!9%"2#�� " #!9�E�P�#�E%� �F#�D � ����C��Q<=� 9 �%�!�.�J� *��&��' !�+��$#Q�.5��.9��

0

E��!C%��<6<�#�E��B#Q���+ �� �)#!3�5�#�"F� �6 �� �.#�", ���9�"2#��+�0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Utilizando a classe anterior, podemos criar tantos Servlets “autenticados” quantoquisermos: basta que esses Servlets estendam a classe ��/"- ��� /&����(&0.���.( e implementem ométodo ��( ��( 0�0 /���� /.����� , em vez do método �&(�/������ . Poderíamos, por exemplo, implementar oServlet ��/�%"$ ��- � %�'�� ��� � da seguinte forma:

Servlet “MenuPrincipal” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- *� 6�F#�".#!9%�8�:� �J#!965� ��.� 96D�� ���'6E��7�� �' � DQ��G �%� !5ON�' � D:D�' ��".":A4#!9�56I!�$� 9�D�� ���'�#��2�F#!9�E6" / #����@' #��&C��Q<@�QE�� R

�5�N�' � D ����� E7E6�!C6�Q<�<�#�E��=#����+>O�+�& / #!�)��' #��&P�#�3!56#�"F� ���.#�3�5�#�"F����>(�+�& / #����@' #Q�.P�#�"Q ��!9�"$# ���.#�", ��!9%"2#��@�.*��$�� "0H �����QD�#� ��&� ��9�R

-.- � ���J�7#�"." # / #����(' #�� #�"$�&#�9�E�#:�JD!' �Q" ".#>� / #����(' #Q�)C%�Q<��QE��� !�6�Q��D!*�#�<����49�#�"2"$#:�.�.#�D�*�� -$- E�#D���EO� <���� ;�K8����K8#�� �8�:�L���!' � E��QG ���J# � ; K8�!�$����E�#QK&� 9�� E���" ��":*�#��QE!#��F"

-.- ��2� 9�D�� ���� "'�!K&� D����F#�"$�8�!9�E��J" ��� �� !�$� ��� �1�� �; <(� 9���D��!��� �J#�9�5I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

Page 83: Jsp servlets j2_ee

' � � � ��.� 9!�)' 9����"� ' ;�� )( �$�' ��<(� 9/(+���6#�"$�8#/#�� �J#!965� ��.� 96D�� ���'6E�#J"25���� �' � DQ��G��������P �� !�+�

' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Page 84: Jsp servlets j2_ee

� ����� ����� �

� � � � � � � �

Nos quatro capítulos anteriores, exploramos com detalhes como um Servlet pode trataruma requisição HTTP e gerar sua resposta.

Infelizmente, as aplicações que pudemos desenvolver até agora tem uma sérialimitação inerente a própria tecnologia de Servlets: a formatação do conteúdo daresposta está totalmente integrada a programação da lógica da aplicação. Atecnologia de páginas JSP, que estudaremos nesse capítulo, nos ajudará a transporessa limitação.

� � � � � � �.$�� $'& � � � # � -� ) � � $ � ) + � � + � $ # � � �,) ��� � )�� +Em nossos Servlets de exemplo apresentados nos capítulos anteriores, geramos, comoresposta, páginas HTML simples, sem nenhuma formatação.

O primeiro Servlet apresentado (seção 1.2), por exemplo, pode gerar a seguinte páginaHTML ao receber uma requisição:

��>�?BA�C��������������� " #!5 #%9%E!#��F#�G�� H I$#> � � �@� � �

� - ����������� - >�? A0C��Essa página HTML não tem, praticamente, nenhuma formatação; um “Webdesigner”sugeriria, com certeza, diversas alterações no código HTML para tornar o layout dapágina mais atrativo. Assim, poderíamos alterar esse código minimamente para:

��>�?BA�C���Q> ��*5�.�

�QA=�!? * >@?=?BI��� � "=H � �� � ��9��&#�9��,� ?'$� �# � ��& ?-�(&=? �� �&#Q� � - *��&��' ��D�*6�!�F" #Q� �Q� "$�!� ������� � ,��,? H ? C�������9%E!#��F#�G���H I�� - ?BH ? C����

� - > ��* � ���������� ��� � �C��P��� �� � � � � � �� !�

��H A � &.* A=���� 8C�� � �� / P � �� - � D���9�" - ' �Q<O�% �� <(� 9���� � �<� ����P��.��P��� � ,������P���QI���� � � &=? � * � ���� * � � �!' / H � � �� � �1C��P��� !��C(" �� !�

��������" �QI�; <(� 9���E�#�#Q��#��� �' � � * ��)#!"$#!9%�8��9�E��:��#�9�E�#!�$#�G���H IJE��JD!' � #!9��F#� - " ��� - ���� - ��� &=?-��� - I���QI���� � � &=? � * � ���� * � � �!' / H � � �� � �1C��P��� !��C(" �� !�@� ".#�5J#�9�E�#!�)#!G�� H I$#

������ �� � �=� �=� ,� - ����� - � � &(? ��� - I��� - ���������

� - >(? A0C��

Page 85: Jsp servlets j2_ee

Apesar da página apresentar exatamente as mesmas informações, a formatação podetornar o conteúdo muito mais atraente para o usuário que estiver visitando nossaaplicação.

Por outro lado, essa modificação faz com que a codificação do Servlet fique muitomais trabalhosa, pois agora a resposta do Servlet precisa conter todos esses dados deformatação adicionais.

Assim, se originalmente o código do método �.(� /.� ��� do Servlet era �5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#��

�&*O�F�� "0H � ����DQ#� ��&� ��9�RI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9����"� " #!5 #%9%E!#��F#�G�� H I$#&%' !�)( ���F#�3�5�#�"$�&� <�#��&P�#��J�Q�8#�*E�E%����� (+� %' , !�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

, agora esse código passa a ser �5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#��

�&*O�F�� "0H � ����DQ#� ��&� ��9�RI��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��� !�+�' � � � ��.� 9!�)' 9������Q>.��* �.�� !�+�' � � � ��.� 9!�)' 9������ A3��? * >(?=? I�!� � "BH � �'% � ��9��8#�9��,�+? $( �#�% � � &=? �(&=?-�@% �F#Q�Q� - *��&��' �

D�*��!�)"2#�� �Q� " �!� ������� � % ��� ,�8�' � � � ��.� 9!�)' 9������2?BH ? C�������9%E�#!�F#�G��7H I� - ?BH ?BC����� !�+�' � � � ��.� 9!�)' 9������ - >.��*5�.�� ,�8�' � � � ��.� 9!�)' 9��������������>��� � �C��P�� %' �� � � � � � ��% !�� !�+�' � � � ��.� 9!�)' 9������QH A�� & * A3���@% 8C�� � � % / P � �@%' - � D��!96" - ' �Q<@�! �� < � 96��� � �<�%'

��� P��.��P � % � % !������P��� !�+�' � � � ��.� 9!�)' 9������QI���������&=? ��* � � � %' * �.� ��' %' / H � � � %' % � � C��P�� % !��C(" ��%' !�� ,�+�' � � � ��.� 9!�)' 9�������������" �QI�; <(� 9���E�#7#��Q#!� !' � � *� ��.#�"2#�9��&��9%E!�J��#!9%E�#!�F#�G�� H IJE��

D�' � #!9!�&#� - " ��� - ���� )�+�' � � � ��.� 9!�)' 9������ - ����&=? ��� - I��� ,�+�' � � � ��.� 9!�)' 9������QI���������&=? ��* � � � %' * �.� ��' %' / H � � � %' % � � C��P�� % !��C(" ��%' !�@� ".#�5

#�9�E�#��F#�G!��H I&#>����� %' � � �@� � � % ,� - ����� - ����&=?���� - I��� ,�+�' � � � ��.� 9!�)' 9�� �!� - ����������� - >�?BA�C��� �8�

0

Além disso, qualquer modificação na formatação dessa página torna necessário oenvolvimento do programador, já que ele precisa incorporar essa modificação aocódigo do Servlet e recompilar seu código. Por exemplo, se nosso “Webdesigner”decidir que a cor do texto agora precisa ser verde, precisamos alterar o código anteriorpara

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��� !�+�' � � � ��.� 9!�)' 9������Q>.��* �.�� !�+�' � � � ��.� 9!�)' 9������ A3��? * >(?=? I�!� � "BH � �'% � ��9��8#�9��,�+? $( �#�% � � &=? �(&=?-�@% �F#Q�Q� - *��&��' ��D�*6���.".#����Q� ".�(� ������� � % !�� !�+�' � � � ��.� 9!�)' 9������2? H ? C�������9%E!#��.#�G�� H I� - ?H ?BC����� !�+�

Page 86: Jsp servlets j2_ee

' � � � ��.� 9!�)' 9������ - >.��*5�.�� ,�8�' � � � ��.� 9!�)' 9��������������>��� � �C��P�� %' �� � � � � � ��% !�� !�+�' � � � ��.� 9!�)' 9������QH A�� & * A3���@% 8C�� � � % / P � �@%' - � D��!96" - ' �Q<@�! �� < � 96��� � �<�%'

��� P��.��P � % � % !������P��� !�+�' � � � ��.� 9!�)' 9������QI���������&=? ��* � � � %' * �.� ��' %' / H � � � %' % � � C��P�� % !��C(" ��%' !�� ,�+�' � � � ��.� 9!�)' 9�������������" �QI�; <(� 9���E�#7#��Q#!� !' � � *� ��.#�"2#�9��&��9%E!�J��#!9%E�#!�F#�G�� H IJE��

D�' � #!9!�&#� - " ��� - ���� ,�+�' � � � ��.� 9!�)' 9������ - ����&=? ��� - I��� ,�+�' � � � ��.� 9!�)' 9������QI���������&=? ��* � � � %' * �.� ��' %' / H � � � %' % � � C��P�� % ��P����& % ,�@� " #!5

#�9�E�#��F#�G!��H I&#>����� %' � � �@� � � % ,� - ����� - ����&=?���� - I��� ,�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �

0

Todo esse processo faz com que o desenvolvedor tenha um grande trabalho cada vezque a formatação da página precise ser modificada, tornando esse processo lento epouco flexível.

� �&� � ��� �.$ � $,&�� � ���#�� - � ) � �� $ � ),+ ��� + � $ #���� �32 4,! - $'+76 �<8

Se em um Servlet a inclusão e a modificação da formatação da resposta precisam serfeitas pelo desenvolvedor diretamente no código da aplicação, em uma página JSP aidéia é que esse processo possa ser feito diretamente pelo responsável pelo“look’n’feel” (layout) da aplicação.

Assim, uma página JSP nada mais é, na verdade, que uma página HTML, comelementos especiais onde o desenvolvedor pode programar o conteúdo dinâmico daaplicação. Porém, ao contrário de uma página HTML cujo nome de arquivo temextensão “.htm” ou “.html”, arquivos com páginas JSP devem ser nomeados comextensão “.jsp”.

A primeira versão do Servlet apresentado na seção anterior (sem nenhumaformatação), por exemplo, poderia ser reescrito como a seguinte página JSP“PrimPag.jsp”

Primeiro exemplo de página JSP��>�?BA�C��������������

� " #!5 #%9%E!#��F#�G�� H I$#> ��@?)�:�.#�3�5�#�"F�)� <�#��&P�#!�J���8#�*E�E�� ��� ?��� � - ����������� - >�? A0C��

Nessa página JSP, o conteúdo dinâmico está contido no elemento��?��:�$#!3�5�#�".�&� <(#��&P�#��J���8#�* E�E�� �,� ? �Desde que esse elemento não seja alterado, podemos incluir / alterar livremente aformatação da página sem afetar o funcionamento da aplicação. Podemos, portanto,modificar essa página de maneira a ter a segunda versão do Servlet apresentado naseção anterior:

Segundo exemplo de página JSP��>�?BA�C��

�Q> ��*5�.��QA=�!? * >@?=?BI��� � "=H � �� � ��9��&#�9��,� ?'$� �# � ��& ?-�(&=? �� �&#Q� � - *��&��' ��D�*6�!�F" #Q� �Q� "$�!� ������� � ,��,? H ? C�������9%E!#��F#�G���H I�� - ?BH ? C����

� - > ��* � �

Page 87: Jsp servlets j2_ee

��������� ��� � �C��P��� �� � � � � � �� !��QH A�� & * A3� �� 8C � � � / P � �� - � DQ��9�" - ' ��<��! %� <(� 9���� � �<� �� � P��.��P��� � !������P���QI���������&=? ��* � � �� "* � � ��' / H � � �� � � C��P��� ,�!C�" �� !���������" �QI�; <(� 9���E�#7#���#��� !' � � *� ��F#�".#�9��8��9%E��:��#!96E�#!�$#�G���H IJE���D!' � #�9��&#�� - " ��� - ���� - ����&=? ��� - I���QI���������&=? ��* � � �� "* � � ��' / H � � �� � � C��P��� ,�!C�" �� !�@� "2#�5�#�9�E�#��F#�G���H I=#>�����

��?��:�$#�3%5%#!")�&� <O#Q�&P6#!�J�Q�8#�*E�E�� ��� ?��� !� - ���� - ����&=? ��� - I��� - ����������� - >�? A0C��

Após fazer essa modificação, ao contrário do que acontece quando se trabalhadiretamente com Servlets, você não precisa recompilar a aplicação, essa modificaçãojá passa a ser automaticamente visível para os usuários.

� �!1 ��*-#%! � -'$�� )*-� � ! - � ) � - �A mágica por trás de uma página JSP é a seguinte: existe um Servlet especial,chamado �"�.0�/ �(&* ��� � /�- , que intercepta requisições direcionadas a recursos com extensão“.jsp”.

No instante em que é recebida uma requisição para uma página JSP, o Page Compilertransforma essa página em um Servlet e o compila, sendo que o resultado dessacompilação é carregado em memória para evitar que esse processo tenha que serrepetido para todas as requisições recebidas.

A primeira versão de nossa página de exemplo �"- � * �"��0 ! � #)� , por exemplo, é transformadano seguinte Servlet

Primeira versão da página JSP “PrimPag.jsp” transformada em Servlet ���D����Q<�#J�!�)<(� �� ��QD�*6#!� � "2 ��

� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�� �� �������� ����� �!� "$#%�&�(' #��)� � "2 �� � �� �� ������ ����<(� �� ���D�*6#!� � ��" �#��.� �.5�9��&� �J#!� � �

!5ON�' � D:D�' ��".": ��Q< �� � " :#��Q�8#�9�E�"0>6���& �;�"2 ����Q" #7R

"F�F�Q�&� D7R0 �5�N�' � D7 ���< �� � "2 �� � R0

�� � ��� �8#�"F�F�Q�&� D7N�����' #���9$� � "2 ���� � 9O� �8#�E � K8�!' "2#��

�5�N�' � D�K8� 9��!'!���!� E&� � "2 ��@� � 9�� ����� �)*6�.�� "4���F<(� �! ���D�*%#!� � �Q"2 %#!�.� �.5�9!�&� �J#!� ;%"2 ��%�,DQ#� ��&� �!9�R0

�5�N�' � D ����� E=�� "2 / #��F��� DQ#��+>6�+�) / #����@' #��&P�#�3�5�#�".� �$#�3%5%#!")� ��>(�+�) / #����(' #Q�&P6#�"2 %�!9�".#�$#�"Q ��!96".#� �&*��F�� "0� �Q����� � �!� H � ���QDQ#� Q�&� ��9�� / #!�)��' #�������DQ#� ��&� �!9�R

;%", ����D �&�!��$/� � ", �� ���QD��8��� $ ��9�5�' ' �

Page 88: Jsp servlets j2_ee

I��Q<�# � �!9%�8#��2� �� <�# � ��9��8#��2� �7965�' ' �>O�+�& / #�".",� �!9J" #�".",� �!9+�79�56' ' �/ #!�)�6' #�� � ��9��&#��2� �� � �' � D�� �.� �!9+�7965�' ' �/ #!�)�6' #�� � ��9�K&� < DQ��9�K&� < �79�56' ' �;%", �� �.� �F#!� �%5!�5�7965�' ' ��N�� #�D �� �� <@#/���&*O� "Q�/ �&�2� 9�< � ���!' 5%# �J9�5�' ' ��)� $ R

� K5� � � "2 !� � � 9�� �8#�E>��� K8��' "$# � R" $696D�*��$�!9�� M�#�E � �&*�� "��BR

� K � � � " �� � � 9�� �8#�E>��� K8��' ".#��R�� "Q Q��� � 9�� � ���+��� "Q Q��� � 9�� �F#�E/���.�.56#!�

00

0�� "Q �� �6�QDQ�8��� $ �=;6"2 �6�QDQ�8��� $(� <�#Q� �O#�K+��5�' � ����D �&�!��$ ���+��$#�"Q ��!96".#!� ".#�� � �!9��F#!9�� ?'$� �#��� �8#Q�Q� - *%�&��' � H / ��� ������� � !�+� ���<�# � �!9!�&#Q� �5�<� � "2 �� ����D �&�!��$�� <@#Q�&I��Q<O# � ��9��&#��2� � �&*�� " ���$#�3�56#�"F� ���.#�"2 %�!9�" #�

�� !�%�&�25%#� � �� ���&� 5�#��+��� � !' � DQ�Q�&� �!9/�J �� <�# � ��9��&#��2�.� <�#�� / #%�&�(' #�� � ��9��&#��2� ���+�D��!9%K � < �J �� <@# � ��9��8#��Q�&� <@#Q� / #!�)��' #�� � ��9�K8� < ���+�" #�" "2� �!9/�� �� <@# � �!9%�8#�� �&� <@#Q� / #�"2"2� ��9����+���5�� �7 �� <O# � �!9��F#Q� �)� <�#��!� 5!���!�+�

-$- >�? A�C - - N�#�<(� 9 � K&� ' #�� - �� < � � "2 � 8� K&�F�!�/��� � � � �+� �8����� � � ���5��&� �.� �&#���,�Q>(? A�C�������������� %,�,%29�� " #!5 #!96E�#%�)#�������H I���� % � !�+�

-$- #�9�E-$- N�#�<(� 9 � K8� ' #��� - ��Q< � � "2 � 8� K8�.���+��� � � �+� �8����� � � � ���5��&� ��.� 9����+�.#�3�5�#�"$�&� <�#��&P�#��J�Q�8#�*E�E%�����!�+�-$- #�9�E-$- >�? A�C - - N�#�<(� 9 � K&� ' #�� - �� < � � "2 � 8� K&�F�!�/��� � � % �+� �8����� � � � ���5��&� �.� �&#��� %' %Q�,%,9�� - ����������� - >�? A�C��� !�+�

-$- #�9�E

0 D����&D�* � ?B*��$�� ��N�' #:���1R� K5� ��5�� 9 �:9O5�' ' ��� ��5��.� <�#�����5�K K8#!� / � M�#����9 � � �

��5��&� D�' #���� ��5!K K8#�� ���+�� K5�+ ���<�# � �!9%�8#�� �59 �:9�5O' ' �B �� <@# � �!9%�8#Q�Q�&� *���9�E�' #!I�� <�#�%�QDQ#% ��&� �!9�� ���8�

0 K&� 96��' ' $ R� K5� � � "2 !� ����D �&���#$ 9 �:9�5O' ' � �� " Q� �%��D �&���#$�� �.#�' #��Q"2#�I��Q<�# � �!9!�&#Q�Q���+ �� <@# � �!9��F#Q� � �+�

00

0

O Page Compiler também verifica a data de alteração do arquivo que contém apágina JSP: caso essa data se modifique, o processo de compilação é executado

Page 89: Jsp servlets j2_ee

novamente para garantir que modificações feitas na página sejam visíveis para osusuários da aplicação.

Devido a todo esse processo de compilação / recompilação, você poderá observarque o primeiro acesso após a criação ou modificação de uma página JSP é sempremais lento que os acessos seguintes (até que haja uma modificação no conteúdo dapágina).

� ��� ��!"# � � ) �,! $O fato de uma página JSP ser convertida para um Servlet faz com que ela tenha omesmo ciclo de vida apresentado na seção 3.4 desse livro: existe uma etapa deinicialização, uma etapa de atendimento de requisições, e finalmente, uma etapa definalização.

Não existem métodos equivalentes ao ��(�� /.� ��� ou ��(�� (�# ����� de um Servlet para a etapa deatendimento de requisições, já que o próprio conteúdo da página contém o código aser executado e retornado para o browser a cada requisição.

Por outro lado, existem os métodos � #�� %!� � ��� e ��#)�� /�#)��- ( � ��� que possibilitam a implementaçãode códigos de inicialização e finalização, respectivamente, da página JSP. A maneirapela qual esses dois métodos podem ser declarados para uma página JSP seráapresentada na seção “Declarações” mais adiante nesse mesmo capítulo.

� ����� � ) � )*-� � + ! - � �.!"# � +Já vimos nas páginas JSP apresentadas até agora um exemplo de um elementodinâmico; na página �"- � * �"��0 ! � #)� apresentada na seção 7.2 desse capítulo, por exemplo,temos a seguinte linha contendo um elemento dinâmico:

� "2#�5�#�9�E�#��F#�G���H I$#> ��@? �:�$#�3�56#�"F�.� <�#��&P�#��J�Q�8#�*E!E������ ?���

, onde o conteúdo do elemento dinâmico está delimitado pelos caracteres ��� � e � � .

Este é apenas um tipo de elemento dinâmico, chamado comumente de “expressão”.Além desse, existem outros 4 tipos principais de elementos dinâmicos que podem estarpresentes em uma página JSP: diretivas, scriptlets, declarações e JavaBeans.

As seções seguintes irão apresentar, de maneira mais detalhada, cada um desses tiposde elementos dinâmicos que poderão ser utilizados por você em suas páginas JSP.

� ������! � )�� ! �,$'+O primeiro tipo de elemento dinâmico que iremos estudar será a diretiva.

O formato básico de uma diretiva é o seguinte:

Formato básico de uma diretiva de uma página JSP��? � E�� �F#��&� ���J9��!�J#�*B�&�2� N�5��8� ��� ����' �!� *B�&�2� N�5��8� 9����J#�*�&�$� N�5��8� �� ����' ���,*B�)�$� N�5��8�

?��, onde a palavra �!� -�/��,� � � deve ser substituída por �.��0 / , � %�' � $ ��/ ou ���.0�� � � . Para cada um dessestipos de diretivas, existem conjuntos de atributos específicos utilizados para parametrizara diretiva.

Page 90: Jsp servlets j2_ee

Conforme o próprio nome indica, a diretiva ���&0�/ serve para se definir diretivas da página;embora existam diversos atributos possíveis para essa diretiva, os atributos mais comunssão os seguintes: � % ��( , ',("%.� /�%.� � � � / , import, /�-�- ("-��"��0�/ e � # � -�- (�-� ��0�/ .O atributo “info” deve ser utilizado para se definir um texto informativo sobre a páginasendo construída; seu valor é retornado pelo método 0�/&� ��/�- ��� /�� % ��( ��� do Servlet (veja seção3.10).

Exemplo de diretiva “page” com atributo “info”��? � �� <O# � 9�K8�����!�%"2D�� � �8�� ���� 9�����#��=E!���=��5��F�!� ?��

Da mesma forma que o método # /&� � (�%&� /�%&� � � ��/ ��� apresentado na seção 4.2 desse livro, oatributo '�(�%.��/�%.� � � ��/ serve para indicar o tipo de conteúdo sendo gerado pela página JSP.Assim, podemos utilizar a seguinte diretiva no início de uma página JSP para indicar queseu conteúdo é uma página 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 noServlet que será gerado (via declaração � * ��("-�� ). Assim, devemos indicar por meio desseatributo todos os pacotes que estaremos utilizando na programação de nossa páginaJSP. Se quisermos utilizar a classe � /&',��(�- do pacote � ��� � ! $�� � � , e as classes que estão nopacote ��� ���&! � ( , por exemplo, poderíamos declarar a diretiva ���&0 / com os seguintesatributos:

Exemplo de diretiva “page” com atributo “import”��? � �� <O# � �� ��!�)�����8� � ���!� � �!� �' �?)���? � �� <O# � �� ��!�)�����8� � ���!� 5��&� ' � � #�DQ�8��� ? �

Finalmente, o atributo /�-�- ("-��"��0�/ serve para indicar a página JSP a ser exibida em caso deerro no processamento da página corrente. A página JSP que for exibir o erro deve, porsua vez, declarar a diretiva �&��0�/ com o atributo � #�� -�- ("-�� �.0 / definido explicitamente como��- $ / .Usando todos esses atributos da diretiva �.��0 / , poderíamos implementar uma página JSPsimples de impressão da data corrente da seguinte forma:

Página JSP que imprime data corrente (datacorrente.jsp)��? � �� <O#7#�� �F���.I�� <�#����!�6�2�F��I��Q<(� � "2 � ? ���? � �� <O# � 9�K8�����!�%"2D�� � �8�� ���� 9�����#��=E!���=��5��F�!� ?����? � �� <O#7D��%9!�&#!9!� ?�$� �#���� �8#�� � - *��&�J' -? ���? � �� <O# � �� ��!�)�����8� � ���!� 5��&� ' � �' ? ���? � �� <O# � �� ��!�)�����8� � ���!� �8#�� �)� / � �� !' #�O���8# �6�!�.�J� �� ? ���>�?BA�C����������� ��� � �C��P��� � � � � � � �� ,�* E��Q�F�:DQ���2�$#!9��F# #>�@?)�:9�#� / � �� �' #��@� �8# �6�!�$�J� � ���+E�E - A�A - $$($$ !��� K8�!�$�J� � �+9�#� �O���&#/���!� ? �� - ����������� - >�? A0C��

Além do tipo de diretiva ���&0 / ao qual todos os atributos apresentados anteriormente sereferem, existe também um outro tipo de diretiva, a diretiva � %�' � $ �./ . Essa diretiva admiteum único atributo �#� � / .

Page 91: Jsp servlets j2_ee

Essa diretiva deve ser utilizada para incluir o conteúdo de outro arquivo na página JSPcorrente, sendo que esse arquivo tanto pode conter um conteúdo estático, como umapágina HTML (ou pedaço de uma página HTML), como um conteúdo dinâmico, ouseja, uma outra página JSP.

Sendo assim, podemos reescrever a página JSP anterior da seguinte forma

Segunda versão da página JSP que imprime data corrente��? � � 9�D�' 5�E�#�K8� ' #�����D���N�#�D���' *%�!� � "2 � ?)�* E��Q�F�:DQ���2�$#!9��F# #>�@?)�:9�#� / � �� �' #��@� �8# �6�!�$�J� � ���+E�E - A�A - $$($$ !��� K8�!�$�J� � �+9�#� �O���&#/���!� ? ���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

, sendo que o conteúdo do arquivo ',� � / '.� � ��(�! � #)� éCabeçalho para página JSP que imprime data corrente (cabecalho.jsp)

��? � �� <O#7#�� �F���.I�� <�#����!�6�2�F��I��Q<(� � "2 � ? ���? � �� <O# � 9�K8�����!�%"2D�� � �8�� ���� 9�����#��=E!���=��5��F�!� ?����? � �� <O#7D��%9!�&#!9!� ?�$� �#���� �8#�� � - *��&�J' -? ���? � �� <O# � �� ��!�)�����8� � ���!� 5��&� ' � �' ? ���? � �� <O# � �� ��!�)�����8� � ���!� �8#�� �)� / � �� !' #�O���8# �6�!�.�J� �� ? ���>�?BA�C����������� ��� � �C��P��� � � � � � � �� ,�

, e o conteúdo do arquivo - (��&�&��/"! ����* � é

Rodapé para página JSP que imprime data corrente (rodape.html)� - ����������� - >�? A0C��

A vantagem de utilizar essa diretiva está no fato de que você pode manter conteúdoestático ou dinâmico comum a diversas páginas JSP em arquivos separados, incluídos,através dessa diretiva, conforme a necessidade. Podemos, por exemplo, construir novaspáginas JSP que incluem o arquivo de cabeçalho '.� � /&' ��� � (�! ��#)� e - (�� �&� /�! ����* � : se for necessáriomudar o conteúdo do cabeçalho ou do rodapé, não precisaremos editar todas asnossas páginas, apenas o conteúdo desses arquivos.

� ������� ��� ) +�+%(*) +Em todas as páginas JSP construídas até agora utilizamos um elemento dinâmicochamado de � �"�"- /�# #��&( : esse elemento serve para imprimir o resultado � � - � %"0 de umaexpressão Java.

Sua sintaxe básica é a seguinte:

Sintaxe de uma expressão JSP��?��=�Q#��� ��F#�"." ���$;�� ����� ? �

Obviamente, esse elemento pode ser utilizado para imprimir o conteúdo de umavariável do tipo � � - � %&0 , ou até mesmo de uma constante ����- � %"0 . Supondo que � � ��/ � ��( sejauma variável ����- � %�0 , por exemplo, poderíamos incluir o seguinte elemento em uma páginaJSP para imprimir o conteúdo da variável:

Page 92: Jsp servlets j2_ee

Exemplo de inclusão de uma expressão JSP para a impressão doconteúdo de uma variável do tipo “String”��?��:' �=�8#�� �&�&?-�

Por outro lado, podemos formar expressões mais complexas, como na página JSP queimprime a data corrente, desde que o resultado dessas expressões sejam String’s.

Expressão que imprime a data corrente na página JSP “datacorrente.jsp”��?��:96#� / � �� �' #��O�Q�8# �����.�J� � ��� E!E - A�A - $$($$ !�+� K+���.�J� ���+9�#� � � �&#/����� ? �

� � � � #� !"� � � )�� +Uma expressão JSP possibilita o processamento de uma expressão Java, e a impressãode seu “resultado” junto com o conteúdo da página JSP. Embora esse recurso sejabastante poderoso, ele não serve para situações quando precisamos efetuar umprocessamento mais complexo, utilizando, por exemplo, diversos blocos de códigoJava.

Um “Scriptlet” permite a inserção de um bloco de código Java diretamente no corpoda página JSP. Sua sintaxe é a seguinte:

Sintaxe de um Scriptlet JSP��? ��N�' �!D��7E6#7D ��E�� <��$;�� ����� ? �

Nós podemos utilizar um Scriptlet para incrementar um pouco nossa página JSP� � ����',("-�- /"% ��/�! � #,� :Terceira versão da página JSP que imprime data corrente

��? � � 9�D�' 5�E�#�K8� ' #�����D���N�#�D���' *%�!� � "2 � ?)���?

/ �&� � 9�< ' �@�&#�� �8� / ��5%E!��DQ�Q�>� �, 8�/ �&� � 9�< ' �=E�� �8�/�79%#� / � �� �' #�O� �F# �����F��� ��� ��E�E - A0A - $$($$ �+� K+�%�$�J�Q���B9�#���O�Q�8#>���,�+�� K!�' �=E�� �&��� ".�8�����&"�� � �&*�� �,� �- � ����' �=�8#�� �8� / ��5%E!��DQ�Q�>� � ��#�' � M3*�9�� &B�Q����9 ��#�' " #�� K!�' �=E�� �8��� "$�8�!���8" � � �&*�� � ��(- ���� ' �@�F#Q�Q�8� / ��5�E���DQ�Q�>�&� �6#!' � M &B� �F��' 9 8�

?-�* E��Q�F�:DQ���2�$#!9��F# #>�@?)�:' �=E�� �&�=?)�����!P ���@?��:' � �&#��Q�8� / ��5�E��QD��Q� ? ���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

Nesse exemplo de página JSP, utilizamos um Scriptet para definir variáveis cujosconteúdos são posteriormente impressos por expressões JSP. De fato, podemoscombinar o uso de Scriptlets e expressões, desde que, obviamente, seja preservada asemântica Java (ou seja, variáveis sejam utilizadas somente após serem declaradas, porexemplo).

Construímos, a seguir, um exemplo um pouco mais elaborado de página JSP utilizando“Scriptlets”: trata-se de um formulário HTML para input do mês do aniversário do usuário,sendo que Scriptlets são utilizados para construir os meses possíveis da caixa de seleçãodo formulário.

Página JSP com formulário HTML de input do mês de aniversário dousuário (“formmesaniv.jsp”)

Page 93: Jsp servlets j2_ee

��? � � 9�D�' 5�E�#�K8� ' #�����D���N�#�D���' *%�!� � "2 � ?)�� ���P�A * � ?BH ��& �� 8 ��$��D���#�".��9�� ��� � "2 � A=�!? > �-�.�� �I�� / ? ����9��&�)#7D��%� � � � " E6#7" #!5 ��9�� �%#��F" ;��.� �!�� / �6C�� � ? & * A3� �� +A � / !���?

-.-�/ D!�.� ��&' #Q���!K8��M�#�9�E��756� � K8��� ����$�7� �F#%�)�!� "$�%N��$#7��" ��#�"$#!"4E��J��9������ � �K8��� �� 9�� � � ��� ��� ��� (�(/�R

-.- � � ��" ��� 96E��:E�� / D��2� ��&' #��� ����F� � �� ��.� ��� �1�!"4#�' #��J#!9��F��" #�"$�8;Q�&� DQ��"-.- E��7 �;Q<@� 9��:#��Q"�#��� ��F#�"." ��#�" ; / I

?-���@� I�?BH � & � * C(" ���� ,��?���H 9!�&#Q<O#!� � �&� / �.�.� 9�<.� �.�-? �� �����?��:H 9%�8#Q<@#!�$� �8� / �&�.� 9�<��B� � ? ��� - �I�? H ��& ���?

-.-�

#J����' �F��9�E�� ����$�75�� / D!�$� ��&' #Q� ����.� K8#!D�*6���4�>� K8��� 0-.- ��� 9���' � M���9�E��J�>� K8��� F��" �!� 9�E��7E���" D!�.� ��&' #��� ��!�$�7� �� !� � ��� �1#�' #!�J#�9��8��"-.- #�".�8;��&� DQ��"4E��7 �; <=� 9��

?-�� -./ ��C�� � ?�������P����H &BI"(? ? �(I����� / " ��A�H ?- &.* A ���� !�(& � H * P� � *�C(" ���� ���9���� ���@ !�� - ���P�A ���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

É interessante observar nesse exemplo a combinação de Scriptlets, expressões eelementos estáticos da página: o bloco de código Java iniciado no primeiro Scriptletda página não é finalizado nesse próprio Scriptlet, mas sim em um outro Scriptlet,inserido após a impressão de um conteúdo estático e de 2 expressões JSP.

� ��� � 2�� )�� � + ! �.� � � # ! � � +No nosso primeiro exemplo de página JSP (veja seção 7.2), fizemos referência a umobjeto que não foi declarado em nenhum ponto da página: na expressão JSP dessapágina, existe uma referência a um objeto -�/ �.$ /&# � .Primeiro exemplo de página JSP

��>�?BA�C��������������� "2#�5�#�9�E�#��F#�G���H I$#> ��@? �:�$#�3�56#�"F�.� <�#��&P�#��J�Q�8#�*E!E������ ?��� � - ����������� - >�? A0C��

Esse objeto equivale, na verdade, a instância da classe � ����� � /"-�� � /�����/ ��$�/�#)� passada comoparâmetro para o Servlet quando esse recebe uma requisição, conforme estudamos noíâçãCapí tulo 5 – Captura de parâ metros da requisiç ã o desse livro.

Além desse objeto, que representa a requisição recebida pela página, a API depáginas JSP disponibiliza outros objetos implícitos que podem ser utilizados noselementos dinâmicos programados pelo desenvolvedor.

Segue uma lista dos principais objetos implícitos, com suas respectivas classes:

Objeto Classe

request javax.servlet.h ttp.HttpServletRequest

response javax.servlet.h ttp.HttpServletResponse

out javax.servlet.jsp.JspWriter

Page 94: Jsp servlets j2_ee

session javax.servlet.h ttp.HttpSession

application javax.servlet.ServletContext

config javax.servlet.ServletConfig

Você deve utilizar esses objetos implícitos da mesma maneira como você utilizaria osobjetos das respectivas classes na programação de seus Servlets. Em particular, oobjeto implícito (&$�� , da classe � # � � - � ��/"- , provê funcionalidade semelhante a da classe�"- � %.�� - � ��/"- que utilizamos na maior parte dos exemplos com Servlets desse livro.

No exemplo seguinte, reescrevemos o formulário de input do mês de aniversário dousuário utilizando o objeto implícito ("$�� :Segunda versão para página JSP de input do mês de aniversário do

usuário (“formmesaniv.jsp”)��? � � 9�D�' 5�E�#�K8� ' #�����D���N�#�D���' *%�!� � "2 � ?)�� ���P�A * � ?BH ��& �� 8 ��$��D���#�".��9�� ��� � "2 � A=�!? > �-�.�� �I�� / ? ����9��&�)#7D��%� � � � " E6#7" #!5 ��9�� �%#��F" ;��.� �!�� / �6C�� � ? & * A3� �� +A � / !���?

-.-�/ D!�.� ��&' #Q���!K8��M�#�9�E��756� � K8��� ����$�7� �F#%�)�!� "$�%N��$#7��" ��#�"$#!"4E��J��9��K8��� �� 9�� � � ��� ��� ��� (�(/�

�!5%�&� ��$� 9��&' 9�� ���@�I�?BH ��& � * C(" � � % � ( H 9%�8#Q<@#!�$� �8� / �&�2� 9�<��B�.��(>�"% ��� ( H 9%�8#Q<@#!�.� �8� / �&� � 9!<��B� �)(>��� - �I�?BH � & �� ���

?-�� -./ ��C�� � ?�������P����H &BI"(? ? �(I����� / " ��A�H ?- &.* A ���� !�(& � H * P� � *�C(" ���� ���9���� ���@ !�� - ���P�A ���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

Podemos também construir a página JSP �"- ("'.* /�#)�"% � ��! � #,� que fará o tratamento dos dadossubmetidos pelo formulário da página ��(�-�* *4/.#)�"% � ��! � #�� , utilizando os objetos implícitos -�/ �.$ /&# � e- /�#,� (�%&# / :Página JSP que faz o tratamento dos dados submetidos pelo formulário

“formmesaniv.jsp” (“procmesaniv.jsp”)��?

H 9��8#�<(#�� ' � �J#�" �79�56' ' ��&��$ R

' � �J#�"3�J9�#� H 9!�&#Q<O#%� �+�.#�3%5%#�"$�&� <�#��&I����.���J#��8#�� ���8A � / !���+�0 D��Q�&D�* ������DQ#� ��&� �!9� ��=#��BR

' � �J#�"3�J9�5�' ' �0� K!���8' � �J#�"3���J9�56' ' ��� � ��' � ��#�"2� � 9�� � ��' 5�# �,��� � � � �+' � ��#�"2� � 9�� � ��' 5�# �,��� ���

�.#�", ���9�".#�� ".#!96E!P�#�E�� �)#�DQ����� K+���.���J#�".��96� ��� � "2 � !�+�?-���@? � � 9�D!' 5�E�#�K&� ' #����+D���N�#�D���' *6�!� � "2 � -?-���?

� K!�+' � �J#�"2� � 9�� � ��' 5�#/������� � ��' #�9�E����.� <�#��&H 9�"$�8��9�DQ#/���8� <�#���� � ��' #!9%E!���$� A���& ? >.� ( ��!5%�&� ��$� 9��&' 9����8I����F��N�#�9�" �6#�" ".#/#�� � � " E�#�".#�5���96� ��#��.".;��.� ��9 !�+�

#�' " #J�!5%�&� ��.� 9��&' 9����8H 9!K #�' � M��J#!9��8#���#�"2"$# 9 ���&#�� � � " E�#7" #!5 �!9�� ��#!�$".;��.� ����" #!5��9�� ��#!�)"2;�� � �&# 9�� � � " %' ! ( ' � �J#�"2� �&� / �)�.� 9�< ��� (>�"% &� !�+�

Page 95: Jsp servlets j2_ee

?-���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

Nesse exemplo, tomamos o cuidado de tratar o parâmetro recebido e, conforme ocaso, gerar o redirecionamento da requisição logo no início da página, antes deescrever qualquer outro conteúdo estático ou dinâmico: da mesma forma que nodesenvolvimento de Servlets, precisamos obedecer a ordem de geração dos elementosda resposta HTTP, ou seja, os headers do redirecionamento devem ser gerados antes daescrita de qualquer elemento do conteúdo da resposta (veja seção 4.2).

� � � � ��) #�"$�� $ & (*) +Esse tipo de elemento dinâmico especial de uma página JSP serve para definir códigosJava que deverão ficar fora do método de atendimento das requisições (o método# /"-�� � ',/ ��� , no mais alto nível). Assim, esse elemento serve para declarar variáveis de classe(estáticas), variáveis de instância, ou até mesmo novos métodos.

Sua sintaxe é a seguinte:

Sintaxe de uma declaração JSP��?�9 ��E�#!D�' ���$�QG ��#�" E6�7 �; <=� 9���� ?��

Em particular, esse elemento deve ser utilizado para definir os métodos ��#��� %!� ����� e ��# ��� /&# ��- ( � ���(mencionados na seção 7.4) caso você opte por incluir um código de inicialização oufinalização da página JSP.

A página JSP seguinte aperfeiçoa um pouco mais nossa página input do mês deaniversário do usuário, imprimindo o nome do mês por extenso na caixa de seleção doformulário. O array de “mapeamento” do nome do mês é declarado em um elementode declaração JSP, para evitar a alocação de memória adicional a cada atendimentode requisição.

Terceira versão para página JSP de input do mês de aniversário dousuário (“formmesaniv.jsp”)��? � � 9�D�' 5�E�#�K8� ' #�����D���N�#�D���' *%�!� � "2 � ?)���?�9

-.- *�� �F��$ D��%� ��":9��!�J#�" E���":�J#!"$#�" �� � ��� �8#�"F�F�Q�&� D / �)�$� 9�< � �BD�� 9�����#�" A #�".#�" �7R �!;%��9�#�� �)� !� � �6#Q�O#!�$#!� �$� ,� ��A4�!�FG�� ,�

�"* N��2� ' ,���FA ��� � �����;O5�9�*�� ,��� ;65�' *��� �� � *<���".�8�� !� � / #��&#!��N��F�� ������ 5!�&5�N��F� ��� &B�Q��#���N��F� ,� �,�O#!M�#!��N��F�� 0 �

-.- ��569�G �%�7 ��!�)�7�.#��8���.96��� � 9����J#7E�� � � " ��" ".��D!� �QE��J����9����J#��F�7 ��Q" ".��E!�JD����J�� ���� ���J#Q�)�)� �� � ��� �8# / �&� � 9�< ��N��&#�� &=���J#!A4#�"@�+� 9�� �� 9�56�7A4#�"@� R

� K"���� �� 965���A #�" ��� � � � �+ �� 9�5��JA4#�" ��� � ����$#Q�.5��.9JD�� 9�����#�" A #�"2#�" �+ �� 9�56�7A4#�" � ���

#�' " # �$#Q�.5��.9 965�' ' �0

?-�� ���P�A * � ?BH ��& �� 8 ��$��D���#�".��9�� ��� � "2 � A=�!? > �-�.�� �I�� / ? ����9��&�)#7D��%� � � � " E6#7" #!5 ��9�� �%#��F" ;��.� �!�� / �6C�� � ? & * A3� �� +A � / !���?

Page 96: Jsp servlets j2_ee

-.-�/ D!�.� ��&' #Q���!K8��M�#�9�E��756� � K8��� ����$�7� �F#%�)�!� "$�%N��$#7��" ��#�"$#!"4E��J��9��K8��� �� 9�� � � ��� ��� ��� (�(/�

�!5%�&� ��$� 9��&' 9����!�@� IQ?BH � & � *�C�" ��� %' , ( H 9��F#Q<�#��.� �&� / �)�$� 9�<��B�.�)(/�"%' !�� ( ��NQ�F#!� & �!�J#�A4#�" �� ��(>��� - �I�? H ��& �� !�+�

?-�� -./ ��C�� � ?�������P����H &BI"(? ? �(I����� / " ��A�H ?- &.* A ���� !�(& � H * P� � *�C(" ���� ���9���� ���@ !�� - ���P�A ���? � � 9�D�' 5�E�#�K8� ' #����F�F��E��� %#!� *!�&��' ? �

� � � � ����� )*- ��2 � ! � +Existem, na verdade, dois tipos de comentários que você poderá utilizar em sua páginaJSP.

Um primeiro tipo é o comentário HTML: independente de ser uma página JSP (ou seja,mesmo sendo uma página HTML estática), você pode utilizar esse elemento para incluirum texto que não aparecerá diretamente para o usuário que estiver visualizando suapágina. O usuário poderá, por outro lado, ler o comentário caso visualize o fonte dapágina.

A sintaxe de um comentário HTML é a seguinte:

Sintaxe de um comentário HTML��9 : �QD��!�J#�9��&;��.� ����:<�

O outro tipo de comentário que você poderá utilizar é um comentário JSP: ao contráriode um comentário HTML, o texto escrito por você não aparecerá para o usuário mesmoque ele visualize o fonte da página. A sintaxe de um comentário JSP é a seguinte:

Sintaxe de um comentário JSP��? : ��D����J#!9��F;��.� ���: ? �

Exemplificando o uso dos dois tipos de comentários:

Página JSP com exemplo de uso dos dois tipos de comentários (HTML eJSP)��>�?BA�C������������������#!�� �' �:E�#�5�".��E���" �.� ���" E�#JD����J#!9!�&;��.� ��"4E�# 5��J�: �; < � 9��3; / I��9 :=��"$".#7D����J#!9��F;��.� �7� �F;7�� ��!�F#�DQ#�� 96�:K8��9��8#JE��7 %; < � 9���:$���? : �6"." #7D��!� #!9��8;��.� ��9 ����� �F;:�� ����.#�D�#��09%�:K8��9��8#�E��J �;�<(� 96��:3? �� - ����������� - >�? A0C��

� � � � 6�$ �,$ �*)'$ -+JavaBeans são, na verdade, classes Java reutilizáveis que seguem algumas regras bemdefinidas para nomeação de seus métodos e variáveis. A idéia por trás do uso dessesJavaBeans em nossas páginas JSP, é que eles encapsulem a lógica de nossaaplicação, separando-a do restante da página.

Page 97: Jsp servlets j2_ee

Embora a definição exata de JavaBeans fuja ao escopo desse livro, para efeitos de usodo uso dessas classes em páginas JSP, é necessário que se siga algumas regras básicasno seu desenvolvimento:

1) O construtor da classe, se declarado, não deve receber nenhum argumento.

2) Podem existir um ou mais métodos públicos para a definição de valores depropriedades do Bean; esses métodos são chamados de métodos # /&����/"- .

3) Podem existir um ou mais métodos públicos para a obtenção de valores depropriedades do Bean; esses métodos são chamados de métodos 0�/�� ��/�- .

Temos, a seguir, uma exemplo de classe JavaBean que implementa uma lógica básicade nossa aplicação:

Primeiro exemplo de JavaBean: encapsula lógica de cálculo de preçosde um produto ���D����Q<�#JD������ ��� 96*��Q#��� ��F#�".���

-.- ;6� �O����#���9J"2� � �' #�"0 ����$�:DQ;�' D�5O' �JE�#� ��F#�G��JE�#�5��� ��F��E�5��&� !5ON�' � D:D�' ��".":I��.#�D���I��F��E���#���9�R

-.- � ��' ��� 569�� �F;��.� � �� � ��� �8# � 9�� �&� I��F#�DQ�"=9�� E � �=�

-.- A #Q�F��E��� ����.�LD�;�' D�5�' �7E��J���!' ���1�&���8��'�E�#�5���' ���F#!�O�F#�D�#!N%#7D��!���� ��!�����J#Q�.�F�7�J3�5���9!�&� E��QE�#:E�#� ��F��E�5��F��"09%� ' �Q�F# �5�N�' � D7� 9��D��!' D�I��.#�D��!C6�Q�8#��B� 9��� �� 3�5���9%�&I��F��E�" �R

�.#��)5��$9 �� 3�5���9��&I��$��E�"4�7�$� I��F#�D��!" 9�� E��0

0

Uma vez construído o JavaBean, para referenciá-lo em nossa página JSP, devemosutilizar o elemento dinâmico � � # ��� $ # / �&/ �"% � , que tem a seguinte sintaxe:

Sintaxe de um elemento para inclusão de um JavaBean��� "Q � 5�"$#��#���9�� E �� ,��� EJE��/��#���9 �� B" D��� �#��� !�Q#�"2DQ�� ��JE�� �%#���9 �� BD!' �Q" " �� ,�QD�' �Q"2"$#7E��/��#���9 �� - �

Na sintaxe anterior, ��� � �.( �"/&� % � deve conter o nome do JavaBean como ele seráreferenciado na página e � ' � � # # / �&( � /"� %�� deve conter o nome da classe incluindoinformações sobre seu pacote (como por exemplo, '�("* ! * � %&�.��/"* �"- /&#)� ! ��- / '�(�� -�(����"/ �&% ).O atributo #)'�(&��/ , por outro lado, deve conter um dos seguintes valores: �.�&0 / (página; é ovalor default caso esse atributo não seja explicitamente definido), - / �&$ /&#�� (requisição),# /�# # � (�% (sessão) ou ���&��� � '.� � � (�% (aplicação); esse valor indica o escopo dentro do qual oJavaBean será visível. Assim, se o escopo de um JavaBean for de sessão, ele seráarmazenado como um atributo de sessão, podendo ser referenciado em todas asrequisições dessa mesma sessão.

Se quiséssemos utilizar o JavaBean � - / '�(�� - (�����/&� % em uma página JSP, por exemplo,poderíamos incluir as seguintes linhas de código:

Exemplo de página JSP utilizando o JavaBean “PrecoProdBean”

Page 98: Jsp servlets j2_ee

��>�?BA�C���������������� "Q � 5�"$#��#���9�� E �� �I!�$#�D��!I��F��E�5��8� D!' ��"."��� �DQ�!� � ��� 9�*��Q#��� ��$#�".��� I��F#�D��!I��$��E���#���9 - ���?��=�,� ��F#�G��L�&���8��'�E�� ' �Q�8#�E�# � ��.��E�5��&��" #(� �

( H 9%�8#Q<@#!�.� �8� / �&�.� 9�<.�+I!�)#�D���I��.��E%5!�8�%� DQ�!' D�I��F#�DQ�!C6�Q�8#�� � ���.? �� - ���������� - >(? A0C��

Esse elemento � � # ��� $ # / �&/ �"% � não é o único elemento disponibilizado pela API de páginasJSP para trabalhar com JavaBeans: existem elementos para referenciar diretamente osmétodos 0 /�� ��/�- e # /�����/�- dos JavaBeans desenvolvidos.

Ainda no exemplo de JavaBean anterior ( � - /&'�(���- (���� /"� % ), vamos acrescentar métodos 0�/&� ��/�-e # /.����/�- para a propriedade com o preço de unidade do produto:

Segundo exemplo de JavaBean: aperfeiçoa PrecoProdBean commétodos “getter” e “setter” para o preço de unidade ���D����Q<�#JD������ ��� 96*��Q#��� ��F#�".���

-.- ;6� �O����#���9J"2� � �' #�"0 ����$�:DQ;�' D�5O' �JE�#� ��F#�G��JE�#�5��� ��F��E�5��&� !5ON�' � D:D�' ��".":I��.#�D���I��F��E���#���9�R

-.- � ��' ��� 569�� �F;��.� �:E�#�K ��5�' � �� � ��� �8# � 9�� �&� I��F#�DQ�"=9�� E � �=�

-.- A #Q�F��E��/� <�#��8�8#�� 1 ����$�:� ��F#�G��7E��J5�9�� E��QE!#JE�� ��.��E�5��8� �5�N�' � D7� 9��B<@#Q�.I!�$#�D��!" 9�� E����BR

�.#��)5��$9 �$� I��.#�DQ�!"B9�� E%�0

-.- A #Q�F��E��/�+" #��+�F#!� 1 ����$�:� ��$#�G��JE!��5�9�� E��QE�#:E��� ��$��E�5��&� �5�N�' � D��O�!� E�" #��&I��.#�D��!" 9�� E��+� 9�� �� ��F#�DQ�("=9�� E�� R

�$� I��F#�D��!" 9�� E/�J �� ��F#�DQ�!"B9�� EO�0

-.- A #Q�F��E��� ����.�LD�;�' D�5�' �7E��J���!' ���1�&���8��'�E�#�5���' ���F#!�O�F#�D�#!N%#7D��!���-.- ��!� ����#Q�&�$�:�J3�5���9��.� E��QE�#7E�# ��$��E�5��8��"096� ' ���&# �5�N�' � D7� 9��D��!' D�I��.#�D��!C6�Q�8#��+� 9�� ��=3�5���9��&I��F��E�" �BR

�.#��)5��$9 �� 3�5���9��&I��$��E�"4�7�$� I��F#�D��!" 9�� E��0

0

Para referenciar o método 0�/�� ��/�- de um JavaBean, a API de páginas JSP disponibiliza oelemento � ��#)� � 0�/&� � - ("� /�-�� � � , cuja sintaxe é:

Sintaxe de um elemento para referenciar o método “getter” de umJavaBean��� "Q � <�#��)I��F�� �#!�)� $ 9�����#��� !�Q96���J#:E�� ;6� ������#���9��� ��$�! �#���� $��� !�Q9����J#:E��7 6�F�� !� � #�E��QE�#��� - �

Page 99: Jsp servlets j2_ee

Para imprimir o valor do preço unitário de um produto, por exemplo, poderíamosacrescentar as seguintes linhas em nossa página JSP:

Segundo exemplo de página JSP utilizando o JavaBean“PrecoProdBean”��>�?BA�C���������������� "Q � 5�"$#��#���9�� E �� �I!�$#�D��!I��F��E�5��8� D!' ��"."��� �DQ�!� � ��� 9�*��Q#��� ��$#�".��� I��F#�D��!I��$��E���#���9 - �� ��F#�G�� 5�96� �&;��$� �LE�� 6�F��E%5!�&�=#>��� " !� <(#��&I��F�� �#���� $ 96���J#�� �I��F#�D��!I��$��E�5��8��

��$�! �#��F� $��� � ��F#�DQ�!" 9�� E� - �� - ���������� - >(? A0C��

Da mesma forma como existe um elemento dinâmico para referenciar métodos 0 /.��� /�- deJavaBeans, também existe um elemento dinâmico para os métodos # /.����/�- . A sintaxedesse elemento é:

Sintaxe de um elemento para referenciar o método “setter” de umJavaBean��� "Q � ".#��&I��$�! �#!�)� $ 9����J#��� ��Q9��!�J#:E�� ;%�Q������#���9��� 1 ��F�! %#!�)� $��� !�Q96�!�J#:E6�7 ��.�� ��.� #�E��QE�#���

���!' 5�#��� ��$�%��' ��� E��7 6�.�� !� � #�E��QE�#�� - �

Podemos, então, modificar o exemplo de página JSP anterior para definir o valor dopreço unitário do produto antes de exibi-lo:

Terceiro exemplo de página JSP utilizando o JavaBean “PrecoProdBean”��>�?BA�C���������������� "Q � 5�"$#��#���9�� E �� �I!�$#�D��!I��F��E�5��8� D!' ��"."��� �DQ�!� � ��� 9�*��Q#��� ��$#�".��� I��F#�D��!I��$��E���#���9 - ���� "Q � ".#��&I��$�! �#!�)� $ 9����J#��� 8I��)#�D���I��.��E%5!�8� ��F�� �#!�)� $��� 8 ��)#!DQ�"=9O� E ���!' 5�#�� % - �� ��F#�G�� 5�96� �&;��$� �LE�� 6�F��E%5!�&�=#>��� " !� <(#��&I��F�� �#���� $ 96���J#�� �I��F#�D��!I��$��E�5��8��

��$�! �#��F� $��� � ��F#�DQ�!" 9�� E� - �� - ���������� - >(? A0C��

Esse elemento de referência a métodos # /&��� /"- de JavaBeans admite, ainda, outra sintaxede uso:

Sintaxe alternativa de elemento para referenciar o método “setter” deum JavaBean��� "Q � ".#��&I��$�! �#!�)� $ 9����J#��� ��Q9��!�J#:E�� ;%�Q������#���9��� 1 ��F�! %#!�)� $��� !�Q96�!�J#:E6�7 ��.�� ��.� #�E��QE�#��� ��!�$���/�� !�Q96�!�L#:E��� ���� ���J#��&�F���� - �

Nessa sintaxe, o valor que será recebido pelo JavaBean para a propriedade emquestão, será o valor do parâmetro � % (&* / ��( ���"-��.* /���-�(�� , conforme recebido pela requisiçãoHTTP.

� � �@1 � !"2 ��! � � ) #%$ + ) 5 $�4'+���5 $ 4 �!"2�� $�� !�)+��Existe um último tipo de elemento dinâmico que pode ser utilizado em uma página JSP:um elemento de referência a uma biblioteca de Tags.

Page 100: Jsp servlets j2_ee

Uma biblioteca de Tags permite que você também separe a lógica de programaçãode sua aplicação do conteúdo da página JSP, assim como JavaBeans se propõe afazer.

No entanto, ao contrário de JavaBeans, uma biblioteca de Tags oferece um acessonativo aos objetos da página JSP, como por exemplo, o objeto que encapsula aresposta do Servlet correspondente a página JSP.

Nessa seção estaremos explorando algumas características básicas de biblioteca deTags. Uma explicação mais detalhada e aprofundada sobre TagLibs pode ser obtidaem � � ��� � � � � ��� � ! #)$ %�! ')("* � �&- (��"$�',��#���� #)� �)��$���("- � ��� �����&0 ��� � -��"- � /&# � �)� ! ����* � .Existem 4 componentes principais por trás 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 extensão “.tld” e colocado nodiretório �������� � � , contém as configurações das bibliotecas de Tags utilizadas pelaaplicação.

Exemplo de um Descritor de Bibliotecas de Tags (“minhabibliotags.tld”)���Q��� '!�%#��$"2� �!9��� � � B#�9�DQ��E�� 9�< �� 8H / ��� ����� � � ������9 � � � ? �(I��L�&� <=' � N7I" ��C6H � � � -$-2/ 5�9�A:� D��$��" $�".�8#��J"'�6H 96D�� -F- ��?-� ; / I7? � < C6� N��F����$ � !-&- � &

��*��+�& � -F- � ���%��� "2569�� DQ��� - � #�# - E��FE�" - #�N!��� "2 ��8�Q<@' � N��$��� $�� � � E��FE ,�� �8�Q<@' � N��

�$�.' � N���#!�F"Q� ��9�� � � � - �&' � NQ��#��F"2� ��9��� "Q*������&96���J#� #��,#��� �' �Q�F� <�� - "2*6�!�&�)9����J#���Q� 9�K8�������Q#!�� �' �:E�#�N�� N�' � ���8#�D��:E�#7?B� <@" � - � 9�K+����$�F�Q<��

�Q9����J#��,? � < � ' ��A45�9�E��� - 96�,�J#��� �8��<�D!' ��"."�� D������ ��� 9�*6�2#��� ��F#�" ��� ? �Q< �' ��A�5�9�E��� - �&� <�D�' �Q" " ���N���E�$�DQ�!9%�8#!9%��� #!�� �� $ � - N���E�$�D��!9!�&#!9!���

� - �F�Q<��� - �&��<(' � N��

Nesse exemplo de “Descritor de Biblioteca de Tags”, podemos observar diversoselementos: os elementos �,� � � �./"-�# � (�% , # ��("-���%&�.* / e � %���( contém, respectivamente, a versão dabiblioteca de Tags, seu nome (conforme referenciado posteriormente na página JSP) eum texto informativo sobre a biblioteca.

O último elemento no descritor de nosso exemplo é um elemento “tag”: esse elementoserve para especificar um nome de uma Tag ( � �.0 � � � � $&% �.( ) e a respectiva classe que irátratar essa Tag quando utilizada na página JSP ( ',(&*4! * � %�����/"* �"- /�#��"! � ��0��+� � ��$ %��.( ). O elemento� (�� � '�(�%&� /�%&� especifica o tipo de tratamento que o conteúdo da Tag deverá receber: nonosso exemplo, esse conteúdo deverá ser vazio, ou seja, não deverá haver textonenhum entre o elemento de início e fim da Tag; outros valores possíveis para esseelemento são � ��� e ����0 �&/&��/�%���/�%&� .Embora em nosso exemplo haja somente um elemento do tipo “tag”, pode haver maisde um elemento desse tipo no mesmo “Descritor de Biblioteca de Tags”.

O componente seguinte por trás do uso de uma biblioteca de Tags, é o “DeploymentDescriptor”, já apresentado no íçãçãCapí tulo 2 – Instalaç ã o e Configuraç ã o desse livro. Paraque se possa utilizar uma biblioteca de Tags, é necessário incluir um mapeamento de

Page 101: Jsp servlets j2_ee

uma URI, referenciada na página JSP, ao arquivo “.tld” com a biblioteca de Tagscorrespondente.

Assim, poderíamos incluir as seguintes linhas no “Deployment Descriptor” de nossaaplicação:

Exemplo de linhas incluídas no Deployment Descriptor para utilização deuma biblioteca de Tags��9 � � � ? �(I��$ #�N!���� �

I" ��C�H � �,� -.- / 5�9 A0� D!�F��"#$�"$�8#��J" ��H 9�D!� -.- �(?-�/� #!N$* � �' � DQ�Q�&� �!9 � % -F- �)& �8*%�+�& (� -F- � �Q���!� "25�9�� D���� - E��8E - #�N�8�� � �� � %@� E��8E� !�

�@ #!N(� �! � ���

� �8�Q<@' � N���$�F�Q<(' � N(��5��2� � - ��� 9�*6�,N�� N!' � ���8� <�"�� - �&� <@' � N�85�� � ��$�F�Q<(' � 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( � �.0 � � %��� /"- ). Essa classe, especificada pelo elemento ����0.' � � # # do Descritor da Biblioteca deTags, é responsável por executar as rotinas pertinentes quando a Tag é encontrada napágina JSP.

Essa classe que gerencia a Tag deve implementar a interface ���&0 ou �"(�� � � �.0 : a diferençabásica entre essas duas interfaces diz respeito ao tratamento do conteúdo da Tag.Como em nosso exemplo não estamos interessandos no conteúdo da Tag, a classe queapresentamos implementa a interface �"�&0 .Exemplo de classe para gerenciar uma Tag (“Tag Handler”)

���D����Q<�#JD������ ��� 96*��Q#��� ��F#�".���

� �� �������� ����� �!� "$#%�&�(' #��)� � "2 �� � �� �� �������� ����� �!� "$#%�&�(' #��)� � "2 �� �8� <(#��2�.� ���

-.- � ' �Q" ".#�3�56#�<(#��F#�9�D�� � ? � < ? � <.� ' ��A�5�9�E�����5%�&� ' � M��QE���#��� �; <=� 9��Q" ; / IJE�#�9���"."2�L�� �' � DQ��G���� !5ON�' � D:D�' ��"."0? � < �' ��A05�9�E��7� �� �' #��J#�9��&"�? � < R

I��Q<O# � ��9��8#��Q���$� I��Q<�# � ��9��8#��2�&�

-.- H �� !' #!�J#�9��8�QG ���7E�#�K8��5�' � �5�N�' � D��O�!� E�" #��&I��!�F#�9���� ? � < ��=�F� <��R0

-.- H �� !' #!�J#�9��8�QG ���7E�#�K8��5�' � �5�N�' � D��O�!� E�" #��&I��Q<�# � �!9%�8#Q�Q���+I���<�# � ��9��8#�� �� �� �� <�# � �!9��8#�� � �BR

�$� I�� <�# � �!9!�&#Q�Q� �J �� �� <�# � �!9��F#Q�Q�&�

Page 102: Jsp servlets j2_ee

0

-.- H �� !' #!�J#�9��8�QG ���7E�#�K8��5�' � �5�N�' � D��O�!� E �$#�' #��Q".#>���R0

-.- H �� !' #!�J#�9��8�QG ���7E�#�K8��5�' � �5�N�' � D ? �Q< <�#��&I����F#�9�� �!�R

�.#��)5��$9 9�5�' ' �0

-.- H �� !�$� ��� �J�Q" �J�F#Q�Q�F� �,�' �7A�5�9%E!��9 B3O5���9�E��7�7? � < #�#�9�DQ��9��&�$�QE����-.- �:K&569�G����7�$#Q�F�%�$9�� / ��H I�� ������� E�#�����9%#!� �$��3�5�#J��D���9��8# ��E��:E��:?B� <-.- 9 ���J" #%� �7 ��$��D�#�" ".��E��/�89���9���".".��D���".���6�L? � < #J����M�� ����� �5�N�' � D7� 9��E�� / �&�����&? �Q< �,�+R

�)� $ R�$�I�� <�# � �!9��F#Q�Q�&� <O#��!�5�� �,�+� ��.� 9��&' 9������' �7A45�9�E���9 !���

0 D����&D�* ������D�#� ��)� ��9� �� #��R 0�.#��)5��$9 / �@H I�� �������(�

0

-.- H �� !' #!�J#�9��8�QG ���7E�#�K8��5�' �&���LK&5�9�G���� �$#��8���.9��=��� � * C�� I�*�� �� E!# �J��96#!� �F�:3�56#:�-.- �.#�"F�F��9��8#JE��7 �;�<(� 9��=; / IJ"2#�� �� ��.��DQ#�"." �QE�� �5�N�' � D7� 9��E�����9�E%? � < �!�R

�.#��)5��$9>� � * C�� I�*�� ���0

0

Os métodos mais importantes dessa classe são os métodos �&( �����&- � ���&0���� , chamado quandoa Tag é encontrada, �&(��)%�� ���&0���� , chamado após o processamento do conteúdo da Tag, e- /�� /"��# / ��� , chamado ao término de todo o processamento devendo liberar quaisquerrecursos alocados durante o processo. É interessante observar que no método ��( �����&- � � �.0��� ” obtemos uma referência ao stream de saída da página, e utilizamos esse streampara imprimir nosso texto � � � � $"%��.(�� .Finalmente, o componente final de nossa biblioteca de Tags é a página JSP em si. Parautilizar a biblioteca de Tags * � % �&� � � � � � (&����0 # ! �#� � , podemos elaborar a seguinte página JSP deexemplo:

Exemplo de página JSP que utiliza a biblioteca de Tags“minhabibliotags.tld” (“exemplotags.jsp”)��>�?BA�C�������������I!�$��D�#�" "2��9%E!�7? � < �' ��A05�9�E��7� � � ����P����? � �8��<(' � NJ5��.� �� - � � 9�*���N�� N�' � �Q�F� <�" 1 ��F#�K8� ���� ��7� 9�*���C�� N� �?���Q� � 9�*6�,CO� N� ? �Q<��' ��A45�9�E�� - �� - ���������� - >(? A0C��

Page 103: Jsp servlets j2_ee

Nessa página, primeiro incluímos um elemento ���.0!� � � , cujo atributo $&- � contém a URIespecificada no “Deployment Descriptor” (que por sua vez faz o mapeamento com oarquivo “.tld” correto), e cujo atributo “prefix” especifica o prefixo a ser utilizado antesde cada Tag.

Na linha seguinte, temos a utilização da Tag em si: há um prefixo, conformeespecificado pelo atributo �&-�/ �#� � do elemento taglib, seguido da Tag, que deverá ter sidodeclarada no descritor de bibliotecas de Tags. Ao encontrar esse elemento, o containerirá carregar a classe que gerencia esse Tag, e chamar os métodos pertinentes.

É importante observar que não existe nenhum conteúdo para a tag * � %"�.� ��� � � ���&0�+� � � $ %��.( ; anotação abreviada � * � %"�.� ��� � � ����0 � � � � $ %��.( ��� é equivalente se escrever� * � %"�.� ��� � � ����0 � � � � $ %��.(�� � �,* � %"�.� ��� � � �"�&0�� � � � $ %��.( � . Caso houvesse algum conteúdo para essa tag,teríamos que utilizar um valor diferente para o atributo

� (�� � � ("%.� /�%&� no descritor debibliotecas de Tags, e poderíamos considerar a implementação da interface �"(�� � � �.0 emvez de ����0 para a classe � �.0�+� � � $"%��.( .A página HTML resultante do processamento da página JSP apresentada anteriormenteserá então:

Resultado do processamento da página “exemplotags.jsp”��>�?BA�C������� ��� �I!�$��D�#�" "2��9%E!�7? � < �' ��A05�9�E��7� � � ����P��� ' �7A�5�9%E!��9� - ���������� - >(? A0C��

Embora você possa construir suas próprias bibliotecas de Tags, normalmente é maisprático e fácil utilizar uma biblioteca já pronta, como o Apache Jakarta Struts,disponível no site http://jakarta.apache.org/struts/.

Page 104: Jsp servlets j2_ee

� ����� ����� �

� �� � � ��� �

Nesse capítulo apresentamos o modelo MVC: através desse modelo, procuramosmostrar como podemos separar o trabalho de desenvolvimento do trabalho deformatação e layout da aplicação.

� � � 8 � �34�� $��.$,&�� � ) �"$���� � �

Normalmente, o desenvolvimento de uma aplicação Web envolve o trabalho de duasequipes distintas: os desenvolvedores são responsáveis pela programação, e os web-designers são responsáveis pela formatação e layout do front-end da aplicação.

Pelo que vimos até agora, existe uma intersecção entre esses dois mundos: na verdade,qualquer que seja a tecnologia que se utilize para desenvolver aplicações Web, sempreexiste um ponto em que se mistura os trabalhos dessas duas equipes.

Agora imagine uma situação onde o início do trabalho de uma equipe dependa daoutra equipe finalizar a sua parte; imagine também que, qualquer alteração feita poruma equipe precise necessariamente envolver o trabalho da outra equipe. Essassituações podem onerar tanto o cronograma quanto o custo de um projeto.

Assim, tanto para efeitos de construção, quanto da manutenção da aplicaçãodesenvolvida, é muito importante que haja a maior separação possível entre esses doistrabalhos, de maneira que as duas equipes possam trabalhar de forma independente,sem dependerem uma da outra.

Embora já tenhamos visto nesse livro algumas técnicas que auxiliam na separação entrelógica da aplicação e apresentação, apresentaremos nesse capítulo uma técnicamuito mais eficaz e que pode ser utilizada de maneira complementar as apresentadasanteriormente.

� �&�.� �%���,! � )��O��� $ 232+ !"# $A arquitetura básica do modelo MVC, ou Model-View-Controller, se vale do uso deServlets, JavaBeans e páginas JSP: os Servlets controlam as requisições recebidas(Controller), os JavaBeans implementam a lógica da aplicação (Model), e as páginasJSP se encarregam da apresentação do resultado (View).

Podemos representar melhor essa arquitetura através da seguinte figura:

Page 105: Jsp servlets j2_ee

�Figura 8.1 � Arquitetura b ásica MVC.á

Toda vez que uma requisição é recebida, o Servlet de controle repassa a requisiçãopara a página JSP responsável pela apresentação da resposta, sendo que JavaBeanssão utilizados pela página JSP para obter os dados dinâmicos da aplicação.

� �"1 � ����� $�� ) � )0�0�! + ! & ( ),+Para que um Servlet �(�%&��- (�� � /�- possa repassar a requisição recebida para uma página JSP,é necessário utilizar um método específico da classe � � � � ��! # /�- ��� /.� ! ������� ! � �������/�- ��� /.� ��/ ��$�/�# � .Assinatura do método “getRequestDispatcher ()” da classe

HttpServletRequest !5ON�' � D7� ����� �!� ".#�����' #Q�.� P�#�3�5�#�"$���@� "2 %� �&D�*�#��%<�#��&P�#�3%5%#�"$���@� "2 �� �8D�*�#!�@�+� � �O��� ' ��9�<(� / �)�$� 9�< �� ����&*��+�

Esses método retorna uma referência para um objeto que implementa a interface� � � � � ! # /�- ��� /.��! ��/ �&$�/�# � �)� #)�&����'.��/�- e que atua como um “wrapper” para o recurso indicado no pathpassado como parâmetro para a função. Assim, se você passar como parâmetro, porexemplo, o caminho relativo de uma página JSP, esse método retornará umareferência a um “wrapper” dessa página JSP.

Esse “wrapper”, por sua vez, disponibiliza um método ��(�- � � - � ��� que permite que vocêrepasse a requisição para o recurso “encapsulado” pelo “wrapper”.

Assinatura do método “forward ()” da interface RequestDispatcher !5ON�' � D����!� EJK8���, �!�)E �+>(�+�& / #��F��' #Q�&P%#�3�5�#�"F�� �� �$#�3�5�#�"F���O>6�8�& / #�����' #Q�&P6#�"2 ���9�".#��� �� �$#�"Q ��!9�" #�+�

Podemos, dessa forma, implementar um Servlet de exemplo que não faz nada, apenasrepassa todas as requisições recebidas para uma página JSP.

Exemplo de Servlet que repassa requisições para uma página JSP� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#� ���"." �7�.#�3�5�� "2� G ��#�"0�$#�D�#!N�� E���" ����$�:�-.- �; <=� 9%��; / I&�!�' ��A0569�E��!� � "2 � !5ON�' � D:D�' ��"." / #!�)��' #��&P�#� ���".".��P6#�3�"4#�� �&#�9�E�" >(�8�& / #!�)�6' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

Page 106: Jsp servlets j2_ee

-.- P�#! %�Q"."2��9%E��:���.#�3%5O� " � G ��� ����.�:�� �;Q<(� 9��3; / I=�' ��A�5�9�E��!� � "2 �)� $ R

���.#�3%56#�")�&� <O#Q�&P�#�3�5�#�")���=� " ����8D�*�#�� �!� - � ' ��A�5�9�E��!� � "2 � �� � K+���, �!�FE��+ �� �F#�3�5�#�"F��� �� �$#�"Q ��!9�" #�+�

0 D����&D�* � / #����(' #Q� �!��DQ#% ��&� �!9� ��B# �BR 00

0

No Servlet anterior, existe um ponto importante que deve ser observado: o pathpassado como parâmetro para a função 0�/&����/ �&$�/�# � �)� #)�&� ��'.� /�- ��� referencia um recursocontido na mesma aplicação Web do Servlet, e, dessa forma, deve excluir a partereferente ao diretório virtual da aplicação (ou seja, esse path não deve ser escritocomo � � � ��-�(�# /�- ��� /���#����+� � � $ %��.("! ��#)� ). Além disso, é importante observar que o método ��("- � �&- �poderá lançar uma exceção: uma das causas pode ser uma exceção lançada pelopróprio recurso referenciado pelo ��/ ��$�/&# � � � #)������'.� /�- .Podemos também implementar a página JSP referenciada no Servlet anterior como:

Exemplo de página JSP “OlaMundo.jsp”��>�?BA�C���������������? �!5%�&� 6�.� 9��&' 9������' � A�5�9%E!��9 ,�8��? �� - ���������� - >(? A0C��

Assim, a cada requisição recebida, o Servlet ��/"- ��� /.� �&/&�&� # #���� / � # repassa a requisição para apágina JSP � � � ��$ %���(�! � # � , que por sua vez retorna para o Browser a seguinte página HTML

Resposta do Servlet “ServletRepassaReqs”��>�?BA�C�������������� ' �7A�5�9%E!��9� - ���������� - >(? A0C��

� ������� � ! 24� � � + ,) � ) ���,! + ! &(*),+Existe ainda um outro recurso da API de Servlets que iremos utilizar no desenvolvimentode nossas aplicações Web no modelo MVC: esse recurso é a definição / obtenção deatributos da requisição.

A classe � � ��� � /�- ��� /.� ��/ ��$�/�# � possui quatro métodos que podem ser utilizados para gerenciar osatributos de uma requisição.

Assinatura dos métodos da classe “HttpServletRequest” que gerenciamos atributos de uma requisição !5ON�' � D � � ����� ' ��9�<(� �N!� #�D �<(#��!*B�8�&� � N�5��8#��+� � ����� ' �!9�< � / �&� � 9�< ��B� �8�&� � N�5��&#�& ���:#��+� !5ON�' � D � � ����� 5��.� ' � ��9�5��J#��F� �)� �!9L<@#Q�!*B���&�2� N!5!�8# & ���J#�" �!�+� !5ON�' � D ���!� E �$#!�J����#�* �+�)�.� N�5��8#�+� �Q���!� ' ��9�<@� / �.�.� 9!< ��=�Q�+�.�.� N�5%�8#!& ���J#�+�

Page 107: Jsp servlets j2_ee

!5ON�' � D ���!� EJ"2#���*�+�.�.� N�5��8#�+� � ����� ' �!9�<(� / �&�2� 9�< �� � �8�&� � N�5��F#�&B���J#��� �Q����� ' ��9!< � � N�� #�D � ��=�Q�+�.�.� N�5%�8# � ��' 5�#��8�

Esses métodos funcionam de maneira semelhante aos métodos da classe � /"- ��� /�� �(�%�� / � �apresentada na seção 3.6: eles permitem definir, remover ou obter valores de atributosde uma requisição. Esses valores de atributos não precisam necessariamente ser objetos� ��- � %"0 , eles podem ser objetos quaisquer Java.

Para exemplificar o uso dessas funções, vamos implementar novamente nosso Servlet� /�- ��� /�����/"�.� # #)� � / � # da seguinte forma:

Segunda versão para Servlet que repassa requisições para uma páginaJSP� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #��1"2� �� !' #�"43%56#7�$#� ���"." �7�.#�3�5�� "2� G ��#�"0�$#�D�#!N�� E���" ����$�:�� �; <=� 9��3; / I !5ON�' � D:D�' ��"." / #!�)��' #��&P�#� ���".".��P6#�3�"4#�� �&#�9�E�" >(�8�& / #!�)�6' #���R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� �J��" 5�� �Q�&� � N�5%�8�7E����F#�3�5�� "Q� G����:D�*����J�QE��&�8A4#!96".� <�#��/ �� �$#�3�5�#�"F�&� ".#���*B�8�&� � N�5��&#����8A4#!9�" � <�#!�/ ,�����' �:A:5�9�E���9 !�+�

-.- P�#! %�Q"."2��9%E��:���.#�3%5O� " � G ��� ����.�:�� �;Q<(� 9��3; / I * ��$#�" #!9!�&��A4#!9�"$� <�#!��� � ". �)� $ R

���.#�3%56#�")�&� <O#Q�&P�#�3�5�#�")���=� " ����8D�*�#�� �!� - ' � ���F��".#����(' #��&" -*� ��$#�" #!9��F��A #�9�".� <@#���� � ". � !�+� K ���, ���FE��+ �� �F#�3O5�#�"F���O �� �$#�"Q ��!96".#�+�

0 D����&D�* � / #����(' #Q� �!��DQ#% ��&� �!9� ��B# �BR 00

0

A página JSP ��"- /�# /�%.��� � /�%&# �&0�/&* ! � #)� , por sua vez, pode ser implementada como:

Página JSP “ApresentaMensagem.jsp”��>�?BA�C���������������?

/ �&� � 9�< ' � �J#!96".� <�#�� � � / �)�$� 9�<��B�$#�3�5%#!")�&� <@#Q��*�+�.�.� N�5��F#���8A4#�9�".� <�#��/ !�+�� K!�+' � �J#�9�".� <@#!� 9 �L9�5�' ' � �!5%�&� 6�.� 9��&' 9��+' � �J#�9�".� <�#��/�+�

?-�� - ���������� - >(? A0C��

Dessa forma, além de repassar a requisição do Servlet para a página JSP, estamostambém passando objetos, definidos no Servlet, para a página JSP. Esse mecanismofunciona graças aos atributos de requisição.

� ��� 6 � -� $*- � $'+ �,$�� � ) +

Page 108: Jsp servlets j2_ee

Juntando os recursos apresentados nas seções anteriores, podemos finalmenteapresentar o modelo MVC com todos os seus componentes.

Para fazer essa apresentação, reimplementaremos e estenderemos a aplicação delogin da seção 6.4 desse livro. Agora, a aplicação de login passará a prever tambémum nível de acesso associado a cada usuário que efetua a autenticação: se o usuáriotiver nível de acesso administrativo, será apresentada a interface do administrador,caso contrário será apresentada a interface do usuário “comum”.

Assim, o Servlet de Login será:

Servlet “Login” � �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.- *� 6�F#�".#!9%�8�:�JK8���.��5�' ;��.� �:E�#�' ��< � 9J#JK8�,MJ�J�!5!�&#!9!�&� DQ��G ����E��J�! �' � DQ��G���� !5ON�' � D:D�' ��".":C���<(� 9J#�� �&#�9�E�" >(�8�& / #!���(' #���R

-.- � #��.� K8� DQ�7".#�#��!� ".�8#�5�" 5�;!�.� �7D��!��� ' ��<(� 9J#�" #!9�*6�: ���"$"2�QE���" D��!���J ��!� ���J#��&�F�(��" #-.- #��!� "F�.� �@���.#��8���.9��J9 � ��#!'�E6#7��D�#�" " �7E���56"25�;!�$� �J#!��3�56#�"F� ��� �,� ����.�J9 � ��#!'�E6#-.- 5�" 5�;!�.� �7D��!��5��/��� ����.�J9 � ��#!'�E6#7��E%��� 9�� "$�&�F�QE���� �+�6D���"$��D��!9%�&�$;��.� ��O�.#��&�!� 9�� � � �� �� � ��� �8# � 9�� &� �%#�' * DQ#�"."2�"@"256���.� �� / �&�2� 9�< �� ' ��<@� 9�� / �)� � 9�< � ".#�9�*����BR

� 9%��' � 9O� ��#�' *D�#�" ".�>� � �� K"���� �� ' ��<(� 9/9 �:9�5O' ' � � � �+ ��=" #!96*�� 9 �J9�5�' ' ���BR

-$- � �!D � E6#���#�� � !' #!�J#�9��8��� ��3%56����D���E�� <�� ����.������' � E��!� � ' �Q<=� 9-$- #�"$#%96*��:E�� 56"25�;��.� �J#�E�#�K&� 9�� � �L�����2� ;Q��#�' ��' � 9O� ��#!' *D�#�"2"$� -$- �+ ���� #��Q#!�� �' ���D���9�"25O' �8��9�E��J5��J�7N���".#�E�#JE��QE���"'�

0�.#��)5��$9 ' � 9O� ��#�' *D�#�" ".���

0

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE�#� �; <(� 9�� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- ����M�#�9�E��J��5��&#�9��)� DQ��G����JE�� 5%"25�;��$� �J#��!N!�8#!9�E��J".#�5 9 � ��#�'�E�#��QD�#�"." �/ �&�2� 9�< ' � ' ��< � 9/�7 ���F#�3%5%#�"$�&� <�#��&I����.���J#��8#�� ���8C�� �BH & !����' � ".#�9�*6�<�

���.#�3%56#�")�&� <O#Q�&I��!�F���J#��&#�� ��� / �(&B>�* !���� 9%��' � 9O� ��#�' *D�#�" ".�>� &B� ��#!' * DQ#�"."2�"@"Q5����.� ��+' � ' ��<(� 9 ��' �B".#!9O*����+�

-.- �O#�K � 9�� 9�E��:�Q�&� � N�5��F��" E�#�" #�" " ���>� " #J� 5�",5%;��.� ��K8��� �O;�' � E�� �>O�+�& / #�".",� �!9�' � "$#!"$"2�Q�/�� �� �F#�3�5�#�"$�&� <O#�� / #�".",� �!9�� �.�.5�#��8�� K"�+' � 9�� ��#!' * DQ#�"."2�/9 � � �' �B".#�"."2�Q��� ".#���*�+�)�.� N�5��8#����8C�� � H & !��' � ' ��< � 9��+�#�' " # ' �=" #�" ".����� �)#!�J�Q�O#�*B�8�&� � N�5��8#����8C � �BH & !�+�

Page 109: Jsp servlets j2_ee

�)� $ R� K!�+' � 9�� ��#�' * DQ#�"." �/��� � �R

-.- "@" 5�;!�.� � 9 ���JD��!96".#�<(5�� 5J".#��!5!�&#!9!�&� DQ��� �6#Q�!� "$�&#�� E%5%��"0 ���"."Q� N�� ' � E��QE�#�" �-.- ' ��<(� 9 - ".#�9�*��7� 9�D����2�F#��8��" ��5 5�"25�;��.� �J�!� 9�E��:9 ���J#�9���� �!5J��"�E!��E���"�E��-.- K8�!� ��5�' ;��.� �/�+"2� �� �' #�"2�J#!9!�8#:��D�#�" "2��5��� �;�<(� 9%��+��#�������N���"4��"�D���".��"'�-.- K8�,M�#��J��"05�� � K8���� ���FE ����$��� �; <=� 9��=; / I/� �����.��C%�Q<(� 9�� � "2 � �� �$#�3�56#�"F�&� ".#���*B�8�&� � N�5��F#���8A4#�9�".� <�#��/ !���, !�8�� K"�,�+' �' �Q<@� 9/9 �:9�5�' ' � � � �+' �=" #!9�*%� 9 �J9�5�' ' ���+ �� �F#�3�5�#�"$�&� " #Q��*�+�.�.� N�5%�8#

�!�8A4#�9�".� <@#!�/ !���,���.�$�!�O' �Q<=� 9J# - �!5 ".#�9�*��J� 9���;�' � E���� " ��9 �+� �� �$#�3�56#�"F�&� <�#��&P�#�3%5%#�"F��� � "2 �� �8D�*�#!�@��� - �6�!�.��C%�Q<(� 9�� � "2 � !�+� K ���� ���FE �+ �� �$#�3�5�#�"F���

�� �.#�", ���9�"2#��+�0#�' "2#�R

-.- "@" 5�;!�.� �7D��!96".#�<(5�� 5J#�K+#��&5���� ��5��8#�9��&� DQ�QG �������� 6�F#�".#!9%�8��9�E��:��� 9��8#���K8�QD�#-.- D����2�)#!"Q ��!9�E�#�9��8#J�Q��"2#�5 9 � ��#!'6E�#J��D�#�" "2� �� �$#�3�56#�"F�&� ".#���*B�8�&� � N�5��F#���8C%�Q<(� 9� !��' � ' �Q<=� 9��+�� K"��' � 9�� ��#!' * DQ#�"." � ��� � �� �F#�3�5�#�"$�&� <@#Q�&P%#!3�5�#�"F���@� "Q �� �&D�*6#!�

�!� - " "25����.� � � ����5���� � "2 � ,�+� K+�!� ���FE �+ �� �$#�3�5�#�"F���O ���F#�"2 ���9�".#��+�#�' " # � �.#�3�5�#�")�)� <O#Q�)P%#�3�5�#�"$���@� " �� �8D!*�#��

�!� - * E���� 9�� "F�.�F�QE����.� � "2 � !�+� K8�!� ���.E��+ �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���0

0 D����&D�* � / #����(' #�������D�#� Q�.� ��9 �� #/� R 00

-.- &B#�" ".# / #%�&�(' #����6��":�/#��&��E���" ���!? # I�� / ? " ���L�)�$� �&�QE���" E��J��#�" �J� � ��9�#!� �.�-.- �8 �#�' ���J#�"2�J���)�)#!D�*6�JE!#�D���E�� <(��� �5�N�' � D ����� E7E6�!I���"F� �+>6���& / #����(' #��)P�#�3�5�#�"$�� �� �F#�3�5�#�".����>(�+�) / #!�)��' #��&P�#�"2 ��!96".#7 ���F#�"2 ���9�".#�

�&*O�F�� "0H � ����DQ#� ��&� ��9�RE���� #����8 �� �.#�3�5�#�"$���� ���F#�"2 ��!9%".#���

00

Conforme você pode observar no Servlet anterior, não existe nenhuma codificaçãofeita que se relaciona a apresentação da interface para o usuário da aplicação. OServlet simplesmente trata os parâmetros recebidos, repassando a requisição para asdiversas páginas JSP da aplicação, que deverão ser responsáveis pela interface em si.

Página JSP “FormLogin.jsp”��>�?BA�C���������������?��=� / �&� � 9�<.� �$#�3�56#�"F�.� <�#���*B�8�&� � N�5��8#����8A4#!96".� <�#��/ !� ? ������P��� ���P�A * � ?BH ��& �� 8C���< � 9 BA �!?B> ��� �� �I�� / ? ,�C���<(� 9(���QH &BI"(? ? �(I����� +? � �6?- �& * A3� �� 8C � �BH &� �������P��/ #�9�*���� �QH & I"@? ? �(I����� �I�* /�/ � �P��. & * A ���� / ��& >�* ,������P����H &BI"(? ? �(I����� / " ��A�H ?- &.* A ���� !�(&=? P�* P� � * C(" � �� !�69��&�F�!� !������P��� - ���P�A �� - ����������� - >�? A0C��

Página JSP “UsuarioComum.jsp”��>�?BA�C�������������� ' ;�� �@? �:�$#�3%5%#!")�&� <@#Q�!*B�+�.�.� N�5��F#���8C%�Q<(� 9� !� ?����%����D � �8#�� ��D�#�"." �7D��!� � 5�" 5�;��.� �:D��!� 5!�/9

Page 110: Jsp servlets j2_ee

� - ���������� - >(? A0C��

Página JSP “Administrador.jsp”��>�?BA�C�������������� ' ;�� �@? �:�$#�3%5%#!")�&� <@#Q�!*B�+�.�.� N�5��F#���8C%�Q<(� 9� !� ?����%����D � �8#�� ��D�#�"." �7D��!� �7�QE���� 9�� ")�&�.�QE��!�@9� - ���������� - >(? A0C��

Essas páginas JSP poderão ser trabalhadas pelos responsáveis pelo layout e formataçãode nossa aplicação, sem afetar a lógica e o trabalho de desenvolvimento.

Page 111: Jsp servlets j2_ee

� ����� ����� �

��� � � � � � � � � � � � �

Já apresentamos nos capítulos anteriores as principais características e funcionalidadesreferentes ao desenvolvimento de aplicações Web com Servlets e páginas JSP.

Estaremos, nesse capítulo, apresentando alguns tópicos adicionais quecomplementarão todo o conhecimento que você obteve até agora: você iráconhecer arquivos WAR, mecanismos de autenticação HTTP e pools de conexões auma base de dados.

�,� ��� �%�4�,! � � + /1� �Já apresentamos, na seção 2.2, uma maneira através da qual você pode instalar umaaplicação Web em um servidor de aplicações: você pode fazer essa instalaçãocriando, abaixo do diretório � / � ������# , uma pasta com o nome de sua aplicação, com oconteúdo dessa pasta obedecendo a um formato específico (veja seção 2.2).

Embora essa forma de instalar a aplicação funcione, é considerado mais elegantedistribuir sua aplicação no formato de um arquivo WAR, ou Web Application Archive.

Um arquivo WAR nada mais é que um arquivo “.jar”, nomeado com a extensão “.war”.Assim, você deve gerar o arquivo WAR utilizando o aplicativo jar para juntar todo oconteúdo do diretório de sua aplicação (retirando, obviamente, os arquivos fontes“.java”).

Assim, poderíamos, por exemplo, remover os arquivos “.java” de dentro do diretório� � ��-�(�# /�- ��� /���# (que contém a nossa aplicação), e, a partir de um PROMPT DOS e de dentrodesse diretório, digitar a linha de comando � �&- '�� ��! ! � � � ��- (&# /"-�� � /���# ! � �&- � .Com um arquivo “.war”, podemos instalar nossa aplicação Web em qualquer servidorde aplicações: basta copiar esse arquivo para a pasta � / � ���&� # do servidor. Obviamente,devemos tomar cuidado para não instalar o arquivo “.war” mais o diretório com toda anossa aplicação juntos em um mesmo servidor de aplicações.

�,�&� � � � )*- � !"# $'& ��� 5 5>8Na seção 6.4 desse livro, apresentamos um exemplo de aplicação contendo umaautenticação baseada em formulários HTML. Essa não é a única forma de fazer aautenticação de usuários de uma aplicação.

Page 112: Jsp servlets j2_ee

O protocolo HTTP incorpora uma funcionalidade que pode auxiliar na implementaçãode um mecanismo de autenticação. Estaremos, nessa seção, mostrando ofuncionamento de um tipo especial de autenticação, a partir do protocolo HTTP,chamada de “Basic Authentication” (autenticação básica).

Para implementar esse tipo de autenticação, precisamos utilizar o código de status deresposta � � ��� � � � ( � ����� � /�-���� /�����/&#)� (�%&# /�! � � � � � ���� � � � � ��� ) e o header de resposta � ����� � $ ����/�%&�,� ' � � / .Ao retornar uma resposta com esse código de status e esse header de respostacontendo um valor � �� � ����� � � �����&(&*�� %�� (�� , onde ����(&*�� %!� (�� deve ser substituído por um nome dodomínio no qual estamos fazendo a autenticação (cada domínio deve proteger umconjunto de recursos de sua aplicação), faremos com que o browser do usuário denossa aplicação mostre uma caixa de diálogo pedindo um usuário e senha de acesso.

O usuário e senha digitados nessa caixa pelo usuário serão enviados, por outro lado,junto com uma nova requisição a nossa aplicação, através do header � $ ����(�- � � � � � (�% . O valordesse header estará codificado no formato Base64, sendo necessário utilizar umdecodificador para ler, efetivamente, seu conteúdo: esse conteúdo será um texto noformato � $�#)$���- � ( ��� 0�� �����.(�� � � # /�% �&� �!� 0�� ��� �&� � .O Servlet a seguir exemplifica o uso desse tipo de autenticação HTTP:

Exemplo de Servlet que utiliza autenticação HTTP para controlar acesso� �� �������� ������� � ��� ���� �� �������� ����� �!� "$#%�&�(' #��)� *!�+�) �� �,�

-.-0/ #����(' #���3�5%# 5��&� ' � M��B�!5��F#!9��&� DQ��G ��� >(?=? I ��!�F�1D���9��&�$�!' �!�O��D�#�" " �E�# 5�",5%;��2� ��"@E�� �� �' � DQ��G���� !5ON�' � D:D�' ��"." / #!�)��' #��!* 5��8#�9��&� D��QD����!>�?B? IL#��Q�8#�9�E�"�>O�+�& / #%�&�(' #�� R

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE�#� �; <(� 9�� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

-.- �NQ�F#!9�E��J�J����' �!�4E�� *�#���E�#%��� * 5%�&*��!� � M����&� ��9� 8��" #�#�"."2#J����' ���1K8����9�5�' ��-.- E�#�K8� 9O� �J��" ��D���E�� <@�7E�#��.#�"2 %��"$�8�7>(? ?BI /�� �'" &.* "@?B> �P�H ����� #�� *�#��QE�#!�-.- � � � � *�5!�)*�#�9��&� DQ�Q�8#�E� 1 ����$�:3�5�#J� N��.�� ".#!� E�� 5�"25%;!�.� �7�� !�$#�" #!9!�&#:�JD���� ���:E�#-.- E�� ;!' �Q<@�7"$�%' � D�� �&��9%E��:� ��F#�#�9�D�*�� �J#�9��8�LE�# ' ��<(� 9J#�" #!9O*��/ �&�2� 9�< ' � *�#���E�#!� * 5��&*/�7 ���.#�3%5%#!")�&� <O#Q�&>@#��QE�#!�@��� * 5��&*%�!�.� M��Q�&� �!9 ��+�� K"�+' � *�#��QE�#!� * 5��)*&���J9�5�' ' �R

���.#�", ��!9%"2#�� " #Q�&>@#��QE�#!� �!� � � � � * 5��&*�#�9��&� DQ� �&#� !�����* / H � P �* C6A3� % ��O�!��� 96� �:E�#$*�5��F#!9��&� DQ��DQ����%� ! !���

���.#�", ��!9%"2#�� " #!9�E����.�$�!�@�+ �� �.#�"2 ���9�".#�� /�� �'"�& * "(? > �P�H � ���.�+��$#Q�.5��.9��

0

-.- �O#�DQ�!E�� K8� DQ��96E��7��DQ��9��F# ��E��JE���*�#��QE�#!� �O ����$�7� " " � 5��.� ' � M����J��" ��D�' �Q"2".#-.- �!����"$# � � � ;%� ��� BE�� "2 ���9 � ��#�'�#�� *��8�& � -F- � *%�!�FE�#��.� " �!56�FD�#�K8�!�)<�#�� 9�#�� - N��Q".# � �(-

Page 113: Jsp servlets j2_ee

-.- ��� / ��# 9%#!D�#�" ".;!�$� ��E�#�".D���9�"2� E�#%�)�!� ��" � ��$� �J#!� �.��" D��!�F��DQ�8#��F#�" E�� *%#���E�#��-.- � #!' #�"4D���9���#!� � / �&�2� 9�< �����Q"Q� D/�!�/ �&�2� 9�<0' � *�#���E!#��,* 5��.*��O#�D��J9�#� / �&�2� 9�<������Q"2# � � � E�#�DQ��E�#��' � *�#���E�#!� * 5��&*�� " 5�N�"F�)�.� 9�<�� � ���!�+�

-.- � ' ��<(� 9&#�".#� ��!�F��E��7E��L"2#�9�*��: �#�' �JD����.�QD��&#!�$#�� � �/ �&�2� 9�< ' � ' ��< � 9/�7' � *�#��QE�#!� * 5��&*��O#�D�� " 5�N�"F�&�.� 9�< � � ��' � *�#��QE!#���* 5��.*��O#�D�� � 9�E�#Q���=K���� � � ���+�/ �&�2� 9�< ' � ".#�9�*��=�J' � *�#��QE!#���* 5��.*��O#�D�� "256N�")�)�.� 9�<��+' � *%#!�QE�#���* 5��&*��O#�D�� � 9�E�#Q��� K!��� � � � ( �8�

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�' � � � ��.� 9!�)' 9�����C��Q<(� 9(��%' � ( ' � ' ��<(� 9/(+�"% �����P��� ��+�' � � � ��.� 9!�)' 9���� / #�9�*�����% � )( ' �B"2#�9�*�� (+� %' ,����P �� ,�+�' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

0

0

Existe também uma maneira de implementar a autenticação de usuários que estãoacessando nossa aplicação baseada em elementos de segurança configurados no“Deployment Descriptor” de nossa aplicação (veja seção 2.2).

Para implementar essa autenticação dessa forma, você deve adicionar elementos# / '.$&- � � � � '�(�%&# ��-���� % � e um elemento � ("0�� % � '�(�%�� � 0 ao “Deployment Descriptor” de sua aplicação.

Exemplo de configuração de segurança no “Deployment Descriptor” daaplicação�Q".#�D�5O�.� � $���D��!96"F�)�F��� 9����

� #�N(�8�$#�".��5��$DQ# � D���' ' #�DQ�&� �!9���@ #�N�&�)#!" �!56�.DQ#(�F9����J#�'* �F#��7P�#�"F�)�$� �&��� - #!N(���.#�"2��5��)D�#!�F9���� #��Q5��$' �� �� �8�8#��.9�� -./ #!�)�6' #���* 5%�8#!9%�&� DQ��D��Q��>�?=? I�� - 5��.' �8 ����+�&#!� 9��

� - #!N(���.#�".��5��FD�#!��D���' ' #�DQ�&� �!9��� ��5��&*)� D���9�"F�.�F�!� 9������Q�)�%' #!�F9����J#��$�8�!� DQ� � � - �$�!' #!�F96���J#��� - ��5��&*(�+D���9�".�&�$��� 9!� �

� - "2#�D�5O�.� � $)�8D��!96"F�)�)�!� 9!�����' ��< � 9(�+D��!9%K � <��

� ��5��&*)���J#��&*���E�����* / H � � - ��5%�&*(���J#��&*%��E���Q�$#���' � �+96���J#��� �!��� 9�� �:E�#$*�5��8#�9��&� DQ��DQ���� - �F#���' � ��9����J#��

� - ' �Q<=� 9(� D��!9%K8� <.�Os elementos apresentados na listagem anterior, por exemplo, definem que os acessosa URL � � � ��-�(�# /�- ��� /���#���� /"-�� � /���� $ � /"% � � ',�&',��( � ��� � devem ser autenticados. Em particular, o elemento - (� /��% ��* / define o grupo de usuários que deve ter acesso a URL em questão: os diversosgrupos, com seus respectivos usuários / senhas, devem, nesse caso, ser configurados noarquivo '�(�%�� � � (&* '.��� � $ #)/"- # ! �"* � abaixo do diretório de instalação do Apache Tomcat.

Se você optar por utilizar esse método de autenticação, você deve chamar em seucódigo os métodos 0 /���� /&* (&��/ � # /�- ��� e 0�/�� � # /�-�� - � %"'*� �&� � ��� , da classe � ����� ��/"-���� /.� ��/ �&$ /&# � , para obter onome do usuário e seu grupo.

Mais detalhes com relação a autenticação baseada em elementos de segurança do“Deployment Descriptor” da aplicação podem ser encontrados na especificação deServlets.

Page 114: Jsp servlets j2_ee

�,��1 8�� � �"+ ,) #�� - ) � (*),+ $ 2*$ + ) ,) $��� +Uma das grandes vantagens no desenvolvimento de aplicações Web com Servlets epáginas JSP é a performance obtida em função da persistência dos objetos carregadosem memória. Em particular, conforme mostramos em diversos exemplos ao longo desselivro, o estado de uma variável estática pode ser mantido ao longo das diversasrequisições recebidas pela aplicação.

Um dos recursos que mais se beneficiam dessa persistência em memória são asconexões com o banco de dados: como o processo de abrir uma nova conexão como banco de dados pode pesar significativamente na performance da aplicação, vale apena manter as conexões abertas, em vez de abrir uma nova conexão a cadarequisição recebida.

Esse tipo de persistência é, normalmente, implementado por meio de um gerenciadorde conexões a base de dados: a cada requisição recebida, um Servlet chama ummétodo desse gerenciador para alocar uma conexão; ao término de seuprocessamento, o Servlet chama outro método para liberar a conexão previamentealocada. O gerenciador, por sua vez, é responsável por estabelecer efetivamentenovas conexões quando necessário, e armazenar essas conexões abertas.

A classe ��(.(!� �(�% ��� , a seguir, implementa um gerenciador de conexões a base de dados:

Classe “PoolConBD”: implementa gerenciador de pool de conexõescom a base de dados ���D����Q<�#JD������ ' � ���F��".#����(' #Q�F"2�

� �� �������� ������� � ��� ���� �� �������� ������� " 3�' � �,�� �� �������� ������� 5!�)� ' � �,�� �� �������� ������� 5!�)� ' � �O� �F#!�

-.- �B#��F#!96D�� �QE��!� E6#7D��%9%#�� �%#�"4��� N���9�D��7E6#7E���E���"-.- A4��9���#!� 56� %�!��'�E�#�DQ��9�#�� ��#�"4�Q�&� ����" D��!��� N���9�D��JE�#JE!��E��!"4E�#��J��9�#�� �F�:3�5�#�9 ���-.- " #�� �796#�D�#!"$"2;�� � �J"2#J#�".�8��N�#%' #�D�#%�45��J�:9������:D��!96#Q� ���J�7D���E�� �$#�3�5�� "2� G ��� �F#�D�#%N�� E�� !5ON�' � D:D�' ��".":I����!' � �!9����R

-.- I�����'�E6#7D��%9%#�� �%#�"4E�# 56������ �' � DQ��G ���J#�"Q �#�D � K&� D��-.- * " "2� �/��D���E��J�! �' � DQ��G����&� #%NJ ���E�# �J��9%�8#!�45�� D���9�� 5�9��8�:E�� ".�&� 9��&�LE�#7D���9�#�� �%#�"-.- �+D��Q"2�JD���9��.�F;!�.� �����&��E���"4��" �� �' � D��QG ��#�"43%56#�K8���$#!� #���#�D!5!�&�QE���"4#!� 5��J�:� #�"2�J�-.- � 9�"F� ��9%D!� �LE��7�J;Q3�5�� 96� �@� �&�&5���'��F#�� ���J3�5�#JD����� ������)� ' *���� � �J#�"2� �7I����!' �+� �� � ��� �8#�"F�F�Q�&� D:D�' �Q" "0I%����' � ��9�����* �' � DR

��.� ��� �&# / �&�2� 9�< �&�.*� �' � D �J9�5�' ' � -$- & �!� #:E��:�� !' � DQ��G �%� ��.� ��� �&# � #�DQ�F�!���$� I�����' �79�56' ' � -.- I����!'6E�#�D���9�#�� ��#�" E�#�"2"$�:�! �' � D��QG ���

-.- "=�.' ��5%",5���� � �J#�".#�9�*��: ����F�:��N��.� �49������Q"�DQ��9�#�� �%#�" ��.� ��� �&# / �&�2� 9�< �&�'" �.' �J9�5�' ' ���$�'" "25%���.� �/�7965�' ' ���&� / #!96*��=�79�56' ' �

Page 115: Jsp servlets j2_ee

-.- ? ���J��9�*6�:��; ��� �J�JE�#!"$"2#� �����' ��E�#�"." ��K8�!� �J�:#���� �8��� ��" 3�5%#�6D���"$� *��!� �-.- 5�� #!� �F� 9��J�� �' � D��QG ������9%�Q���Q"�DQ��9�#�� �%#�"0"$#%� ������N�#��F�8��"0� 96E�#QK&� 9�� E����J#!9!�8#-.- � ��#JE�#��.�.5ON���� ��" #!�)�6� E��!� E�# N���9�DQ��E�#JE��QE���",� ��.� ��� �&#�� 9%���$� ? ����A4� ��I����!' � �B�

-.- ?B� �J#!��5�� ����$�:��#�"F�&��N�#�' #�D!� �J#!9��8�JE�# 9��Q�O�Q"0DQ��9�#�� �%#�" ��.� ��� �&#�� 9%���$� ?B� �J#���5��5� �B�

��.� ��� �&#/�=�.� ��#!�4�&� �@� � ��#���;%E�N�D&�79�56' ' � -.- � �.� �O#!��� E�N�D ��.� ��� �&#�� 9%���$�'&B5�� � �!9%"�* ' ��DQ��E��Q"=� � � -$- & ���J#��F�:D��%� �F#�9��8#JE�#�DQ��9�#�� �%#�"0��' ��D��QE��Q"

-.- H 9�� D!� �!' � M��:#�"F�)�$5��&5��)��"0' ��DQ�!� "���D���E���"$�&�.�LE��.� ��#!��� E�N�D:#-.- ��N��F#J� ��2� � #!� �$��D���9�#�� ���7D��%� ��N���"$#7E�#�E��QE���" �5�N�' � D I����!' � �!9 ����* �' � D�� / �)�.� 9�< ��=�� !' � D�� / �)�.� 9�< ��=E�� � ��#���;%E�N�D�� / �)�.� 9�< � 9��!�J#����.�

/ �&�2� 9�< �� 5O�.' � / �.�.� 9�< �� 5�"Q5����.� ��� / �)�.� 9�< �� " #!9�*6����� 9��� ��=�8���7A4� ��I�����' ��� 9�� ��@�.� �J#���5�� � �&*��$�� "0I�����' � �!9����.����DQ#� ��&� �!9

R� K!�+ ��=�! �' � D=9 �:9O5�' ' �BR

� K"�,�+ ��=E��.� �O#!��;%E�N�D 9 �79�56' ' � ��� �+ �� 9%�!�J#��� 9 �J9�5�' ' � ��� �+ �� 5��$' 9 �79�56' ' � ����� �� 56"25����$� �&9 �L9�5�' ' � ��� �8 �� ".#�9�*�� 9 �7965�' ' � � � �+ �� �&���JA � ��I����!'�� � �� � �+ ��@�&� ��#��!5�� � � ���BR

�&�.* �' � D �J ��B�� �' � D���&� I�����' �J9�#� � #�D �&���3�,�+�

�&�'"=�$'��7 � 5��2' ��&�'"@" 5����.� �/�J �� 5�"Q5����.� ����&� / #�9�*�� �J �� ".#�9�*6����&� ? ����A4� ��IQ���!'��7 ��@�F����A4� ��I�����' ��&� ?B� �J#���5�� �7 ��@�.� �J#��!5��&�

-.- � ��� �F#�<���9�E�� - D��QE��Q".�.�F��96E!�J��E��.� ��#%� ;6E�N�D�)� $ R

��� ���+� �Q#2� ;�E2N D � � ���+� �Q#2�,� � ' �."+"&� K �Q� &��.�4# � ���EQ�+� ��#2� ;,E,N$D � � 9 #� H 9." � �)9 DF# � � �� �.� �%#��.A4��9�� <O#%�$� �F#�<(� "F�&#�� �@�.� ��#!�@�+�$� �@�.� ��#!��;%E�N�D��+�

0 DQ�Q�FD�* ���!��D�#! ��.� �!9� �=# � R�.*��F�� 9�#� I����!' � �!9����.���QD�#� Q�.� ��9��+ ��=�� �' � D����F9 ���LK8���� ���"2" � ��#�'

D����.�.#�<(��� - DQ��E!��"F�)�$��� EO�.� �%#���� E�N�D� ��+�0

-.- H 9�� D!� ��' � M���9�E��7 ����!'ODQ��� 5��J��D��!96#Q� ����)� $ R

� � I����!' � �QE�E���' #��J#!9!���+��' ��DQ�!& �Q�O� � �!96#Q�Q���/���!�+�� �'& 5�� � �!9�"�* ' �!DQ�QE6�Q"3� �

0 DQ�Q�FD�* ���!��D�#! ��.� �!9� �=# � RE�#�".�.�F�!� I�����' ���+��.*��F�� 9�#� I����!' � �!9����.���QD�#� Q�.� ��9��+ ��=�� �' � D����F9 ���LK8���� ���"2" � ��#�'

D!� � ��� �� ��.� �J#�� �F�:D���9�#����%�!� � (� �� #�� <@#Q�&A4#�".".� <@# �!�����0

0#�' " #:�.*��F�� 9�#� I�����' � ��9����.���QD�#� ��)� ��9��+ ��=�! �' � D��

�& ��������J#Q�.�F��" E�#�D��2� �QG ����E�� ��!��'�� 9���;�' � E���" ,�+�

Page 116: Jsp servlets j2_ee

00

-.- * ' ��D���5��J�:9�������D���9�#��Q���JD��!� � N��Q" #JE�#7E6�QE!��"-.- ��� / ��#�"." # �&#Q�F��E��� ��F#�D�� ".�7"$#%����" $�9�D�*O�F�!9O� M�#�E� ��!�)�:#��(� �F���-.- ��.��N�' #��J�Q" E�#�DQ��9�D����.� � 9�D�� �79%�7��D�#�"." �7��� I�����' ��.� ��� �&#J" $�96D�*��$�!9�� M�#!E � ��9�96#�DQ�&� ��9J�!' ��DQ�&=����� � ��9�#����Q� �!���.*��F�� "=I�����' � ��9����.����DQ#� ��&� ��9�R

� �!9�96#�D��&� ��9�' �BD���9>�J9�5�' ' ��.� $ R

' �=D���9>�&�=�.� ��#!� A4��9�� <�#��.� <O#�� � ��9�9%#�DQ�&� ��9�� �$�'" �.' �6�&�'"@" 5����.� ����$� / #�9�*���+�0 D��Q�FD�* ���!��D�#! ��.� �!9� � #� R

�)*6�F�� 9�#� I����!' � ��9����.���QD�#! ��.� �!9��+�$�.* �' � D����&9 ���:K8���O ���" "�� ��#!'6�!N��2� � 9������D��!96#Q� ����� � (+�1� �)��M ���JK+����% � )( � #!� <�#��&A4#�"." � <�#/��� (+� %' , !�8�

0�$#Q�.5��.9�' � DQ��9��

0

-.- P�#Q�F�!�.96����" # ���" "�� ��#!' ��5��J��D��%9%#�� ���JD�������N��Q"2#JE�#�E��QE���"-.- � �!5 E%� �F#��8��� #!9��8#JE�� �����'���5 5�� � 9%�����JDQ��9�#����%��-.- ��� / ��#�"." # �&#Q�F��E��� ��F#�D�� ".�7"$#%����" $�9�D�*O�F�!9O� M�#�E� ��!�)�:#��(� �F���-.- ��.��N�' #��J�Q" E�#�DQ��9�D����.� � 9�D�� �79%�7��D�#�"." �7��� I�����' �5�N�' � D:"#$(96D�*��$�!9�� M�#�E � �!9�96#�D��&� ��9J�!' �!DQ� � ��9�#��,��� ��� �&*��$�� " I�����' � ��9����.����DQ#! !�&� ��9R

� �!9�96#�D��&� ��9�' �BD���9>�J9�5�' ' �� K!�+�$� I�����' 9 �7965�' ' �R

� K"�+� � I����!' � "2� M�#/�!��� � �R

-.-:/ #�� ����%'6E�#�DQ��9�#�� �%#�":9 ����#�".�&� ��#��1���,M%� ���O ���E�#!�J��"-.- �F#��)� �)�!� E6#!' # 5�� �0D��!96#Q� ��� ��$#Q�(� ���J#!9��8#J#�"F�&��N�#�' #�D!� E��' �=D��!9+� � � �%969�#�D��&� ��9��B�$� I�����' � K8� �$"F����' #!�J#�9�� ���8��&� I�����' � �$#!�J����# �6' #!�J#�9���*��� � �+�

�)� $ R� K5�+' �=D���9�� � " � ' ��".#�E>���!�B' �=D��!9+�7965�' ' �

0 DQ�Q�FD�* ������D�#� Q�.� ��9 �� #��R ' �BD��!9+�7965�' ' � 0

� K!�8' � DQ��9/���J9�5�' ' �B' �=D���9>�L�!' ��DQ� � �!96#Q�Q���/���8�0#�' " # � K5�+�$�'&B5�� � ��9�"�* ' ��DQ��E!�Q"=�J�$� ? �,��A4� ��I����!' �R

-.- � � �6D���".��D���9��&�$;�� � ��6" #���� 9%E!�J9 ���J�&� �%#��.�J��" ���&� 9!<(� E��J�J�8�!�J��9�*��-.- �J; �!� �J�:E�� ����!' �O ���E!#��J��" #�"$�8�!N�#�' #�DQ#�� 56�J�79��Q�O�:D���9�#�� ���' �=D��!9+�:��' ��DQ�!& ����� � �!96#Q���Q�/�!�+�

0#�' " #:�.*��F�� 9�#� I�����' � ��9����.���QD�#� ��)� ��9��+�$�.* �' � D�����9��6�J#!�$�7�J;Q��� �J�

E�#JD���9�#�� ��#�" ���&� 9�<(� E������+�0

� K!�+' � DQ�!9+9 �J9�5�' ' �B�&�'&B5�� � ��9�"�* ' ��DQ��E��Q"=(�(��

Page 117: Jsp servlets j2_ee

�$#Q�.5��.9�' � DQ��9��0

-.- C�� N�#��F�756�J�:DQ��9�#����%� ��)#���� ���J#!9!�8#:�!' ��D��QE�� ���F#��8�%�$9��:#�"." �:D���9�#�� ���� ����.�L� �����' �-.- ��� / ��#�"." # �&#Q�F��E��� ��F#�D�� ".�7"$#%����" $�9�D�*O�F�!9O� M�#�E� ��!�)�:#��(� �F���0 ��$�!N�' #!�J�Q" E�#-.- DQ��9�D����.� � 9�D�� �79%�7��D�#�"." �7��� I�����' �5�N�' � D " $696D�*��$�!9�� M�#�E:����� E ' � N%#!�F� � �!9%#��Q����� � ��9�9�#�D �&� �!9� ��=D��!9 � R

� K"�+� � I����!' 9 �J9�5�' ' �R

�)�,$ R� K!�!9 �� DQ��9�� � " � ' ��" #�E>���,��$� I��!��' � �QE!E��O' #��J#!9����+ ��=D���9��+�

0 DQ���&D�* ������D�#! ��)� �!9 ��B#�R 0�&�'&B5�� � ��96"�* ' ��D��QE��Q" �,: �

00

-.- P�#Q�F�!�.96��� 9 �6�J#!�F�JDQ���2�F#�9��8#�E�#JD���9�#�� ��#�" ��' ��D��QE��Q" �5�N�' � D:"#$(96D�*��$�!9�� M�#�E � 9�� ��N��8#!� &B5�� � ��9�"�* ' ��DQ��E!�Q" �!�R

�$#Q�.5��.9�� �'& 56� � �!9�"�* ' ��DQ��E���"2�0

-.- �O#�"F�)�F���O ��!��'�E6#7D��!96#Q� ��#�" � K+#!D�*���9�E��L�&��E6�Q"0�Q"�D��!96#Q� ��#�"4�!N�#����&�Q"�� �5�N�' � D:"#$(96D�*��$�!9�� M�#�EJ����� E�E�#�"F�.�F��� I�����' ��� �&*��$�� "�I�����' � �!9����.����DQ#� ��&� ��9R

� K!�+�$� I�����' 9 �7965�' ' �R

K8��� �+� 9%� �.� �=�O� �7�$� I����!' � " � M�#/�!�+�O� (�(��R

� �!9O9�#�DQ�&� �!9�' �=D���9>�&� � ��9�9�#�DQ�&� �!9�� �$�I����!' � #�' #��J#!9���*B� �+� �+��)� $ R

� K��+' �BDQ��9/9 �L9�5�' ' �B' �BDQ��9�� D�' ��".#/�!�+�0 DQ�Q�FD�* ������D�#� Q�.� ��9 �� #��R 0

0

�&� I����!' � �.#��J�Q��#�* ' ' �6' #��J#!9��8" �,�+�

�)�,$ R�=�.� ��#!� A4��9�� <�#��.� E�#��F#�<(� "$�8#�� �@�2� ��#%� �+�$� �@�.� �%#�� ;!E�N�D��+�

0 DQ���&D�* ������D�#� ��)� ��9� ��=#��R�)*��F�� 9�#� I��!��' � �!9���.�!�,DQ#� ��)� �!9��+�$�.* �' � D����F9 ���LK8�!�@ ���"2" � ��#�'

E�#�"2D��QE��Q"F�.�F�!� E��.� ��#%�4� E�N�D� ��+�0

00

0

-.- >@��"2*��&��N�' #7D��!� �J�� �#����J#!9��F�:#!9%�&�F# 9����J#�" E��Q"��! �' � DQ��G ��#�" #�" #!56"0�$#�"Q �#�D �)� ����"0 %�!��' " �� � ��� �8#�"F�F�Q�&� D7> ��"2*��F��N�' #��$� I�����' " * �' � DQ" �79%#� >@��"2*��8��N!' # ���+�

Page 118: Jsp servlets j2_ee

-.- � � � ��5���9������ �����'��� ����)�&� � E6��"�".#�<(5�� 9��8#�" E���E���" �O9��!�J#JE��:�� �' � D���G �%��-.- 9����J#:E��JE��.� ��#�� E�#JD���9�#�� ���7��N��Q" #7E�#JE��QE���"'�69����J#:E��7N��Q" #�O5O�.' - 5�" 5�;!�.� � - "2#�9�*%�-.- E�#JD���9�#����%��%�8�!�J��9�*%�7��; ��� �J�:E6� �����'�#J�&� �J#���5��E�#�D���9�#�� ���7��N��Q" #7E6#7E��QE6��"2� �5�N�' � D "$�8�Q�&� D:" $�9�D�*O�F��9�� M�#�EJ����� E�D!�$� ��I%���!' * �' � D�� / �&�.� 9!< �� �� �' � D�� / �&�2� 9�<

��BE%� � ��#���;%E�N�D�� / �)�$� 9�< �� 9��!�J#����.� / �.�2� 9�< �� 5O�.' � / �.�.� 9%< �� 5�"256���.� �� / �&� � 9!< ��B"2#�9�*������ 9��� �� �&����A4� ��I����!' �O� 9!�� ��@�)� �J#���5���� �&*��$�� "0I%����' � �!9����.���QD�#� ��&� ��9�R

� K"�+ ��=�� �' � D 9 �J9�5�' ' �BRI����!' � ��9�����* �' � DJ' � ����!' �&�+I�����' � ��9���� * �' � D���$� I�����' " * !' � D�"2� <@#Q���+ ��=�� �' � D����� K!�+' � �����' 9 �:9�56' ' �B' � ����%' � E�#�"F�)�)�!� I����!' ���+�

' � ����!' �79%#� I����%' � ��9�����* �' � D��+ ��B�� !' � D��� ��=E��.� ��#!� ;%E�N�D��O �� 9����J#���.�� �� 56�.' � �� 5�"Q5����.� ���� ��=" #!9�*����� ��=�8����A4� ��I�����' �� ��@�.� �J#��!5����+�

�$�I����!' " * �' � DQ"2� �5����+ ��=�! �' � D��O' � ����!' �+�0

0

-.- � #�� �7I�����' � �!9����* �' � D�� ��' ��D�� � �!9�#��Q��� �5�N�' � D:"$�8�Q�&� D � ��9�9�#�D �&� �!9J�!' ��D�� � ��9�#����Q�� / �)�$� 9�< ��=�� �' � D�� �&*O�F�� "�I��!��' � �!9����.����DQ#� ��&� �!9R

I��!��' � �!9�����* �' � D7' � ��!��' �&�+I����!' � �!9�����* �' � D���$� I����!' " * �' � DQ"2� <�#�� �+ ��=�� �' � D��8�� K"�+' � ����!' 9 �L9�5�' ' ��F#��&5�� 9�' � �����' � ��' ��DQ� � ��9�#����Q�>���+�#�' " # �$#Q�.5��.9 965�' ' �

0

-.- � #�� �7I�����' � �!9����* �' � D�� �!N��8#�� & 5�� � ��9�" * ' ��D��QE���" �5�N�' � D:"$�8�Q�&� D7� 9��1�%N��8#�� &B5�� � �!9�" * ' ��D��QE���" � / �&� � 9�< �� �� 6' � D��R

I��!��' � �!9�����* �' � D7' � ��!��' �&�+I����!' � �!9�����* �' � D���$� I����!' " * �' � DQ"2� <�#�� �+ ��=�� �' � D��8�

� K"�+' � ����!' 9 �L9�5�' ' ��F#��&5�� 9�' � �����' � �!N��&#�� &=5�� � ��9�"�*�' ��DQ��E!��" �!�+�#�' " # �$#Q�.5��.9 � �

0

-.- � #�� �7I�����' � �!9����* �' � D�� ' � N�#��F� � �!96#Q�Q��� �5�N�' � D:"$�8�Q�&� D��O�%� E ' � N�#!�$� � ��9�#��,���� / �&�2� 9�< �� �� �' � D�� � ��9�9�#�D �&� �!9� � DQ�!9 �R

I��!��' � �!9�����* �' � D7' � ��!��' �&�+I����!' � �!9�����* �' � D���$� I����!' " * �' � DQ"2� <�#�� �+ ��=�� �' � D��8�� K"�+' � ����!' 9 �L9�5�' ' �' � �����' � ' � N�#��F� � �!96#Q���Q��+ �=D��!9��+�

0

-.- � � E�#�I�����' � ��9��.��*� �' � D�� E�#�".�&�F��� I����!' �5�N�' � D "$�8�Q�&� D:" $�9�D�*O�F��9�� M�#�EJ����� E�E�#�".�&�$�!� I�����' � / �&�2� 9%< �� �� �' � D��

�&*O�F�� "0I����!' � �!9��� ���QD�#! ��&� �!9R

I��!��' � �!9�����* �' � D7' � ��!��' �&�+I����!' � �!9�����* �' � D���$� I����!' " * �' � DQ"2� <�#�� �+ ��=�� �' � D��8�

� K5�+' � �����'�9 �:9�56' ' �R

' � ����!' � E�#�".�&�F��� I����!' ���+�

Page 119: Jsp servlets j2_ee

�$�I����!' " * �' � DQ"2� �F#��J�Q��#��+ �� �� �' � D��+�0

00

É interessante observar que a classe anterior permite que sejam configurados / utilizadosnão apenas um único pool de conexões a base de dados, mas sim diversos pools:como são declaradas variáveis estáticas, todas as aplicações Web sendo executadasna mesma instância da máquina virtual Java irão compartilhar esses mesmos objetos.Sendo assim, é necessário prever a alocação e liberação de conexões por aplicação,de forma que o funcionamento de uma aplicação não interfira no funcionamento deoutra.

Esse gerenciador de conexões ao banco de dados utiliza também uma classe do tipo� ��'�/&��� � (�% para indicar falhas em seu funcionamento. Segue a implementação dessaclasse ��(.(� � (�% �� � �"',/&� �,� (�% :Classe “PoolConBDException”: exceções associadas a classe

“PoolConBD” ���D����Q<�#JD������ ' � ���F��".#����(' #Q�F"2� ���D����Q<�#JD������ ' � ���F��".#����(' #Q�F"2�

-.- �%��DQ#�G ���� ����$��<@#%�)#!96D�� ��E���� E�#JD���9�#�� ��#�" ��N���"$#7E�#JE��QE���"3�FI�����' � �!9����. !5ON�' � D:D�' ��".":I����!' � �!9����.�%�,DQ#� ��&� �!9J#�� �&#!9%E�" ����DQ#� ��)� �!9�R

�5�N�' � D7I����!' � ��9����.����DQ#� Q�&� ��9�� / �.�.� 9�< �� � "F<��BR1",56 �#!� �+ � �J"F<��+� 0

�5�N�' � D7I����!' � ��9����.����DQ#� Q�&� ��9�� / �.�.� 9�< ��B�� �' � D� / �)�$� 9�< ���J"F<��BR"25O �#�� ���,��� ( �� �� �' � D (+��� � ( �� �J"F<��+�

00

Finalmente, temos a seguir um Servlet para exemplificar o uso de nosso gerenciador depool de conexões:

Servlet “ServletTestePool”: exemplifica o uso de nosso gerenciado depool de conexões a base de dados ���D����Q<�#JD������ ' � ���F��".#����(' #Q�F"2�� �� �������� ������� � ��� ���� �� �������� ������� " 3�' � �,�

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

� �� ������ D������ ' � ���$��".#�����' #Q�F"2� � �

-.-0/ #����(' #�� ����.� �&#�"$�8#�E�� ��!��'�E6#7D��%9%#�� �%#�"4� N��Q" #JE�#7E6�QE���" !5ON�' � D:D�' ��"." / #!�)��' #�� ? #�"$�8#!I����!'6#�� �&#�9�E�" >(�8�& / #!���(' #���R

-.- H 9�� D�� ��' � M��7 ����!'6E�#JD���9�#�� ��#�"

Page 120: Jsp servlets j2_ee

�5�N�' � D ����� E � 9�� ��� / #%�&�6' #�� � �!9%K8� < ��B"2#��F��' #Q� � �!9%K � <���&*O�F�� " " 9��Q����� ' ��N�' #����QD�#� ��)� ��9�� / #����(' #����%�QD�#! ��.� �!9�R

"25O �#��2� � 9�� ���+ ��=".#�����' #Q� � �!9%K � <��+�

� K5�+ �� ".#����(' #Q� � �!9!K&� < 9 �7965�' ' ��.� $ R

I����!' � �!9 ���@� D�� � ��I�����' * �' � D�����C�� �(�)� / #!���@' #Q�F" �����DQ����� � $�".3�' � � E�N�D�� �@�$� ��#�� ,��&' � �(�)��" #!�)�6' #��8"' ,� ��� E�N�D�� � $O".3�' � -$- � � �=� � � � %�%�� �(- ' � �@�F��" #!���@' #��8" ���8�QE���� 9� !��� % !� � � � � ���

0 D��Q�FD�* ������DQ#� ��)� �!9� ��=#��R�)*6�F�� 9�#� " 9�� ���!� ' ��N�' #���QD�#� ��&� ��9 ���,���.�F�(��9 ���LK8�!�@ ���"2"�� ��#!'6D!� � ��� ����!' � % �

( ��=#�� <O#��&A4#�"."2� <O# ���)(>� %' ! ��+�0

0

�5�N�' � D ����� E7E6���B#Q� �+>6�8�& / #����(' #Q�.P�#�3�5�#�"F�� ���F#�3%5%#�"$����>O�+�. / #��F��' #Q�&P�#�"2 ���9�".#� �� �F#�"2 ���9�".#���&*O�F�� "0H � ����DQ#� ��&� ��9�R

-.- �O#�K � 9�� 9�E��7*�#��QE�#!�)"0��5!�!� ' � �!�F#�" ����F�:#��(� �&���4DQ��D�*�#����J#!9��8�JE�#� �; <(� 9�� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!� � ��D�*6#!� � ��9��)�)�%' !� �89����D���D�*6#�O��5�"F� �8�$#Q����' � E!���8# ��+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�+I6�F� <(�J�� !���896�!��DQ��D�*�#� !�+� �� �$#�"Q ���9�" #!� " #Q�&> #��QE�#�� �!�,���� !� �.#�" ����8A4��9 � �� ;65�' ������ � � � ����� ��� � A0?- !�+� �� �$#�"Q ���9�" #!� " #Q��� � �&#�>O#!�QE�#�� ����C��Q".�,��A���E�� K8� #�E� �� / $�".�8#�� � D�5��2�)#!9��&?B� �J#�A�� ' ' � " ���!�+�

I��2� 9���� �.� �F#!� ' � ���J �� �.#�", ���9�"2#�� <@#Q��� �.� �8#!�����8�' � � � ��.� 9!�)' 9������Q>�? A�C��������������� !�+�

�)� $ R' � � � !�$� 9��&' 9���� *�' ��DQ��96E��:D���9�#�� ���JD��!� � N��Q" #JE�#7E6�QE!��"�� � ������P��� ,�+�� �!9�96#�D��&� ��9�' �BD���9>�JI�����' � ��9 ���=� ��' ��D�� � ��9�#��,������FC�� ���F� / #!�)�6' #��8"' ,�+�

-$- � � �6#��,#�D�5%�8�:3�5�#��.� #!" / � C�D��!��D��!96#Q� ���J�!' ��D��QE��7� � �

' � � � !�$� 9��&' 9����8C�� N�#!�F��9�E6�:D���9�#�� ���7D��%� ��N���"$#7E�#�E��QE���"0� � � ����P �� ,�+�I����!' � ��9����@� ' � N�#!�)� � �!96#Q���Q�����8C�� ���F� / #��F��' #Q�8"� !�O' �BDQ��9��+�

0 D����&D�* ������DQ#� Q�.� ��9� ��=#��R' � � � !�$� 9��&' 9����!��� �F�796�:��' ��DQ��G ��� - ' � N�#��.�QG ���JE�#�DQ��9�#����%�7��N���" #7E�#�E��QE���" 9 ��+�

0

' � � � ��.� 9!�)' 9������ - ���-���.��� - >�?BA�C��� ,� �' � � � K8' 56"2*/���+�

00

Page 121: Jsp servlets j2_ee

���������

��� ������������7@09 �����4� �������:��@ &�$�5����7 (�@� �.! @���=���,$� ; � @ � @��$������ �����

Page 122: Jsp servlets j2_ee

� ����� ����� ���

� � ��� ��� � � � � � � � � � � � � � � � � � �

� � � � � ) + )*- � � � �,! � ) - � � ,) � ��2+ + ! # � ) � � � ! # $'&(*),+O mercado de desenvolvimento de aplicações na década de setenta e oitenta erabaseado em sistemas centralizados executando sobre um único computador. Odesenvolvimento contínuo da tecnologia diminuiu o preço de componentes dehardware. Com a queda no preço de componentes de hardware tornou-se viável aaquisição de computadores, agilizando, principalmente, o processo produtivo deempresas.

As empresas, que adquiriram muitos computadores, começaram a perceber a utilizadeem criar canais de comunicação entre estas máquinas, este foi o desenvolvimentoprático das redes de computadores. As redes deixaram de estar na teoria de livros epartiu para o cotidiano do mercado. A vantagem das redes de computadores estavaligada, principalmente, à possibilidade de acesso compartilhado de recursos tais comoimpressoras e arquivos.

Com o desenvolvimento das redes de computadores diversas empresas começaram aoferecer sistemas operacionais que suportassem tal interconexão em rede.Desenvolveram-se, então, sistemas como o Novell, Windows for Workgroups, Linux quemais tarde foram evoluindo para os sistemas mais utilizados atualmente.

Com o desenvolvimento dos sistemas operacionais de rede, que permitiam ocompartilhamento de recursos, os desenvolvedores se depararam com clientesdesejando softwares capazes de executar em todos seus computadores, atualizandoum mesmo banco de dados. Neste ponto houve o desenvolvimento da tecnologiacliente-servidor, utilizando linguagens tais como Clipper, Visual Basic e Delphi.

Nas implementações da tecnologia cliente-servidor era utilizado um computadorcentral com o banco de dados. Cada um dos computadores que participavam darede tinha instalado um software que acessava remotamente este banco de dados.Esta foi a forma encontrada para que todos pudessem executar o software comdesempenho desejável.

Nos anos noventa, com o desenvolvimento da Internet, um novo mercado foi criado.Este mercado exigiria mais conhecimentos dos desenvolvedores, e especialização atémesmos dos vendedores de tecnologia. Estes sistemas de Internet executavam sobreum determinado computador, que tinha um Web Server (tal como Apache, Microsoft

Page 123: Jsp servlets j2_ee

IIS, etc) e uma banco de dados (PostgreSQL, Oracle, etc). Quando um usuárioacessasse um servidor via um navegador (Netscape, Opera, Microsoft Internet Explorer,etc), este servidor retornaria uma página, esta página conteria conteúdo em HTML, quemais tarde evoluiu para outros formatos.

No início os servidores de páginas na Internet, hospedavam apenas páginas em HTMLcom figuras (gifs, jpegs, etc). Páginas HTML não poderiam gerar dinamicamente dados,tal como obter, inserir e alterar informações em um banco de dados. Neste momentohouve o desenvolvimento de CGIs (Common Gateway Interfaces). Os CGIs erampequenos programas em linguagens como por exemplo C. Estes CGIs eram chamadospelo servidor Web para acessar um banco de dados ou executar qualquer tipo detarefa que deveria ser dinâmica, e não estática, tal como são as páginas HTML.

Servidor Web

CGI

Servidor

�Figura 10.1 � Servidor WEB com CGI.

Os CGIs eram mais difíceis de se desenvolver (nesta época se utilizava linguagem C),então diversos desenvolvedores iniciaram a criação de suportes modulares nossevidores Web para permitir a integração direta com linguagens de desenvolvimento.Os CGIs eram executados como processos à parte do Web Server, o que necessitava aalocação de mais memória e sobrecarregava o sistema, em casos com muito acesso.

Diversas linguagens de script se desenvolveram após os CGIs, tais como PHP, ASP, Perl,Phyton e JSP. A execução de scripts (pequenos programas) criados nestas linguagensera feita como observado na figura 10.1, o que diminuia o consumo de memória doservidor, gerando menos atrasos no tempo de resposta do cliente e minimizando asobrecarga do servidor.

Page 124: Jsp servlets j2_ee

Servidor Web

Script

Servidor

�Figura 10.2 � Suporte a M ódulos.ó

O desenvolvimento nas linguagens de script é o mais comum até hoje para sistemas naInternet. Contudo, desenvolver neste modelo tem diversas limitações tais comoescalabilidade, comunicação entre processos, acesso simultâneo a bancos de dados,transações entre bancos de dados que estão localizados em diferentes computadorese distribuição de carga.

Para solucionar as limitações das linguagens de script diversos trabalhos estavamparalelamente em desenvolvimento. Estes projetos visavam a construção de suportespara a construção de sistemas distribuídos. Os sistemas distribuídos permitem quecomputadores executem computações de forma cooperativa, e além disto oferecemum grau de transparência para o usuário final. Contudo, desenvolver neste tipo dearquitetura distribuída não era uma tarefa simples, aliás, o desenvolver precisava teraltíssima especialização. Para isto empresas tais como a Sun Microsystems se uniram emtorno de um padrão chamado J2EE (Java 2 Enterprise Edition) para o desenvolvimentode aplicações distribuídas, oferecendo aos desenvolvedores uma base sólida e maissimples (não que seja tão simples assim) para desenvolvimento.

� � �&� �,! + � )��.$'+ ��! + � � ! 2�� � � +Antes de aprofundar em qualquer arquitetura de sistema distribuído, deve-se aprendermais sobre sistemas distribuídos. A definição mais simples de sistemas distribuídos é umconjunto de computadores interligados em rede, que executam operaçõescomputacionais de forma cooperativa e transparência para o usuário final. Ter umarede é o primeiro passo para a construção destes sistemas, o próximo passo é criar umsistema que seja modular, onde cada módulo execute em um computador distinto.Estes módulos trocam informações entre si para executar determinada operaçãocomputacional. O termo transparência se refere a criar um nível de abstração entre ousuário e o sistema, desta forma o usuário não sabe que seu sistema executa uma parteem cada computador, simplesmente para ele, o sistema esta sendo executado. Esteusuário “enxerga” o conjunto de computadores interligados em rede para execuçãocooperada de computações tal como um único computador virtual (maioresinformações no livro Distributed Systems, autor Andrew S. Tanembaum).

Page 125: Jsp servlets j2_ee

Computador ServidorComputadorComputador

ComputadorVirtualmente Único

�Figura 10.3 � Computador Virtualmente ÚnicoÚ

Os benefícios de um Sistema Distribuído sobre um sistema que executa em um únicocomputador compreendem a economia, velocidade, desenvolvimento de aplicaçõesnaturalmente distribuídas, confiabilidade, crescimento incremental.

Um caso prático da economia encontra-se em certa situação vivenciada por um dosautores que, na época, desenvolvia sistemas para a Internet. Determinado sistemahavia sido contruído em PHP, uma linguagem de script, para acessar um banco dedados e realizar determinandas operações. Após certo tempo este sistema tornou-seum dos sites mais acessados do país, e o servidor que o executava ficou cada vez maiscarregado. Havia então dois caminhos a se tomar: o primeiro seria comprar umcomputador maior e com mais capacidade, o outro desenvolver a aplicaçãonovamente para executar como uma aplicação distribuída.

Para tratar da questão que envolvia esta aplicação em PHP foram realizados diversosestudos comparando custos e desempenho computacional. Foi observado que serianecessário adquirir uma workstation da Sun Microsystems para atender a aplicação,caso contrário seria necessário desenvolver novamente. Contudo, caso a aplicaçãofosse implementada para funcionar sobre um sistema distribuído seriam necessários trêscomputadores pessoais para executá-la, o que era em torno de 12 vezes mais barato.

Workstation

SistemaCentralizado

PC PC PC

SistemaDistribuído

X

�Figura 10.4 � Economia de Recursos

A velocidade é outra questão de interessante análise. A velocidade de um hardwarechega a limites da própria física, contudo como ultrapassar estes limites impostos pelosmateriais existentes? Utilizar um ambiente distribuído pode colaborar neste sentido, pois

Page 126: Jsp servlets j2_ee

subdividir uma aplicação em módulos, que executem em paralelo, cada um em umcomputador distinto, divide a carga e permite que a aplicação tenha maiordesempenho final. Contudo, subdividir uma aplicação em módulos não é uma tarefatrivial.

Um exemplo de aplicação prática para atingir alta velocidade na execução daaplicação é o site de buscas Google ( ��� ����� �)� � � � ! 0�(.(&0 � /�! '�(&* ). Imagine buscas muitocomplexas, existe um computador único que conseguiria atender a este sistema? Não.Construir um hardware para isto seria viável? Não, pois o custo seria proibitivo. Pararesolver este tipo de problema, os envolvidos criaram uma aplicação que executasobre diversos computadores, particionando as operações de busca e indexação dasinformações.

Google (Sistema Distribuído)

Workstation

Servidor

WorkstationWorkstation

ServidorServidor

...

...

�Figura 10.5 � Google.

Há aplicações que são naturalmente distribuídas, onde módulos precisam executartarefas distintas, contudo em algum momento necessitam trocar mensagens parasincronizar determinadas informações. Este tipo de aplicação é altamente privilegiadapelos sistemas distirbuídos.

A confiabilidade de um sistema pode ser atingida de duas formas: através dareplicação de hardware e da replicação de software. Replicar hardware tem o intuitode não deixar o sistema cair em casos onde um dos componentes físicos venha a terproblemas, este tipo de solução é conhecida como tolerância a falhas. A réplica desoftware tem o intuito de copiar softwares para diferentes computadores, caso um doscomputadores pare, outro poderá reiniciar a aplicação e o sistema continua disponível,este tipo de solução é conhecida como alta disponibilidade.

A alta disponibilidade é algo inerente de um sistema distribuído. Como existem várioscomputadores em uma rede, torna-se muito acessível desenvovler uma aplicaçãoonde sejam criados módulos e réplicas destes módulos possam existir em outroscomputadores. Caso um dos computadores tenha problemas, outro poderá assumir.

Page 127: Jsp servlets j2_ee

Servidor Servidor Servidor

Módulo A Módulo CMódulo B

�Figura 10.6 � Alta Disponibilidade.

O crescimento incremental está relacionado à necessidade do sistema de suportarmaiores cargas. Em um sistema centralizado, quando este torna-se muito carregado(veja o exemplo citado sobre o aspecto econômico de sistema distribuídos) deve-seadquirir um novo hardware para executá-lo, e este com certeza será de maior custo.Contudo, numa aplicação distribuída bem subdividida em módulos, no caso doambiente ficar muito carregado, pode-se adicionar novos computadores ao sistema,redistribuir os módulos entre os computadores de tal forma que atinja maiordesempenho e atenda seus novos requisitos.

Servidor Servidor

Módulo A Módulo CMódulo B

�Figura 10.7 � M ódulos do Sistema Distribuído.ó

Page 128: Jsp servlets j2_ee

Servidor Servidor Servidor

Módulo A Módulo B Módulo C

�Figura 10.8 � M ódulos do Sistema Distribuído Redistribuídos.ó

As desvantagens de um Sistema Distribuído compreendem o desenvolvimento desoftware, sobrecarga no meio de comunicação, segurança.

Para projetar um sistema distribuído o desenvolvedor precisa de conceitos adicionais esempre ter em mente aspectos tais como multithreading, acesso compartilhado arecursos, comunicação em rede de computadores, acesso simultâneo a recursos eoutros conceitos. Isto tona o desenvolvimento de aplicações distribuídas algo complexopara os desenvolvedores mais comuns.

Subdividir os módulos de uma aplicação distribuída não é uma tarefa simples. Para istodeve-se ter em mente a necessidade de criar módulos que tenham poucacomunicação entre si, sobrecarregando o mínimo possível o meio de comunicação.Tendo, por exemplo, cinco objetos, sendo que três deles comunicam-se em demasia,crie um módulo para estes três, caso os outros tenham pouca comunicação, subdivida-os entre os demais computadores.

Page 129: Jsp servlets j2_ee

Sistema Distribuído

Módulo A Módulo B Módulo C

ServidorServidor

�Figura 10.9 � Subdivis ão de Módulos.ã

Observando a figura 10.9 pode-se pensar: caso a aplicação fique muito carregadaposso redistribuir os módulos B e C, conforme a figura 10.10.

Sistema Distribuído

Módulo A Módulo B Módulo C

Servidor Servidor Servidor

�Figura 10.10 � Redistribui ção de Módulos.ç ã

Contudo, se o módulo A tornar seu computador muito carregado como resolver talquestão? Pode-se tentar subdividí-lo, mas se a rede ficar muito sobrecarregada com taldivisão pode ser necessário comprar um computador de alto desempenho somentepara executar este módulo. Os sistemas distribuídos minimizam em cerca de 95% doscasos que envolvem aquisição de hardware, contudo há problemas que se resolvidosde forma distribuída podem tornar a rede sobrecarregada e gerar um piordesempenho final.

Page 130: Jsp servlets j2_ee

����� ��������� ������������������ ��� ������� ��!#"$���%��&��'���(��)*�,+��,&-��� ��� �� �%�����.��*� ���/�0��1�32 �

O principal objetivo de um sistema operacional de rede é o compartilhamento derecursos em uma rede de computadores. Suponha uma rede onde existe apenas umaimpressora, é mais fácil compartilhá-la para todos os usuários do sistema do quecomprar uma impressora para cada computador. Para solucionar este tipo deproblema foram desenvolvidos os sistemas operacionais de rede. São exemplos desistemas operacionais de rede o Linux e Windows 95/98/NT/2000.

Em um sistema operacional de rede, os computadores são “enxergados” pelos usuárioscomo máquinas distintas. Desta forma, para acessar um determinado recurso, deve-sesaber em qual computador ele se localiza. Em um sistema operacional de rede acomunicação entre computadores é realizada através de arquivos compartilhados, istoocorre tanto no acesso a diretório (ou pastas) compartilhadas, quanto no uso daimpressora, que cria uma fila de impressão para recepção de arquivos compartilhados.

Um sistema distribuído oferece ao usuário a imagem de um único recursocomputacional. O usuário final não sabe se parte de sua aplicação executa noscomputadores A, B e C. Além disto, as partes em que sua aplicação foi subdivididacomunicam-se entre si para sincronizar informações e, portanto, executar umaoperação em conjunto.

Suponha uma aplicação que necessita realizar muitos cálculos, enquanto outra parteda aplicação utiliza os resultados destes cálculos. Pode-se subdividir esta aplicação emdois módulos. Cada um deles executando em um computador diferente. O projetistado sistema conhece estes aspectos do sistema, contudo o usuário final acredita que osistema está executando em apenas um computador, pois ele desconhece ofuncionamento do sistema e suas operações.

A comunicação em um sistema distribuído é feita através de mensagens que trafegamsobre a rede. Ao contrário dos sistemas operacionais de rede que podem trafegararquivos completos.

Com as definições anteriores pode-se notar que executar um sistema operacionalcomo Linux ou Windows em uma rede não é ter um sistema distribuído. Ter um sistemadistribuído é construir uma aplicação que seja subdividida em módulos, cada um delesexecutando em um computador distinto e trocando mensagens entre si para sincronizartodas as tarefas que estão sendo executadas.

� � ��1 8 � ! � ) ! � � + � -,+ $,! � + ,)�� �%���,! � )��O��� $'+ � $�� $ � ! + � )�� $'+ ��! + � � !"2�� � �� + - � � )�� # $� � ���41$�

CORBA (Common Object Request Broker Architecture) é um padrão que definido pelaOMG (Object Management Group), organização que reúne cerca de 800 empresasdo mundo todo. Este padrão foi desenvolvido para a construção de aplicaçõesdistribuídas. Por ser um padrão, para aplicá-lo, deve-se ter acesso a um suporte ouferramenta que o implemente. Diversas empresas e interessados desenvolveram suaspróprias versões seguindo o padrão Corba, dentre estas pode-se destacar o Mico( � � ��� � � � � � � ! * � '�(�! (�-�0 ), OmniOrb (), Visibroker (), Jacorb () entre outros.

Page 131: Jsp servlets j2_ee

Segundo o padrão Corba, aplicações para um ambiente distribuído podem estarsendo executadas em diferentes plataformas de hardware e sistemas operacionais.Além disto, podem ter sido construídas em diferentes linguagens de programação taiscomo C, C++, Java ou Delphi.

Uma das vantagens do padrão Corba é ser aberto, isto permitiu que várias empresasimplementassem suas próprias versões, deixando de limitar o desenvolvedor tal comoocorre com soluções proprietárias. E o mais importante, fossem interoperáveis entre si.Isto de fato é o objetivo, contudo fazer duas versões de Corba diferentes interoperaremnão é tão simples quanto parece.

Um desenvolvedor contrói sua aplicação sobre uma versão do Corba, e desta forma,pode distribuir as partes desta aplicação em uma rede. Assim a aplicação irá funcionarcomo um sistema distribuído.

Servidor Servidor Servidor

Middleware CORBA

Aplicação Distribuída

�Figura 10.11 � Corba.

A principal limitante no crescimento do uso de Corba é a complexidade emdesenvolver para esta arquitetura. Há muitas exigências para os desenvolvedores, quenecessitando de produtividade acabaram deixando esta arquitetura.

����� ��� +����

Com o desenvolvimento da plataforma Java, a Sun Microsystems observou um grandehorizonte no desenvolvimento de aplicações em rede de computadores e iniciou odesenvolvimento de um suporte para objetos distribuídos chamado Java/RMI. RMIsignifica Remote Method Invocation, ou seja, a invocação de métodos remotos. Estesuporte simplificou a construção de aplicações distribuídas, contudo funciona apenaspara a linguagem Java, ao contrário de Corba.

Page 132: Jsp servlets j2_ee

Chamada

Retorno

StubCliente

StubServidor

ObjetoCliente

ObjetoServidor

�Figura 10.12 � Java/RMI.

RMI contou com o apoio de diversas empresas, que interessadas na plataforma Java,desenvolveram uma série de IDEs (Integrated Development Environments), aquelasferramentas gráficas que simplificam o desenvolvimento, prontas para implementarusando a nova tecnologia. Isto agregou muito e diversos desenvolvedores voltaram suaatenção para Java.

RMI possibilitava as mesmas funcionalidades que Corba, contudo, com o apoio defabricantes, em pouco tempo surgiram boas ferramentas e aplicações neste suporte.Além disto, a Sun Microsystems criou o suporte Java/IDL para comunicar Java comCorba, isto permitia que desenvolvedores utilizando Corba pudesse até mesmo migrarpara Java e continuar o desenvolvimento em RMI.

�������

Observando o lado promissor da tecnologia Java/RMI a Sun Microsystems desenvolveuum padrão chamado J2EE (Java 2 Enterprise Edition). Com isto, a empresa segmentoua tecnologia Java e começou cada vez mais a se preocupar com o mercado deaplicações distribuídas.

J2EE é uma arquitetura que utiliza a mesma pilha de protocolos de Java/RMI o quepermite comunicação com Corba, e além disto, permite continuidade aosdesenvolvedores Java/RMI. Nesta tecnologia uma série de suportes foram oferecidos.Programar para um ambiente distribuído tornou-se mais simples, pois uma base sólidade componentes haviam sido desenvolvidos para isto.

Diversos fabricantes se interessaram pela arquitetura J2EE, mais ferramentas dedesenvolvimento foram lançadas e o mercado aumentou sua aceitação para estatecnologia. Dentre os fabricantes destaca-se a Oracle, IBM, Sun Microsystems, BeaSystems, etc.

� � &�0��� ��� �������

Observando a conquista do mercado pelo J2EE, a Microsoft não se agüentou e lançasua própria tecnologia para o desenvolvimento de aplicações distribuídas. Estatecnologia é proprietária e não um padrão 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 desteenfoque a arquitetura para sistemas distribuídos é a J2EE. Apesar da grande evoluçãodesta arquitetura, o projeto de aplicações distirbuídas ainda exige conhecimentos

Page 133: Jsp servlets j2_ee

adicionais dos desenvolvedores. Cada vez mais desenvolver torna-se uma tarefa queexige estudos sobre conceitos e novas tecnologias, ao contrário de estudar umalinguagem comum.

O mercado tem optado por tecnologias baseadas em plataformas abertas e isto podeser cada vez mais notado. Empresas como IBM e Oracle voltaram-se muito para estesegmento de mercado, suportando sistemas operacionais livres como o Linux e partindopara a tecnologia Java. Aos poucos as empresas notam que tecnologias fechadas, taiscomo o Microsoft .NET, limitam o cliente, pois há a dependência única e exclusiva daMicrosoft, ao contrário do J2EE que é oferecido por vários fabricantes.

Não se encontrar neste mercado promissor é algo que preocupa muitos projetistas edesenvolvedores. Portanto, conhecer uma tecnologia como J2EE é necessário e abrecaminhos, não só no cotidiano de escrita de código, mas sim nas técnicas e escolhadas melhores arquiteturas e opções para desenvolvimento.

Page 134: Jsp servlets j2_ee

� ����� ����� � �

������� � � �� � � � ��� � � � � � ��� � � ��

� � � ��� ��� )6� 6 � � �

J2EE, ou Java 2 Enterprise Edition, é uma plataforma para desenvolvimento deaplicações distribuídas. Apresenta facilidades para a utilização dos recursoscomputacionais e distribuídos tais como acesso à banco de dados, componentes Web,utilização de mensagens assíncronas, execução de processos transacionais, persistentesou não etc.

Apresenta uma API, especificada pela Sun MicroSystems, que proporciona um padrãopara a implementação dos diversos serviços que oferece, sendo que isto pode ser feitodiferentemente por várias empresas, de formas distintas mas ainda assim oferecendo asmesmas facilidades, por estarem de acordo com as especificações impostas para asua construção.

Para um programador que já tenha tido contato com a linguagem Java e suas APIs naJ2SE (Java 2 Standart Edition), este não terá muitas dificuldades no entendimento e nautilização de J2EE. O que precisa-se é entender os detalhes da arquitetura e onde seencontram cada componente e seus recursos, isto é, se faz necessário se ambientarneste contexto para se fazer o uso correto da plataforma.

� � �)��� ! +� � $ � ��$ � $21 ��� �.$A arquitetura J2EE se apresenta em várias camadas, sendo que cada camada écomposta por componentes e serviços que são providos por um container. A idéia decontainer e componentes pode ser facilmente entendida por meio de um exemplo.

Imagine uma colméia de abelhas, que contém abelhas obviamente, pulpas, zangões,a abelha rainha, o mel real etc. Podemos fazer um paralelo e entender como containera colméia, que fornece recursos para as abelhas sobreviverem. Por sua vez, as abelhasem suas diferentes funções, tais como as operárias e as reprodutoras, podem ser vistascomo os componentes que sobrevivem dentro do container, isto é, a colméia.Podemos ainda expandir esse exemplo em um apiário, imaginando que cada colméiaseja um container e todas as colméias juntas, ou seja, o apiário, represente o servidorJ2EE.

Outro exemplo um pouco mais técnico, é o uso de páginas HTML em um Web Browserem uma simples navegação em um site qualquer. Podemos entender como container,

Page 135: Jsp servlets j2_ee

o próprio navegador que fornece recursos e facilidades para o componente, nestecaso as páginas HTML. O componente por sua vez, pode oferecer diversos serviços aousuário, através do suporte do container, tais como facilidades visuais como botões,hiperlinks, figuras e tabelas, e o próprio serviço de navegação.

Em um servidor J2EE, podemos ter diversos containers interagindo entre si.

Veremos a seguir uma breve explicação de cada camada da arquitetura e de seuscomponentes.

�3 Camada cliente: acesso por meio de interfaces stand-alone (aplicações Java),páginas HTML ou Applets. Nesta camada os componentes residem em um AppletContainer, em um HTML container (Web browser) ou em um Application ClientContainer. O Applet container, fornece recursos para um componente Appletexecutar e se tornar funcional para o usuário. O Web Browser apresenta recursos efuncionalidades para o uso de páginas HTML e por fim o Application Client containerfornece recursos para a execução das classe stand-alone utilizadas pelos usuáriospara interagirem no sistema.

�3 Camada Web: esta camada é implementada por JSPs e Servlets, que fornecem alógica para a camada cliente ( ou de apresentação ) do negócio. JSPs e Servletsresidem no Web Container. JSPs oferecem a facilidade de utilizar algumas lógicas deapresentação em uma página web sem muitas dificuldades tecnológicas. O Servletapresenta-se como um controlador das ações executadas pelos usuários naspáginas de apresentação, e fornece recursos para obtêr dados dessas ações erealizar as operações desejadas. Os componentes Web residem no Web Containerque pode ser um servidor TomCat ou outro similar.

�3 Camada de Negócios: esta camada trata da lógica de negócio da aplicação. Énela que implementa-se todas as regras de negócio, alocação de recursos,persistëncia de dados, validação de dados, gerencia de transações e segurança,providos por componentes conhecidos por EJBs. Este por sua vez residem no EJBContainer.

�3 Camada EIS - Enterprise Information System, ou Sistema de informações empresariais:nesta camada é que se encontram os sistemas de banco de dados, sistemaslegados, integração com outros sistemas não J2EE etc.

Page 136: Jsp servlets j2_ee

�Figura 11.1 � Camadas, seus respectivos componentes e containers e a intera çãoç ãentre eles.

� � ��1 �"- + � $*��$ - � � 6 ��� ��� � �

Para obter o kit de desenvolvimento para J2EE, acesse o site da Sun MicroSystems emJ2EE - � � ���&! #,$ %�! ',(&* � � � /./ e faça o download do J2SDKEE e de suas documentações. A suainstalação segue praticamente o mesmo esquema da versão J2SE. Por fim se faznecessário a criação da variável de ambiente �

���� � ��� � � . Inclua também o diretório

����� � � � � � � � � % na variável de ambiente PATH. Para acessar a biblioteca J2EE, aponte o

classpath da sua aplicação para o diretório ����� � � � � �)�*� � � � � � /&/�! � �"- . Os pacotes desta API tem

o prefico javax e nele podem ser encontrados todos os recursos disponíveis para aespecificação J2EE.

Utilizaremos para a execução dos nossos exemplos, o servidor de aplicações da SunMicroSystems, que também faz parte do kit J2EE e pode ser acessado no diretório

����� � � � � � � � � %�� � � /�/�! � ��� . Um outro aplicativo muito útil a ser utilizado para realizar a instalação

dos componentes no servidor será o deploytool, também disponível no kit e acessadono mesmo diretório.

� � � � � �0� )�+��� � - � ) � � � ! + ) 6�$ �,$ �*)'$ -+B

Enterprise JavaBeans são objetos distribuídos que apresentam uma estrutura bemdefinida, isto é, implementam interfaces específicas e que rodam no lado do servidor.Também são conhecidos como EJBs (Enterprise JavaBeans) e serão tratados dessaforma neste livro.

São nada mais do que simples objetos que devem seguir algumas regras. Estas regrasforam definidas pela Sun MicroSystems através da especificação de EJBs na arquiteturaJ2EE.

Container EJB

EJB

Container Web

JSP Servlet

Servidor J2EE

EIS

Cliente

Applet Container

Applet

App-Client Container

Stand Alone

HTML Container

Página Html

Page 137: Jsp servlets j2_ee

Apresentam métodos para a lógica de negócio e métodos que tratam da criação(instanciação), remoção, atualização do EJB entre outros, dentro do ambiente aondesobrevive. (Isto será abordado durante o livro no tema ciclo de vida do EJB).

Conforme definido pela Sun MicroSystems – “Enterprise JavaBean é uma arquiteturapara computação distribuída baseada em componentes ...”

Devemos entender que EJBs, não são simples classes Java, mas sim componentesdistribuídos que fornecem serviços e persistência de dados, além de processamentoassíncrono e que podem ser invocados remotamente.

� � ��� 8 $�� $ ��� ) + )�� �') � ) � � � �0�,) ��� ! �"! � 2 � � +B

EJBs são normalmente utilizados para executarem a lógica de negócio do lado doservidor de forma distribuída. Podemos ter EJBs sobrevivendo em ambientes distintos, emmáquinas diferentes, em locais geograficamente diversos e ainda assim utilizando deserviços eficientes.

Utilizando EJBs, sua aplicação irá se beneficiar de serviços como transações, segurança,tolerância a falhas, clustering, distribuição, controle de sessão entre outros. Estes serviçossão fornecidos pelo ambiente que o EJB sobrevive, o container EJB, que será visto emmais detalhes nos capítulos seguintes.

EJBs residem em um mundo chamado container. Este local conhece muito bem ainterface implementada pelos EJBs e sendo assim, consegue tratar cada tipo de EJBdiferente um do outro e de forma correta.

Veremos mais adiante que o cliente que deseja utilizar um EJB, não acessa-odiretamente, mas sim utiliza-o através do container, que encaminha as chamadas demétodo ao EJB e retorna a chamada ao cliente quando for necessário.

Vejamos a seguir como isto é feito pelo container, implementando um exemplo deacesso remoto a um serviço, utilizando a API de Sockets e o recurso de serializaçãode objetos.

�Figura 11.2 � Exemplo de servi ço e troca de objetos utilizando Sockets eçSerializa ção.ç ã

Stub

Objeto

Skeleton Cliente

Servidor

RMI

RMI

Page 138: Jsp servlets j2_ee

� � � � �����.� � - )*-� )+ �)6 �Os tipos de Enterprise JavaBeans especificados até a edição deste livro são:

�3 Session Bean : Stateless e Stateful

�3 Entity Bean : Bean-Managed Persistence e Container-Managed Persistence

�3 Message-Driven Bean

Um EJB Session Bean provê serviços, isto é, define métodos de negócio que podem seracessados remotamente e que disponibilizam operações relevantes à aplicação. O tipoSession Bean Stateless não apresenta um estado como o próprio nome já diz, e forneceserviços para clientes locais e remotos. O EJB Session Bean Stateful, também forneceserviços localmente ou remotamente, mas apresenta uma relação forte com umcliente, isto é, mantém o estado que um cliente define, assim este cliente podeconfigurar e recuperar dados deste EJB.

Os EJBs Entity Beans representam entidades, objetos que são persistidos. Podemapresentar a manipulação e persistência do objeto de duas formas: BMP ou CMP. Notipo BMP (Bean-Managed-Persistence), o código de persistência e manipulação doobjeto deve ser fornecido pelo Bean, isto é, deve ser programado. Já o tipo CMP(Container-Bean-Managed) é provido pelo próprio container, não tendo a necessidadede escrever linhas de código para estas operações.

Message-Driven-Bean são EJBs que fornecem serviços assíncronos e podem sercomparados a Session Beans Stateless, que também fornecem serviços aos clienteslocais e remotos, mas de forma assíncrona. Um EJB do tipo Message-Driven-Bean secomporta como um listener que aguarda o recebimento de mensagens através de umMOM (Middleware Oriented Message).

Detalhes de cada tipo de EJB serão 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.

Além de implementar uma interface definida pela API, devemos criar duas interfacesque serão utilizadas pelos clientes para acessarem os EJBs. Estas interfaces sãoconhecidas como ��(&'.� � e �&/&* (�� / e devem ser definidas para os EJBs do tipo ��/�# # � (�% �"/"� %(Stateless e Stateful) e Entity Bean (BMP e CMP).

Para EJBs do tipo ��/.# #,��0�/ � � - � �./�%��"/"� % não precisamos definir nenhuma interface e conformeveremos em um próximo capítulo.

Não se preocupe com detalhes destas classes e interfaces neste momento, pois logoadiante detalharemos cada uma delas, nos tipos específicos de EJB.

� � � � � # ) +�+ ��� �*# $*� )�� �0� � )�� � � �O acesso remoto é utilizado quando o EJB e o cliente estão em máquinas diferentes. Seo cliente e o Enterprise JavaBean estiverem na mesma máquina o acesso remoto serárealizado igualmente. Acessamos um Enterprise JavaBean na mesma máquina ou emoutra máquina da mesma forma (transparência).

Page 139: Jsp servlets j2_ee

Para criarmos um Enterprise JavaBean com acesso remoto, devemos implementar ainterface Remote e a interface � (&* / . A interface ��/"* (&� / define os métodos de negócioespecíficos do EJB e a interface �"( * / define os métodos do ciclo de vida do EJB. Para osEntity Beans a interface � ("* / também define os métodos de busca (create e finders).

javax.ejb.EJBHome

getEJBMetaData()getHomeHandle()remove()remove()

<<Interface>>

java.rmi.Remote

�Figura 11.3 � Diagrama de Classes UML da Interface Home.

java.rmi.Remotejavax.ejb.EJBObject

getEJBHome()getHandle()getPrimaryKey()is Ident ical()remove()

<<Interface>>

�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 não étransparente, dessa forma devemos especificar que o acesso é local. O acesso localpode ser usado em vez do remoto para melhora no desempenho do negócio, masdeve-se fazer isto com cautela, pois um EJB definido como acesso local não pode serexecutado em container em forma de cluster, isto é, não pode ser acessadoremotamente de forma alguma.

Para criarmos um Enterprise JavaBean com acesso local, devemos implementar ainterface Local e a interface ��("'.� � � ("* / . A interface ��(&' ��� define os métodos de negócioespecíficos do EJB (assim como a interface Remote) e a interface ��("',�!� �"(&* / define osmétodos do ciclo de vida do EJB (assim como a interface � (&* / ). Para os Entity Beans ainterface ��(&'.� � � (&* / também define os métodos de busca (finders).

javax.ejb.EJBLocalHomeremove()

<<Interface>>

Figura 11.5 - Diagrama de Classes UML da Interface LocalHome

Page 140: Jsp servlets j2_ee

javax.ejb.EJBLocalObject

getEJBLocalHome()getPrimaryKey()remove()isIdent ical()

<<Interface>>

Figura 11.6 - Diagrama de Classes UML da Interface Local

Para um EJB do tipo � /&# #)�.0 / � �- � �,/�% ��/&�"% , não precisamos implementar nenhuma dessasinterfaces porque, como veremos no íCapí tulo 5 – Message-Driven Beans, este tipo deEnterprise JavaBean apresenta um comportamento diferente de um Session Bean e umEntity Bean, proporcionando processamento assíncrono. O que precisamos fazer éimplementar uma interface de Listener que será associado ao MOM.

javax.jms.MessageListeneronMessage()

<<Interface>>

�Figura 11.7 � Diagrama de Classes UML da Interface Listener.

� � �����)6 � � 2 � ) # � )��)6 � ��� )Como podemos observar ao longo dos tópicos explicados até este ponto, vimos que oscomponentes EJB não são acessados diretamente, isto é, não acessamos a instânciado Bean diretamente, mas fazemos o acesso aos serviços disponíveis por eles através deinterfaces que são disponibilizadas para acesso remoto ou local.

Outro detalhe que pode ser observado, que apesar de utilizarmos as interfaces de umcomponente EJB para acessar seu métodos, vimos que a implementação dos seusserviços oferecidos, isto é, o Bean não implementa as interfaces oferecidas por ele.Bem, conhecendo a definição de interfaces e herança devemos nos perguntar:

Por que o Bean não implementa as interfaces locais e remotas? E não implementandoestas interfaces, como é possível acessar os métodos contidos no Bean?

Esta pergunta pode ser respondida simplesmente pela explicação de como o containerse comporta com os componentes EJB. Cada fabricante de servidores de aplicaçãoprovê a implementação para as interfaces remote e home definidas para ocomponente e que são respectivamente as classes � � � � � � /&'�� e � ��� � ("* / .A classe � ��� � � ��/ '�� implementa a interface remote para os acessos remotos e locais eencapsula (wraps) a instância do EJB que foi solicitada pelo cliente. O � � � � � ��/&',� é criadobaseado nas informações 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 métodos da interface home para os acessos remotos e locaise ajuda o container a gerenciar o ciclo de vida do Bean, tais como sua criação,remoção etc.

Quando um cliente solicita uma instância de um EJB através da interface home pelométodo ' -�/&����/ ��� , a classe � ��� � ("* / cria uma instância da classe � � � � � ��/&',� que faz referência à

Page 141: Jsp servlets j2_ee

instância do EJB solicitado. A instância do EJB é associada com a classe � � � � � ��/&',� e ométodo /,� � � - / ��� / ��� implementado no Bean é chamado. Depois que a instância é criada,a classe � ��� � (&* / retorna uma referência para a interface - /"* (.��/ (o stub) da classe � ��� � � � /"'��para o cliente.

Com a referência da interface remota, o cliente pode executar os métodos de negóciodo Bean. Estas chamadas são enviadas do stub para a classe � ��� � � � /"')� que repassa aschamadas para os métodos corretos na instância do Bean. No caso de retorno devalores nos métodos, o mesmo faz o caminho de volta pelo mesmo caminho utilizadona chamada do método, retornando os valores para o cliente.

�Figura 11.8 � Cliente acessando o servidor EJB, com as classe EJB Home e EJBObject (encapsulando o EJB).

� � � � � ��� � ��# � -+ � �%�! ���*) �*) #1� � $�� )�$ # ) + + $�� � + #�� � � � - ) - � ),+Construir um EJB pode parecer difícil, mas apesar de ser uma tarefa demorada, nãoapresenta uma complexidade muito elevada. Esta demora pode ser diminuídautilizando de ferramentas que propiciam a sua criação de uma forma automatizada.

Primeiro se faz necessário identificar qual tipo de EJB, ou quais tipos de EJB serãonecessários para uma determinada aplicação. Definido os EJBs que farão parte daaplicação, deve-se definir os métodos de negócio de cada um deles, ou seja, definir ocomportamento de cada um. Após isso, começamos o desenvolvimento do EJB.

Com os EJBs definidos, e assim, com seus métodos de negócio definidos, devemos criaras interfaces necessárias que serão usadas pelos clientes para o acessarem. No caso deSession Beans ou Entity Beans, devemos definir a interface ��/&* (���/ (ou Local caso o acessoseja somente local) com os métodos de negócio do EJB. Logo após, definimos ainterface �"( * / (ou ��("',� � (&* / para acesso local) com os métodos do ciclo de vida do EJB,isto é, normalmente com os métodos de criação do EJB e métodos de busca (utilizadosem Entity Beans e conhecidos como finders).

Servidor J2EE

Container EJB Cliente

EJBHome stub

EJBObject stub

Remote Interface

Home Interface EJB

Home

EJB Object

Bean

Remote Interface

Home Interface

Page 142: Jsp servlets j2_ee

Como já foi dito, para o EJB Message-Driven Bean não precisamos definir as interfacesHome (ou ��("'.� � � (&* / ) e ��/&* (�� / (ou Local), pois o mesmo se comporta diferentemente dosoutros EJBs.

Por fim, devemos criar o EJB propriamente dito, implementando a interface específicade cada tipo de EJB e codificando cada método de negócio.

Depois de ter construído os EJBs necessários para uma aplicação, devemos empacotaros mesmo em um arquivo, ou em arquivos separados.

Para empacotar um Enterprise JavaBeans, devemos utilizar do utilitário “jar”, que éfornecido juntamente com o JSDK e que facilita a criação do Java Archive (JAR). Comuma linha de comando e alguns argumentos, empacotamos os EJBs em arquivos JAR.

Observe que um arquivo JAR pode ser instalado tranqüilamente em um servidor deaplicação, mas há um outro tipo de arquivo, que empacota todos os recursos daaplicação além dos EJBs, em um mesmo arquivo. Este arquivo é conhecido como EAR(Enterprise Archive) e contempla arquivos JAR, arquivos WAR (Web Archive), arquivosRAR (Resource Adapters Archive), arquivos de configuração, figuras entre outrosrecursos.

É extremamente aconselhável o uso deste tipo de arquivo, para a instalação deaplicações Enterprise, conforme especificado pela Sun MicroSystems.

Estas operações serão descritas com mais detalhes na Parte III – Instalando eExecutando EJB.

Após ter feito isso, podemos instalá-los em um servidor de aplicação. Note que oprocesso de instalação de um EJB nos servidores de aplicação variam de acordo comcada fabricante, então é sugerido uma leitura da documentação do servidor deaplicação específico.

Para acessar um EJB, precisamos criar um cliente que consiga localizar o EJB onde eleestá residindo (servidor de aplicação - container), obtêr uma referência ao EJB remotoou local e obtêr uma instância para acessarmos os métodos de negócio do EJB. Claroque para o EJB do tipo Message-Driven Bean, como apresenta um comportamentodiferente e se propõe a solucionar um problema diferente, utilizamos seus serviços deforma diferente também.

No caso mais comum devemos realizar um “lookup”, isto é, procurar pelo EJB noservidor de aplicação que ele está instalado. Quando criamos um EJB, definimos umnome para ele, e este nome será utilizado pelo cliente para localizar o EJB. Com areferência do EJB em mãos, podemos acessá-lo pela sua interface � (&* / (ou ��( '.��� � ("* / ),obtêr uma referência para a interface �&/&* (�� / (ou ��(&'.� �) e executar os métodos de negóciodesejados.

Lembre-se que o acesso ao EJB pelo cliente é realizado através das interfaces � (&* / e��/"* (&� / , sendo que o acesso diretamente à instância do EJB propriamente dito é deresponsabilidade do container, que opera sobre o Enterprise JavaBean e executa seusmétodos e retorna valores, através das solicitações dos clientes, por meio das interfaces(stubs e skeletons).

Page 143: Jsp servlets j2_ee

� ����� ����� � �

� � � � � � � � ��

� �'� ��� �4�')�+ � � � ),+ + ! � - � ) $,- +B

Session Beans são componentes que apresentam serviços para seus clientes. Estesserviços são fornecidos para o cliente pelas interfaces do EJB Session Bean eimplementadas pelos métodos de negócio no próprio Bean. O estado do objeto SessionBean consiste no valor da instância de seus atributos, sendo que estes não sãopersistidos.

Imagine que uma aplicação necessite realizar alguns cálculos e retornar este valor parao cliente, sendo que deseja-se que este serviço seja remoto para ser acessado porvários clientes pelo país. Isto pode ser implementado por um EJB do tipo Session Bean edisponiblizado em um servidor de aplicações para todos os clientes. Este é um exemplode utilização de um Session Bean.

Mais adiante veremos os códigos fonte de Session Bean exemplo.

Page 144: Jsp servlets j2_ee

SBExampleBean

EJB_Context : SessionContext = null

SBExampleBean()ejbCreate()ejbRemove()ejbAct ivate()ejbPassivate()setSessionContext()

<<EJBSess ion>>

SBExample

Remote

SBExampleHome

create()

Home

<<EJBRealizeHome>><<EJBRealizeRemote>>

<<instantiate>>

�Figura 12.1 � Diagrama de Classes UML do Session Bean.

Analisando o diagrama de classes acima temos uma classe e duas interfaces. A classedo EJB Session Bean ��� � ����* ��� / �&/ �"% ( � � ����/�# # � (�% ) e as interfaces ��� � ����* ��� / ( �&/ * (&��/ ) e ����� ���&* �!� / � (&* /(Home). Para cada classe do Bean devemos definir as interfaces ( �&/"* (&� / e/ou ��(&'.� � e � (&* /e/ou ��(&'.� � � (&* / ). No exemplo acima, foram definidas as interfaces �&/&* (���/ e � (&* / , maspoderiam ter sido definidas as interfaces ��("',�!� e ��("',�!� � (&* / ou todas elas (com isto teríamosacesso local e remoto ao mesmo EJB).

O Bean deve conter os métodos definidos para um EJB Session Bean conforme a APIJ2EE que são: /,� � � - / � � / ��� , /.� � ��/&* (��./ ��� , /�� � � ')�,� � ����/ ��� , /,� � � ��#�# � � ��� / ��� e # /&� ��/�# # � (�%��(�%.��/��"����� . Também devemapresentar os métodos de negócio com suas devidas implementações que serão osserviços disponibilizados pelo EJB.

Na interface � (&* / do EJB devemos definir o método ' - /"����/ ��� , que será utilizado pelo clientepara solicitar ao container que crie uma instância do Bean e forneça uma referênciapara acessar os seus serviços ou os métodos de negócio através da interface � /&* (&��/ . Interface Home : SBExampleHome

���D����Q<�#JD������ N�������� #��,���� �' #!� #!� N�� ".#�"2"2� �!9��

� �� �������� ����� �!� #�� N�� � �� �� �������� ������� 5!�)� ' � �,�� �� �������� ������� �$� � � � �

!5ON�' � D7� 9%�8#!�)K8�QD�# / ��%�Q���� !' #!>O����#�#��Q�8#%9%E!"�� ����� �!� #�� N�� �;���>O���J#JR �5�N�' � D / �����Q���� �' #LD!�F#��Q�8#���� �&*O�F�� " � �F#��Q�8#�����DQ#� ��)� ��9���P6#!�J���&#�!��DQ#% ��&� �!96�

0

Page 145: Jsp servlets j2_ee

Na interface ��/&* (.��/ do EJB devemos definir os métodos de negócio que fornecerão aocliente os serviços disponibilizados pelo Bean. Estes métodos tem a mesma assinaturatanto na interface ��/"* (.��/ quanto na própria implementação do Bean.

A seguir veremos como poderia ser definido esta interface, com um exemplo de serviçofornecido pelo Bean, para calcular o valor de um desconto informando algunsparâmetros.

Interface Remote: SBExample. ���D����Q<�#JD������ N�������� #��,���� �' #!� #!� N�� ".#�"2"2� �!9��

� �� �������� ����� �!� #�� N�� � �� �� �������� ������� 5!�)� ' � �,�� �� �������� ������� �$� � � � �

!5ON�' � D7� 9%�8#!�)K8�QD�# / ��%�Q���� !' #:#��Q�8#�9�E�"0� ����� �!� #�� N�� �;����N�� #�D ��R �5�N�' � D7H 9��8#�<(#�� DQ��' D��@� " DQ��5�9����+H 9!�&#Q<O#!�1����' 56#��H 9��8#�<�#�� �$��9�<�#�� �&*O�F�� "�P�#!� �Q�8#����QDQ#� Q�.� ��9��

0

A seguir apresentamos a implementação do Bean deste exemplo.

Bean: SBExampleBean. ���D����Q<�#JD������ N�������� #��,���� �' #!� #!� N�� ".#�"2"2� �!9��

� �� �������� ����� �!� #�� N�� � �

!5ON�' � D:D�' ��"." / �����,���� �' #���#���9�� �� �' #��L#!9��8" / #�"2" � ��9���#���9�R

�� � ��� �8# / #�" "2� �!9 � �!9!�&#Q� � " #�" ",� �!9 � �!9%�8#Q�Q�&�

�5�N�' � D��O�!� E�#�� N � �F#�� �8#���� �&*O�F�� " � �)#!���8#�����DQ#� Q�&� ��9�R0

�5�N�' � D��O�!� E�#�� N�P�#!�J����#�!�BR0

�5�N�' � D��O�!� E�#�� N�*DQ�&� ���Q�8#�,�BR0

�5�N�' � D��O�!� E�#�� N�I��Q".",� ��� �8#����BR0

�5�N�' � D��O�!� E�" #�� / #�" "2� �!9 � �!9��8#�� � � / #�"."Q� ��9 � ��9��&#��2�1"2#�"."Q� ��9 � ��9��8#��Q���R�&*�� ",� ".#�"."2� �!9 � �!9!�8#�� �5�L"2#�"2" � ��9 � ��9��&#��Q�&�

0

�5�N�' � D7H 9��8#�<(#�� DQ��' D��@� " DQ��5�9����+H 9!�&#Q<O#!�1����' 56#��H 9��8#�<�#�� �$��9�<�#��R-.- � �� !' #!�J#�9��8�QG ���7E�#�".�8#��/#��8��E!�JE�#�9�#�< ��D�� ���0

0

Page 146: Jsp servlets j2_ee

Para obter este serviço, o cliente deve realizar a localização do EJB no servidor deaplicação utilizando a API JNDI, solicitar uma referência para a interface � ("* / do EJB ecom ela executar o método de ciclo de vida: ' - /"����/ ��� . Assim, o cliente terá acesso àinterface Remote que apresenta os métodos de negócio, isto é, os serviços disponíveispara o EJB e dessa forma, poderá executá-los para as operações desejadas.

Maiores detalhes de localização e obtenção das referências para as interfaces, serãovistas no êApê ndice A que apresentará exemplos mais detalhados de EJB e a utilizaçãode cada serviço, além de especificar os arquivos de instalação (deploymentdescriptors).

Até aqui introduzimos o EJB Session Bean, mas ainda não detalhamos os dois tipos deSession Bean que serão vistos nos próximos tópicos e que são:

�3 Session Bean Stateless

�3 Session Bean Stateful

� �'����� � $ - �� �,+ $�� ��� �) + + ! � - �*) $ -�

Deve-se utilizar um Session Bean quando deseja-se prover serviços a seus clientes, sendoque estes serviços sejam transacionais e seguros, rápidos e eficientes. Session Beansapresentam uma forma de executar a lógica de negócio do lado do servidor, comtodos os ganhos que um servidor de aplicação apresenta e vistos nos capítulosanteriores dessa segunda parte do livro.

� �'�,1 � ),+ + ! � - �*)'$ - ��� $ � )*� ) + +Um Session Bean Stateless não mantêm o estado para um cliente em particular.Quando invocamos um método, o estado de suas variáveis se mantêm apenas durantea invocação deste método. Quando o método é finalizado o estado não é retido. Sãocomponentes que não estão associados a um cliente específico e, portanto,implementam comportamentos que atendem a necessidade de muitos clientes.

Session Bean Stateless: SBStatelessExampleBean. ���D����Q<�#JD������ N�������� #��,���� �' #!� #!� N�� ".#�"2"2� �!9��

� �� �������� ����� �!� #�� N�� � �

-.- �%��#!�� �' �LE�# / #�"."Q� ��9>��#���9J3�5�#J�! ��.#�"2#�9��&����"�".#��F��� G���"�����"�" #!5�"4D!' � #�9��8#�",�-.- �6".�8#�"4".#��F��� G���" " ��� � �� �' #!�L#!9!�&�QE���"4�Q�&�$� � #�"�E�#��&#��8��E���" E�# 9�#�< ��D�� ���-.- ��;��:E��L�)� �� / #�"."Q� �!9+��#!��9J�� ��F#�".#�9��8��� ��"0� #Q�&��E��!" #�� N � �F#�� �8#����B#�#�� N�P�#��J�Q��#��������!' #��-.- E���"��&#��8��E���"4#!� N�* D �)� ��� �&#����B#�#�� N�I���"." � ��� �F#��� ����$� / #�" "2� �!9/�%#���96" E��:�.� �� / �8�Q�8#�K85�' � !5ON�' � D:D�' ��"." / � / �&� �F#!' #!"$" ���Q��� �' #��#���9�� �� !' #!�J#�9��&" / #�" "2� �!9���#���9�R

-.-*� �!9%�8#��2�F�7E�� / #!" "2� �!9/�%#���9�� �� � ��� �8# / #�" "2� �!9 � �!9!�&#Q� � " #�" ",� �!9 � �!9%�8#Q�Q�&�

-.- ����#�D!5��8��E�� �#�' �JD���9��8��� 9�#��1�! ���" �JD!� � ��G �%�7E��J� 9%"F� ��9�D�� �:E��>�;����-.- � �&*��F�� " � �$#����&#�%�QD�#! ��.� �!9 #Q��D�#!G�����9��LD!�.� ��G�����E�# 5��J��#%9!�)� E��QE�#LE�� ��;���� �5�N�' � D��O�!� E�#�� N � �F#�� �8#���� �&*O�F�� " � �)#!���8#�����DQ#� Q�&� ��9�R0

Page 147: Jsp servlets j2_ee

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�JE�#!"$�&�.5�� �1��� 9�"F� ��9%D!� �LE�� ��;����-.- I����F�J�>�;�� / #�"."Q� ��9>��#���9 / �F� �&#�' #�"2"@��E�#���#!��".# ' � N�#!�F��� ��" �$#�D�5��)".��" �!' ��D��QE���"-.- ��!�)�:#�".�8#>�;��J9�#�".�8#��/#��8��E!��� �5�N�' � D��O�!� E�#�� N�P�#!�J����#�!�BR0

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�J�Q�&� ���!� ���%N�� #��8�JE��� ����!'6E�#>�;���"Q�-.- &B#�"$�8#����!�J#�9��8�:E�#���#!� " #!���$#!D�5O �#!�$�QE���" �&��E���"4�!":�$#�D�5��."$��":5��)� ' � M��QE���"� �#!' �/�;��!�-.- H ".�8�&#JK8#�� �&�J" �!��#�9��8#� ����.� / #�"2" � ��9/��#���9 E��J�)� �� / �&� �&#�K&5�' �-.- ��"$�8#��/#Q�8��E��JE!#���#J".#��4E�#QK&� 9�� E��� ��!�F�J�>�;�� / #�"."Q� ��9>��#���9 / �F� �&#�' #�"2" �8�!��N�#!�/�-.- �! �#�"2��� E�#�9 ���J"2#��45��&� ' � M��QE���6 ��!� " #�".�F#:�.� ��JE�#>�;��79 ���LK&� DQ�� ��Q" ",� ���%� �5�N�' � D��O�!� E�#�� N�*DQ�&� ���Q�8#�,�BR0

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�JE�#�����' �O#!� ����N�� #Q�F�7�Q� �����'�E�#/�;���",�-.- &B#�"$�8#��/#Q�8��E��JE!#���#�� ".#��0' � N�#��.�QE���" �8��E���" ��":�.#�D!5��$".��" ��' ��DQ��E���"0 �#�' �/��;����-.- H ".�8�&#JK8#�� �&�J" �!��#�9��8#� ����.� / #�"2" � ��9/��#���9 E��J�)� �� / �&� �&#�K&5�' �-.- ��"$�8#��/#Q�8��E��JE!#���#J".#��4E�#QK&� 9�� E��� ��!�F�J�>�;�� / #�"."Q� ��9>��#���9 / �F� �&#�' #�"2" �8�!��N�#!�/�-.- �! �#�"2��� E�#�9 ���J"2#��45��&� ' � M��QE���6 ��!� " #�".�F#:�.� ��JE�#>�;��79 ���LK&� DQ�� ��Q" ",� ���%� �5�N�' � D��O�!� E�#�� N�I��Q".",� ��� �8#����BR0

-.- � ��9�K&� <(5��$�0��D���9��8#��Q�8�7E�� / #�".",� �!9+��#���9��-.- � ����F��� "2#�"."Q� ��9 � ��9��8#�� � D���9��8#�� �&�JE�� / ��� �5�N�' � D��O�!� E�" #�� / #�" "2� �!9 � �!9��8#�� � � / #�"."Q� ��9 � ��9��&#��2�1"2#�"."Q� ��9 � ��9��8#��Q���R

�&*�� ",� ".#�"."2� �!9 � �!9!�8#�� �5�L"2#�"2" � ��9 � ��9��&#��Q�&�0

-$- � � �6�!N��!� �,��E�#�K8� 96�0��":�&#��8��E���" E�#�9�#�< ��D�� ����� "$�8� #��6��"0" #!�)��� G���"-$- 3�5�#J� / #�" "2� �!9/��#���9 � �F;�K8���.96#�D�#!�4����"�"2#�5�" D�' � #!9%�8#�"Q�

� �'� � � !"# � � ,) �,! '$� ��'),+ + ! � - � ) $ - � � $�� )*� ) +�+A figura 12.2 representa o ciclo de vida de um Session Bean Stateless.

Page 148: Jsp servlets j2_ee

In stân cia do EJB Session Be an

State less a in da não ex iste

Session Be an State le ss pr onto ou m antid o no po ol de

ob je tos

1. Class.n ewIn sta nce()2. setSessionContex t()3 . e jbCr eate ()

e jbRem o v e()

Ex ecu ção dosm étodos de negócio

�Figura 12.2 � Ciclo de vida de um Session Bean Stateless.

Assim que o servidor de aplicações é inicializado, não existem beans instanciados,então, dependendo das políticas de pooling adotadas, o container instancia o númerodefinido de beans. Caso o container decida que precisa de mais instâncias no pool,instancia outros beans. Os beans no pool devem ser equivalentes (porque sãoStateless), pois eles podem ser reutilizados por diferentes clientes. Quando o containerdecide que não precisa mais de instancias no pool, ele as remove.

� )+ + ! � - �*) $ - � � $ � ) 1O� �EJB Session Bean Stateful são componentes que mantêm o estado dos seus atributos eum relacionamento forte com o cliente que o utiliza. Se a execução termina ou se ocliente solicita a remoção da instância deste EJB para o container, a sessão é finalizadae o estado é perdido, isto é, o valor dos atributos configurados pelo cliente para esteEJB são perdidos e em uma próxima utilização estarão com seus valores nulos.

Este tipo de Session Bean, diferente do Session Bean Stateless, mantém os valores dosatributos entre várias chamadas aos seus métodos de negócio (ou serviços), sendoassim, o cliente pode configurar os valores dos atributos do Bean através dos métodossetters e assim o EJB pode utilizar estes valores para os métodos de negócio.

Session Bean Stateful : SBStatefulExampleBean. ���D����Q<�#JD������ N�������� #��,���� �' #!� #!� N�� ".#�"2"2� �!9��

� �� �������� ����� �!� #�� N�� � �

-.- �%��#!�� �' �LE�# / #�"."Q� ��9>��#���9J3�5�#J�! ��.#�"2#�9��&����"�".#��F��� G���"�����"�" #!5�"4D!' � #�9��8#�",�-.- �6".�8#�"4".#��F��� G���" " ��� � �� �' #!�L#!9!�&�QE���"4�Q�&�$� � #�"�E�#��&#��8��E���" E�# 9�#�< ��D�� ���

Page 149: Jsp servlets j2_ee

-.- ��;��:E��L�)� �� / #�"."Q� �!9+��#!��9J�� ��F#�".#�9��8��� ��"0� #Q�&��E��!" #�� N � �F#�� �8#����B#�#�� N�P�#��J�Q��#������-.- ��' #�� E!��"��/#Q�F��E���"4#�� N�*DQ�&� ���Q�8#��!� #�#�� N�I��Q"."Q� �����8# ���B ����$� / #�"."2� �!9+��#!��9%"-.- E��L�)� �� / �8���8#�K 5O' � !5ON�' � D:D�' ��"." / � / �&� �F#QK&5�' �������� �' #���#���9�� �� �' #��J#!9%�8" / #�" "2� ��9���#���9�R

-.- � ��9��8#��Q�8�JE�� / #�"."Q� ��9>��#���9�� �� � ��� �8# / #�" "2� �!9 � �!9!�&#Q� � " #�" ",� �!9 � �!9%�8#Q�Q�&�

-.- � � �6E!#�K8� 9��:��"����)�.� N�5��8��" 3�5�#J".#�� ��� �J��9!�)� E���" #!963�5���9��8�-.- �7" #�"." ����E!# 56� D�' � #!9!�&#:#�"2 �#�D � K8� DQ��#�".�.� ��#�� ��N�#��)�8� �� � ��� �8# / �&� � 9�< 96���J#!�

-.- ����#�D!5��8��E�� �#�' �JD���9��8��� 9�#��1�! ���" �JD!� � ��G �%�7E��J� 9%"F� ��9�D�� �:E��>�;����-.- � �&*��F�� " � �$#����&#�%�QD�#! ��.� �!9 #Q��D�#!G�����9��LD!�.� ��G�����E�# 5��J��#%9!�)� E��QE�#LE�� ��;���� �5�N�' � D��O�!� E�#�� N � �F#�� �8#���� �&*O�F�� " � �)#!���8#�����DQ#� Q�&� ��9�R0

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�JE�#!"$�&�.5�� �1��� 9�"F� ��9%D!� �LE�� ��;���� �5�N�' � D��O�!� E�#�� N�P�#!�J����#�!�BR0

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�J�Q�&� ���!� ���%N�� #��8�JE��� ����!'6E�#>�;���"Q�-.- &B#�"$�8#����!�J#�9��8�:E�#���#!� " #!���$#!D�5O �#!�$�QE���" �&��E���"4�!":�$#�D�5��."$��":5��)� ' � M��QE���"� �#!' �/�;��!�-.- H ".�8�&#JK8#�� �&�J" �!��#�9��8#� ����.� / #�"2" � ��9/��#���9 E��J�)� �� / �&� �&#�K&5�' � �5�N�' � D��O�!� E�#�� N�*DQ�&� ���Q�8#�,�BR0

-.- " �&� ' � M��QE��J �#!' �JD��!9%�8�!� 9�#!�4 ����F�JE�#�����' �O#!� ����N�� #Q�F�7�Q� �����'�E�#/�;���",�-.- &B#�"$�8#��/#Q�8��E��JE!#���#�� ".#��0' � N�#��.�QE���" �8��E���" ��":�.#�D!5��$".��" ��' ��DQ��E���"0 �#�' �/��;����-.- H ".�8�&#JK8#�� �&�J" �!��#�9��8#� ����.� / #�"2" � ��9/��#���9 E��J�)� �� / �&� �&#�K&5�' � �5�N�' � D��O�!� E�#�� N�I��Q".",� ��� �8#����BR0

-.- � ��9�K&� <(5��$�0��D���9��8#��Q�8�7E�� / #�".",� �!9+��#���9��-.- � ����F��� "2#�"."Q� ��9 � ��9��8#�� � D���9��8#�� �&�JE�� / ��� �5�N�' � D��O�!� E�" #�� / #�" "2� �!9 � �!9��8#�� � � / #�"."Q� ��9 � ��9��&#��2�1"2#�"."Q� ��9 � ��9��8#��Q���R

�&*�� ",� ".#�"."2� �!9 � �!9!�8#�� �5�L"2#�"2" � ��9 � ��9��&#��Q�&�0

-.- � ��9�K&� <(5��$�0�J�O�!' ��� �Q�&�.� N�5��&�J9����J#��-.- � ����F����9����J#��O�!' ��� E!�����&�2� N�5��&�:�J" #%� D���9�K&� <(5��$�QE!��� �5�N�' � D��O�!� E�" #��,& ����#� / �)�.� 9�< 9����J#��+R

�&*�� ",� 96���J#=��9����J#!�0

-.- � N���#�� �J����' ��� E��J�Q�.�.� N65��8� 9%���J#%�-.- � �F#��&5��.9L����' ��� E��J�Q�.�.� N�5!�8� 9���� #!� �5�N�' � D / �)� � 9�<�<@#��,& ���J#���+R

�.#��)5��$9 9����J#��0

Page 150: Jsp servlets j2_ee

-.- � � �6�!N���� �,�JE�#�K � 9�����":�&#��8��E���" E�#�9�#Q< ��D�� ����� "F�F� #��6�!"�".#��)��� G���"-.- 3�5�#J� / #�" "2� ��9/��#���9 � �$;�K8���.96#�D�#!�4����"0" #!5%" D!' � #!9%�8#�"Q�

0

� !�# � � ) �,! $ ��,) + + ! � - �*) $,- � � $ � ) 1@�,�O diagrama a seguir, figura 12.3, representa o ciclo de vida de um Session BeanStateful. Temos as transições entre estado ativo e passivo, nos quais o bean deixa de serutilizado por um tempo e fica aguardando novas chamadas do cliente quando estapassivo, e ativo quando volta a ser utilizado pelo cliente. Nestes dois momentos, pode-se liberar os recursos alocados para determinado bean que se tornará passivo, e obterestes recursos quando o bean se tornar ativo.

Instân cia do EJB Sessio n Bean Stateful

ainda n ão ex i ste

Sessio n Bean Stateful p ron to

1 . Class.newInstan ce()2 . se tSessio nCon tex t()3 . ejbCr eate()

ejbRem ov e ()

Ex e cução dosm étodos de negó cio

Sessio n Bean Stateful Pa ssiv o

ejbPassiv ate ()

ejbActiv ate ()

�Figura 12.3 � Ciclo de vida de um Session Bean Stateful.

Page 151: Jsp servlets j2_ee

� ��������� � ���

����������� ����� �"!

#%$�&'#)(+*�,.-/1032"46587�9:7<; =>-�?356/A@Entity Bean são Beans de Entidade, isto é, representam entidades persistentes. Em outraspalavras, são componentes de negócio com mecanismo de persistência de dados.

O estado do Entity Bean pode ser persistido em um banco de dados relacional, arquivoXML além de outros tipos de repositórios de dados. Isto quer dizer que o estado doEntity Bean é mantido além do tempo de vida da aplicação ou do servidor J2EE. Esta éuma característica muito útil em situações onde deseja-se utilizar os dados destaentidade em momentos que seria inviável mante-los em memória.

Existem dois tipos de Entity Beans:

�B Bean-Managed Persistence.

�B Container-Managed Persistence.

EBExampleBean

EJB_Contex t : Ent ityContext

EBExampleBean()ejbCreate()ejbPostCreate()ejbAc tivate()ejbPassivate()ejbLoad()ejbStore()ejbRemove()setEnt ityContext()unsetEntityContext()

<<EJBEntity>>

EBExample

RemoteEBExampleHome

create()findByPrimaryKey()

Home

EBExamplePK

hashCode()equals()toString()

<<EJBPrimaryKey>>

<<EJBRealizeHome>>

<<EJBRealizeRemote>>

<<instantiate>>

<<EJBPrimaryKey>>

CFigura 13.1 � Diagrama de Classes UML do Entity Bean.

Page 152: Jsp servlets j2_ee

#%$�&�����,�? 5��.2 ,3/1?���,� 465 7�9 7<; = - ? 56@Deve-se utilizar o EJB do tipo Entity Bean quando seu estado precisa ser persistido. Se ainstância do EJB não estiver ativa ou se o servidor de aplicações for derrubado, pode-serecuperar o estado do mesmo, pois estará persistido na base de dados. O que torna osEntity Beans diferentes dos Sessions Beans é que primeiramente o estado do Entity Beané salvo através de um mecanismo de persistência, além disso possui uma chaveprimária que o identifica.

#%$�&'$46587�9:7<; = -.? 5 = -�? 5� � ? 58?�� -�����>-�� /19'/ 7�-�5�� -Utilizando esta estratégia, a codificação das chamadas de acesso à base de dadosestão na classe de negócios do EJB e são responsabilidade do desenvolvedor. Então,para os métodos de busca (métodos utilizados para encontrar Entity Beans na base dedados) e para os métodos de criação, remoção e atualização dos Entity Beans, deve-se codificar os comandos responsáveis por realizar estas operações.

O Entity Bean BMP - Bean de Entidade com Persistência Gerenciada pelo Bean -oferece ao desenvolvedor a flexibilidade de desenvolver as operações de persistênciade dados que em alguns casos, podem ser complexas de serem implementadas pelocontainer.

Esta estratégia demanda mais tempo de desenvolvimento e alguns autores sugeremque se utilize a estratégia de persistência CMP (Container-Managed-Persistence), queserá vista a seguir.

Detalhes de implementação de um EJB Entity Bean BMP, assim como os deploymentdescriptors serão vistos no êApê ndice A.

Entity Bean BMP: EBBMPExampleBean.��� ������������ "!$# %" ���# ��&'��!$�)( ��# ��* %"# ��+ ,.- ,0/�1

- !$� )23,4* ��5��6&�# �"* %)# 761

8.8�9 &���!$�"( ;:)� 9 + ,�- ,0/=< �"��+$<�>�?�@ ,A- ( - B ��:" C� �"2.�D!���+E,GF�2� �H�:)��:) H��)!I@)!I!$�"- 8.8 �"�)2JH�- HA,���+�,��K�$�"��2L�"H.��+E,G��2M� H� E� �)2J��N�OE��H�HP )%"2.�� "H���,A2.- %"@ ,G "H�:)�"HJ,�� 9�Q <"#8.8R % H6��2A5)�DS�@E�C+" 9 + ,�- ,0/=<��"��+$<">�?"T ,� :) D $� U�:�- �V ;:)�D�"2P- ��N�W $XG� �)2JH'- HJ,�F"+"��- �K:) 8.8 )%"* ��,� "Y0T�2L��!� N�W ETE��,�@Z��( - B���N�W D� ,���#[:"� 5���H.�)2�- !$�"( �"!���+ ,G��:) �+)� H.,G�"H!�\ ,G :) �HPT8.8�] - ����+E:) K������2��V �:) $�)2J �V2L��!���:� )2M:)� ] - +)- 2M�$!$�"( ^" "2 ] )2.!��K:"� ] ��B��)2�- H6H. )#��@[%"( - �K��( ��H.H 9 <"<">�? 9 &���!$�"( ��< �"��+�- !$�"( ��!���+�,GH 9 + ,�- ,0/�< �"��+$_

8.8�` )+ ,G� &�,G �:) 9 + ,�- ,0/=< �"��+)#9 +E,�- ,3/ ` �+�,���&6,a�)+ ,�- ,0/ ` )+ ,G� &6,A1

8.8�b ,A2L- %"@ ,G dcC�DH.�)2��"�"2JH'- H.,�- :) �#* �65���# ( ��+��V# e�,A2.- + � ] - �)( :fcE1

8.8�b ,A2L- %"@ ,G $gh�DH.�)2��"�"2JH'- H.,�- :) �#* �65���# ( ��+��V# e�,A2.- + � ] - �)( :)gi1

8.8�` 26- �$@)!��K- +"H.,Gj�+E��- �;:� $ "%)* � ,G ��)!k!l��!�U"2.- �K�m� �)2JH�- HL,G�DH6��@ZH�:"� :� "HP#

Page 153: Jsp servlets j2_ee

8.8�� � ��2J��! ] - �"( : cD����!$�" K��H6�E2��"�)2JHP- HJ,.- :" �#8.8�� � ��2J��! ] - �"( : cD����!$�" K��H6�E2��"�)2JHP- HJ,.- :" �#8.8�� 2J� ,�@)2.+���^Z�65�����+)- ���KS�@"�$- :Z��+ ,�- ] - ���; $ E%"* ��,J C� �)2JH�- HL,�- :) "#)�" :)�DH6��2�+)@Z( ( #8.8�� ,�^)2J ��dH ` 2L����,�� 9 &�������,.- �+l��&�� ��N�W" $+)�;��2.- ��N�W $:" $ E%"* ��,G "#�"@)%)( - � * �65���# ( ��+ �V# e�,A2.- + �m�)* % ` 2L����,G�)X0* ��5)��# ( ��+��V# e�,A2.- + � ] - �)( :fcZT

* �65���# ( ��+ �V# e�,A2.- + � ] - �)( :EgiYi,�^)2L �� H ` 2.�"�6,J� 9 &'� ��� ,�- �+$_

8.8 :"��5)���� )+ ,J��2� $��U":E- �� �:"�m�"��2LHP- HJ,GF)+"��- ��:) "H���,�2P- %�@E,G �H�:) 9�Q <)#HP��,��)- �)( :fc"X ] - ��( :fcEY01HP��,��)- �)( :)g X ] - ��( :)giY012.��,A@)2L+m+)@)( ( 1

8.8K9 &�� ��@ ,G� :" C� �)( ��� )+ ,G�"- +"�)2M��� U"H�����26- � N'WE D:) 9)Q <"#8.8�� � ��2J��!I@)+",�- ,�( ��:�)- �)( :ic�� ��!m� C� �)2JH�- HL,�- :) "#8.8�� ,�^)2J ��dH ` 2L����,�� 9 &�������,.- �+l��&�� ��N�W" $+)�;��2.- ��N�W $:" $ E%"* ��,G "#�"@)%)( - � 5) )- :D�)* %)? �HJ, ` 2J�"�6,��"X0* �65E�"# ( ��+��V# e�,�26- + � ] - ��( :fc"T)* �65���# ( ��+ �V# e�,A2.- + � ] - �)( :EgiY

,�^[2J �� H ` 2.� ��,G� 9 &����)��,A- "+$_

8.8K9 &�� ��@ ,G� :" C� �)( ��� )+ ,G�"- +"�)2��"��2L�D2L��!$ �5)�E2� $ �%)* ��,J C�"�"2.H6- HA,A- :" "#8.8�� ,�^)2J ��dH �)�"!� �5�� 9 &�������,�- "+�"@)%)( - ��5[ �- :$�)* %��"��!� �5)��XGY ,�^[2J �� H��"�"!$ �5)� 9 &����"��,.- "+$_

8.8�� � 5E�$�� )+ ,J��2� $��U":)- �[ D:)�$2L��!� "N'W �:) 9�Q <�+" m!���- D:)�$�"�"2.HP- H.,GF"+)��- ��#

8.8�` )+ ] - �V@)2L� �5[��( )2�:) D�6,.2P- %"@ ,� ] - �"( :fcE#8.8�� � �"2J��! ] - �)( :fc�5��"( )2�:" $��,�2P- %�@�,� K��HP�)2��� )+ ] - � @�2J��:" )#�"@)%)( - ��5[ �- :$H6� ,���- ��( :icEX0* ��5E��# ( ��+ �V# e�,A2.- + � ] - �"( :icEY _

,�^�- H'# ] - �"( :fc�� ] - �)( :fc"1

8.8�` )+ ] - �V@)2L� �5[��( )2�:) D�6,.2P- %"@ ,� ] - �"( :)gi#8.8�� � �"2J��! ] - �)( :)g 5��"( )2�:" $��,�2P- %�@�,� K��HP�)2��� )+ ] - � @�2J��:" )#�"@)%)( - ��5[ �- :$H6� ,���- ��( :EgiX0* ��5E��# ( ��+ �V# e�,A2.- + � ] - �"( :EgiY _

,�^�- H'# ] - �"( :)g�� ] - �)( :)g 1

8.8�R %�,�\"! �5)�"( "2�:) ���,.2.- %Z@ ,G ] - �)( :fc"#8.8�� 2J� ,�@)2.+;5���( )2�:) ���,.2.- %)@�,G ] - �E( :fc"#�"@)%)( - �D* ��5���# ( ��+ �V# e�,A2.- + �$��� ,��[- ��( : c X0Y _

2.��,A@)2L+ ] - �"( :icE1

8.8�R %�,�\"! �5)�"( "2�:) ���,.2.- %Z@ ,G ] - �)( :)g #8.8�� 2L��,�@[2.+�5���( )2�:) ���,�26- %"@ ,J ] - ��( :)g #�"@)%)( - �D* ��5���# ( ��+ �V# e�,A2.- + �$��� ,��[- ��( :�g X0Y _

2.��,A@)2L+ ] - �"( :Egi1

Page 154: Jsp servlets j2_ee

8.8�� !$��( ��!��"+ ,G��N�W D:) $!�\ ,G �:) ;:)�DH6�)( �"N'WE D:" $ )%"* � ,G $�"��( �KHP@Z�K��^Z��5)���G�)2L- !���2L- ��#8.8�� � ��2J��! ] - �"( : cD��^"��5E���3�)2.- !���2.- �;:� 9"Q <"#8.8�� 2J� ,�@)2.+���^Z�65��$�)2.- !���2.- �;:� 9"Q <"#8.8�� ,�^)2J ��dH ��- +":"�)2 9 &�������,�- "+���262. ��� m( "����( - B��"2� 9�Q <"#�"@)%)( - � * �65���# ( ��+ �V# e�,A2.- + �m�)* %��)- +":)<�/E?)2L- !���23/��Z��/�X0* �65���# ( ��+��V# e�,�26- + � ] - ��( :fc"Y

,�^[2J �� H��)- +):"�"2 9 &����"� ,�- "+$_

8.8�� � 5E�$�� )+ ,J��2��D- !$�"( �"!���+ ,G��N�W �:)�K ��E�E2A��N'WE D:"�m( �� ��( - B ��N�W" 8.8 :" D )%"* ��,� $+" $!$�"- $�"��2LHP- HJ,G��+E,G��#2.��,A@)2L+m+)@)( ( 1

8.8� ,�- ( - B���:) ��"��2.�;����262J� ���"2� $ )%"* � ,G C�E�E2AHP- HJ,��"+ ,��K:Z C!��)- �:)�$� �E2LHP- H.,GF"+)��- �8.8 �$��,�@Z��( - B���2� "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- 5��K $ �%Z* � ,G D:Z C�" )( #�"@)%)( - ��5[ �- :$�)* % b ��,�- 5)��,G��X3Y _

8.8� ,�- ( - B���:) ��"��( ��� �+E,G��- +"��2�S)@)��+":" K:Z��5) )( 5)�� $ )%�* ��,� ��� m�" � )( #�"@)%)( - ��5[ �- :$�)* %"? ��H.H'- 5��6,G�)X0Y _

8.8�� �"H.� �+ ] - �V@�2A� $� )+ ,���&P,J D:) 9 + ,�- ,0/=<��"��+)#�"@)%)( - ��5[ �- :m@[+"H.� , 9 +�,�- ,G/ ` )+ ,G� &6,AX0Y _

,�^�- H'# ��+ ,�- ,0/ ` "+ ,���&�, �K+[@)( ( 1

8.8�` )+ ] - �V@)2L� $� )+ ,G� &�,G D:) 9 + ,�- ,0/=<��"��+)#8.8�� � ��2J��!��E+�,A- ,0/ ` E+�,���&6,a� E+�,���&�,G �:) 9 +�,�- ,0/=< �"��+)#�"@)%)( - ��5[ �- :$H6� , 9 +E,�- ,G/ ` �+ ,G� &6,AX 9 + ,�- ,G/ ` "+ ,���&P,M�E+�,A- ,0/ ` �+�,G��&6,AY _

,�^�- H'# ��+ ,�- ,0/ ` "+ ,���&�, ���)+ ,.- ,G/ ` �+ ,J��&6,A1

��#%$�&� �� 9J��� 2k�3-��39 � ? 465 7�9 7<; = - ? 5 =D� �

A figura 13.2, representa o ciclo de vida dos Entity Beans BMP. Todos os métodos sãochamados pelo container para o bean. Para criar um novo Entity Bean é utilizado ométodo create e para removê-lo é necessário executar o método ����������� . Pode-secarregar um Entity Bean usando os métodos de busca do entity bean ( �! "�#$����% , �'&)(�*+ ",#

Page 155: Jsp servlets j2_ee

� � ��� ��#�% ). Quando o bean é ativado, ele carrega o dado do meio de persistência equando é desativado, persiste o dado no meio de persistência.

In stância do EJB Enti ty Bean BMP ainda não

ex i ste

Entity Bea n BMP no poo l de objeto s

1. Class.ne wInstan ce()2. setEnti tyContex t()

u nsetEntityConte x t()

Enti ty Bean BMP Pron to

1. ejbPassi v ate()2. ejbLo ad()

1. ejbStore ()2. ejbActi v ate()

Ex e cuta o sm éto dos de negó cio

ou ejb Find ()

ejb Load() ejb Sto re()

1. e jbCreate()2. e jbPostCrea te() ejbRem ov e ()

ejb Hom e() ejb Fin d()

CFigura 13.2 � Ciclo de vida BMP Entity Bean.

#%$�&���48567�9 7 ; = - ?35 � 2 587 ?39 5 -��E�� ? 58?��.-�����>-�� /19 / 7<->5��1-Entity Beans CMP (Bean de Entidade com Persistência Gerenciada pelo Container)oferecem mais rapidez e facilidade no desenvolvimento de objetos persistentes pois odesenvolvedor não precisa escrever os comandos para persistir e manipular os dados.O container se encarrega de realizar estas operações e retornar os valores desejados.Ele faz isso para as operações triviais tais como inserção do objeto, remoção,atualização e seleção pela chave- primária ( �,����� � � , � �������$� , % � � � � e �) ",#������) � ������ ��respectivamente).

Page 156: Jsp servlets j2_ee

Para as operações específicas de consulta a objetos persistidos, se faz necessário o usode uma linguagem de consulta conhecida como EQL (EJB Query Language). Osdetalhes desta linguagem serão vistos a seguir.

Estas operações devem ser definidas no arquivo de deploy do componente ( �$& (�� & � � � � � l)utilizando-se de EQL para cada operação desejada. Neste arquivo define-se oscampos que serão persistidos e os relacionamentos entre Entity Beans.

Detalhes de implementação de um EJB Entity Bean CMP, assim como os deploymentdescriptors serão vistos no êApê ndice A.

Entity Bean CMP: EBCMPExampleBean.��� ������������ "!$# %" ���# ��&'��!$�)( ��# ��* %"# ��+ ,.- ,0/�1

- !$� )23,4* ��5��6&�# �"* %)# 761

8.8�9 &���!$�"( ;:)� 9 + ,�- ,0/=< �"��+$@",�- ( - B���:) D�"�"2J�D!l��+ ,GF)2M �H�:"��:" "H��"! @)!I!���- D�E�E2AHP- HJ,��"+ ,��8.8 �$�"�)2J�"H.��+E,G��2�� H� E� �)2J� N�OE��H�HP )%"2.�� "H���,A2.- %"@ ,G "H�:)�"HJ,�� 9�Q <"#8.8�� ���� H. $:" m@"H. $:)� 9 +E,�- ,0/=<"� ��+ ` >�?"T)� H� )�"�"2.��N�O �"H�:)�C�E��2LHP- HL,GF�+Z��- �KH.W" 8.8 - !$�"( �"!���+ ,G��:)��H��E��( C�Z2JU��)2L- ;�� )+ ,���- +"�)2.T"H6��+Z:" DS)@Z�K m�)2J �V2L��!���:" E2�+"W $�)2J�"��- HP�8.8 H6�m�"2.�"�� "��@�� ��2��� )!���HL,G��H� )�"��2L��N�O �"H�,�26- 5Z- ��- HP#8.8 ?"��2L�K��H� )�"��2L��N�O �"H��"HP�E����� ] - � ��HPTZ�� "!� C@)!l���� �+ZHP@)( ,����� )!� )@ ,A2A �H��"��2Lj�!���,A2A �H�E E28.8 � &���!$�"( ETE��HA,��D�" :)��H.�)2�:Z� ] - +Z- :"�K��,�2L�65�\"H�:Z� 9�� +" D:Z���)( �/)!$�"+ , :��"H6��2P- ��,� �2�:) 8.8�9 + ,�- ,0/=< ����+ ` >�?�#��% H.,�2L����,��)@)%"( - ����( ��H6H 9 < ` >�? 9 &���!$�"( ��< �"��+$- !m�"( ��!���+�,GH 9 + ,�- ,0/�< �"��+$_

8.8�` )+ ,G� &�,G �:) 9 + ,�- ,0/=< �"��+)#�"26- 5��6,G� 9 +E,�- ,3/ ` �+�,���&6,a�)+ ,�- ,0/ ` )+ ,G� &6,A1

8.8�` 26- �$@)!��K- +"H.,Gj�+E��- �;:� $ "%)* � ,G ��)!k!l��!�U"2.- �K�m� �)2JH�- HL,G�DH6��@ZH�:"� :� "HP#8.8�� � ��2J��! ] - �"( : cD����!$�" K��H6�E2��"�)2JHP- HJ,.- :" �#8.8�� � ��2J��! ] - �"( : cD����!$�" K��H6�E2��"�)2JHP- HJ,.- :" �#8.8�� 2J� ,�@)2.+���^Z�65�����+)- ���KS�@"�$- :Z��+ ,�- ] - ���; $ E%"* ��,J C� �)2JH�- HL,�- :) "#)�" :)�DH6��2�+)@Z( ( #8.8�� ,�^)2J ��dH ` 2L����,�� 9 &�������,.- �+l��&�� ��N�W" $+)�;��2.- ��N�W $:" $ E%"* ��,G "#�"@)%)( - � * �65���# ( ��+ �V# e�,A2.- + �m�)* % ` 2L����,G�)X0* ��5)��# ( ��+��V# e�,A2.- + � ] - �)( :fcZT

* �65���# ( ��+ �V# e�,A2.- + � ] - �)( :EgiYi,�^)2L �� H ` 2.�"�6,J� 9 &'� ��� ,�- �+$_HP��,��)- �)( :fc"X ] - ��( :fcEY01HP��,��)- �)( :)g X ] - ��( :)giY012.��,A@)2L+m+)@)( ( 1

8.8K9 &�� ��@ ,G� :" C� �)( ��� )+ ,G�"- +"�)2M��� U"H�����26- � N'WE D:) 9)Q <"#8.8�� � ��2J��!I@)+",�- ,�( ��:�)- �)( :ic�� ��!m� C� �)2JH�- HL,�- :) "#8.8�� ,�^)2J ��dH ` 2L����,�� 9 &�������,.- �+l��&�� ��N�W" $+)�;��2.- ��N�W $:" $ E%"* ��,G "#�"@)%)( - � 5) )- :D�)* %)? �HJ, ` 2J�"�6,��"X0* �65E�"# ( ��+��V# e�,�26- + � ] - ��( :fc"T)* �65���# ( ��+ �V# e�,A2.- + � ] - �)( :EgiY

,�^[2J �� H ` 2.� ��,G� 9 &����)��,A- "+$_

8.8K9 &�� ��@ ,G� :" C� �)( ��� )+ ,G�"- +"�)2��"��2L�D2L��!$ �5)�E2� $ �%)* ��,J C�"�"2.H6- HA,A- :" "#8.8�� ,�^)2J ��dH �)�"!� �5�� 9 &�������,�- "+�"@)%)( - ��5[ �- :$�)* %��"��!� �5)��XGY ,�^[2J �� H��"�"!$ �5)� 9 &����"��,.- "+$_

Page 157: Jsp servlets j2_ee

8.8�` )+ ] - �V@)2L� �5[��( )2�:) D�6,.2P- %"@ ,� ] - �"( :fcE#8.8�R % HP�"2J5)��S�@"�$+"�K�"HP�"�"��- ] - ��� N�W 9)Q <�gi# � T"� H.,J��HK!�\ ,G �:) H�H�WE m- !$�"( ��!���+ ,J��:" �H8.8 �"��( $�)2JU)�"2.- K�� )+ ,J��- +"�)2.#8.8�� � ��2J��! ] - �"( : cK5���( )2�:Z D��,A2.- %"@ ,G ��DH.�)2��� "+ ] - � @)2J��:Z �#�"@)%)( - �K��%EH.,�2L����, 5[ E- :$HP��,��)- �)( :fc"X0* �65���# ( ��+ � # e�,�2.- + � ] - ��( :fc"Y01

8.8�` )+ ] - �V@)2L� �5[��( )2�:) D�6,.2P- %"@ ,� ] - �"( :)gi#8.8�R % HP�"2J5)��S�@"�$+"�K�"HP�"�"��- ] - ��� N�W 9)Q <�gi# � T"� H.,J��HK!�\ ,G �:) H�H�WE m- !$�"( ��!���+ ,J��:" �H8.8 �"��( $�)2JU)�"2.- K�� )+ ,J��- +"�)2.#8.8�� � ��2J��! ] - �"( :�g=5���( )2�:Z D��,A2.- %"@ ,G ��DH.�)2��� "+ ] - � @)2J��:Z �#�"@)%)( - �K��%EH.,�2L����, 5[ E- :$HP��,��)- �)( :)g X0* �65���# ( ��+ � # e�,�2.- + � ] - ��( :)g Y01

8.8�R %�,�\"! �5)�"( "2�:) ���,.2.- %Z@ ,G ] - �)( :fc"#8.8�� 2J� ,�@)2.+;5���( )2�:) ���,.2.- %)@�,G ] - �E( :fc"#�"@)%)( - �K��%EH.,�2L����,4* ��5E��# ( ��+ �V# e�,�2.- + �$� ��,��Z- �"( :fc"X0Y01

8.8�R %�,�\"! �5)�"( "2�:) ���,.2.- %Z@ ,G ] - �)( :)g #8.8�� 2J� ,�@)2.+;5���( )2�:) ���,.2.- %)@�,G ] - �E( :)g #�"@)%)( - �K��%EH.,�2L����,4* ��5E��# ( ��+ �V# e�,�2.- + �$� ��,��Z- �"( :)g X0Y01

8.8� ,�- ( - B���:) ��"��2.�;����262J� ���"2� $ )%"* � ,G C�E�E2AHP- HJ,��"+ ,��K:Z C!��)- �:)�$� �E2LHP- H.,GF"+)��- �8.8 �$��,�@Z��( - B���2� "H�:"��:" "H�:)��HP@Z�D- +ZHJ,Gj�+Z��- �"#�"@)%)( - ��5[ �- :$�)* %�" ���:)X3Yf_

8.8� ,�- ( - B���:) ��"��( ��� �+E,G��- +"��2��"��2J����,�@"�"( - B ��2� H�:)��:) �H�:) � E%"* ��,J 8.8 +) $!���- K:Z�C�"�"2.H6- HA,�F�+E��- ��#�"@)%)( - ��5[ �- :$�)* % e�,G )2J�)X0Y _

8.8� ,�- ( - B���:) ��"��( ��� �+E,G��- +"��2�S)@)��+":" K��,A- 5��K $ �%Z* � ,G D:Z C�" )( #�"@)%)( - ��5[ �- :$�)* % b ��,�- 5)��,G��X3Y _

8.8� ,�- ( - B���:) ��"��( ��� �+E,G��- +"��2�S)@)��+":" K:Z��5) )( 5)�� $ )%�* ��,� ��� m�" � )( #�"@)%)( - ��5[ �- :$�)* %"? ��H.H'- 5��6,G�)X0Y _

8.8�� �"H.� �+ ] - �V@�2A� $� )+ ,���&P,J D:) 9 + ,�- ,0/=<��"��+)#�"@)%)( - ��5[ �- :m@[+"H.� , 9 +�,�- ,G/ ` )+ ,G� &6,AX0Y _

,�^�- H'# ��+ ,�- ,0/ ` "+ ,���&�, �K+[@)( ( 1

8.8�` )+ ] - �V@)2L� $� )+ ,G� &�,G D:) 9 + ,�- ,0/=<��"��+)#8.8�� � ��2J��!��E+�,A- ,0/ ` E+�,���&6,a� E+�,���&�,G �:) 9 +�,�- ,0/=< �"��+)#�"@)%)( - ��5[ �- :$H6� , 9 +E,�- ,G/ ` �+ ,G� &6,AX 9 + ,�- ,G/ ` "+ ,���&P,M�E+�,A- ,0/ ` �+�,G��&6,AY _

,�^�- H'# ��+ ,�- ,0/ ` "+ ,���&�, ���)+ ,.- ,G/ ` �+ ,J��&6,A1

Page 158: Jsp servlets j2_ee

��#%$�&���� 9�� � 2 �3- �39���? 48567�9 7�; = - ?35 � � �

A Figura 13.3, representa o ciclo de vida do Entity Bean CMP. Ele é praticamente omesmo de um Entity Bean BMP, sendo que a única diferença é que pode-se chamar ométodo ejbSelect(), tanto nos beans que estão no pool quanto nos que estão ativos.

Instân cia do EJB Enti ty Be an CMP ain da n ão

e x i ste

Enti ty Bea n CMP n o p o ol de o b je tos

1 . Class.n ew In sta nce ()2 . setEnti tyCon tex t()

u n se tEn ti tyCo ntex t()

Enti ty Be a n CMP Pr on to

1. ejb Pa ssi v a te()2. ejb Lo ad ()

1. ejb Sto re ()2. ejb Acti v a te ()

Ex ecuta o sm é to do s d e n eg ócio

o u e jbFind () e e jbSele ct()

e jbLoa d () ejbStor e()

1 . ejbCr ea te ()2 . ejbPo stCr e ate() ejb Re m o v e ()

e jbHom e() e jb Fin d() ee jb Select()

CFigura 13.3 � Ciclo de vida CMP Entity Bean.

#%$�&���� - � ?�� 9:2>5.?�� -�587<2 4�� = 46587�9:7<; =>-�?35 � � �

+�) ��&�� ������ ��������� �����/�0������ � �� 1��$�����

Page 159: Jsp servlets j2_ee

Um entity bean pode se relacionar com outro, como um relacionamento entre duastabelas de um banco de dados relacional. A implementação de um relacionamentopara entity beans BMP é feita por meio da codificação na classe de negócio do EJB,enquanto para os entity beans CMP o container se encarrega de oferecer osmecanismos de relacionamento através dos elementos de relacionamento definidos nodeployment descriptor.

+�) � � � ���������" ��� ��) ��� ��� "����.�,�%��) �-&� ���(��� ���� � �,��� ���

Um relationship field é equivalente a uma chave estrangeira em uma tabela de umbanco de dados relacional e identifica um entity bean através do relacionamento.

� �() �/��"()�� &�� ��-�� ��� ����) �-&��'���(��� ����� �$�.����� ���,���� � � � 1$������ ���

Existem quatro tipos de multiplicidades:

�B 1 – 1: Cada instância de um entity bean pode se relacionar com uma únicainstância de outro entity bean. Por exemplo, um entity bean marido tem umrelacionamento � ��� com o entity bean esposa, supondo que esta relação ocorranuma sociedade onde não é permitido a poligamia.

�B 1 – N: Uma instância de um entity bean pode se relacionar com múltiplas instânciasde outro entity bean. O entity bean gerente, por exemplo, tem um relacionamento � �� com o entity bean empregado, ou seja, um gerente pode ter vários empregadossob seu comando.

�B N – 1: Múltiplas instâncias de um entity bean podem se relacionar com apenas umainstância de outro entity bean. Este caso é o contrário do relacionamento �� � , ouseja, o entity bean empregado tem um relacionamento �

� � com o entity beangerente.

�B N – M: Instâncias de entity beans podem se relacionar com múltiplas instâncias deoutro entity bean. Por exemplo, em um colégio cada disciplina tem vários estudantese todo estudante pode estar matriculado em várias disciplinas, então orelacionamento entre os entity beans disciplina e estudante é �� .

�*���%�&�� ������ �������,�� ����) ��&��'�����.��$�����.���� �0������� � � � 1$������. ���

Um relacionamento entre entity beans pode ser bidirecional ou unidirecional. Numrelacionamento bidirecional cada entity bean tem um campo (relationship field) quereferencia outro entity bean. Através deste campo um entity bean pode acessar oobjeto relacionado.Em um relacionamento unidirecional, apenas um entity bean tem ocampo referenciando outro entity bean.Consultas em EJB-QL podem navegar atravésdestes relacionamentos. A direção dos relacionamentos determina quando a consultapode navegar de um entity bean para outro.

Sendo um relacionamento bidirecional as consultas EJB-QL podem navegar nas duasdireções acessando outros entity beans através dos campos de relacionamento. A tag�$� � � � ��� #���"��$� � no arquivo ejb-jar-xml define o nome do campo do relacionamento e naclasse abstrata do entity CMP teremos os respectivos métodos abstratos ,� � e %!� �relacionados a este campo. Os tipos que um método get como esse retorna é o tipo

Page 160: Jsp servlets j2_ee

da interface local do objeto relecionado sendo um relacionamento � � � , caso orelacionamento seja �� � o tipo retornado pode ser ou & �,� � � � � � � � � � � � � � ��" ou & �,� � � � � � � � � � .Sempre que tivermos campos de relacionamento no entity bean não devemos invocaro seu método set no �+&)( � ��� � � � , ele deve ser invocado no método �$& ( � ��% � � ����� � � ou através dosmétodos set e get que estiverem disponíveis na interface local. Exemplos:

Relacionamento bidirecinal:

CFigura 13.4 � Relacionamento Bidirecional Entity Bean CMP.

Neste caso podemos ver que os dois entity beans podem navegar e acessar asinformações sobre o entity bean relacionado, só para visualizar iremos agora mostrarcomo ficariam as configurações no deployment descriptor.

� ��* %��G2L�)( ��,�- )+��� ��* % �G2L�E( ��,�- E+ �G+"��!����6��H�� �H6���J!���2.- :� � 8 �"* %��32.�"( ��,A- "+��G+Z��!����� ��* % �G2L�E( ��,�- E+EHP^)- ���32J )( ���

� :"�"H.��2L- ��,�- �+�6��H6�� "H.� � 8 :)��H6��2P- � ,�- "+��� �"* %��J2J�)( ��,�- )+"HP^Z- ���G2L �( � �J+Z�'!l��� 9 H�� �H6� �"��( ��,�- �+EHP^)- ���" "( � � 8 ��* %��G2L��( �6,A- �+"H�^)- ���32J )( ���J+"��!����� !m@)( ,�- �"( - ��- ,0/� R +"� � 8 !$@Z( ,�- �"( - ��- ,0/�� 2J�)( ��,�- )+"H6^)- ���G2L �( ���GH6 �@Z2.�����

� :"��HL��2.- ��,�- �+��6�"HP� "H.� � 8 :)� HP��26- ��,.- �+�� ��* %��G+Z��!���� 9 HP� "H.� � 8 �"* %��3+"��!����

� 8 2A�E( ��,�- �+EHP^)- ���32. "( ���3HP "@)2.� ���� ��!$2�� ] - ��( :��

� :"��HL��2.- ��,�- �+���!���2.- :) � 8 :�� HP�"2.- ��,�- �+��� ��!$2'� ] - ��( :���+E��!�����!$��2L- :" � 8 �"!$2 � ] - �"( :��J+"��!����

� 8 ��!$2�� ] - �"( :��� 8 �)* %��G2L��( ��,�- �+ZHP^)- � �32. "( ���� ��* % �G2L�E( ��,�- E+EHP^)- ���32J )( ���

� :"�"H.��2L- ��,�- �+��!���2.- :) � 8 :"��H6��2.- � ,�- "+��� �"* %��J2J�)( ��,�- )+"HP^Z- ���G2L �( � �J+Z�'!l����>���2.- :" �"�"( �6,�- �+EHP^)- ���" "( � � 8 �)* %��G2L�)( ��,�- )+"HP^)- � �32. "( � �J+"��!����� !m@)( ,�- �"( - ��- ,0/� R +"� � 8 !$@Z( ,�- �"( - ��- ,0/�� 2J�)( ��,�- )+"H6^)- ���G2L �( ���GH6 �@Z2.�����

� :"��HL��2.- ��,�- �+���!���2.- :) � 8 :�� HP�"2.- ��,�- �+��� ��* %��G+Z��!�����>���2L- :" � 8 �)* % �3+)��!����

� 8 2A�E( ��,�- �+EHP^)- ���32. "( ���3HP "@)2.� ���� ��!$2�� ] - ��( :��

� :"��HL��2.- ��,�- �+��6�"HP� "H.� � 8 :)� HP��26- ��,.- �+�� ��!$2'� ] - ��( :���+E��!������ HP�" H.� � 8 ��! 2 � ] - �"( :��J+"��!����

� 8 ��!$2�� ] - �"( :��� 8 �)* %��G2L��( ��,�- �+ZHP^)- � �32. "( ���

Esposa Marido

marido esposa

Page 161: Jsp servlets j2_ee

� 8 �)* %��32.�)( ��,�- )+��

Na verdade não será precisa digitar todo esse código xml para criarmos osrelacionamentos pois existem ferramentas que fazem isso por você, mas você deve teridéia de como funciona e o que é configurado nesse arquivo.

A tag �$��� �)�) � � #���" ��� � configura o nome do campo do ejb nos quais serão criados osmétodos get e set que estarão disponíveis na interface local, caso configuramos amultiplicidade ��� � , se fóssemos configurar ��� � por exemplo deveríamos trocar a tag� � � � � � �� � para many e acrescentaríamos a tag �$��� �)�) � � #�� � � � como o exemlo mostra aseguir:

� ��!$2�� ] - ��( :��� :)�"H.�"2.- ��,�- "+��6�"HP� �H6� � 8 :"�"HP��26- ��,A- �+��� ��!$2'� ] - �"( :��3+)��!������ HP�" �HL� � 8 ��!$2�� ] - ��( :��G+Z��!����� ��!$2'� ] - �"( :�� ,G/V� ����* ��5)��# @�,�- ( # ` "( ( ����,�- )+ � 8 ��!$2�� ] - �E( :��0,3/��"���

� 8 ��!$2�� ] - ��( :��

Neste caso você pode escolher se o tipo retornado será & �,� � � � � � � � � � � ��� � ��" ou & �+� � � � � � � � � � .

CFigura 13.5 � Relacionamento Unidirecional Entity Bean CMP.

Aqui temos um relacionamento unidirecional onde apenas a esposa pode encontrar omarido, o marido não é capaz de recuperar informações das mulheres por meio dorelacionamento. Neste caso a tag �$��� �)�) � � # no deployment descriptor �$& ( � &�� � � � � � não estaráconfigurada no lado em que definimos o relacionamento do lado do EJB marido.

� ��* %��G2L�)( ��,�- )+��G+E��!����6� H'� "H.���J!���2L- :" � 8 ��* %��G2L��( �6,A- �+��3+)��!����� ��* %��G2L�)( ��,�- )+"HP^)- ���G2J )( ���

� :)�"H.�"2.- ��,�- "+��6�"HP� �H6� � 8 :"�"HP��26- ��,A- �+��� ��* % �G2L�E( ��,�- E+EHP^)- ���32J )( ���J+"��!���� 9 HP�" H.� �"�"( ��,�- �+ZHP^)- ���" "( � � 8 �)* %��32J�)( �6,�- "+"HP^)- ���02. "( � �3+)��!����� !$@)( ,A- ��( - ��- ,0/�� R +"� � 8 !$@)( ,�- �"( - ��- ,0/��� 2L�)( ��,�- �+ZHP^)- � �32J )( ���3HP "@)2L��� �

� :"�"H.��2L- ��,�- �+�6��H6�� "H.� � 8 :)��H6��2P- � ,�- "+��� �"* %��J+"��!���� 9 HP� "H.� � 8 ��* %��G+"�"!����

� 8 2L�)( �6,.- �+ZHP^)- ���G2L �( � �3H. )@)2L������ ��!$2'� ] - �"( :��

� :"�"H.��2L- ��,�- �+��!���2.- :) � 8 :"��H6��2.- � ,�- "+��� ��!$2�� ] - ��( :��J+"��!�����!l��2.- :" � 8 ��!$2 � ] - ��( :���+E��!�� �

� 8 �"!$2'� ] - ��( :��� 8 �)* %��32.�)( ��,�- )+"HP^Z- ���G2L �( ���� ��* %��G2L�)( ��,�- )+"HP^)- ���G2J )( ���

� :)�"H.�"2.- ��,�- "+���!���2.- :) � 8 :"� HP��26- � ,�- �+��� ��* % �G2L�E( ��,�- E+EHP^)- ���32J )( ���J+"��!�����>���2L- :" �Z��( �6,�- "+"HP^)- ���" �( � � 8 �)* %��32.�)( ��,�- )+"HP^Z- ���G2J )( � �J+"��!l���� !$@)( ,A- ��( - ��- ,0/�� R +"� � 8 !$@)( ,�- �"( - ��- ,0/��� 2L�)( ��,�- �+ZHP^)- � �32J )( ���3HP "@)2L��� �

Esposa Marido

marido

Page 162: Jsp servlets j2_ee

� :"�"H.��2L- ��,�- �+��!���2.- :) � 8 :"��H6��2.- � ,�- "+��� �"* %��J+"��!�����>��"2.- :" � 8 �)* %��G+Z��!����

� 8 2L�)( �6,.- �+ZHP^)- ���G2L �( � �3H. )@)2L������ 8 �)* %��32.�)( ��,�- )+"HP^Z- ���G2L �( ���� 8 �)* %��32.�)( ��,�- )+��

#%$�&���4 �A=D ���

EQL ou EJB-QL é a linguagem portável utilizada para construir os métodos de consultados EJB’s CMP de acordo com a especificação 2.0. Esta linguagem não é utilizadapara os EJB’s BMP, pois os mesmos utilizam a API JDBC, ou outro mecanismo depersistência para acesso à base de dados.

��� � �����(���� ��� ��)�� � ��� �����

Devemos utilizar EQL para implementar os métodos de busca de seus Entity Beans CMPque não seja a partir de sua chave-primária ( �! ",#���� � � ������ �� ), pois este já é oferecidoautomaticamente pelo container.

��� � ��� � ��

Um comando EJB-QL contém três partes:

�B Uma cláusula SELECT

�B Uma cláusula FROM

�B Uma cláusula opcional WHERE

� &�)����� ��) � �3+! �

A cláusula *���� ela define o domínio de uma consulta, indica qual parte de uma basede dados você irá consultar. No caso de uma base de dados relacional, a cláusula *���� tipicamente restringe quais tabelas serão consultadas. Por exemplo:

e 9 9"`��dR < Q)9E`�� X "Y�� R >�� b e�

Aqui estamos declarando uma variável na cláusula *���� . Esta variável o pode ser usadaposteriormente em outras cláusulas desta mesma consulta, neste caso estamosreusando a variável na cláusula ������� � � .Algumas vezes precisamos declarar variáveis na cláusula *��!� que representa umconjunto de valores:

e 9 9"`��dR < Q)9E`�� X ��Y�� R >�� b e� ET � � X �# - ,G�"!$HPYi�

A frase �#" � o declara a varíavel o que representa os entity beans � , e a frase $ �&% � � � ����%�' adeclara a variável a que representa uma coleção de items do entity Bean � . Então AS éusado quando a varável declarada representa um único valor e $ � é usado quando avariável representa uma coleção de valores.

Page 163: Jsp servlets j2_ee

� &�)����� ��) ����� ��+��

A Cláusula ��� � � � restringe o resultado da consulta, você escolhe os valores desejados apartir das variáveis declaradas na cláusula * ��� :

e 9 9"`��dR < Q)9E`�� X0�"Y�� R > ? �"H.H6 ��D��� 9 � 9 �)# +E �!�����fc

Esta consulta recupera todas as pessoas que possuem o atributo nome igual aoparâmetro que será passado no método. Por exemplo, o método poderia serconstruído da seguinte forma:

] - +":)< / � �!���X e ,�2.- + �=+) "!���Y

Para ultizar collections na cláusula ��� � � � você precisa declará-la primeiramente nacláulua *���� :

e 9 9"`��dR < Q)9E`�� X ��Y�� R > ? �"H.H6 �� b em��T � � X0��# �"��2J�"+ ,�� H���Y�� 9 � 9 ��# ] - ( ^" �# +"��!���� � ?"� :)2J ��

Algumas vezes você pode declarar mais de uma varíavel que representa o mesmoentity bean. Quando fazemos comparações este artifícil é muito útil:

e 9 9"`��dR < Q)9E`�� X c"Y�� R > ? �"H.H6 ��K fcET�? �"H.H6 ��K )g�� 9 � 9 fc"# - :)��:"� �; �g # - :"��:)� b � � "g # +" "!������ Q 'W ��

� &�)����� ��) � � � �� �

A cláusula � � ��� �&� especifica o resultado retornado pela consulta. Por exemplo:e 9 9"`��dR < Q)9E`�� X "Y�� R > ? �"H.H6 ��D�ZT � � X �# ���"2J��+�,���H6Y �

Na consulta são definidas duas variáveis p e a, a cláusula select determina qual deveser selecionada.

Neste exemplo a consulta retorna todos os produtos em todas as regras que contemitems:

e 9 9"`�� ( # �"2J ":)@ ,G "H � � R > � 9�� � b ��HK2.T � � X32.# - ,��"!�HPY (

Como você pode ver podemos utlizar o ponto para acessar relacionamentos nacláusula ������� � � . Este código é interpretado para um SQL-padrão onde um JOIN é feitopara recuperar os dados desejados.

Perceba que nest exemplo não utlizamos a notação � (�& ��� � % ' , ele é apenass utilizadoquando se trata de uma variável simples que não faz uso do ponto para acessarinformações por meio dos relacionamentos entre entity beans.

Outra informação importante é que a cláusula � � � � � não trabalha com collections,apenas aceita variáveis simples, ou seja:

e 9 9"`�� 2P# - ,G�"!�H�� R > �Z��� 2.� b em2

Esta query não está correta, a forma correta é:e 9 9"`��dR %"* �"��,�X �"Y

Page 164: Jsp servlets j2_ee

�� R > �Z��� 2.� b em2.T � � X02.# - ,���!lHPYi�

Para filtrar as informações, ou seja, não trecuperar informações repetidas é utlizado ofiltro � $ � � $ � � � :

e 9 9"`�� � � e � � �i` � ( # ��2L �:)@ ,G "H � � R > � 9 � � b b em2.T � � X02.# - ,��"!�HPY

Você pode também fazer que seu método de busca retorne um & ��� � � � � � � � � � que nãopermite que valores repetidos sejam inseridos.

Agora a seguir temos um exemplo de como um método é definido no arquivo �+&)( � & ��� � � � �pode ser acessado por meio das interfaces � ����� e/ou � � ��� � � � � � do EJB. Na interface ométodo estaria assim:

��@[%"( - � * �65���# @ ,.- ( # ` "( ( ���6,.- "+ ] - +E:E<�/ � �!��"X e�,A2L- + �=+Z �!$�"Y ,�^[2J �� H��)- +":"�"2 9 &����"� ,�- "+�T�"��!l �,G� 9 &����"� ,�- )+$1

Este método vai retornar todas as pessoas que tem o nome passado como parâmetro.No arquivo �+&)( � & ��� � � ��� temos:

#�# #� S)@"�)23/��

� S�@E�E2�/ �J!�� ,�^" : �� !$��,�^" ": �3+"��!���� ] - +":)<�/ � �!�� � 8 !�� ,�^" : �3+"��!����� !$��,�^" ": �3�"��2L��!�H �

� !l��,�^" ":��G� �"2.��! ��* ��5)��# ( ��+ �V# e�,.2.- + � � 8 !���,�^" :��G� �"2J��! �� 8 !$��,�^) :��G� ��2L��!�H �

� 8 S[@"��2A/���!�� ,�^" :��� ��* % �0S�( �

��� � ` �[b �fb � e 9 9"` � R < Q"9Z` � X ��Y � � R > ? �"H.H6 �� b e$� � � 9 � 9 +Z �!���� c���� �� 8 �)* %��0S�( �

� S)@"�)23/��#�# #

Page 165: Jsp servlets j2_ee

� ��������� � ���

� � ! ! ��� �����)��� ��� � � � �"!

#' & #)( * ,6-/ 0.2 � -�/ / ?���-� � 9��.-�5 = - ? 56/A@São um tipo de componentes EJB que recebem mensagens por meio de um JMS (JavaMessage Service).

Enquanto tradicionalmente os outros Beans são acessados através de interfaces (RMI-IIOP) com acesso síncrono, os Message-Driven Beans, também conhecidos pela siglaMDB, são utilizados por meio de mensagens, com acesso assíncrono.

Isso se dá por meio de um middleware orientado a mensagens (MOM), localizado entreo cliente, ��% % � �� ������# � � ��� , e o bean, �$% % � +� � ��"�% � ��� � . Este middleware recebe mensagens deum ou mais clientes e envia as mensagens para os Beans destino.

JMS é a API utilizada para receber as mensagens dos clientes e enviar as mensagensaos Message-Driven Beans.

O estado do objeto é muito simples e semelhante a um EJB Session Bean Stateless quenão mantêm o estado para um cliente em particular. Quando enviamos umamensagem para invocamos um Message-Driven Bean, o estado de suas variáveis semantêm apenas durante a invocação. Quando o processamento requerido éfinalizado o estado não é retido. São componentes que não estão associados a umcliente específico e, portanto, implementam comportamentos que atendem anecessidade de muitos cliente.

MDBExampleBean

EJB_Context : MessageDrivenContext = null

MDBExampleBean()ejbCreate()onMessage()ejbRemove()setMessageDrivenContext()

<<EJBMessage>>

CFigura 14.1 � Diagrama de Classes UML do Message-Driven Bean

Message-Driven Bean : MDBExampleBean.

Page 166: Jsp servlets j2_ee

��� ������������ "!$# %" ���# ��&'��!$�)( ��# ��* %"# !�:E%"1

- !$� )23,4* ��5��6&�# �"* %)# 761- !$� )23,4* ��5��6&�# * !�HP# 7'1- !$� )23,4* ��5��6&�# +E��!$- +�� # 761

8.8�9 H.,G� 9)Q <;� &'�"!$�)( ;:) K,.- �" $>��"H.H.���[� � � 2P- 5���+$<E����+)TZ���)2J�"H.�)+ ,G�K "HK!�\ ,G �:) H'�J�"��:)2�W 8.8 :)����- ��( �:)�K5 - :)�K�)* % ` 2.� ��,G�)X0Yi�$�)* %��"�"!� �5)��X3Yi�$ m!�\�,G :) K )+)>���H6H.�6� ��X0Y8.8 � &����"@ ,���:" $+) $2J�"���"%)- !��"+ ,G �:)�C@Z!���!l��+"HL�����"!$#��@[%"( - �K��( ��H.HK> � < 9 &'��!$�"( ��< ����+$- !$�"( �"!���+ ,GH�>�� HPHL�6�V� � 2.- 5E�"+)< ����+[T">���H.H6�6����)- HJ,��"+"��2�_

8.8�` )+ ,G� &�,G �:) C> � <"#�)2.- 5)��,G�$>���H.H6�6��� � 2.- 5)��+ ` �+ ,J��&6,4!$� H.H6�6�V� � 2.- 5E�"+ ` "+ ,���&P,.1

8.8� ,�- ( - B���:) ��"��( ��� �+E,G��- +"��2��"��2J�$- +ZHJ,G��+Z��- ��2� 9�Q <"#8.8�� ,�^)2J ��dH ` 2L����,�� 9 &�������,.- �+l��&�� ��N�W" $+)��- +ZHJ,G��+"��- ��N�W �:) D "%)* � ,G )#�"@)%)( - ��5[ �- :$�)* % ` 2J�"�6,G�)X0Yi,�^[2J �� H ` 2A����,G� 9 &����)��,�- "+$_

8.8� ,�- ( - 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� �"2J�D� H.,J�C> � <�#8.8�� � ��2J��!I!$HJ�=!��)+"H.�6� ��!�2.�"� ��%"- :��;��,�2L�65�\�H�:" m> R >�#�"@)%)( - ��5[ �- :$ )+)>�� HPH.�6� ��X0>�� H.HP�6�[�C!�HJ� Y _

,A23/ _8L8 - !$�"2.- !��K�$!��)+"H.�6���"!I2.� ���)%"- :)�e /)HL,G�E!$# �@ ,�# �)2.- + ,�( +)X��3>��"+"H.���[��! 2L��� �)%�- :)������� X0X � ��&�,�>���H6H.�6�V�"Y !�HJ�VY0# �V��, � � &6,�XGY0Y01

����,���^ X Q >�e 9 &�������,�- �+l��&�Y _� &�# �)2L- +E,Ge�,������ � 2.��� ��X0YG1e /)HL,G�E!$# ��262.# �"2.- +",�( +)X�� 9 2.2J ��� $ �%�,G�E2� �,G� &�,G $:��$!���+ZH.�6���"!������$��&�Y01

8.8�` )+ ] - �V@)2L� $� )+ ,G� &�,G D:) $>�� HPH.�6� � � 2L- 5)�"+$<"����+)#8.8�� � ��2J��!I!$��H6H.�6� � � 2.- 5)��+ ` �+�,���&6,a� E+�,���&�,G �:) $> � <"#�"@)%)( - � 5) )- :DH6� ,�>���HLH.����� � 2.- 5���+ ` �+�,G��&6,�X0>�� H.H.�6� � � 2.- 5)��+ ` �+E,G��&�,4!�� HPHL�6�V� � 2.- 5E�"+ ` "+",G��&�,�Y _

,�^[- H�# !��"H.H.�6� � � 26- 5)��+ ` �+�,���&�, ��!$� H.HP�6� � � 2L- 5)�"+ ` "+ ,���&P,.1

#' &A��� ,3? 5��.2 ,./1?���,� � -�/ /1?���- m� 9��.->5 = - ?356@Deve-se utilizar EJB Message-Driven Bean quando necessita-se de operaçõesassíncronas sendo executadas no servidor (container).

Observe que para realizarmos um processamento em paralelo no servidor sem o uso deMessage-Driven Bean, era necessário o uso de Threads em EJB Session Bean Stateless.

Page 167: Jsp servlets j2_ee

Esta prática é desaconselhada pela própria Sun MicroSystems Inc., pois recai em váriosproblemas, um deles a falta de controle dessas execuções 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 váriasinstâncias de um mesmo componente sendo executados em paralelo, para realizar amesma operação.

#' &'$ � 9J��� 2k�3-��39 � ? � -�/A/A?�� - m� 9)�.->5 = -.? 5A Figura 14.2, representa o ciclo de vida do Message-Driven Bean. Ele é bem simplescomparado aos outros beans, pois o container instancia um determinado número debeans e os mantém no pool de acordo com as necessidades e removidas quando ocontainer decidir, da mesma forma que o Session Bean Stateless. Assim que umamensagem é recebida pelo JMS, ela é redirecionada para um bean específico, paraque seja tratada.

In stân cia d o EJB Message-Dr iv en Bean

a inda não ex iste

Message-Dr iv en Bean no pool de ob jetos

1. Class.ne wInstance()2. setMessag eDr iv en Contex t()3 . e jbCr eate()

e jbRem ov e()

onMessage()

CFigura 14.2 � 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 entreduas aplicações, programas ou componentes. Um cliente pode enviar mensagens paraum ou mais receptores, que também pode retornar um outra mensagem, ou executaralgum método de negócio. Utilizando este recurso, o receptor de mensagens nãoprecisa estar disponível no mesmo momento que o cliente enviou a mensagem,podendo consumi-la, ou recebê-la posteriormente, isto é, no momento em que seuserviço estiver ativo. Assim, o cliente que envia a mensagem e o receptor da

Page 168: Jsp servlets j2_ee

mensagem devem somente conhecer bem o formato da mensagem, com os dadosque ela carrega.

Para fazer uso destes recursos na linguagem Java, foi criada uma API conhecida comoJMS – Java Messaging Service. Esta API fornece serviços que permitem a criação, envio,recebimento e leitura de mensagens. O importante a saber é que um cliente cria umamensagem e a envia utilizando esta API. Um receptor de mensagens, receberá estamensagem através de um Message-Oriented-Middleware ou MOM. Alguns conceitosmuitos usados nas referências a JMS são produtores e consumidores de mensagem(producers / consumers), para designar um cliente como um produtor de mensagens eum componente EJB Message-Driven Bean por exemplo, como um consumidor demensagens.

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 seguirredirecionada para o consumidor correto. Observe na figura, que o produtor tambémpode ser um consumidor de mensagens e que o consumidor de mensagens tambémpode ser um produtor.

CFigura 14.3 � MOM.

A arquitetura JMS é composta por cinco partes que são: Provedor JMS, queimplementa as interfaces definidas na API JMS e provê recursos para administrar esseserviço; os clientes JMS que podem ser programas ou componentes que agem comoprodutores e consumidores de mensagens; as mensagens propriamente ditas que sãoobjetos que transportam os dados do cliente para o receptor; os objetos deadministração do serviço JMS que são utilizados pelos clientes para enviar asmensagens; e os clientes nativos que são clientes que usam produtos de Messagingnativos e não da API JMS.

A seguir vamos detalhar os dois tipos de postagem de mensagens e enteder asdiferenças entre eles.

�B Point-to-Point

�B Publish/Subscribe.

� ���� ��� ���� �$��������� ��� �������������������

O conceito de mensagens Point-To-Point – PTP – é de enfileirar as mensagens paraserem consumidas. Os produtores enviam as mensagens para uma determinada fila(Queue), que são consumidas por um destinatário. Assim que receber a mensagem, odestinatário avisa ao MOM que a mensagem foi recebida e processada corretamente(sinal de acknowledge). A fila armazena todas as mensagens que são enviadas, até omomento que são consumidas pelos receptores, ou até o momento que foremexpiradas.

Observe ainda, que vários consumidores de mensagens (muitas instâncias do mesmoconsumidor) podem consumir mensagens do MOM. Este recurso normalmente é

MOM P2P1

Page 169: Jsp servlets j2_ee

disponibilizado e gerenciado pelo servidor de aplicações para processamento demensagens em paralelo.

O cliente pode enviar mensagens para o MOM, mesmo sem existir nenhum consumidorde mensagens ativo naquele momento.

CFigura 14.4 � Point-To-Point (Queue).

� ���� ��� ���� ���1���� � � � ���1�� &� ��1� � ��"� &��

No uso de � � ( � % ��� % � (�% �,� (�� – Publica/Inscreve – os clientes enviam a mensagem para umtópico (topic). Os consumidores registram-se nos tópicos que lhes são convenientes esão notificados da chegada de uma nova mensagem.

Os consumidores podem somente consumir mensagens que forão postadas depois deterem se registrado (inscrito) no MOM, isto é, as mensagens enviadas pelos clientesantes disto, não podem ser consumidas por eles. Observe que neste caso, cadamensagem pode ter mais de um tipo de consumidor.

Se algum cliente emviar uma mensagem para um tópico que não possue nenhumconsumidor registrado, esta mensagem não será entregue. Após o consumidor seregistrar, as mensagens que chegam ao MOM são notificadas aos consumidores, quefornece estas mensagens a eles.

Por haver uma dependência muito grande do tempo em que o consumidor deve estarativo enquanto o cliente envia a mensagem, os consumidores podem fazer registrosduráveis ( ���&��" ��� ) e receber mensagens enviadas enquanto eles não estam ativos. Istopermite a facilidade de uma fila, com a diferença de consumo de mensagens pordiversos tipos de consumidores.

M OM

ConsumerProducer QUEUE

Page 170: Jsp servlets j2_ee

CFigura 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* ��5��6&�# * !�HP# 7'1- !$� )23,4* ��5��6&�# +E��!$- +�� # 761

8.8�9 H.,G�;��( ��HPHL�$��&���! �"( �TE�E+�5V- �D!��"+)HL�6����+ZH�� ��2J�$@)! ] - ( �DX S)@Z��@"�"Y8.8 �"�"2J�KH6�)2��� )+"H6@)!$- :"�K�" �2�@)!I> � <"#��@[%"( - �K��( ��H.H � ��HL, ` ( - �)+ ,a_

�"@)%)( - �KHL,G��,�- ��5[ E- :m!���- +)X e�,�2.- + � � � �"2J�[HPY _� @)�"@"� ` �+)+"� ��,�- �+�S)@Z��@"� ` "+)+"�"�6,�- �+���+)@�( ( 1,A23/ _

8L8 ��26- �K $�� "+",G� &6,� ` �+E,G� &P,a��,G& ��+"��� � +Z- ,�- ��( ` �+ ,J��&6,AX0Y01

8L8 ( "����( - B��K���� "+)+Z����,�- )+ ] ���6,� )23/� @Z��@"� ` "+)+"����,�- �+�"����,G )23/mS�@"�)@"� ` E+"+Z���6,.- �+ �"���6,J �2A/ �

X � @"�"@"� ` �+)+Z���6,.- "+�"���6,J �23/ Y �6,G&�# ( ��"@)�"X��G* �65)� � � �!$� 8 ��+E5 8 * !$H 8>�/ � @"��@E� ` "+)+"� ��,�- )+�E����,G �2A/��JY01

8L8 ( "����( - B��K��S)@)�"@"�DX ] - ( �"Y� @Z��@"��S)@"��@Z����X � @"�"@"��Y �6,3&�# ( � "��@)�"X��J* �65)��� �� �!$� 8 �"+"5 8 * !�H 8 � @"��@"� � ��!����GY01

Consumer 2Producer

M OM

TOPIC

Consumer 3

Consumer 1

Page 171: Jsp servlets j2_ee

8L8 ��26- �K���� �+Z��&'W S)@Z��@"� ` "+)+"����,�- �+���S�@"�"@"� ` �+)+Z���6,.- �+ �"���6,J �2A/Z# ��2L����,G� � @"�"@"� ` �+)+E���6,�- "+)X0Y01

8L8 ��26- �K��HP� HPH�WE D:Z�K�� )+"� &PW" � @Z��@"� e"��H.H�- "+$S)@"��@Z��e ��H6HP- �+��;S)@)�"@"� ` �+)+"�"�6,�- �+Z# ��2A���6,G� � @"�"@"��e"��H6HP- �+)X ] ��( H.�"T

e"��H6H'- �+)# b� �fR�� b ` � �iR � 9� � 9 Y01

8L8 ��26- �K $H6��+":)�"2� @Z��@"� e"��+":"��2�S)@)�"@"��e"��+E:��"2 �;S)@)�"@"��e"��H6HP- �+[# ��2J�"�6,�� e"��+":)�"2.X S)@"��@E��Y01

8L8 ��26- �K�$!���+"H6�6����!��$� H�"+ 5V- �� ��&�,�>�� HPHL�6�V�D!l��H6H.�6� ���KS[@"��@"�"e ��HLHP- �+)# ��2J�"�6,G� � ��&�,�>�� HPHL�6�V�"X0Y01] )2�X0- +E,a- � �i1�- ��� 1[- ���)Y _

!$� H.H6�6����# H.� , � � &6,AX��3>��"+"H.�6���"!I+)2 � ���mX0- � c"Y0Y01e /)H.,G�)!$# "@ ,A# �"2.- + ,�( +)X0!���HLH.�6�V�"# ����, � ��&�,�X0Y0YG1S)@)�"@"��e"�"+":"��26# H.�)+ :�X !���HLH.�6���)Y01

����,���^ X 9 &����"��,A- "+��)Y _�)# ��26- +�,Ge�,G� ��� � 2J� ���EX0Y01e /)HL,G�E!$# ��&�- ,�XPc"Y01

] - +Z��( ( /=_8L8] �"��^"���K� E+E��&PW" - ] X S)@"�"@)� ` �+[+"����,�- )+ � ��+)@)( ( Y _

,A2�/ _SE@Z��@E� ` "+)+"�"�6,�- �+)# ��( �H6��X0Y01

����,���^ X Q >�e 9 &����)��,�- )+���YM_

e /)HL,G�E!$# ��&�- ,�X � Y01

Message-Driven Bean : TestMDB- !$� )23,4* ��5��6&�# �"* %)# 761- !$� )23,4* ��5��6&�# +E��!$- +�� # 761- !$� )23,4* ��5��6&�# * !�HP# 7'1

8.8 � �"HJ,���:"�m2J�"���)%"- !��"+ ,G D:"�m!��"+"HP�6�[��+"H����)( C> � <"#8.8 �Z��� ��%"�$@)!��K!$�"+"H.�6� ��! :Z K,.- �" � �� ":"��� � ��&�,�>���H6H.�6�V� � 8 �� :)�����$�C- !$�"2.- !���+" D� )+"HP "( �)#��@[%"( - �K��( ��H.H � ��HL,�> � <K- !$��( ��!��"+ ,GH�>���H6H.�6� � � 2.- 5)��+Z<��"��+�T">�� HPHL�6�V��)- HJ,J��+"�"2�_

8.8�` )+ ,G� &�,G �:) C>���H.H6�6�V��� � 2.- 5E�$<"� ��+)#�"26- 5��6,G��,�2L��+)H6- �"+ ,a>���H6H.�6� � � 2.- 5)��+ ` �+�,���&6,a��,G& ��+)@)( ( 1

8.8�� +"HJ,�j�+E��- �; $ E%"* ��,G $+Z DH.�)2A5�- :" "2��"�"( ��� "+",G��- +)�"2.#�"@)%)( - ��5[ �- :$�)* % ` 2J�"�6,G�)X0Y _

8.8 �)�"!� �5��;�C- +"HJ,Jj�+"��- �K:" $ �%)* ��,J C+Z DH6��2A5�- :) "2P#

Page 172: Jsp servlets j2_ee

�"@)%)( - ��5[ �- :$�)* %��"��!� �5)��XGY _

8.8�` )+ ] - �V@)2L� $� )+ ,G� &�,G D:) 9)Q <�> � <"#8.8�� � ��2J��!���,G&��� �+E,G� &P,J D:" m> � <"#�"@)%)( - ��5[ �- :$H6� ,�>���HLH.����� � 2.- 5���+ ` �+�,G��&6,�X0>���H6H.�6� � � 2.- 5)��+ ` �+ ,J��&6,a��,3&�Y _

,�^�- H'# �6,G&��;��,G&�1

8.8�� �"( - :)���C!��)+"H.�6� ��!�2.�"� ��%"- :��;�$�C- !$��26- !$�K+Z D�� )+ZH. �( �"#8.8�� � ��2J��!I!$��H6H.�6� �D!$�"+"H.�6� ��! �DH6��2�+Z �,A- ] - ��� :��"#�"@)%)( - ��5[ �- :$ )+)>�� HPH.�6� ��X0>�� H.HP�6�[�C!��"H.H.������Y _

,A23/ _- ] X0!�� HPHL�6�V�D- +"HL,G��+"� �� ] � � &6,�>���HLHP�6���"Y _

e /)H.,G�)!$# "@ ,A# �"2.- + ,�( +)X��G>���+"H6�6���"! 2L�����)%"- :"�D� �E( C> � <�� ��mXGX � � &P,�>��"H.H.�6� ��Y !�� HPHL�����"Y0# ��� , � � &6,�XGY0Y01

�)( HP�$_e /)H.,G�)!$# �"2P2L# �"2P- + ,�( +ZX��G>��"+"H.�6� ��! �� �!k,A- � $�"2P2J� :" � �

�m!��"H.H.�����)# ����, ` ( � H.H�X0Y0# ��� , � ��!���X0Y0Y01

����,���^ X 9 &����"��,A- "+��)Y _�)# ��26- +�,Ge�,G� ��� � 2J� ���EX0Y01

Page 173: Jsp servlets j2_ee

� ��������� � ���

� � �"! ������� � ��� �� ��������

A proposta inicial da API desenvolvida para a plataforma Java é a de prover aosdesenvolvedores os recursos básicos de infra-estrutura e permitir que eles pudessem seconcentrar na implementação das regras de negócio de suas aplicações. Assim, foramdisponibilizadas bibliotecas para trabalhar com coleções, com entrada e saída dedados, com recursos de internacionalização, entre outras.

Esta idéia foi utilizada novamente na especificação da plataforma J2EE, com o objetivode prover implementações para problemas recorrentes de aplicações distribuídas,agilizando seus tempos de desenvolvimento e permitindo que o foco dodesenvolvimento fique nas regras de negócio a serem atendidas, deixando os recursosde infra-estrutura complexos a cargo dos fabricantes dos containers. Desta forma, háum aumento significativo nas chances das necessidades dos clientes serem atendidase, por consequência, os sistemas construídos serem bem sucedidos.

Entre a gama de serviços previstos na especificação da plataforma J2EE ligados aosEnterprise JavaBeans, serão abordados dois dos mais usados: transações e segurança.O primeiro serviço serve para garantir a integridade dos dados, permitindo que falhas eexecuções concorrentes não tornem as informações gerenciadas pela aplicaçãoinconsistentes. O segundo serviço trata da proteção da aplicação com relação aoacesso não autorizado às funcionalidades disponibilizadas por ela.

� ��������������� �"!"#%$&�Tipicamente os sistemas provêem funcionalidades para seus clientes baseados em umamassa de dados armazenados em um meio peristente. A integridade das informaçõesarmazenadas neste repositório é fundamental para o correto funcinamento do sistemae muitas vezes a perda de informações pode causar prejuísos para seus usuários.

Os problemas relacionados a manutenção da integridade das informaçõesarmazenadas em um meio persistente podem ser causados por fatores físicos oulógicos. Dentre os fatores físicos podemos destacar a falta de energia elétrica durante oprocessamento de uma funcionalidade que envolva várias operações sobre os dados.Já fatores lógicos estão relacionados com erros na programação do acessoconcorrente aos dados, onde alterações realizadas por um processo podem sersobrepostas por outros processos executando de forma concorrente.

Page 174: Jsp servlets j2_ee

Estes problemas são significativamente agravados quando estamos desenvolvendo emum ambiente distribuído. Uma vez que partes de nossas aplicações podem serexecutadas em máquinas diferentes, há a chance de uma delas quebrar sem que orestante da aplicação tenha conhecimento disto, fazendo com que uma operaçãorealizada pela aplicação seja executada parcialmente, o que pode corromper osdados sendo manipulados. Também há a chance de uma infomação ser alterada poruma parte da aplicação sem que a outra seja notificada, o que também ocasionaresultados errôneos.

Como solução a estes problemas, foi desenvolvido o conceito de transações. Paratanto é feito um agrupamento das operações realizadas em uma determinada porçãodo software em uma unidade denominada transação, que apresenta quatropropriedades fundamentais, chamdas de ACID:

�� Atomicidade - garante a completude da execução das operações de umatransação, ou seja, ou todas as operações de uma transação são executadas ounenhuma operação é realizada. Caso não seja possível completar uma operaçãoapós outras terem sido executadas, deve ser possível anular o efeito destas últimaspara atender a esta propriedade.

�� Consistência - garante que o conjunto de operações que compõem uma transaçãonunca deixem o sistema em um estado inconsistente.

�� Isolamento – garante que a execução de uma transação não seja afetada pelaexecução de outra transação. Esta propriedade é especialmente importantequando há aplicações concorrentes que acessam os mesmos dados, uma vez quedurante a execução de uma transação os dados podem ficar temporariamenteinconsistentes, levando outras transações que utilizam estes dados a produziremresultados incorretos e possivelmente violarem a propriedade de consistência.

�� Durabilidade - garante que os resultados obtidos em uma transação sejamarmazenados em um meio persistente.

Para ilustrar estas propriedades, vamos utilizar como exemplo uma transação bancáriade transferência de fundos de uma conta corrente para outra. Suponha a existência daseguinte classe responsável por realizar a transferência:

Classe usada para demonstar propriedades transacionais.������� � �� ��H.H ������� _

���� � �������� � ������ ��������ZH������������� ������� �!� ` `#" ` ������� ` �$�%������� ����&� '(��)+* ` ������� ` ���,�%�������+���"H���� ����*

��������� �+)-���$����������. _��� ���$�%� ��� ��DH&�0/��KH&��� ���DH,�$� � �� ����� �+�������$����$H����1������� �������� � " ����� '2��) � '(���Ge���� ��� " . � )-����������� ��.

� /������3����� e���� ��� � �"H,�$�4� �� ����������5������� � ��� " � b ����$��� � �+����� '(��) � �6�������-�����H,��� ���7� '8�$�������$H������$�%� ���1��� �9)-���$������� ��.;:

����� '2��) � ������� ����� " )+���<���=�$����.;:����H%� � �>� � �������� ����� " )-��������������.?:

���� � �

A necessidade da primeira propriedade pode ser logo vista nas duas últimas operaçõesdo método de transferência entre contas correntes. Caso logo após a primeira

Page 175: Jsp servlets j2_ee

operação ser processada ocorra uma queda do sistema, por falta de energia elétrica,por exemplo, o montante será reduzido da primeira conta mas não será creditado nasegunda. Isto significa que o montante iria simplesmente desaparecer, tornando a basede dados do sistema bancário inconsistente.

A segunda propriedade diz respeito à demarcação dos limites da transação. Elagarante que uma transação conterá um método de negócio completo. Assim, no casodo método de transferência entre contas correntes, não seria possível inclir a operaçãode débito em uma transação e a de crédito em outra, pois neste caso ao final daprimeira transação o sistema estaria inconsistente.

O isolamento diz respeito a tornar a execução em paralelo de transaçõesindependentes. Como a consistência só é garantida no término de uma transação, épossível que durante sua execução o sistema esteja num estado inconsistente (noexemplo esta situação seria atingida no momento após a operação de débito e antesda operação de crétido). Assim, caso uma outra transação seja iniciada enquantouma primeira ainda não terminou, é possível que seus resultados não sejam corretos,uma vez que a premissa da consistência é que o sistema estaria inicialmenteconsistente.

A última propriedade trata da confirmação dos resultados efetuados pelas transações.Neste caso, após a confirmação das operações, seus resultados são efetivamentearmazenados em meios persistentes. Assim, é garantido que em caso de falhas nosistema após o encerramento da transação, seus resultados ainda poderão ser vistosapós o restabelecimento do sistema.

��� ��� ��� ���� �������������� ����� � �

O uso de transações traz muitas vantagens e garante a integridade dos dados, mas háum custo alto em utilizá-las. Os controles que são utilizados para garantir aspropriedades ACID podem tornar uma aplicação lenta de tal forma que se torne suautilização inviável. Assim, este recurso deve ser usado de forma consciente, ficando acargo dos desenvolvedores determinar as operações de negócio que necessitam detransações e as que não. Ele também deve determinar a melhor forma de agrupar asoperações em transações.

Na especificação J2EE há duas formas do desenvolvedor informar aos containers EJBquais são as operações transacionais e como elas devem se comportar com relação àsoutras: uma forma programática e outra declarativa. A primeira forma consiste nainclusão no código fonte dos EJBs instruções para que as transações sejam iniciadas eterminadas. Uma vez que o controle todo de quando as transações iniciam e sãoconcluídas faz parte da especificação do bean, este tipo de delimitação é chamadade BMT (Bean Managed Transaction).

A forma declarativa de determinar os limites das transações é feita através deinstruções nos arquivos descritores dos EJBs. Desta forma, o próprio container fica a parda existência das transações no momento do deploy e é capaz de controlar suaexecução. Este tipo de transação é chamado de CMT (Container ManagedTransaction) e permite um elevado grau de flexibilidade para mudanças na política decontrole de transações da aplicação. Os dois tipos de transações serão discutidos comdetalhes nas próximas seções.

Page 176: Jsp servlets j2_ee

������� ����� � ����� �

Transações BMT (Bean Managed Transactions) ou programadas permitem maiorcontrole por parte do desenvolvedor, pois ele é que insere em seu código instruçõesque indicam o momento em que a transação foi iniciada, o momento em que ela foiconcluída com sucesso ou que ocorreu um erro e a transação deve ser abortada.

As instruções para o controle das transações são disponibilizadas numa API chamadaJTA (Java Transaction API). Ela permite o acesso transparente aos mais variadosgerenciadores de transações disponíveis nos containers. A implementação da Sun paratal API é o JTS (Java Transaction Service).

A comunicação com um gerenciador de transações se inicia com a obtenção de umareferência para a interface javax.transaction.UserTransaction, que é feita através docontexto do EJB. Esta interface permite enviar comandos para delimitar o início de umatransação (begin), conclusão com sucesso (commit) ou solicitar que as operaçõesrealizadas sejam descartadas pela ocorrência de falhas (rollback). Abaixo um exemplode uso de uma transação gerenciada pelo bean em um método que realiza atransferência 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 transações pode ser utilizado apenas Session Beans e Message DrivenBeans. Os Entity Beans exigem um maior controle do container sobre suas ações eportanto não tem disponível o gerenciamento de transações feito por ele próprio.

������� ����� � ��� � �

Transações CMT (Container Managed Transactions) ou declarativas podem serutilizadas com qualquer tipo de EJB. Neste tipo de transação não há a necessidade deprogramação explícita das delimitações das transações, esta tarefa é efetuadaautomaticamente pelo próprio container. Para tanto, é necessário informar nosdescritores dos EJBs a necessidade de suporte transacional às operações e como eledeve gerenciá-lo.

Page 177: Jsp servlets j2_ee

Uma vez que não há a necessidade de inclusão de cógido específico para gerênciade transações, a flexibilidade de mudança da estratégia 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 inclusão de suporte transacionalnum EJB pra gerenciamento de contas bancárias:

Exemplo de descritor - ejb-jar.xml:� � � � �� ��H6H���)+��� ���;���"H����� ������� �

� ������ ��� �$�$��� �!�%���"H&���� � ����� )+�<� /���� �

� � � �����>��)-���� ����$�� � � � � ��������) ���� ) ��� /��������$��)-��� � � � ) ��� /�����������) ���

� � )+�<� /������� � �%���)H����&�?� �,� ����� ��������$�>� ����� � � �!�����ZH�?�&��� �&� ���������

� � ������ ��� ������� �������"H&���� � �����

� ������ ��� �$�$��� �!�%���"H&���� � ����� )+�<� /���� �

� � � �����>��)-���� ����$�� � � � � ��������) ���� ) ��� /��������$��)-���%�������"H%� ���������� ������� ����� � � � ) ��� /��������>�=) ���

� � )+�<� /������� � �%���)H����&�?� �,� ����� ��� � ���$���<������� � � �!�����ZH�?�&��� �&� ���$�����

� � ������ ��� ������� �������"H&���� � ������ � ��H6H���)9��� ���;���"H����� �<� ��� �� � � � �

O suporte a transações é definido dentro do assembly-descriptor. Nele são definidos,para cada método do EJB, qual o seu atributo transacional. Observando o exemplo,verifica-se que para o EJB chamado �������� são definidas dois blocos de transações. Noprimeiro é definido o atributo Required para todos os seus métodos através do uso dowildcard *. Logo em seguida este atributo é sobreposto para o métodotransferenciaEntreCC, modificando o atributo para ��� �������� � .O atributo transacional, citado acima, é usado para dizer ao container como astransações devem ser efetuadas quando os métodos especificados são chamados.Deve-se levar em conta que o cliente do EJB, que pode uma aplicação Swing, umServlet ou mesmo outro EJB, também pode estar usando transações para efetuar suastarefas e a chamada a um método do EJB deve levar isto em conta. Tendo isto emmente, a segir serão mostrados os possíveis atributos transacionais definidos naespecificação EJB 2.0 e o comportamento do container para cada um deles.

�� Required (Requerido): Configura o bean (ou método) para sempre executar emuma transação. Se a chamada for feita dentro de uma transação no cliente, achamada de método passará a fazer parte desta transação. Caso contrário, umanova transação é criada.

�� RequiresNew (Requer novo): Utilizada para que o método do EJB sempre executedentro de uma transação nova. Assim, o método executará dentro de umatransação própria que será encerrada quando o método termina sua execução.Caso o método seja chamado dentro de uma transação do cliente, esta é

Page 178: Jsp servlets j2_ee

suspensa, é criada uma nova transação para o EJB, executada e finalizada, e sóentão a transação do Cliente é retomada.

�� Mandatory (Mandatório): Indica que o método somente pode ser chamado dentrode uma transação do cliente. Diferente do Required, que caso o cliente não estejanuma transação cria uma nova, este atributo gera uma exceção se sua chamadanão for dentro de uma transação.

�� NotSupported (Não Suportado): Usado para indicar que o método não irá executardentro de uma transação. É o complementar do Required, ou seja, caso o clienteesteja ou não dentro de uma transação o método será executado sempre fora deuma transação.

�� Supports (Suportado): Nesta modalidade, o método do EJB será executado em umatransação caso o cliente esteja em uma transação. Caso contrário, o EJB seráexecutado sem nenhuma transação. Este é o caso menos recomendável para usode transações, uma vez que os resultados da execução são inesperados, devido àdependência do suporte transacional do cliente.

�� Never (Nunca): Utiliza-se este atributo quando o EJB (ou método) não pode serchamado por um cliente que esteja dentro de uma transação. Caso isto ocorra élançada uma exceção. Normalmente usado quando o método acessa algumrecurso que não é transacional e portanto não é capaz de prover as garantiasdefinidas para as transações.

A seguir apresentamos uma tabela que demonstra os efeitos do uso de cada atributode transação. No exemplo, temos um cliente e um EJB, os quais apresentam transaçãoou não. Temos duas transações, a transação � - T1 - e a transação � - T2. Observe osefeitos de cada atributo de transação, quando o cliente define e não define umatransação.

Atr i bu toTransac ional

Transação do Clien te Transação do Bean

RequiredNenhuma T2

T1 T1

Requires NewNenhuma T2

T1 T2

MandatoryNenhuma Exceção

T1 T1

NotSupportedNenhuma Nenhuma

T1 Nenhuma

SupportsNenhuma Nenhuma

T1 T1

NeverNenhuma Nenhuma

T1 Exceção

��������� ���������������������� ���!��"#�%$'&(�)�)��*(&%�+��������&($-,+�.�/&.�0� &'$(�%*'�(���1,2�-*%�-,3�0�

Page 179: Jsp servlets j2_ee

�&$���� � � �"! �Em uma aplicação J2EE, há duas formas que os clientes devem ser avaliados no acessoao sistema e aos componentes que ele utiliza. Para um cliente acessar um sistema,inicialmente ele deverá estar autenticado no mesmo. Autenticar um cliente significaque o sistema deve verificar se o cliente é quem ele diz que é. Para isso o mesmodeverá fornecer algumas informações como usuário e senha, ou algum código deacesso ou algo parecido. O sistema autenticará o usuário e sendo assim, associará omesmo a uma identidade de segurança pré estabelecida, tal como um perfil deadministrador, coordenador ou atendente por exemplo.

Assim que o usuário é autenticado e acessa o sistema, este último deverá apresentarformas de autorizar o usuário a acessar operações do sistema válidas para o seu perfilde usuário. Por exemplo, se o perfil do usuário é de atendente, o mesmo não poderiaacessar a operação de relatórios gerenciais.

A autenticação é feita antes de realizar as operações nos EJBs e veremos mais adianteas formas que podem ser utilizadas para tal. Já a autorização é realizada durante achamada de métodos dos EJBs, que permitem ou negam o acesso de determinadoperfil de usuário.

Veremos a seguir uma breve explicação da API JAAS e como utilizá-la

�������

JAAS (Java Authenticated and Autorizated Service) apresenta interfaces quepossibilitam que usuário sejam autenticados e autorizados em aplicações J2EE. Comisso, permite que o usuário acesse sistema e operações dele, não importando como éimplementado pelo fabricante do servidor J2EE. E assim, o servidor J2EE se encarregade localizar os dados dos usuários que estão aptos a acessar o sistema, o perfil de cadaum, possibilitando os mesmos de acessarem operações específicas oferecidas pelaaplicação em questão.

Um usuário poderá acessar um sistema e estar autenticado para o mesmo, sendo eleuma aplicação Web ou uma aplicação standalone. Isso deverá ser transparente para ousuário, sendo que a aplicação J2EE poderia prover as duas interfaces para o usuáriocom as mesmas funcionalidades.

� ��� � � � �� ���

Em versões mais antigas da especificação EJB não havia uma API que definia osserviços necessários para operações de segurança. Com a criação da API JAAS isto foipossível e autenticar um usuário ficou mais simples e portável.

Com foi dito anteriormente, um usuário poderá acessar um sistema por uma interfaceWeb ou standalone, sendo que a aplicação deverá prover os mesmos recursos para ousuário. Em interfaces standalone, a autenticação parece ser mais simplista, tendo aaplicação que utilizar a API JAAS para autenticar o usuário, a partir das informaçõesfornecidas pelo mesmo.

Em interfaces Web isto também é necessário, sendo que o usuário também deveráfornecer informações como usuário e senha para o servidor Web que irá verificar aautenticidade da informação. Para fazer isso, o navegador poderá apresentar quatro

Page 180: Jsp servlets j2_ee

formas de realizar uma autenticação que são: Basic Authentication (AutenticaçãoBásica), Form-Based Authentication (Autenticação baseada em Formulários), DigestAuthentication (Autenticação com Mensagem Alterada) e Certificate Authentication(Autenticação com Certificado Digital).

Iremos a seguir detalhar cada uma delas.

�� Basic Authentication - o navegador apresenta uma tela de login e fornece aoservidor o usuário e senha para a autenticação. Esta tela depende do navegadorque está sendo utilizado.

�� Form-Based Authentication - a aplicação fornece uma página HTML (que poderáser gerada por um JSP, por exemplo) com um formulário no qual o cliente informariao usuário e senha. Para isso, há um padrão utilizado pela API JAAS.

...� � ����) )-�<�!/����� ����� H�� �#���� � ��� � � � H������� � ��� � �/��� � ���� H,������� � � � � ������� � � ���� �4����5�� �6����)-�� � � � �"H����,�$��)-����������>/���� � � ������� � � ���� ������HPH � ����� �6����)-� � � � ��� H.H � ����� ���

� � ������)��

...

�� Digest Authentication - para este tipo de autenticação é usado um algoritmo paraconverter o usuário e senha em um texto ilegível à leitura, dificultando que usuáriosmau intencionados descubram estas informações. Esta informação é passada aoservidor que utilizando do mesmo algoritmo, autentica o cliente em questão.

�� Certificate Authentication - o servidor recebe do cliente um certificado digital peloqual será autenticado.

Assim que o cliente é autenticado pela aplicação, o mesmo estará associado a umaidentidade ou perfil, que será propagado por toda a aplicação e utilizado pelo servidorpara a execução dos métodos dos EJBs, isto é, o seu perfil será utilizado na suaautorização.

� ����� � � ����

Estando cliente autenticado, ele deverá ser autorizado a realizar certas operaçõesfornecidas pelo sistema, de acordo com o seu perfil de usuário. Para isso, a aplicaçãodeve estar configurada com security policies ou regras de segurança para cada serviçofornecido por seus componentes, isto é, para cada método de cada EJB.

A autorização pode ser apresentada de duas formas: Autorização Programática ouDeclarativa. Na Autorização Programática o programador deve implementar averificação de segurança no EJB, isto é, deve verificar qual usuário está acessando oserviço e validar o mesmo. Na Autorização Declarativa o container realiza toda avalidação de segurança, não sendo preciso implementá-la. Para isso, deve-seconfigurar no deployment descriptor as propriedades de segurança para cada EJB epara cada método do mesmo.

Em um mundo perfeito, o melhor forma a utilizar é a Autorização Declarativa. Haverácasos que será necessário mesclar as duas formas de autorização, sendo que somentea declarativa não será suficiente. Por exemplo, se em uma rede de lojas um usuáriocom perfil de gerente pode acessar o serviços de obtenção de relatórios gerenciais,

Page 181: Jsp servlets j2_ee

sendo somente permitido acessar esses dados das redes de uma determinada praça(região de São Paulo, por exemplo), se faz necessário incluir uma validaçãoprogramática da região da rede de lojas que o gerente em questão atua.

��� ��� � ��� + �������

O conceito de security roles é simples, mas necessário para o entendimento do uso deautorização. Uma security role é um conjunto de identidades de usuários (identity). Paraum usuário ser autorizado a realizar um operação por exemplo, sua identidade deveráestar na correta security role (perfil) para a operação em questão. O uso de securityroles é interessante, pois o desenvolvedor não precisa especificar o perfil do usuário nocódigo do EJB.

� ����� � � ������ � � � � ����� � � �

Para realizar a autorização de forma programática, se faz necessário obter asinformações do usuário autenticado na implementação do EJB. Isto deve ser feitoutilizando a interface javax.ejb.EJBContext que fornece os métodos ��� � ��� � ���� ���� � ��� � ��� ��� e� ������ � ���� ������� ����� . Vejamos a seguir os métodos desta interface.

������� � � �$�����!������ � ������5 � � � � � ���> ��2�������<5�� � � �������� � � ���(� � H,������%� � � � � �&� �$�� ������'������ ��� � ��� � ��� �>�� ����� " .;:������� � ������ �����+� H �2��� � ����� ������� � " ���!�%� ��' ����� �� ��)-��. :� � �

O método ��� � ��� � ��� �� � � ��� ���� ��� fornece informações do usuário atual, autenticado no sistema.Este método retorna o objeto ! ��"���# ������$� � � ��# ���� ���%� � ��� no qual pode-se obter informaçõesimportantes do usuário, utilizadas para a sua autorização.

O método � � �&������� ��� ��� ��� '�� ��� ��� ����� ��(���)*��� verifica se o usuário atual está dentro de uma securityrole específica. Dessa forma, pode-se realizar a autorização para um determinadoserviço do EJB de forma programática.

Vejamos a seguir um exemplo de deployment descriptor, configurando secutiry roles elinks para as security roles reais. Esta última propriedade pode ser configurada, pois emtempo de desenvolvimento o programador pode definir uma security role dentro do seucódigo e depois no momento da instalação do sistema, a security role real tem umnome diferente, então cria-se um link para o nome correto.

� � �� ���$�����&����� H������������)H �

� H&�"H.H=� ��� �

� � �� H��������� ����� �%��� ��� �%��� �

� ����H%���� �<� � ��� � � ���!��� �$���0�EH,� ���%� �� %' ����������� � � ����H&��,� ��� � ��� �� ����� �����>��)-� �%'(���%������� � � ����� ��������) � �� ����� ����� � ��� ��)-�����<'(��� � � ����� ����� � ��� �

� � H%�������� � ��������� ������������ � �

Page 182: Jsp servlets j2_ee

� � H&�"H.H,� ��� �� � HPH���)+��� ���4����H&���� ������� �

� � �� H��������� ����� �%��� ���

� ����H%���� �<� � ��� � � ���!��� �$���0�EH,� ���%� �� %' ����������� � � ����H&��,� ��� � ��� �� ����� �����>��)-� �,)-���>�&'(��� � � �%��� ��������)-���

� � H%�������� � ��������� ���� � �

� � � HPH%��)0��� ���4���"H���%� �<����� �� � ����� ���,����� H������������ZH �� � �

� ����� � � ���� ���� ����� � � � � �

A diferença de utilizar autorização declarativa ao invés da declaração programática éque não há a necessidade de programar a autorização, necessitando somente deconfigurar o deployment descriptor, definindo qual para cada EJB a security role a serutilizada. Pode-se definir uma security role para todos os métodos do EJB, ou definir umaespecífica para cada método. Há a possibilidade de excluir métodos que não deseja-se que seja acessado por nenhum perfil de usuário, e isto também deve ser feito nodeployment descriptor.

Observe que se alguma operação realizar uma chamada a algum método com umperfil inadequado, isto é, com um perfil que não foi configurado ou definido para ométodo, o container lançará um exceção do tipo ! ��"���# � ������# '���� $���� � ����� ������� � � � .Vejamos a seguir um exemplo de deployment descriptor, configurando security roles eas permissões para os métodos dos EJBs.

� � �� ���$�����&����� H������������)H �

� H&�"H.H=� ��� �

� � �� H��������� ����� �%��� ��� �%��� �

� ����H%���� �<� � ��� � � ���!��� �$���0�EH,� ���%� �� %' ����������� � � ����H&��,� ��� � ��� �� ����� �����>��)-� �%'(���%������� � � ����� ��������) � �

� � H%�������� � ��������� ������������ � �

� � H&�"H.H,� ��� �� � HPH���)+��� ���4����H&���� ������� �

� � �� )+�<� /���� �?�����%)0� HLH,� ��� �

� ����� �����>��)-� �%'(���%������� � � ����� ��������) � �� ) ��� /���� �

� � � ��������)-�������> �� � H���� � � � � ���?����)-���

Page 183: Jsp servlets j2_ee

� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���� � )+��� />��� �

� � )+�<� /�������������)+� H.H,� ��� �� � �

� � �� )+�<� /���� �?�����%)0� HLH,� ��� �

� ����� �����>��)-� �%'(���%������� � � ����� ��������) � �� ) ��� /���� �

� � � ��������)-�������> �� � H���� � � � � ���?����)-���� )-�<� /�����������)-� �&���� � � )-��� /������ �$��)-� �� � ) ��� />��� �

� ) ��� /���� �� � � ��������)-�������> �� � H���� � � � � ���?����)-���� )-�<� /�����������)-� �%'(� � � )-�<� /������?����)-� �

� � )+��� />��� �� ) ��� /���� �

� � � ��������)-�������> �� � H���� � � � � ���?����)-���� )-�<� /�����������)-� �%'(����� �������$� � � )-��� /$�����?����)-� �

� � )+��� />��� �� ) ��� /���� �

� � � ��������)-�������> �� � H���� � � � � ���?����)-���� )-�<� /�����������)-� �&��� �#�����ZH������ � � )+�<� /������?����)-� �� )-�<� /������������%��)�H ��� ������'2��� � � )-����/��������$������)�H �� )-�<� /������������%��)�H ��� ������'2��� � � )-����/��������$������)�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 aplicação J2EE, teremos com certeza casos em que serviços de alguns EJBsutilizam serviços de outros. Dependendo da aplicação, poderíamos querer que aidentidade do usuário (perfil) seja propagado para os métodos que estão sendochamados pelos próprios EJB para outros EJBs, ou em vez disso, definir um perfil paraexecutar um determinado método em um EJB específico.

Page 184: Jsp servlets j2_ee

Imagine uma situação em que um cliente acessa um serviço de cálculo de um certoimposto para a venda de um produto. Chamaremos este como serviço �������� do EJB � .Este método chamaria outro método do EJB � , o método � ������� . Podemos definir naaplicação, que este último método execute com a identidade do chamador, isto é,utilize a mesma identidade do cliente que chamou o método �������� do EJB � . Ou aindapoderíamos definir que o método � ������� do EJB � rodasse com uma nova identidade,definida pela aplicação. Essas duas opções podem ser configuradas no deploymentdescriptor da aplicação. Vejamos um exemplo a seguir:

� ���$�����&����� H������������)H �� H&�"H.H=� ��� �

� � � ��������)-��� � � � � � ��������)-� �

� � �� H��������� ����� � �������!� � � �

� �ZH����;���� � ����?� ������� � ��� � �� � H%�������� � ����� �������!� � � �� � �

� � H&�"H.H,� ��� �� H&�"H.H=� ��� �

� � � ��������)-���� � � � � ��� �$��)-� �

� � �� H��������� ����� � �������!� � � �

� �������4��H �� �!�$� ��� �$��)-� �%'����%������� � � ����� � �?����)-���

� � ����� �;��H �� � H%�������� � ����� �������!� � � �� � �

� � H&�"H.H,� ��� �

� � HPH���)+��� ���4����H&���� ������� �

� � �� H��������� ����� �%��� ���

� ����H%���� �<� � ��� � � ���!��� �$���0�EH,� ���%� �� %' ����������� � � ����H&��,� ��� � ��� �� ����� �����>��)-� �%'(���%������� � � ����� ��������) � �

� � H%�������� � ��������� ���� � �

� � � HPH%��)0��� ���4���"H���%� �<����� �

� � ����� ���,����� H������������ZH �

�� ��� � �

Veremos a seguir, um exemplo de módulo de segurança utilizando a API JAAS. Observeque não provemos uma implementação específica para o módulo, sendo o intuito

Page 185: Jsp servlets j2_ee

mostrar somente um esqueleto com os métodos principais que devem serimplementados conforme o contrato estabelecido pelas interfaces. Fica a cargo doleitor implementar os métodos se desejado.

ExampleLoginModule.java���� �<��'(�-���) � ����� � � �<5=��)+��� � � H��������� � �(:

� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � H&��� � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � � ��' � � � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � ���� � ������ � � :

��� �$5���)+��� � ���7)�������� ����+� �<'8� �+�������+������� � B���� � ����� ����� � ���N ���-���0�EH,� ���%� � ���� �ZH���� �� ��HPH%�0�����-�����%��H&������� � )+��� ��)-��������N�����*)H���)-����� �KH&���>���7�>) ���������-���+������� � ������ ��������-��&� � N ���-���+��) )����$�>� ����+� ��' � � �������� � �� ��H.H��5���)+��� �����<' � ��� ������� � � )+��� ��)-������H�����' � ���1�����>� �

��� ��������� H,����� ���) ' ��������>�7� ��������)-��N�O��"H �%��� ���� ���>������H1�+��)-������ � ������� " �� � ����� ��. ����&� �(�&��� ���(� � ��&�aH���� � ��&� �>��� � :

��� � ��� �� ��� � B<��0)�������� �-���0� �<' � � ���� �)H%���+) �����������+��5�������������7����� �-���������5����-���7� �<'8� ��*������"H ��H,�>� � �ZH������>�� ��N ����*��� ���) �0���%�����"H,� ��� ���0� �>� �� ��� � B���� ��H%� �+)����$�>� ����) � ��������)-��N�O��"H �%��� �����������"H ������ H,���0�ZH�� ����� ��������)�H=��� � ��<�aH,��� � ��&� ��H,���1����� ����� � ������ ����� ��������) ���� � �������/����>��� ���1/�������� �$�1�$� � � � B<����� �����%�KH&�+���)+�>��� ����1���) �+�� � ������� ����� ��������)�H=/����%��� ��� �&��� � H��������-���)+�$���?�!� � /������-���) ���$� ���"H )�������� � H ����� ��������) �$�<��� ���ZH1���"N�O��"H �"H=������ �4� ������ H ��� ������ � '2������N ���-���0� �<' � � �������� � ������ �7� ��� � � ��� � B�� " ����� � ��&�4H&��� � ���� * � ��� � ���� � � ���>��� ���1���� � �������/>�=�>��� ����*

� ����H,/>���%��������������*�� ��� ����� � ���"H,.� /(� H � H,��� � ����� ;H,��� � ��&�!:

��� �)H%���+) �����������0���!� � � B������7�����%����$�����$� � ����1�0�ZH,�����%� � ����� ����� ����� �(������������� �%�DH&�-� ����������� � ���N �$�DH%�0������� � B<���1���)IH,�>�� H.H,��*��� ����� H,�-�� H,�-������ � ���,� � ����� � /���� �dH����<' � �>��5������� � ���-��5���"N ���-���-������� ��� ����������� � ����1�0�"H,� ����� � �������� � ������� �����0� ��' � � " .8�!/��%��� H���<' � ���$5���$�<� � ���

����� ���$�+���$�������!� ����1�0�ZH,������� �-�$H�����/�����-�� � ������� �����-��H%��� � ���$��������� ���� HPH%���� � H.H&�+�������$H����6����� � �0�����1��� �$��� ���-���+���%���$���!� � � H,* � � � � *��������� ���� �

��� � � � � � B<�����-�������-������� � B<���1�+���)+)+� � �������� ����� � ���N ��� ����� ����� ����� �(������������� �%�DH&�-�$�<��� �(����H�����"H.H&�7�$� ��$)-)+� � *������ H,�-���H&�+������ � ����� � ����� � /���� �dH����<' � �>��5������� � ���-���H&�-����� /$� �+���)+)+� � �������� � ������� �����+���)+)+� � " .8�!/>��� � H���<' � �>��5������� � ���

���<�!���%�-� ���>��:�

Page 186: Jsp servlets j2_ee

��� � � � � � B<�����-����� �������!� ��� �0�������� HPH��+���+���$�����$� � �� N ��� ���� � />��)-�����7����� �-���������5����-���7� �<'8� ��H��+� ����� ����� � ���N ��� ����� /$��� ����� ����� ����� �(������������� �%� ���H,�0/$� � �;H,����"H6H��+���-�������!� *$����� H&�-���H%�+������!� ����� � ����� � /���� �dH����<' � �>��5������� � ���-���H&�-����� /$�7���-�������?� �������� � ������� �����+�������?� " .2��/������ H �>��' � ����5�����<� � ���

���<�!���%�-� ���>��:�

��� � � � � � B<�����-������� ������� �����1�0� ��'����$� �>�7�ZH,�����&� �-����������� � ������ ���� � H���� � )+��� ��)-��������N����-�����(��� � ���"H%� ����� �6� � ��� ���� ���������� � �%���������� ��� H ���$H,��� � ��<� " �� � ��������. ����� ����� ����� �(�������>��� �%�-���H%�+�0� �<'(���$� ������� �$� ���)IH����� HPH&��*$����� H��+�� H��+������ � ����� � ����� � /���� �dH����<' � �>��5������� � ���-��5���"N ���-���H&�-�0� �<' ����� ����� /�� �������� � ������� �����0� ��'(����� " .8��/���� � H �>��' � ����5�����<� � ���

���<�!���%�-� ���>��:�

ExamplePrincipal.java���� �<��'(�-���) � ����� � � �<5=��)+��� � � H��������� � �(:

� )+�����?� � �<�(� � H&�������� � � � � :

��� �>�����!��H&������� �0�ZH,������� �-��H,��� ���$�����$� � ������ �������� � �� ��H.H��5���)+��� � � ��� ���� �����>� )+��� ��)-�����GH � �&� �$�� ������

��� #��)-� ���7�ZH,������� � ����&� �(�&��� ��� �&� ��' �>��)-� -�(��� � :

��� � ���"H%� ���$�����1��)H!� ��)+� B<����� ����� ��������) ����)-� �>��)-� ���7�ZH,������� � �������� � ��5���)+��� � � �%� ���� ����� " �<�!��� ��' ����)+��.

� /(� H � �>��)-� +����)-��:�

����� �<� ��) �0�$��)+� ���7�EH,� ���%� � ����� ����� �����+����)-� ���0�"H&� ����� � �������� � �<�!�&� ��'+'2��� ��)-� " .

���<�!���%�0����)-��:�

��� � )+��� ��)-��������N���� ���+)���������� �����>��� H ������ ����� ��� ��DH��0�>) ��� � ����� �0� ' �����$� �"H���� ����� ��������) �$� � ��� � �<� �-�DH���� ���)+����������� ����� ����� ����� �(������������� �%� ���H,�+�+��� � ������H,� � � � ' �����>� �"H�����*$����� H&�-���H&�-������!� ����� � �������� � ������� �����+��������� H " � � � ��&� ��� � .

� � " ��� � � �!/�� H,.�%��������� ��������:

Page 187: Jsp servlets j2_ee

� � " � " ��� � � �ZH�����������<� ��5���)0��� � � ��� �$�� ����� .;.�%��������� ����� H%�$:

���<�!���%�0����)-� � �������� H ";";" ��5���)+��� � � ��� ���� ����� . �$� � . � '���� #��)-� " . .;:�

��� � )+��� ��)-��������N���� ���+)����������-/���H,/ �2���>� ���� � ��������)-�-��)-� �/��<�(� ���0/�� H,/+�$� � � � B<����������%��"H����+��� � ����� ����� ����� �����-�/>�&�(�-���7/>��H,/ �������� � � ��� />��H,/ �2����� " .�

���<�!���%�0����)-� � />��H,/��2���>� " .;:�

��� ���<� ���������) ��H��!�&� ��'0���) � ��������)+��N�O��"H ���0�"H&� ����� � ����� ����� ������H%� �,� ��'0���) � �������%)+��N�O$� H ���0�"H,� ����� � �������� � �<�!�&� ��'+�������!�%� ��' " .

���<�!���%�0����)-��:�

ExampleRoleGroup.java���� �<��'(�-���) � ����� � � �<5=��)+��� � � H��������� � �(:

� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � H&�������� � � � � :� )+�����?� � �<�(� � H&�������� � � � ���� � � :

��� � �>���"H����$����+�"H�������� �����+������� �7� )+��� ��)-���<� ��N ������+��) ' ��������>�7�ZH,������� �"H �������� � �� ��H.H��5���)+��� ������� � � �%����� ��5��������)H �$5���)+��� � � �&� ���� ������� )9��� ��)-�����GH � �������

��� � ���"H%� ���$�����1��)H!� ��)+� B<����� ����� ��������) ����)-� �>��)-� ���7�ZH,������� � �������� � ��5���)+��� � �>��� � � �%���>� " �<�!��� ��' ����)-��.

��� � )+��� ��)-��������N����-���-����ZH������������ � � ��

��� � ��� �� ������0�"H�������� ���) �(��� H�� �$� ���' �����$� ����� ��������) �)H���� �"H,� ����� ��DH&���1���$� �� ���$��������-' ������� ����� ����� ����� �(�������>��� �%��H��+�0�)H&������� ����������(� �� ���������-���) H,����"H6H���*��� ����� H,�-�� H,�-������ � ���,� � �������� � ������� �����+������� ��)+����� "� �%� ���� �������ZH����&.�

���<�!���%�-� ���>��:�

��� ����)-���(� �0�)H,� ����� � ��� ' ������� ����� ��������) �)H���� �"H,� ����� ��DH&���1���$� �� ���$��������-' ������� ����� ����� ����� �(�������>��� �%��H��+�0�)H&������� ������2����)-��� � ��� ���)IH,�>��"HPH%�$*��� ����� H,�-�� H,�-������ � ���,� � �������� � ������� �����0����)-������� ��)+����� "� �&� �>�� �������ZH�����.�

� � � ��&� ���%���� )-��)+�����JH � ����)-���(� " �"H�����.;:���<�!���%�0�����<� � �(�>� � :

Page 188: Jsp servlets j2_ee

����� ����� ��� ��DH��+�0�ZH,������� ���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�>)-� � N����0���&� �(� � �<'8� ����� ���� �$5����������������)IH���' �������"N�� �������� � �� ��H.H��5���)+��� � � ��H%� � )0��� ��)-�����GH � ��� � � � ��'(�����6&�!� ���

��� ��5��������� � � N ���+���)IH%��'2�(�����EN�� ����� ����� �����+� ���;����)-��N����7�����������>���������� �+)�����������>�7� �> �������� � � � � ��<� �,�>� " .

�!����� ���$����5,� <��5 -����� � �>� � � ��� � ��������5&� " .;:� � � ��&� ��� � &��5 � � ��� ����� " � ���������� ���(��5���)+��� ��� ��H%� ��.;:��������&� � � ��5=��)+��� � � ��H%� � ��)-� />��)-� " ���������� � �(�$5=��)+��� ��� �"H�� � ��)-��.� ���?� ����� � ����)-����� � � � ��&� � �>�����%��� " ��� � *���������,� ���(��5���)+��� ��� �"H�� � ��)-� � �� � H.H=.;:��������&� � � ��5=��)+��� � � ��H%� ���"H�� -/���)+� � ���������� " .;:

�%��������� ����H!� � �>��� � " .;:

� ��<� �/ " ��5�����<�!� ���-��5�.���5 � ���%� �$����� ������ ������ " .�:

��

ExampleMain.java���� �<��'(�-���) � ����� � � �<5=��)+��� � � H��������� � �(:

Page 189: Jsp servlets j2_ee

� )+�����?� � �<�(�&5 � �$��)+� �<' � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � � :� )+�����?� � �<�(�&5 � H%�������� ��� � ����� / � � ��' � � � � :

������� � �� ��H.H��5���)+��� � � ��� �

������� � KH%����� � ���$� �0)-��� � " ��� ��� ��' � � ����'[H,. �!/>��� � H ��5�����<�!� ���

����' � � � ��������5&� � ��'2� � �2���$����5�� +����� �>��'2� ��� ��������5&� " ����5=��)+��� ��� �"H�� ��.;:� ��' � ���2�������<5�� � � ��' � � " .;:

����� � ��&�4H&��� � ����� -� ��' � ���2�������<5�� � '(��������� � ��&� " .;:

��5���)0��� � � � H�� ��5���)+��� � � � H�� -��� � ��5���)+��� � � � H�� " .;:����� � ��&� � ��� � H " H,��� � ��&�!*$���� � ����.;:

��

Observamos que o uso de transações é inevitável para que a aplicação apresenteeficiência e robustez. Agora sabemos que a arquitetura J2EE provê transações do tipo

� � ��� e que podemos utilizá-las, tanto como Container-Managed como Bean-Managed,para gerenciar as transações de nossa aplicação.

Page 190: Jsp servlets j2_ee

� ��������� � ���

� �������� �� ����� ����� � �� � � ! � ���#" � � �

�%$ � �'& ���)( � $%�+*-,/.10%�32541676 � 89,:(;,=< �&�?>A quantidade de servidores de aplicação J2EE encontrados no mercado hoje égrande. Existem servidores de aplicação de uso livre e outros proprietários, algunsdispondo de alguns serviços como diferenciais, outros dispondo de um desempenhomelhor.

Quando decidimos em usar a tecnologia J2EE e precisamos escolher qua servidor deaplicações utilizar, devemos levar em consideração aspectos como desempenho,tamanho da aplicação, recursos que serão utilizados, custos entre outros.

Para executar e exemplificar a aplicação J2EE que iremos apresentar neste capítulo,iremos utilizar o servidor de aplicações livre Jboss na versão 3.0.1. Já existem novasversões deste servidor de aplicações, mas não entraremos em detalhes. A escolhadeste servidor de aplicações, se deve ao seu grande uso em aplicações J2EE que nãonecessitam de um servidor proprietário. Apresenta uma solução ótima e de altodesempenho para os custos envolvidos.

Não é o enfoque deste tópico avaliar outros servidores de aplicação e decidir qualdeles é o melhor, mas nas referências no final do livro, pode-se ter acesso aos links dosfabricantes de diversos servidores de aplicações comerciais.

�%$ �:4�@����A8 �B( �%�C.-0)DFEG0 �7HI, � �������C.C0�$ $ J $�E � 8 ���C.-0 �BK �&$ �+*-,/.10 �L2A416M6Não existem muitos segredos para instalar, configurar e executar o servidor deaplicações Jboss.

O que devemos fazer é copiar o pacote do servidor de aplicações Jboss na versão3.0.1, do site do próprio Jboss ( N�� � �PO � �=QMQ7Q # !SR �����%# ��� � ). O arquivo que foi copiado deve ter sidoum arquivo compactado. Este arquivo deve ser descompactado em um diretório ousub-diretório no qual deseja-se ter a instalação do servidor de aplicações Jboss. Apósesta fase a instalação está completa.

O interessante é que não precisaremos realizar nenhuma configuração para executaros exemplos contidos neste livro. A configuração padrão da instalação do Jboss já nosproporciona todos os serviços necessários para a nossa aplicação exemplo. Veremosque necessitaremos de utilizar um banco de dados, mas isto não será problema e nemprecisaremos nos precocupar em instalar um. O Jboss oferece um banco de dados

Page 191: Jsp servlets j2_ee

para realizar testes e executar exemplos. Assim, a fase de configuração também estácompleta sem muita dificuldade.

Para executar o servidor de aplicações Jboss também é uma operação muito simples.Execute o prompt de comando do seu sistema operacional e acesse o diretório deinstalação do Jboss. Entre no diretório R�� � , isto é, � � ��� � ��� ���������� R������� � R�� � , e execute o comandorun.bat para iniciar o servidor. Então deve-se ter o seguinte: � � ��� � ��� ���������:R������� � R�� � � � $�� . Comisto, o servidor de aplicações inicializará, gravando várias mensagens no console, atéaparecer a última mensagem informando que o servidor foi inicializado com sucesso.Assim, poderemos realizar a instalação da aplicação exemplo que veremos logo aseguir, que também não apresentará muita dificuldade.

Observe que também não é o intuito deste capítulo, explorar os recursos e detalhes deconfiguração do servidor de apliações Jboss. Para maiores detalhes consulte adocumentação oferecida e disponível no site do Jboss. Se não for o suficiente, o Jbossvende uma documentação mais completa para pessoas que desejam utilizar o servidorJboss em aplicações comerciais, e que necessitam de informações mais complexassobre o servidor.

Veremos a seguir, tópicos que exemplificam na forma de uma aplicação, os tipos deEJB apresentados nos capítulos anteriores deste livro. A aplicação completa seencontra no final do livro no apêndice Aplicação � ��� ��� � ����) ��� � . Então, cada tópicoseguinte trará explicações detalhadas do que foi implementado em cada EJB. No fim,poderemos juntar todos os EJBs e outras classes auxiliares em uma única aplicação efazermos a instalação e acesso à aplicação exemplo.

A aplicação exemplo apresentada nos próximos tópicos se trata de uma aplicação devenda de produtos, no qual um usuário poderá escolher alguns produtos, calcularalgumas informações pertinentes a estes produtos e incluindo estes produtos em umacesta de compras. Poderá ainda excluir, alterar ou remover todos os produtos de suacesta. Na finalização da compra, os dados dos produtos escolhidos serão persistidos e ousuário será avisado do término da compra, com os dados dos produtos vendidos.

�%$ �� ����+, ���M.10 �BK � $&� � ,;0 ���%$�� � �-8 � 8 $F(�$ � �Neste tópico serão analisadas as partes da codificação do EJB Session Bean Stateless,que faz parte da aplicação exemplo. Não detalharemos as interfaces, pois elas sóapresentam o contrato dos métodos de negócio e ciclo de vida. Os métodos denegócio serão brevemente explicados.

O EJB Session Bean utilizado como exemplo, apresenta serviços de cálculo do descontoconcedido ao usuário e cálculo de parcelas para um produto em venda. O nomedeste EJB é SalesSupportBean.

O código a seguir, pertencente a interface � ��) � do EJB SalesSupportBean, apresenta ométodo que solicita a criação do EJB e retorna a referência para a execução dosmétodos de negócio.

�������� � ����� � H����������$� � ������<��� " . � /(��� �dH �#������������5�����<� � ����*��>��)-�<� ����5������� � ����:�

Observe que o método �������� ����� ao ser executado, solicita ao container que crie umainstância do EJB SalesSuuportBean. Dessa forma o container cria a instância do objeto,

Page 192: Jsp servlets j2_ee

do tipo �������IR%!���� que encapsula o EJB SalesSupportBean e retorna ao cliente chamadoruma referência da interface ����) � ��� , na qual se tem acesso aos métodos de negócios ouserviços disponíveis para o EJB em questão.

A seguir, observe os métodos da interface �&��) �� � do EJB SalesSupportBean, métodos denegócio utilizados pelo cliente para calcular o desconto concedido ao produtovendido e cálculo das parcelas a serem pagas.

�������� � � �&�(� � � ����' � � �����<' ���6���� � � H&�������� " � ������'(���6����� ����* � ������'(��� �%����' ��.

� /(�!��� H�����) �������$5�����<��� ����:������� � � �&�(� � � ����' � � �����<' ���6���� � � ���� " � �����<'(���6����� ����* � �$����'2��� �!� )-� H=.

� /(�!��� H�����) �������$5�����<��� ����:�

A seguir vamos analisar a implementação do EJB SalesSupportBean. Iremos somentecomentar os métodos de negócio deste EJB que são muito simples. Os métodos deciclo de vida do EJB serão somente citados.

No método de ciclo de vida ��! R� ����������� que apresenta a mesma assinatura da interfaceHome SalesSupportHome, não foi necessário nenhuma implementação, sendo assimeste método não contém lógica. Isto também ocorreu para os métodos ��! R�����) ��"������ ,��! R � ��� � "��������� e ��!SR� ������� "�� ������ , por não necessitar de executar operações nos momentos decriação e remoção da instância do EJB, e na ativação e passivação quando ocorre aliberação de recursos alocados, mas que não é o caso.

Os métodos de negócio � ��� ��� � � ����$������� e � ��� �% � ��������� apresentam operações simples para ocálculo do desconto concedido na venda do produto e cálculo do valor de parcelasde acordo com o valor da venda.

�������� � � �&�(� � � ����' � � �����<' ���6���� � � H&�������� " � ������'(���6����� ����* � ������'(��� �������.

����� �����+�>��� � �$����'2��� " ����� �>� � � ��� � ��� ��� " . � " ����� ��� � � ��� � ��� ��� " . � �����% � � ��� � ��� ��� " .;.;.;:�

������� � � �&�(� � � ����' � � �����<' ���6���� � � ���� " � �����<'(���6����� ����* � �$����'2��� �!� )-� H=.����� �����+�>��� � �$����'2��� " ����� �>� � � ��� � ��� ��� " . � �!� )-�"H � � ��� � ��� ��� " .?. :

Observe que o método ���� ��� � � ����$������� retorna o resultado da operação do valor de vendadiminuido do valor de desconto concedido de acordo com o percentual informado. Ométodo � ��� �� &� ��������� somente divide o valor total da venda pela quantidade de vezestambém informada para o método.

Veja que as operações implmentadas são bem simples e também não é o escopodeste livro, detalhar demasiadamente as operações, sendo que estas servem somentede exemplo e apresentam uma idéia de como deve-se implementar os serviçosoferecidos pelo EJB Session Bean Stateless.

Abaixo veremos o deployment descriptor do EJB SalesSupportBean, arquivo que deveser criado juntamente com o EJB e utilizado pelo servidor de aplicações para obterinformações adicionais do EJB e realizar o deploy do mesmo. Este arquivo tende a sersimples para EJBs Session Bean. Iremos somente comentar algumas linhas.

As linhas iniciais apresentam o nome de exibição e o nome propriamente dito do EJB,utilizados pelo servidor de aplicações. A seguir seguem os nomes das interfaces � ��)*� e

Page 193: Jsp servlets j2_ee

����) ��� e o nome da classe que implementa o EJB em questão. Depois é informado o tipode EJB Session Bean, que pode ser Stateless ou Stateful e por fim o tipo de transação,isto é, se será gerenciada pelo Container ou pelo Bean. Por fim é definido o tipo detransação utilizada para cada método específico do EJB. Deve-se fazer referência aoEJB que se está definindo as propriedades de transação, pelo seu nome anteriormentedefinido e a seguir, definir para cada método o tipo de transação que este seenquadrará. No nosso caso utilizamos um asterístico, com isso todos os métodos do EJBinformado utilizarão o mesmo tipo de transação que foi definida como Required.

�� H��"H.H�� ��� �

� �(� H=��� �������>��)-� � ����� ��H ���(�������!� � � ��� H,��� � ���?����)-���� � � �����>��)-� ������� ��H �����������!� � � � � �����>��)-� �� />��)-�������) � ������� � ���%� � ��&� � � � � � H��"H.H,� ��� � ����� � H ������������������)-� � � /$��)-� �� �%��) ��� ���&���) � ����� � � ����� � ��&� � � � � � H�� HPH,� ��� � ����� � H������������!� � � ����)-����� �� � � ���;�� ��H6H �����) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � ����� ��H ���>��������� ������ � � � � ���;�� ��H6H �� H&�"H.H=� ��� � � � ��� ���<� �&����� �"H.H � � H��"H.H�� ����� ���(������ �������"H&���� � ����� ���>�$� � � ���$����� �>��� � � �!�����ZH���&� � ����� ��� ��� �

� � H,�"H.H�� ��� �� � ����� ���,����� H������������ZH �

� � HPH���)+��� ���4����H&���� ������� �� ���������� �������4� �%���"H,��<� � ��� �

� ) ��� /���� �� � � ��������)-��������� � H����������$� � � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� ��

�%$ ��� ���+, ���M.-0 �BK �&$ � � , 0����%$ �%� �-8 �18 $BH �-(Iremos agora detalhar um exemplo de EJB Session Bean Stateful, utilizado na aplicaçãoexemplo. Não serão detalhados os métodos de ciclo de vida da interface ����) �' ��� �������������� � ��)*� neste tópico, pois o mesmo já foi abordado no tópico anterior e o seucomportamento é o mesmo. A única exceção se faz para o método ��! R� � ���������� , por umpequeno detalhe que será mostrado.

Este EJB, chamado de SalesBasketBean, será encarregado de prover todos os serviçosde venda dos produtos escolhidos. Para isso, fornece métodos de negócio tais comoadicionar produtos na cesta de compras, removê-los, limpar a cesta, calcular o preçototal dos produtos etc. Assim, vamos analisar cada método de negócio deste EJB. Aseguir segue a assinatura dos métodos de negócio constantes na interface ����) �� �' ��� �������������� .

�������� � ��(��� �+� ��� � ����� ��H " ���) � ������� � ����� � ��&� � ��� � � H���� � � �"H&���&.

� /(�!��� H�����) �������$5�����<��� ����:������� � � �&�(� � � ����' � ������ ����� � � ����� � B�������� � " .8� /������ H�����)-��������5��������� ���(:������� � ��(��� �-����� � �������>&� " ���) � ����� � � ����� � ��&� � ��� � � �������>&� � � ���%������&� .

� /(�!��� H�����) �������$5�����<��� ����:

Page 194: Jsp servlets j2_ee

������� � � �&�(� � � ����' � ������ �����+����)-����� � �%������<� " ���) � ������� � ����� � ��<� � �(� � � �!������&� � ������������� .8��/���� �dH �$��)-��������5�����<� � ����:

������� � � �&�(� � � ����' � � �����<' ���6���� � �� H������ � �,� �� " . � /��%��� H �>��)-��������5���$�<� � ���>:������� � ��(��� � � ������ �� H������ " . � /������ H �>��)+�<���$��5=����<�!� ����:�

Na classe de implementação do EJB SalesBasketBean, criamos um atributo chamadoR ��� ���� , que é uma Map que mantém os produtos adicionados na cesta de compras.Com isto, entendemos a diferença do EJB Session Bean Stateless do EJB Session BeanStateful, no qual este último mantém os dados de um cliente específico, isto é, mantémos produtos na cesta de um determinado cliente e não compartilha estes dados comoutros usuários.

����&� ���&� � � ���+��� H������!:�

Também mantemos no EJB SalesBasketBean os dados do usuário que iniciou a compra,para no final desta, validarmos seus dados e relacionarmos os produtos compradospara um determinado usuário. Observe que existe um objeto do tipo �&����� � � . Este objeto éutilizado para carregar informações do usuário em questão.

����&� ���&� � � H&��� � � �"H&����:�

O método ��! R� � ���������� do EJB SalesBasketBean somente inicializa a Map que contém osprodutos comprados por um determinado usuário.

�������� � ��(��� �-� � ���#�����&� � " . �!/������ H �#������������5�����<�!� ���

� /�� H � ����H������ ����� �2� H,/�� ��� " .;:�

O EJB SalesBasketBean dispõe de um método utilizado par ainicilizar a venda. Para isso,configura o usuário que estará realizando a compra. Observe que esta operaçãopoderia ser executada no método ��! R�������� ����� , passando o objeto �&����� � � como parâmetrono momento da criação da instância do EJB.

�������� � �(��� �0� ��� � ����� ��H " � H���� � � �ZH�����.�

� /�� H � �)H%��� -�"H&����:�

O trecho a seguir implementa o método de finalização da compra. Esta operação éum pouco mais complexa que as apresentadas até o momento, então atente para osdetalhes. Inicialmente é solicitado à uma classe chamada de ' ��� ����'����"�� ������� ��� ��� , umareferência para a instância do EJB Entity Bean ProductBean, utilizado para persistir osdados dos produtos vendidos para determinado usuário. A operação de obter areferência para o EJB ProductBean está implementada na classe ' ��� ����'�� ��"�� ��������� ������� comopode-se notar.

Esta classe implementa um Design Pattern bastante conhecido, no qual oculta aimplementação da localização do EJB e facilita esta operação para as classes que a

Page 195: Jsp servlets j2_ee

utilizarão. Não é o intuito deste livro detalhar Design Patterns utilizados nos códigos. Paramaiores detalhes consulte as referências bibliográficas.

Após os detalhes deste método, apresentamos a implementação do método doSalesServiceLocator que localiza o EJB e retorna a referência para os seus clientes.

Com a referência da interface ���&) � �� ��� $��� �������� � ��) � , podemos realizar a execução dométodo create() para cada produto contido na cesta de produtos. Persistimos cadaproduto da cesta do usuário, fazendo isso por meio de um iterador. Este iterador iráobter cada produto contido na Map e criar uma instância do EJB ProductBean.

�������� � � �<�(� � � ����' � ������ ����� � � ����� � B�������� � " . � /������dH ��5������� � ���

� �%������&� �$������ ����)-� � ������ ����)+� "� �����$�>&� �������� ����)-��.����� � H������?� � �� ������<���$� � '2��� � �ZH������>�� " . �' �<� �������� ����)-� " ����� ��H �������(� �� �>����&� ��� � � � � � � � � � �� � #.;:

� ��������� " � � �����&����� � -����H����<� � �����!� � ���<� " . � � � �����&����� " .;:�� � /���H ��5&� " .;:�. � ��� � ����� ��� ������������ " � ��� � ���$� ���(.#� � ����5&� " .;:� �����$�>&� � � �(� "� �����(��&� � � . �������$�>&� � '(��� � ��� �>� " .;:� ������ ����)-� � ������&� � " �(� � '(�<� ��)-� " .�*���� � '���� � � " .;*��(� � '(��� � ��H%���� �<� � ��� " .�*

�$��� � ��� �<'(��� " �(� � '(��� � ��� �� " .?.;.;:�

���<�!���%�0��� � ������ ����� " �!�%����.;:� ���� �/ " �#�����&� ���$5������� � ���-��5�.�

� /(�!��� �$��� ��5������� � �$� " �������%����� /(� � � ��� �(� �$'+� �-��� ����� � B<� ����� � � ���-��5�.;:�

A seguir vemos a implementação do método ��� � ����� ��� � ��) � , da classe ' ��� ����'����"�� � ������ ��� � � , na qualé obtido referência para as interfaces dos EJBs contidos no servidor de aplicação. Vejaque a operação é simples, somente realizando um lookup (localização) do EJBsolicitado pelo seu nome JNDI. Para efeito de melhora de desempenho, a referênciapara as interfaces Home solicitadas são armazenadas em um cachê e podendo serutilizadas futuramente em outras chamadas a este método.

�������� � H �(�>�/��%����� B<���+���� ��������� �8��)-� '2��� �>������ �2��)-� " �<�!��� ��' � �>��� ��)-��.

� /(�!��� H�������� � )-����5�����<� � ��� � ����

� � "�� � ������ ����)-���2���/$� � ����$����� �ZH��>��� " � ����� �=)-��.;.���� ��������� ����)-�-� ������ ����)-� " ���> �$������ ����)-��.2<��5 � � ��� ����� " � ����� ��)-��.;:� ������ ����)-���2���/$� � ���$� " � ����� ��)-��*>� ������ ����)-��.;:

���<�!���%� " ���> �������� ����)-�$. � ������ ����)-���2���/�� � '(��� " � ����� ��)-��.;:� ���� �/ " ��5�����<�!� ���-��5�.�

� /(�!��� �$����������� � )-����5=������ � ��� " �������!�$��� /�� � ������ � ��'0���-'(��� �+� ������(/$��)+� �$� � ��<��%�������������� ��� ��� � ����� ��)-� �+��5<.;:

��

A seguir continuamos com os métodos do EJB SalesBasketBean.

Page 196: Jsp servlets j2_ee

A implementação dos métodos ��� �� �� � ��$������� e ���) ��"��� ���� ��$ ������ que adicionam e removemprodutos da cesta é simples. Utilizamos os métodos de adição e remoção de objetos dotipo ���� ��$ �� � � na Map. Também há a implemetação de um serviço para limpar todos osprodutos da cesta. Este método também aproveita o método ��� ����� da Map e executa-o.

�������� � �(��� �+����� � �����$�>&� " ���) � ����� � � ����� � ��&� � ��� � � �����(�$&� � � ���%������&� .

� /�� H � ����H������ � ����� " �������$�>&� *����%�����>&�!.;:�

������� � � �&�(� � � ����' � ������ �����+����)-����� � �%������<� " ���) � ������� � ����� � ��<� � �(� � � �!������&� � ������������� .

� � " � /�� H � ����H��<��� � ����) ����� " ���%�����>&� . � -����� � .����� �����+�>��� ������ ����� " ��������.;:����� �����+�>��� ������ ����� " ����� H���.;:�

������� � ����� �-� �%���� ���H ���<� " .�� /(� H � ����H������ � �� ����� " .;:

O EJB também apresenta o método de cálculo do preço total dos produtos contidosna cesta. Esta também é uma operação simples, que consiste em iterar todos osprodutos contidos na cesta, acumulando os valores dos produtos e retornando estevalor.

�������� � � �$����'2��� ���� � ���H������ � ��� �� " .�

� ���#�(��� ��� �� :����� " � �������<� ��� � ��� H������ � ��������������� " . � � �������<���$� " .;:(� � />��H #��5&� " .;: .

� ��� � ����� ���0���$� � � " � ��� � �>��� � �(.#� � ���<5�� " .;:�(��� �>� � ";" � �����(��&� � � .#��������� � '(��� � ��� ��� " .;. � '(�<� � �&� �� " .;:

����� �����+�>��� � �$����'2��� " ����� �>��.;:�

Observe que este EJB também não apresenta complexidade de implementação decódigo, mas como já foi dito, este não é o intuito do livro. O enfoque desta aplicaçãoexemplo é de somente validar os conhecimentos de EJBs..

A seguir segue o deployment descriptor do EJB SalesBasketBean. Também nãoapresenta muitos segredos e a única diferença para o deployment descriptor do EJBSession Bean Stateless visto no tópico 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. Também não houve alterações naconfiguração do tipo de transação para cada método, utilizando o mesmo tipo detransação para todos os métodos do EJB SalesBasketBean, conforme explicado notópico anterior.

�� � � ��� � ��� �

� �������������%� H%�����������ZH �� H��"H.H�� ��� �

Page 197: Jsp servlets j2_ee

� ��� H���� �������>��)-� � ����� ��H& �� H������ � � ��� H,��� � ��� �$��)-� �� � � �����>��)-� � ����� ��H, �� H������ � � � � ��������)-���� />��)-�������) � ����� � � ����� � ��&� � � � � � H��"H.H,� ��� � ����� � H, ���H��<��������)+� � � /���)-� �� ����)-����� �����) � ����� � � ����� � ��&� � � � � � H�� HPH&� ��� � ����� ��H, ���H ���<� � � �%��)-����� �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � ����� � H, ���H������ ������ � � � � ���;�� ��HPH �� H��"H.H�� ��� � ���(��� � ��� �&����� ��� � � H&��H6H,� ����� ���(��� �� � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �

� � H%��HLH=� ��� ��

�%$ ��� ��� , ��� .10 ��K 6"�G8 ,;8�� � $&��� �����

O próximo EJB a ser comentado será o EJB Entity Bean BMP UserBean. Neste EJB foiimplementado toda a lógica de persistência e manipulação do objeto. Para realizar apersistência em um banco de dados, não precisaremos instalar e configurar um. Opróprio servidor de aplicações Jboss fornece um banco de dados como padrão, quepode ser utilizado para executar exemplo de aplicações J2EE. Então utilizaremos esserecurso para manter os EJB Entity Beans.

Veremos as interfaces � ��)*� , ����� ��� � ��)*� , �&��) �� � e �������� que são respectivamente � ����� � ��) � ,�&����� �������� ����) � , �&����� e � ����� ���� ��� . Não iremos detalhar todas, somente a � ��)*� e ����) ��� , pois asinterfaces utilizadas para acesso local apresentam os mesmos métodos, somentesuprimindo a exceção.

A seguir temos o contrato da interface � ��)*� � �&����� � ��)*�� que apresenta os métodos de ciclode vida do EJB. O método �������� ����� é utilizado para solicitar-se uma instância do EJB parao container. Neste método são informados os valores do objeto que serão persistidos.Este método declara as exceções �������� � � ����� ��� ��� utilizada em caso de erro na persistênciado objeto, sendo uma exceção de ��$�� � � ) � e a ����) ��� � ��������� � ��� utilizada para outros erros quepoderiam ser tratados. Veremos mais detalhes deste método, isto é, da suaimplementação no próprio EJB UserBean.

O outro método de ciclo de vida definido nesta interface é o método � � ����� �� � ) �� ��� � �&��� .Este método é utilizado para localizar um objeto persistido através de sua chaveprimária, que no nosso caso será o CPF do usuário. Na execução deste método, não énecessário utilizar o método ������������� , pois não iremos criar um novo objeto e sim localizarum objeto anteriormente persistido. Com isso, o método � � ����� ���� ) ����� � � ����� também retornauma referência para a instância do EJB. Declara as exceções FinderException utilizadacaso não consiga localizar o objeto através da chave-primária informada, e a exceção����) ��� � ����������� ��� para outros erros na execução do método.

�������� � � �$�����!������ � H���� ����)-�-��5��������)H � �&�(�<5 � � � � � ���> ����)-�

������� � � H,���1������&� � " �<�!��� ��' ����)-��* � ������'(���6�����* ��� �,� ��'0�����(�!��HLH,*�������� ��' ��) ��� � .� /(�!��� H � �%����������5�����<�!� ����* ����)-��������5�����<� � ����:

������� � � H,���6� � ���� � � �%� )-����� ����� " � �����<'(���6�����.#� /������ H ��� ����������5������� � ���(*����) ��������5������� � ����:

O código a seguir apresenta os métodos de negócio do EJB. Estes métodos sãodefinidos nas interfaces ����) � �� e ���� ��� . Iremos detalhar somente a interface ����) � ��� � �&����� - pois

Page 198: Jsp servlets j2_ee

a interface ����� ��� � �&����� ���� ��� - apresenta os mesmo métodos e a única diferença é que osmétodos não declaram exceção necessariamente.

Vemos os métodos de negócio do EJB UserBean. São definidos nesta interface osmétodos getters e setters para o objeto em questão. A única particularidade dainterface ����) �� � em relação a ���� ��� como dito anteriormente é a exceção ����) ��� � ����������� ��� ,sendo que no acesso remoto é utilizado em caso de erro na execução dos métodos denegócio que seguem.

�������� � � �$�����!������ � 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������� � ����:

Veremos em seguida o detalhamento da implementação do EJB Entity Bean BMP -UserBean.

Definimos um atributo chamado connection, utilizado para manter a conexão com obanco de dados responsável por manter os dados do objeto. Essa conexão é obtidapor meio de um nome JNDI definido pelo servidor de aplicações Jboss comoDataSource padrão configura neste servidor. Usaremos este para persistirmos os objetos.Veremos que definimos um método para obter a conexão, o método ��� � � � ������� � ��� �utilizado em alguns métodos de persistência do objeto.

Seguem também alguns atributos definidos como constantes que apresentam asoperações de seleção, remoção, atualização e localização dos objetos em SQL. Estesatributos são utilizados em determinados métodos que serão vistos posteriormente, pararealizar as operções respectivas. Observe que essas operações no banco de dadospoderiam não ser definidas como constantes do EJB, mas serem criadas somente emcada método. Esta é uma decisão do programador e aqui segue somente comoexemplo.

����&� ���&� � �!�����ZH,� ������� �$�>����&�!� ���-���������&� � ��� -����� � :

����� �$�����0���0� �)H%���LN ���-���-��� � �����7�>�7 �2����&� ���&� � �4� ���������!��� ��' � ����� � ����� ��� �

� � ����� � � � � � ����� " ��)-��*�� ��� * � ���(�!��H6H,*(�>)+��� � . � � � � ��� " � * � * � * � . ��:

����� �$�����0���+�<� ����� � B���N ���-���+��� � �����7�>�7 �2����&� ���&� � �4� ���������!��� ��' � � � � � � ����� � � �

� � � � � �#� � ����� ����� ��)+� � * �6�����%��H6H � *(��)-��� �� � � �2����� �#���� � �?:

����� �$�����0���0�%��)-� N���� ���-��� � �<� �+���+ �2����&� ���&� � �4� ���������!��� ��' � � ��� � � ����� ��� � � � � ��� �#� � � � � � �$� � � �2� ��� � ��� � � :

Page 199: Jsp servlets j2_ee

����� �$�����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 implementação do método ��! R� ���� ������ definido na interface ���&) � e�������� � ��) � . Neste método são informados os atributos do objeto a serem persistidos e neleé implementado a operação de gravação dos dados em um banco de dados.Observe que obtemos uma conexão com o banco de dados, preparamos a operaçãoa ser executada, realizamos o bind dos atributos e em seguida executamos ocomando. Por fim, são configurados todos os atributos do objeto e retornado o seuatributo chave-primária para o container. Este tratará essa informação e retornará aoobjeto chamador uma referência para a interface ����) �� � ou ����� ��� , disponibilizando assim aexecução dos métodos de negócio.

Não mostramos detalhes do método ��! R� ������ ������������� , pois não há implementação. Somenteé importante salientar que este método deve ter a mesma assinatura do método ������ � ����� .Normalmente ele é utilizado para configurar relacionamente entre EJB Entity Beans, masisto não é detalhado neste livro. Maiores detalhes sobre relacionamentos de EJB EntityBean consulte a bibliografia.

�������� � � �$����'2��� � � ��� �%������� " �<�!��� ��' ����)-��* � ��� �<'(���6���� * ��� �,� ��' �����(�!��HLH=* ������� �$'0��) ��� � .

� /(�!��� H � �%����������5�����<�!� ��� � ����

����������� � ��� '(��� �2�����$���� � ��� " .;:�!����

� �%�������!�����<� �&� ��)-����� H%� )-�� ���������&�!� ��� � �������������������<����)+����� " � ����� � ����� ��� � .;:������

H%� ) � � H%�����<�!��� ��' "�� *�����)-��.;:H%� ) � � H%��� � ��� "�� *$���� � � ��� � ��� ��� " .;.;:H%� ) � � H%�����<�!��� ��' " � *���������� HPH&.�:H%� ) � � H%�����<�!��� ��' "�� *���) ��� � .?:H%� ) � � �<5�����$��� " .;:

Page 200: Jsp servlets j2_ee

� � ����� � � JH!� ) � � �� �"H�� " .;: ��

� � ����� � � �������>��&�!� ��� � �� ��H%� " .;: �� ���� �/ " ��5�����<�!� ���-��.

� /(�!��� �$����� �%���<������5��������� ��� " . :�

H���� #��)-� " ����)-��.;:H���� � ��� " ���� .;:H���� � ���(�!��HLH " �����(��� HPH&.;:H�������)-��� � " ��)-��� � .;:����� ����� '2�����#�<� " .;:

O método a seguir trata da remoção do objeto do meio persistente. Como no método��! R� ������ ����� , o método ��! R�����) ��"%����� também obtém uma conexão com o meio de persistência,prepara a execução do comando '�� � , realiza o bind da variável pelo chave-primária eexecuta o comando. Assim, o registro definido com a chave-primária informada éremovido do banco de dados. Esse método não retorna nenhum valor, mas em casode erro na execução do método, a exceção ����) ��"�� � ����������� ��� é lançada e poderá sertratada pelo objeto chamador.

�������� � �(��� �+� � ������)-����� " .8� /(��� �dH �$��)+�<�����$5=����<�!� ���

� ��������������� � ��� '(��� �2�����$���� � ��� " .;:�!����

� �%�������!�����<� �&� ��)-����� H%� )-�� ���������&�!� ��� � �������������������<����)+����� " � � ��� �#� ����� � � �2.;:������

H%� ) � � H%��� � ��� "�� *�� /(� H � ���� � � �$� � ��� ��� " .;.;:H%� ) � � �<5�����$��� " .;:

� � ����� � � MH%� ) � � �� � H�� " .;: ��

� � ����� � � 6����������� � ��� � �� ��H�� " .;: �� ���� �/ " ��5�����<�!� ���-��.

� /(�!��� �$��������)-��������5��������� ��� " ����������� �!��)+�<� � ��'0��� ��)-����� � ��.;:�

O próximo método ��! R � � � ������ �� � ) ���� � ������ apresenta a localização do objeto por meio de suachave-primária. A chave deve ser informada para o método e o objeto é localizado nomeio persistente e uma instância sua é criada no container do servidor de aplicação. Éentão retornado sua chave primária que será tratada pelo container que disponibilizarápara o objeto chamador a referência para interface ����) � �� ou �������� , para a execuçãodos métodos de negócio. A implementação deste método também é muito parecidacom os anteriores, obtendo uma conexão, preparando o comando '�� � , realizando obind da variável tida como chave-primária, executando o comando, configurandocada atributo com os valores localizados no meio persistente e por fim, retornando para

Page 201: Jsp servlets j2_ee

o container a chave-primária do objeto. Em caso de erros na localização do objeto,uma exceção � � ������ ��� ������� � � � é lançada.

�������� � � �$����'2��� � � � ��� ���� �� � ��� )-����� ��� � " � �����<'(���6�����. � /(��� �dH �>� �$�������$5=����<�!� ���

� ��������������� � ��� '(��� �2�����$���� � ��� " .;:�!����

� �%�������!�����<� �&� ��)-����� H%� )-�� ���������&�!� ��� � �������������������<����)+����� " � � � � � � � ��.;:������

H%� ) � � H%��� � ��� "�� *$���� � � ��� � ��� ��� " .;.;:���"H,��� � �����1�JH KH%� ) � � ��5��������� � ������� " .;:�!� ��

� � " �.H � ���<5,� " .;.��/�� H � H&��� ��)-� " �LH � '(��� ���!�%� ��' "�� .;.;:��/�� H � H&����� �������"H.H " �JH � '(����������� ��' "�� .;.;:��/�� H � H&��� ��)-��� � " �LH � '������<�!��� ��' " � .;.;:��/�� H � H&�����#��� " �$��� � �$����'2��� " �JH � ' �<� � ��� " � .;.;.;:

��

� � �>��� � � ��JH � �� ��H%� " .;: ��

� � ����� � � JH!� ) � � �� �"H�� " .;: ��

� � ����� � � �������>��&��� ��� � �� �"H�� " .;: �� ���� �/ " ��5�����<�!� ���-��.

� /(�!��� �$��� ��� �������&��5��������� ��� " �����������6��� ����� ��'0��� � ��&� ��� � � �����+���� .;:�

����� ����� �!/>� H � ��<��:�

O método ��! R ����������� é executado pelo container quando este deseja carregar os dadosdo objeto do meio persistente e mantê-lo em memória. Também não retorna nenhumvalor, somente atualiza os dados do objeto atual. A implementação também é trivialrealizando as mesmas operações dos métodos de persistência anteriores.

�������� � �(��� �+� � � ������� " .

� ��������������� � ��� '(��� �2�����$���� � ��� " .;:�!����

� �%�������!�����<� �&� ��)-����� H%� )-�� ���������&�!� ��� � �������������������<����)+����� " ��� ����� � ����� ��� �2. :������

H%� ) � � H%��� � ��� "�� *�� /(� H � ���� � � �$� � ��� ��� " .;.;:���"H,��� � �����1�JH KH%� ) � � ��5��������� � ������� " .;:�!� ��

� � " �.H � ���<5,� " .;.��/�� H � H&��� ��)-� " �LH � '(��� ���!�%� ��' "�� .;.;:��/�� H � H&����� �������"H.H " �JH � '(����������� ��' "�� .;.;:��/�� H � H&��� ��)-��� � " �LH � '������<�!��� ��' " � .;.;:

Page 202: Jsp servlets j2_ee

��

� � �>��� � � ��JH � �� ��H%� " .;: ��

� � ����� � � JH!� ) � � �� �"H�� " .;: ��

� � ����� � � �������>��&��� ��� � �� �"H�� " .;: �� ���� �/ " ��5�����<�!� ���-��.

� /(�!��� �$��� ���> ���5�����<�!� ��� " ���>������� � ������� ��'0��� � ����GH � �?.;:�

O método ��!SR�'�� ��� ����� também não apresenta nenhuma complexidade e é muito parecidocom o método anterior. Este método é responsável por atualizar os dados do objeto emmemória no meio persistente, isto é, para cada atributo configurado no objeto emmemória, este objeto é executado para manter o sincronismo com os dadospersistentes. Observe que este método executa a operação contrária do método � !SR����� ���� .

�������� � �(��� �+� � ���<� ���%� " .

� ��������������� � ��� '(��� �2�����$���� � ��� " .;:�!����

� �%�������!�����<� �&� ��)-����� H%� )-�� ���������&�!� ��� � �������������������<����)+����� " � � � � � � ��� � ��� � .;:������

H%� ) � � H%�����<�!��� ��' "�� *<� /(� H � ����)-��.;:H%� ) � � H%�����<�!��� ��' "�� *<� /(� H � �����(����H6H,.;:H%� ) � � H%�����<�!��� ��' " � *<� /(� H � ��)-��� � .;:H%� ) � � H%��� � ��� "�� *�� /(� H � ���� � � �$� � ��� ��� " .;.;:H%� ) � � �<5�����$��� " .;:

� � ����� � � JH!� ) � � �� �"H�� " .;: ��

� � ����� � � 6����������� � ��� � �� ��H�� " .;: �� ���� �/ " ��5�����<�!� ���-��.

� /(�!��� �$��� ���> ���5�����<�!� ��� " ���>������� �����.H&� H!� � �<'0��� � ����JH � �?.�:�

Não iremos detalhar os métodos ��!SR�������� "��������� e ��!SR� ������� "��������� , pois os mesmo não apresentamimplementação. Os métodos setters e getters também não serão explorados por nãoapresentarem nenhuma dificuldade. Também suprimimos os métodos � �� ������ ���� � � ��� ������ e$������ � ��� ��� � ���� ��� �� � � pelos mesmos motivos.

Por fim observamos o deployment descriptor do EJB Entity Bean BMP = User Bean - oqual apresenta algumas particularidades e diferenças em relação aos anteriores EJBSession Bean e por isso serão detalhados.

Page 203: Jsp servlets j2_ee

Observe que a tag posterior a enterprise-beans é a tag entity, informando que os dadosque seguem irão informar detalhes de um EJB Entity Bean. As linhas iniciais são asmesmas, definindo o nome do EJB a ser mostrado e o nome utilizado pelo containerpara referenciar o EJB.

Após são informados os nomes das interfaces ����) � , ����) � �� , �������� � ��) � e �������� e o nome daclasse que implementa o EJB. A seguir o tipo de persistência utilizado par aum EJB EntityBean que podem ser duas: Bean ou Container. No nosso caso, como implementamosos métodos de persistência do EJB, esta deve ser configurada como Bean. Depoisdevemos informar qual a classe da chave-primária do EJB. Vemos que neste caso aclasse é uma classe da API Java, mas poderia ser uma classe definida para aaplicação. Por fim, a tag reentrant define se o EJB pode chamar outro EJB.

Os atributos de transação não 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 �BK 6"�G8 ,;8�� �%$���� � ���

Vamos agora analisar os detalhes da implementação do EJB Entity Bean CMP -ProductBean. Este EJB apresenta as interfaces ����) � , ����) ��� , ����� ��� � ��)*� e ����� ��� que são �� � ��$��� � ��) � , ������$ �� , ������$ �� �������� ����) � e �� � ��$ �� ����� ��� , além da classe de implementação do EJBProductBean e seu deployment descriptor. Há uma novidade para este EJB.Implementamos a classe da chave- primária que se chamada �� � ��$ ��� �� . Como vimos noexemplo do EJB Entity Bean BMP - UserBean - este não implementava uma classe paraa chave primária, utilizando uma classe da API Java. Faremos diferente neste EJB paraexemplificar o seu uso.

A seguir vemos um trecho do código da interface � ��) � � ������$ ��� � ��)*� . Ela define os métodosde ciclo de vida do EJB tais como o �������� ��� � , que recebe como parâmetros os valores aserem persistidos no bando de dados e também declara as exceções �������� ������������� � � ,quando ocorre algum erro na persistência do objeto e a ����) � ��� � ��� ����� � � � para outros erros.Define também os métodos conhecidos como finders, utilizados para localizar objetos já

Page 204: Jsp servlets j2_ee

persistidos. Neste caso, definimos somente o método-padrão � ��� � �� � ) ��� � �&� �&��� informandoqual o valor da chave- primária do objeto que deseja-se localizar. Este método tambémdeclara as exceções � � � ����� � ����������� ��� , para erros na localização do objeto no meiopersistente e a ����) ��� � ����������� ��� para outros erros.

A interface ���� ��� � ��) � também define os mesmos métodos, tendo a única diferenção denão declarar as exceções remotas - ����) � ��� ������������� ��� .

�������� � � �����$�>&� ���������� " ��� �,� ��' ����)-��*���� �,� ��' ���"H����� ��� � ����* � �$����'2��� ����� ���*� �����$�>&� � �0���%�����>&� � �(. � />��� � H � �%���&� ���$5������� � ����*�����)+�<���$��5=������ � �$��:������� � � �����$�>&� � � ���( � � �%� )-����� �>��� "� �������>&� � �0����. � /������ H�(� �������&��5������� � ����*

����) ��������5������� � ����:�

A interface ����) ��� � ������$ �� - apresenta os métodos de negócio do EJB. Neste somentedeclaramos os métodos getters e setters para o EJB Entity Bean CMP - ProductBean.Não iremos detalhá-los, pois são muito simples. A interface �������� � �� ���$ ��� ����� ��� - tambémdefine esses mesmos métodos, com a única diferença de não declarar as exceçõesremotas - ����) � ��� ������������� ��� .Logo a seguir apresentamos a implementação da classe de chave-primária, utilizadapara o EJB ProductBean. Esta classe também não apresenta nenhuma complexidade,somente apresentando os atributos de chave-primária que no caso é somente um id.Importante salientar que como esta classe será utilizada pelos clientes remotos, eladeve implementar a interface '�� ��� ��� � ��� R�� � .

�������� � �� ��H.H � ��������&� � �0� )+��� ��)-�����GH ������� ��� � B<����� � �

O próximo código apresenta a implementação do EJB Entity Bean CMP - Product Bean- propriamente dito. Veremos que também não apresenta muita complexidade, pois osmétodos de persistência e manutenção do objeto são implementadas pelo containerdo servidor de aplicações, tirando essa responsabilidade do implementador, assim nãohavendo códigos para estes métodos.

A classe deve ser declarada como abstrata, pois o container irá implementá-la quandoesta for instalada no servidor de aplicações na aplicação exemplo.

���� H�� �%����1������� � �� ��H6H � �����(��&� ������+� )9��� ��)-�����GH �(��� � � �( ������ �

Observe que o método ��! R�������������� somente configura os atributos do objeto e retorna ovalor da chave-primária. A persistência dos seus dados fica a cargo do container.

�������� � � �����$�>&� � �+� � � � �����&� � " � �&�$� � � ����' � ��� ��� ��' �>��)-��* � ����� � � ���$' � ��� ��� �<'0����H&��%� �<� � ���>*

� �&�(� � � ����' � � �����<' ���1����� ���*����) � ������� � ����� � ��<� � � � � � ���$� � � � � � �!������&� � ������������� � ��.8�!/������ H �#������������5�����<�!� ���

H���� #��)-� " ����)-��.;:H���� � ��H%���� �<� � ��� " ����H&���� �<� � ����.;:H���� � �%� �� " ����� ���.;:H���� � �!������&� � � " �������$�>&� � �(.;:����� ����� '2��� � �%������<� � � " .;:

Page 205: Jsp servlets j2_ee

Veja também que os métodos de manipulação do objeto tais como ��! R�����) ��"������ , � ! R ���� ��� � e��! R�'�� ������ � são desprovidos de implementação, ficando também a cargo do container estatarefa. Os métodos de negócio também não apresentam implementação, mas adiferença para os métodos de ciclo de vida é que devem ser declarados comoabstratos, pois serão implementados pelo próprio container novamente.

�������� � �(��� �+� � ������)-����� " .8� /(��� �dH �$��)+�<�����$5=����<�!� ��� �

������� � �(��� �+� � � ������� " .�

������� � �(��� �+� � ���<� ���%� " . �

������� � ��� H%� ����<� �(��� �$H&���� ��)-� " � �&�$� � � ����' � �<�!��� ��' ����)-��.;:������� � ��� H%� ����<� �(��� �$H&��� � ��H%���� �<� � ��� " � ����� � � ����' � ��� �&� ��'0���"H����� ��� � ����.;:������� � ��� H%� ����<� �(��� �$H&��� � �%� �� " � ����� � � ����' � � �����<' ���1����� ���.;:������� � ��� H%� ����<� �(��� �$H&��� � �!������<� � � " ���) � ����� � � ����� � ��&� � � � � � ����� � ��� � � �!������&� � �

������������ � ��.;:������� � ��� H%� ����<� � ����� � � ���<' � �<� ��� �$'+'(��� ��)+� " .;:������� � ��� H%� ����<� � ����� � � ���<' � �<� ��� �$'+'(��� � � H,��&� �<� � ��� " .;:������� � ��� H%� ����<� � ����� � � ���<' � � ������'(���6'2��� � �%� �� " .�:������� � ��� H%� ����<� ���) � ����� � � ���%� � ��&� � � � � � ����� � � � � � �������>&� � �-'���� � �%������<� � � " .;:�

O deployment descriptor do EJB Entity Bean CMP - Product Bean - não traz muitasnovidades em relação ao EJB Entity Bean BMP - UserBean. Uma das poucas diferençasdeste é que o tipo de persistência do EJB deve ser configurado como Container, poisficará a cargo deste realizar a persistência. Informamos também a classe da chaveprimária, que neste caso será a classe que implementamos exclusivamente para essepropósito. A seguir vemos a definição da versão de CMP que no nosso caso utilizamos aversão 2.x e a seguir o nome abstrato do esquema, utilizado para as consultas EQL. Porfim definimos cada campo CMP. Estes campos devem ter os mesmos nomes doscontidos na implementação do EJB. A última linha define qual é o nome do atributoque será utilizado como chave para a persistência do objeto.

A configuração dos tipos de transação para cada método, segue a mesmaconfiguração utilizada para os outros EJBs anteriores.

�� �����JH�� H!� ���$����4� � ��� ���2��������� ����� � � �����.H&� H%�����>�� � ��� ��� �� ���%� ) � �������?�� � H.H �����) � ������� � ����� � ���� � � � � � ���$� � � � � � �%������<� � � � � ����� ) ������� �4�� ��H6H �� �%��������������� � �>��� H&� � � �������$� ������� �� �)+��� �(���.H&� ��� � � � 5 � � �)+��� �(���JH�� ��� �� ���"H��!�!��&� �3H&�/���)-� ���>��)-� � � �!�������� � � ���"H��!�!��&� �3H&�/���)-� ���>��)-� �� �)+��� ��� �$� � �

� ��� ��� ��� �$��)-� ���$��)� � � ��� ��� ��������)-���� � �)+��� � � ��� � �� �)+��� ��� �$� � �

Page 206: Jsp servlets j2_ee

� ��� ��� ��� �$��)-� ����� H,��&� �<�!� ��� � � �4� ��� �����$��)-� �� � �)+��� � � ��� � �� �)+��� ��� �$� � �

� ��� ��� ��� �$��)-� ������� �� � � ��� ��� � ������) � �� � �)+��� � � ��� � �� �)+��� ��� �$� � �

� ��� ��� ��� �$��)-� ���������(��&� � � � � ��� ��� ��������)-� �� � �)+��� � � ��� � �� ���%� ) �<����� � � ��� � �����!������&� � � � � ���,� ) ��� ��� � � ��� � �

� � �����!� � � ��

�%$ ��� ���+, ���M.10 �BK � $ � � � ��$��� �� ,;*"$%��� $&���O próximo EJB a ser comentado será o EJB Message-Driven Bean - UserNotifierBean.Como vimos nos tópicos teóricos deste tipo de EJB, o mesmo não necessita dadefinição de interfaces como nos EJB Session Bean e EJB Entity Bean. O que devemosfazer é implementar a classe do EJB que servirá como consumidor de mensagens e amensagem propriamente dita, sendo que esta última pode ser utilizada como uma dasimplementações definidas pela API Java.

Vamos analisar o EJB UserNotifierBean, que nos apresentará algumas diferenças dosoutros exemplos apresentados anteriormente.

Vemos inicialmente que a classe deve implementar a interface � ����������� � � � "������������ e ainterface � ���%� ��������� ��� � ��� � . A primeira interface é utilizada pelo container para tratar do ciclode 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 método � ��� ������������� � , o qual veremos sua implementação logo a seguir.

�������� � �� ��H.H � H&���� #��� � ��� ���� ������+� )+��� ��) �����GH � �"H.H&�&'(� � ��� �(���� �������*�� �"H.H���'�� ��� H���������� �

Os EJBs do tipo Message-Driven Bean somente definem os métodos de ciclo de vida��! R� ������ ����� e ��!SR�����) ��"������ . Os mesmos no nosso caso estão desprovidos de implementação,por isso não serão detalhados.

O método de negócio importante para a execução deste tipo de EJB é o método� ��� ��������������� . Este método é executado assim que mensagens são enviadas pelosprodutores de mensagens, isto é, os clientes que realizam as chamadas assíncronas aoEJB. Estas mensagens são postadas em um MOM e logo em seguida consumidas peloEJB Message-Driven Bean. Para isto, a mensagem é enviada como parâmetro para ométodo � ��� ��������������� , que valida a mensagem, recupera os dados contidos nela e realiza alógica de negócio necessária.

No nosso exemplo, a mensagem é validada verificando se a mesma é uma instânciado tipo de mensagem que estamos esperando receber. Caso isto ocorra, obtemos amensagem através do método ��� ��� ��������������� da interface � ����������� e realizamos a lógica denegócio, que neste caso será enviar um email para o usuário que efetuou a comprados produtos. Observe que todas as mensagens customizadas, isto é, definidas parauma determinada aplicação, devem implementar a interface � ����������� .

Page 207: Jsp servlets j2_ee

������� � �(��� �+����� ��H6H��&' � " � �<�$�<5 � � )�H � � ��H.H��&'2� )lH�' .� ����

� � " )�H�' � �"H%������������ � H������ ��H6H��&'2��.���� �&� ��' ) ��H.H&�&'2� "?" � H&����� �"H.H��&'2��.#)lH�' . � '2��� � � H.H,�&'�� " .;:� H,��� � � �"H,��� "�" � H,����� ��H6H��&' ��. )�H�' . � ' �<� � H���� " .;:� /�� H � H%�����(��)-��� � " �"H���� � '(�����8��H%� " .;*(�EH���� � '2��� � ��� � � ��� ��)-��� � " .;*

������� ��H ��� � � � ��&�!� ��� ��*�)-� HPH%�&' ��.;:�

� ���� �/ " ��5�����<�!� ���-��5�.����EH%����) � ���,� � ����� �$� � � " �?���������MH&���>��� ��'0��)+��� �$�;�$� �"H&��� � ��� ��5�.�:

��

Este EJB também apresenta um método privado chamado ����� � � ) ��� � ��� , no qual éimplementado a lógica de envio de emails. Ele não será detalhado.

A classe que implementa a mensagem UserMessage também não será detalhada, poisnão apresenta uma complexida extra. Somente define atributos que serão utilizadospara carregar os dados da mensagem do produtor para o consumidor, isto é, docliente que está efetuando a chamada assíncrona, para o EJB Message-Driven Beanque executará a operação.

A seguir vemos o deployment descriptor do EJB Message-Driven Bean -UserNotifierBean. Nele podemos observar algumas particularidades para este tipo deEJB. Como define somente a classe de implementação do EJB, nele definimos somenteeste atributo, além do nome de visualização e do nome utilizado pelo container parareferenciar o EJB. O tipo de transação também é definida como nos outros tipos deEJB. A particularidade do EJB Message-Driven Bean está em definir o destino damensagem. Devemos informar qual o tipo de destino utilizado para receber amensagem, se é Queue ou Topic.

�� )+��HLH,�&'2���4�(��� ����� �

� �(� H=��� �������>��)-� � � H����� #��� � � � ��� � � ��� H,��� � �����>��)-� �� � � �����>��)-� � � H����� ��� � � � ��� � � � � ���?����)-���� � � ���;�� ��H6H �����) � ������� � ���%� � ��&� � � � � � )-��� � � H����� ��� � � � ���& ������ � � � � ���4�� ��H6H �� �������"H&���� � ����� ���>�$� � � ���$����� �>��� � � �!�����ZH���&� � ����� ��� ��� �� ) ��H.H&�&' ���;�(�%� �������4����H%� � ���<� � ��� �

� ���"H��!� ���&�!� ����� ���(����� � �&���&5 � � )�H � � ����� � � ���"H���� ���&� � ����� ���>�$� �� H,�>�"H���%� ��� � �$���;�����%����� � � � � �� #��� � ���%����� � � � H,����H%���� �<� � ����� �(�>������� � � � � �

� � )-�"H.H&�&'(���;����� �$�����4����H%� � �$��� � ��� �� � )-�"H.H,�&'�� �4�(��� ����� ��

�%$ ��� 6MK �%�-EG0-8 � �C.10 � � �F(:, E � !��10Para empacotar a aplicação, podemos fazê-la de várias formas. Podemos utilizar osempacotadores do próprio J2SDK e J2SDKEE que são o jar e o packagerrespectivamente. Poderíamos utilizar do ANT, uma ferramenta muito utilizada no meioJava para criar makefiles.

Page 208: Jsp servlets j2_ee

Utilizaremos um arquivo de ‘build’ do ANT para realizar tal operação. Observe que ointuito deste tópico não é de explicar as particularidades dessa ferramenta. Paramaiores detalhes veja no tópico ��� R�� � ����� � � � as referências para o ANT.

A seguir apresentamos o arquivo R�$�� � ��# ��) � , utilizado como makefile para compilar aaplicação, gerar documentação, criar os pacotes (jar) e a aplicação Enterprise (ear).

Build File : build.xml� � 5�)0���$���LH,� ���� � ��� ���#��������(� ��' � � � � ��������� � � � � �

� ����� � ����1����)+�� �;��5=��)+��� ��H �#���<������� � ��/>��� ��� ��� H,����� � � � ���

� ���%�������?��� ����)-�� ������)-� � �$��� ���� ����?����� � ���%� � ���� � ����)-� � � � �� ���%�������?��� ����)-�� � ���(� � ����)-� � �$��� ���� �?��5���)+��� ��� � �� ���%�������?��� ����)-�� � �(���JH=� ��� � �$��� ���� � ��� � � � �� ���%�������?��� ����)-�� ������� � � � ����) � �$��� ���� � � � � � � �� ���%�������?��� ����)-�� ������� � � � ���&' � �$��� ���� � � � �� ���%�������?��� ����)-�� �;���)+��� � � � ��������' � �$��� ���� �4�$� � � �� ���%�������?��� ����)-�� ������� � � � ��� � � �$��� ���� � � � � � )+��� � �� ���%�������?��� ����)-�� ������� � � � �� ��HPH%��H � �$��� ���� ��������>� � � � ��� � �4� �� ��H6H��"H � � �� ���%�������?��� ����)-�� ������� � � � � � � � �$��� ���� ��������>� � � � ��� � �4� � � � � � �� ���%�������?��� ����)-�� ������� � � � ���"H���������"H � �$��� ���� ��������>� � � � ��� � �4� ���� � � �� ���%�������?��� ����)-�� ������� � � � ���� �<�&' � H ���(��� ���� ��� ����� � � � ��� � � � ���������'���H � � �� ���%�������?��� ����)-�� ������� � � � ���� � �$��� ���� ��������>� � � � ��� � �4� ���� � � �� ���%�������?��� ����)-�� ������� � � � � �&�������� � �$��� ���� ��������>� � � � ��� � �4� ����� � � �

� ���%�������?��� ����)-�� ������� � � �$� � � �$��� ���� � � � � � � �� ���%�������?��� ����)-�� ������� � � H=�� � �$��� ���� ��������!� � � ��� � �;� H,�� � � �� ���%�������?��� ����)-�� ������� � � ��� H��������� H �$�(��� ���� ��� ����� � � ��� � �4� �<�� � �!��H&���>����"H � � �� ���%�������?��� ����)-�� ������� � � ���"H����� �������LH � �$��� ���� ��������!� � � ��� � �;� ��� � ���"H����� �<� ���AH � � �� ���%�������?��� ����)-�� ������� � � � � � � �$��� ���� ��������!� � � ��� � �;� � � � � � �� ���%�������?��� ����)-�� ������� � � � ��� � �$��� ���� ��������!� � � ��� � �;� H,�� � � ��� � � �� ���%�������?��� ����)-�� �;���� � ��������&'(�"H � �$��� ���� � � � � �

� � � ����$��� '2������+�� ��HLH=����� /+�$��H��������7�>��H � � �"H1���+����� � ����� � �� ���<� /+� � �;�� ��H6H,���&� / ���

� ����� /$�$� ��)-����� ���&� / ���������� � � � �� ��H6H��"H � � � �� ��� � �"H���� ��� � ��������!� � � � � � � �6� ���� �����"H� � ���,���<� � ��� � � �

� � �$�&�!/ �

� � � )-��H!� ����0/$�$� ��>�7���>� � � � � � � � �� �����?'2��� �>��)-� �?/���� � ���

� ���/�� ) ��H.H&�&' �� ����4����� � ����)-� � ���� � � ������ ��� � � �� ���/�� ) ��H.H&�&' �� � � � �� ���/�� ) ��H.H&�&' �� � � H,� ��) �>��H�H���' ��� ��� � H1� ���!'(���GH " ��� �$�"H,.�� � � �� ���/�� ) ��H.H&�&' �� � � � �� ���/�� ) ��H.H&�&' �� ��/���� � � ��� � � � ��� � � ��� � ��H%� ��� � H����+)+���"H��&'2��) � � � �� ���/�� ) ��H.H&�&' �� �;�� ����� � � � ��� � � � ��� � � ����)-�<�(�-��H%�!����� ��������$� � '�����-������� ����� � �� ���/�� ) ��H.H&�&' �� ������� � � � � � ��� � � ��� � � ��)+����������#��H � H � �&) �#� �&��� � � ���,�.H#�,� ����� ���.H � ������ H � � �� ���/�� ) ��H.H&�&' �� �;�����H � � � � ��� � � ��� � �� �����-� � �<�$������ ���7�>��� � ����� " � � � . � � �

Page 209: Jsp servlets j2_ee

� ���/�� ) ��H.H&�&' �� �;���)+��� � � � ��� � � � ��� � � ��)+��� � � � H �� � H.H,� H ���0���%� � ������� � �� ���/�� ) ��H.H&�&' �� � � � �

� � �����?'2��� �

� � � � � )+�$� �-�"H��!�%��� ���!������ � ' � ���-������� � � � �� �����?'2��� �>��)-� �?�� ����� ���

� ����� �<� �-�$� � ���������� � � � ��� � � � � �� � �����?'2��� �

� � � � ��� �� ��� � B���N�O$� H ����H�� ���H � �� �����?'2��� �>��)-� �?� ��� � ���

� ) �<�$� �6�(� � ��� ����� � � � ��� � � � � �� � �����?'2��� �

� � � � ��� �� ��� � B���N�O$� H �>���� HPH ����� ��H �$������-���)0��� � ��N ��� � �� �����?'2��� �>��)-� �?� ��� � �4���)+��� � � �#�����������"H� ��� ��� � ���

� ) �<�$� �6�(� � ��� ����� � � � �� ��H.H&��H � � � �� ) �<�$� �6�(� � ��� ����� � � � ��������&'(�"H � � � �� ) �<�$� �6�(� � ��� ����� � � � � � � � � � �

� � �����?'2��� �

� � � � ��� �� ��� � B���N �$�7������� �0����� � � ��� ����� � ���N ��� � �� �����?'2��� �>��)-� �?� ��� � �?���>� � � �#���$�������)H� �?� ��� � ���� � � ���"H,���������H �������� � ���N �$� � �� ���� �+� ����� � ���������� � � � ����H&�����%��"H � � �

� ��� � �"H���� ��� � ��������!� � � ��� H,���������H � � � �� � ������ �� � � � � � H ���+����� � �<� � � �� ���� �+� ����� � ���������� � � � � � � � ���

� ��� � �"H���� ��� � ��������!� � � � � � � � �� � ��� � �"H���� �

� � ������ �� � �����?'2��� �

� � � ���)+��� � � � H �� ��H6H,� H ���-����� � �� N �$� � �� �����?'2��� �>��)-� �?���)+��� � � �#���������>��H � � �>� � �4���)+��� � �����

��� ������ H�����(� � ���������� � � H&�� � � ���"H������ � ���������� � � � �� ��H6H��"H � ��� ��H6H,����� /��%��� �?�� ��H.H������ / �#�>������' ����?���)+��� � � � ��������' � � � �

� � �����?'2��� �

� � � ���� ���������� �(��H � � �ZH � �� �����?'2��� �>��)-� � � ��� � �

� � � ��)0������<� � ������� H � H ��� ����� ���"H ���+������ � ' ������N�O�� H ���$H&� H!� ��)-� � ���� ��� � ���!�4� � � ���������� � � � ���������'���H �?� �%��H&�����%��"H � � ��� ���

� �4� � ��H%���6�$� � ���������� � � � ��� H���������"H � � � �� � � ��� �� � � ��)0������<� �� H �� ��H6H,� H ) �����"H1��H ���0���> � ���� ��� � ���!�4� � � ���������� � � � �$�������'���H �?� ��5���)0��� ���;�� � ����� � � ��� �

)+���>� �;��H!�� ��� ����� � � ����H&���� �����$�AH �?� � ��� � � � � ����� � � �� ���

Page 210: Jsp servlets j2_ee

� �4� � ��H%���6�$� � ���������� � � � �� ��HPH�� H � ���� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � �� � ���$� ����� � � �� � ���� ����� �&��) �� � ���) � ����� � � �,� � � ��!� � � � � � H;�6H0H�� �,� �� �;� � �,?� �,���&�%�,� � � �� �JHGH � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � H&��H6H,� ��� �� �!� � ��<� ���>�������?������)-� � �� ��H.H � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � H&��H6H,� ��� �

����� ��H� ���H��<��� � �� ��HPH � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � H&��H6H,� ��� �

����� ��H� ���H��<��� ����)-� � �� � H.H � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � H&��H6H,� ��� �

����� ��H �����������?� � �� ��HPH � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � H&��H6H,� ��� �

����� ��H �����������?� ����)-� � �� � H.H � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � � )-��� � � H������ ��H.H��<'(� � �� ��H.H � � �

� � ��� � �"H���� �� � � ��� �

� � �����?'2��� �

� � � ���� �� � ��� ��� ����� � ���N ��� � �� �����?'2��� �>��)-� � � ��� � �

� � ��� � ���!�4� � � ���������� � � � ��������&'���H �?� ��5���)+��� ��� � ��� � � ��� �� ����5�)+� ���������� � � � ��� �4� � �� ���� � � � ��� � 5�)+� ���

� �4� � ��H%���6�$� � ���������� � � � ��� � �#��5=�� ����� H � � �� �� � � � � ��� � 5�)+� � � �� � � ��� �

� � �����?'2��� �

� � � ��)+�������� � ��H � � �"H ���-����� � �� N �$� ��5���)0��� � � �� �����?'2��� �>��)-� �?� � ��� � ��� ���

��� ��� � ���!�4� � � ���������� � � � �$�������'���H �?� ��5���)0��� ���;� � � � � ��� �)+���>� �;��H!�� ��� ����� � � ����H&���� �����$�AH �?� � � � � � � � ������� � �� ���

� �4� � ��H%���6�$� � ���������� � � � �� ��HPH�� H � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � �$� ����� � � �� � ���� �����7�$��)-� �4���) � ����� � � ����� � ���� � � � � ��� � � � �

� � ��� � �"H���� �� � � ��� �

� � �����?'2��� �

� � � ���� ��+��������� �(������ � �� �����?'2��� �>��)-� �?����� �#�>���������"H � � ���%*�� ���&*�� � ��� � ��� ���

� ����� �����?� � � � ���������� � � � ��������<'(��H �?� ��5���)+��� ���;����� � ����� �������5�)+� ��� ����� � � ����H����� �����$�AH �?� ����� � ������� � ��&��� ��� � 5�)+� � �� �4� � ��H%���6�$� � ���������� � � � ��������<'(��H � ���

� � ���� �����7�$��)-� �4��5���)+��� ���;� � � � � ��� � � �� � ���� �����7�$��)-� �4��5���)+��� ��� � ��� � � ��� � � �� � ���� �����7�$��)-� �4��5���)+��� ���;�� � ����� � � ��� � � �� � ���� �����7�$��)-� �?���"H���������"H � � ��� � � �

� � ��� � �"H���� �� � ����� �

� � �����?'2��� �

Page 211: Jsp servlets j2_ee

� � � ����B �0���>� � �-�������� � ���N���� � �� �����?'2��� �>��)-� �?����� � ��� �����������"H �4�� ������*�� ��� � �?����� � ��*����)+��� � ��*>����� ���� � �����?'2��� �

� � � '(������ � ���(��������� ����� � ���N���� � �� �����?'2��� �>��)-� �4���� H � ���������>�"H� �?���)+��� � � ���

� ) �<�$� �6�(� � ��� ����� � � � ���� � � � �� ) �<�$� �6�(� � ��� ����� � � � � �&�������� � � � ���� ����������KH&�����%������<� /� ��������%� � � H,�% � � ��� H������ � � ������>� � � � � �&�������� � �

�� ��H6H,����� /��%��� �?�� ��H.H������ / �#�����"H6H� �?����� ���&� ��� �����JH=� ��� � �(� H �6�"H,�� � �(��H ������ � � � ������5� � �(� H � � � ������� � � � � �� ����4�4��� � ����)-� � � � � �������� � � ��&��� ��� �� ���� � � � � � ��?����� � ���=)-� � � � � ���$���� � � ���� � ��� � �2��������� � ��?����� � ����)-� � � ��(� � � �������� � � � ����) � � �����;� ��) ����4����� � ����)-� � � �$�&�(������ � �

� ��������&'(�0����)-�� �;���) � ����� � � � � � �� � � ��� />����� ��/��?� � � ��� � �&�(� � H,��� � ���) � � � H�� � �>� � � �����H � ����� � � �� � � ��� />����� ��/��?� � � ��� � �&�(� � H,��� � ���) � � � ��� � H���� � ��� � � � ���/����� H � ����� � � �

� � � ���������� �� B�� �DB�� ���4� � �� ���������� � � � ��� � �?� ��4�4��� � ����)-� � � � �<�������� � B�� � ���

� �4� � ��H%���6�$� � ���������� � � � � �<�$������ � � � �� � B�� ���

� � �����?'2��� �

� � ����� � ��&� �

�%$ � � @ �"�A8 �)( ��� .10 � � � (;, E � ! �-0 �C0 � $��?*-,S.10 � 2A41676A instalação de uma aplicação J2EE no servidor de aplicação Jboss não é uma tarefamuito difícil nem complexa. Configurações adicionais no próprio servidor de aplicaçãonão serão necessárias, pois não utilizamos recursos adicionais, mas se isso fosse precisotambém não seria uma operação muito complexa.

Tendo em mãos o arquivo EAR, a única tarefa que devemos realizar é a cópia doEnterprise Archive no diretório de deploy do Jboss. Devemos nos certificar de executaro Jboss com as configurações padrões, isto é, executar o comando� � � � � � ����� ��� � � ������ R������� � R�� � � � $� ou � � � � � � ��� � ��� ��� � ��� �=R ����� � � R�� � � ��$��� � ��� ��$�� � , que inicializará o servidor em seumodo de configuração padrão. Sendo assim, podemos realizar o deploy da aplicação,somente copiando o arquivo para o diretório � � � � � � ��� � ��� ����� ����:R ������ � � ����"���� � ��� ��$�� � � ������� � � .Algumas informações sobre o deploy serão impressas no console do Jboss, detalhandoa instalação do pacote. Por fim, se nenhum problema no arquivo EAR for detectadopelo servidor de aplicação, a mensagem de deploy realizado com sucesso seráimpressa no console.

Observe que o servidor de aplicações Jboss pode ser configurado para inicializar comserviços e recursos a mais ou a menos. A instação padrão sem configuraçõesadicionais, nos apresenta três modos de configuração fornecidos pelo servidor deaplicação. A configuração recomendável a ser utilizada para a execução daaplicação exemplo deste livro é a configuração default. Para maiores detalhes sobre asoutras configurações ou configurações customizadas, consulte a documentação doservidor de aplicação.

Page 212: Jsp servlets j2_ee

� ����������� �

� � �� I����� � ��� � � ����I� ���

� ���������"$�� �BK . $ � (;0 � K $%�G8 . $&� E � , ��8?0%�?>Deployment descriptors ou arquivos descritores são utilizados pelos componentes daarquitetura J2EE para definir seus detalhes, informações que são usadas pelo containerpara gerenciar esses objetos.

Existem vários tipos de descritores, um diferente do outro e específicos para cada tipode componente.

São alguns exemplos de descritores:

�� web.xml para componentes Web;

�� ejb-jar.xml para componentes EJB;

�� application.xml para o empacotamente de aplicações enterprise etc.

Para componentes EJB por exemplo, se faz necessário o uso de um arquivodenominado ejb-jar.xml, especificado pela Sun MicroSystems Inc. para aplicaçõesenterprise e que apresenta informações dos componentes EJB tais como Session Bean,Entity Bean e Message-Driven Bean. Além disso, apresenta formas de definir o escopoda transação na qual irá sobreviver o EJB, segurança e autenticação, relacionamentosentre Entity Beans, tipo de sessão, persistência dos Entity Beans, consultas em EQL paraEntity Beans, tipo de Session Bean, recursos remotos ou locais localizados através deJNDI 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 ��! R �! ���# ��)*� e estar no diretório � ����� �� ( � da aplicação. Este arquivo será empacotadojuntamente com as classes que os componentes utilizarão.

Este arquivo tem sua estrutura definida por um DTD (Document Type Definition). Iremosapresentar uma breve explicação de cada elemento e atributo do deploymentdescriptor ejb-jar.xml. Para maiores delhaes, consulte o DTD ejb-jar_2_0.dtd.

O arquivo em questão, deve ter como linha inicial com a seguinte declaração:

Page 213: Jsp servlets j2_ee

� � � � � � � � �-� � ��� � ��� ��� � � � � � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � ���� � ��� /��;� � � ��� � �<�$� � H,�>� � ���) � ����� � � � ��� � ��� � � � � � ����� � �

���������� �������� �����

O elemento-raiz do deployment descriptor ejb-jar.xml é o elemento � � ! R � ! ��� � . A seguiriremos detalhar seus atributos e elementos.

� � � ��� � ��� �� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� �(� H=��� �������>��)-� � � � ��� H,��� � ��� �$��)+� �� H�)-��� � ��� ���� � � � H�)-��� � ��� ���� �� � ��� '(����� ���� � � � � ���?'2���?� ���� �� �������������%� H%�����������ZH � � � �����������>��� H&���?�������ZH �� �%��� ��� � ���ZH,/�� ��H � � � ����� �&�!� ���"H,/�� �"H �� � HPH���)+��� ���4����H&���� ������� � � � ��HPH���)+��� ���4����H&���� ������� �� � � ���;�� � ���$� � � ��� � � � � � ���;�� � ���$� � � ��� �

� � � � ��� � ��� �

�� <description> : atributo que apresenta a descrição do pacote EJB.

�� <display-name> : atributo com nome do módulo de EJB a ser utilizado por outrasferramentas para referenciar a este pacote.

�� <small-icon> : atributo com o caminho completo de uma figura que será utilizadacomo um ícone pelas ferramentas, que manipularão este módulo. 16x16 pixels.

�� <large-icon> : atributo com o o mesmo que a small-icon, sendo que esta íconepoderá ser maior. 32x32 pixels.

�� <enterprise-beans> : elemento que define as informações dos EJBs contidos nestepacote. Neste elemento estarão as informações de cada EJB Session Bean, EntityBean e Message-Driven Bean.

�� <relationships> : elemento que apresenta os relacionamentos entre os EJB EntityBean CMP.

�� <assembly-descriptor> : elemento que define as informações de segurança etransações.

�� <ejb-client-Jar> : elemento usado para conter o nome do pacote com as classepara acesso remoto aos EJBs.

������������ ����� ������� !" ����� #����!��

O elemento � � � ���� �� � ��� �SR������� � define informações de cada tipo de EJB, tais como, SessionBean, Entity Bean e Message-Driven Bean, e não possui atributos. A seguir iremosdetalhar seus elementos.

� ���$�����&����� H������������)H �� H&�"H.H=� ��� � � � H&��H.H�� ��� �� ������� ��� � � � ����� � � � �� ) ��H.H&�&' ���;�(�%� ����� � � � )-� HPH%�&' ���;�(��� ����� �

� � ����� ���,����� H������������ZH �

Page 214: Jsp servlets j2_ee

O elemento � ��������� ��� � define informações para os EJBs Session Bean contidos no arquivode deploy, sendo assim, podemos ter várias ocorrências deste elemento. A suadeclaração apresenta alguns atributos e elementos.

� H��"H.H�� ��� �� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� �(� H=��� �������>��)-� � � � ��� H,��� � ��� �$��)+� �� H�)-��� � ��� ���� � � � H�)-��� � ��� ���� �� � ��� '(����� ���� � � � � ���?'2���?� ���� �� � � �����>��)-� � � � � � ��������)-� �� />��)-��� � � /���)-� �� �%��) ��� ��� � � �%��)-����� �� � ������ � /$��)+��� � � � ������ ��/���)-� �� � ������ � � � � ������ �� � � ���;�� ��H6H � � � � � ������ � H.H �� H&�"H.H=� ��� � � � ��� � � � H��"H.H=� ��� � � � �$� �� �������"H&���� � ����� ���>�$� � � � �!�����"H,��<� � ����� ���(��� �� ����� �4�����!��� � � � ����� �4�$���!��� �� � � �����%��� � � � � � �����%��� �� � � ����� ������ ���%��� � � � � � ����� ������ ���%��� �� H&����(��� ����������� �������<� � � � H&�������� � � �?����� ��������� �� H&����(��� ������� ������� � � � � � � H&�������� � ��� � ������� � � � �� �%�"H����������������� � � � �%�"H�����������?����� �� �%�"H�����������?�$��� �;��������� � � � �%��H&����������?���$���?����� ��� �

� � H,�"H.H�� ��� �

�� <description>: descrição 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 íconepelas ferramentas, para este EJB.

�� <large-icon>: caminho completo de uma figura que será utilizada como um íconepelas ferramentas, para este EJB.

�� <ejb-name>: nome do EJB, utilizado posteriomente dentro do próprio deploymentdescriptor 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 transação. Pode ser Bean ouContainer.

�� <env-entry>: define propriedades de ambiente para o EJB.

�� <ejb-ref>: declara referências para outros EJBs.

Page 215: Jsp servlets j2_ee

�� <ejb-local-ref>: declara referências locais para outros EJBs.

�� <security-role-ref>: declara referência para regras de segurança para este EJB.

�� <security-identity>: informa como propagar o contexto de segurança.

�� <resource-ref>: declara referência para recursos que podem ser utilizados pelos EJBs.

�� <resource-env-entry>: associa os recursos com nome JNDI.

O elemento � ��� � � � � � apresenta informações do EJB Entity Bean e também pode ocorrermais de uma vez no arquivo de deploy. Além de apresentar informações do EJB, podedefinir as querys utilizadas pelo container para um EJB CMP.

� ���$� � ��� �� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� �(� H=��� �������>��)-� � � � ��� H,��� � ��� �$��)+� �� H�)-��� � ��� ���� � � � H�)-��� � ��� ���� �� � ��� '(����� ���� � � � � ���?'2���?� ���� �� � � �����>��)-� � � � � � ��������)-� �� />��)-��� � � /���)-� �� �%��) ��� ��� � � �%��)-����� �� � ������ � /$��)+��� � � � ������ ��/���)-� �� � ������ � � � � ������ �� � � ���;�� ��H6H � � � � � ������ � H.H �� �����JH�� H!� ���$����4� � ��� � � � �����JH�� H!� ���$����4� � �$� �� ���%� ) � �������?�� � H.H � � � ����� ) � ����� �?�� ��HLH �� �%��������������� � � � ���������!������� �� �)+��� �(���.H&� ��� � � � �)+��� �(���JH�� ��� �� ���"H��!�!��&� �3H&�/���)-� ���>��)-� � � � ��� H�� �%���� �3H&�/���)+� ���$��)+� �� �)+��� ��� �$� � � � � �)+��� � � ��� � �� ���%� ) �<����� � � ��� � � � � ���&� ) �<��� � �4� ��� � �� ����� �4�����!��� � � � ����� �4�$���!��� �� � � �����%��� � � � � � �����%��� �� � � ����� ������ ���%��� � � � � � ����� ������ ���%��� �� H&����(��� ����������� �������<� � � � H&�������� � � �?����� ��������� �� H&����(��� ������� ������� � � � � � � H&�������� � ��� � ������� � � � �� �%�"H����������������� � � � �%�"H�����������?����� �� �%�"H�����������?�$��� �;��������� � � � �%��H&����������?���$���?����� ��� �� �(�$�$� � � � � ��������� �

� � �����!� � � �

�� <description>: descrição do EJB Entity Bean.

�� <display-name>: nome utilizado pelo container para se referir ao EJB em questão.

�� <small-icon>: caminho completo de uma figura que será utilizada como um íconepelas ferramentas, para este EJB.

�� <large-icon>: caminho completo de uma figura que será utilizada como um íconepelas ferramentas, para este EJB.

�� <ejb-name>: nome do EJB, utilizado posteriomente dentro do próprio deploymentdescriptor para referenciar este EJB.

Page 216: Jsp servlets j2_ee

�� <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 persistência do objeto. Pode ser BMP ou CMP.

�� <prim-key-class>: nome completo da classe que define a chave primária daentidade.

�� <reentrant> : pode ser True ou False.

�� <cmp-version>: versão de CMP. Depende da implementação do servidor deaplicação. Pode ser 1.x ou 2.x.

�� <abstract-schema-name>: nome do objeto utilizado adiante para criar em EQL,formas de consulta e manipulação do objeto em questão.

�� <cmp-field>: apresenta todos os campos de um EJB Entity Bean CMP que serãopersistidos.

�� <primkey-field>: campo de um EJB Entity Bean CMP que será considerado comochave primária.

�� <env-entry>: define propriedades de ambiente para o EJB.

�� <ejb-ref>: declara referências para outros EJBs.

�� <ejb-local-ref>: declara referências locais paa outros EJBs.

�� <security-role-ref>: declara referência para regras de segurança para este EJB.

�� <security-identity>: informa como propagar o contexto de segurança.

�� <resource-ref>: declara referência para recursos que podem ser utilizados pelos EJBs.

�� <resource-env-entry>: associa os recursos com nome JNDI.

�� <query>: apresenta uma lista de códigos de manipulação de objetos, utilizado paraEJB Entity Bean CMP, utilizando a linguagem EQL (EJB Query Language).

O elemento � )*����������� � ��� � "�� � � define as informações dos EJB Message-Driven Bean. Comonos outros casos, o arquivo de deploy pode conter mais de uma ocorrência desteelemento, isto é, no caso de deploy de mais de um EJB. A seguir os seus atributos eelementos.

� )+��HLH,�&'2���4�(��� ����� �� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� �(� H=��� �������>��)-� � � � ��� H,��� � ��� �$��)+� �� H�)-��� � ��� ���� � � � H�)-��� � ��� ���� �� � ��� '(����� ���� � � � � ���?'2���?� ���� �� � � �����>��)-� � � � � � ��������)-� �� � � ���;�� ��H6H � � � � � ������ � H.H �� �������"H&���� � ����� ���>�$� � � � � �%���)H%��&� � ����� ��� ��� �� ) ��H.H&�&' ���0H&��� ��&� ��� � � � ) ��H.H&�&'(���0H&��� ��&� ��� �

Page 217: Jsp servlets j2_ee

� �� ���>��� � ����'(����) ����� � � � �������� � � ����'�����) ����� �� ) ��H.H&�&' ���;�(�%� �������4����H%� � ���<� � ��� � � � )+� H.H��<'(���?���,� �(�����;���"H�� � ���&� � ��� �� ����� �4�����!��� � � � ����� �4�$���!��� �� � � �����%��� � � � � � �����%��� �� � � ����� ������ ���%��� � � � � � ����� ������ ���%��� �

� H�����>��� � � ��� �����$� � � � � � � H,������&� � � �?� ������� � ��� �� �%�"H����������������� � � � �%�"H�����������?����� �� �%�"H�����������?�$��� �;��������� � � � �%��H&����������?���$���?����� ��� �

� � )-�"H.H,�&'�� �4�(��� ����� �

�� <description>: descrição 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 íconepelas ferramentas, para este EJB.

�� <large-icon>: caminho completo de uma figura que será utilizada como um íconepelas ferramentas, para este EJB.

�� <ejb-name>: nome do EJB, utilizado posteriomente dentro do prórprio deploymentdescriptor para referenciar este EJB.

�� <ejb-class>: nome completo da classe que implmenta o EJB em questão.

�� <transaction-type>: define quem gerenciará a transação. Pode ser Bean ouContainer.

�� <message-selector>: filtra mensagems baseadas no seletor de strings do JMS.

�� <acknowledge-mode>: especifica como serão as mensagens de confirmação(acknowledge). Pode ser Auto-acknowledge ou Dups-ok-acknowledge.

�� <message-driven-destination>: define o tipo de destino da mensagem que pode ser! ��"�� �&# !�) � # � $���$�� ou ! ��"�� ��# ! )*�%# � ����� � . Além de definir a durabilidade do envio da mensagem quepode ser Durable ou NonDurable.

�� <env-entry>: define propriedades de ambiente para o EJB em questão.

�� <ejb-ref>: declara referências para outros EJBs.

�� <ejb-local-ref>: declara referências locais paa outros EJBs.

�� <security-identity> : informa como propagar o contexto de segurança.

�� <resource-ref> : declara referência para recursos que podem ser utilizados pelosEJBs.

�� <resource-env-entry> : associa os recursos com nome JNDI.

��������� � � ���� � ����!��� ���!��

O elemento � � ��� ��� � �����=N�� ���� apresenta o relacionamento entre EJBs Entity Bean CMP, sendoque podem ocorrer nenhum, um ou mais relacionamentos entre EJBs deste tipo. Defineoutro elemento, � ��!SR ������ ����� ��� � , no qual são configurados cada relacionemento entre doisEJBs.

� ����� �<� � ���"H,/>� � H �

Page 218: Jsp servlets j2_ee

� ���"H����� �<� � ��� � � � ����H����� �<� � ��� �� � � �����%��� �<� � ��� �

� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� � � �����%�$� ��� � �$��������)-� � � � � � ���?����� �<� � �����?����)-� �� � � �����%�$� ��� � �$�EH,/�� ���?����� ���

� ���"H���%� �<� � ��� � � � ����H&���� �<� � ��� �� � � ��������� �<� � ���"H,/>� �����%��� �����>�=) � � � � � � ���?����� ��� � ���"H&/�� �����%��� ��� �>��)-� �� )0��� � � ��� � �� � � � � � )+��� � � ��� � �� � � �� ����� ��� � ���"H&/�� �����%��� ���GH&���>���� �

� ����H%���� �<� � ��� � � � �>��H����� ��� � ��� �� � � �����>��)-� � � � � � ��������) � �

� � �!�$� ��� � ���EH,/�� ���?����� ���3H,�������� �� �)+��� � � ��� � �

� ����H%���� �<� � ��� � � � �>��H����� ��� � ��� �� �)+�� � � ��� ��� �$��)-� � � � �)+�� �4� ��� ��������)+���� �)+�� � � ��� ���;� �2��� � � � �)+�� � � ��� ���4���(�����

� � �)+���4�4� ��� � �� � � � ���?����� ��� � ���"H&/�� �����%��� ���

� � � �����%�$� ��� � �$�EH,/�� ���?����� ���� ���"H����� �<� � ��� � � � ��� H���%� �<� � ��� �� � � �����%�$� ��� � �$�EH,/�� ���?����� ��������)-� � � � � � �����%��� ��� � ���ZH,/�� ���?����� ��������)+���� )+��� �!� ��� � �� � � � � � )+��� � � ��� � �� � � �� ���H&�������������� ����� � � � ���H���������;����� �<��� �� �%��� ��� � ���ZH,/�� ���?����� ���3H,�����%�� �

� ���"H���%� �<� � ��� � � � ����H&���� �<� � ��� �� � � ��������)-��� � � � � ���?����)+���

� � �%��� �&��� ���ZH,/�� �����%��� ���3H������%�� �� �)+�� � � ��� � �

� ���"H���%� �<� � ��� � � � ����H&���� �<� � ��� �� �)+��� � � ��� ��������)-� � � � �)+��� � � ��� � ������) � �� �)+��� � � ��� ���4� � ��� � � � �)+��� � � �$� ��� ���(��� �

� � �)+�� � � ��� � �� � � � �����%��� ��� � ���ZH,/�� ���?����� � �

� � � � ���?����� �<� � ��� �� ����� �<� � ���"H,/>� � H �

A seguir vemos uma breve explicação dos atributos do elemento � ����� ����� � ���:N�� ���� .�� <description> : descrição do relacionamento entre EJB Entity Bean CMP.

�� <ejb-relation> : define o relacionamento entre dois EJB Entity Bean CMP.

Sub-elemento � ��!SR ������ � ��� ��� � do elemento � ���� ��� � �����=N�� ����� que define define o relacionamentoentre dois EJB Entity Bean CMP.

�� <description>: descrição 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 doisEJBs que possuem o relacionemnto.

Page 219: Jsp servlets j2_ee

Sub-elemento � ��! R � � ��� ����� � ���:N�� � ��� ��� � � do elemento � ��! R � � ��� ��� � � � � que descreve um regra derelacionamento dentre dois EJBs.

�� <description>: descrição 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 EntityBean CMP é dependente da vida do outro EJB. Sendo assim, só pode serconfigurado para o EJB Entity Bean com multiplicidade um (One) norelacionamento.

�� <relationship-role-source>: define qual EJB estará relacionando com este.

�� <cmr-field> : define qual o campo utilizado para o relacionamento. Apresentaatributos que definem a descrição do campo de relaciomento, o nome do campopropriamente dito e o tipo do campo.

�������������#! !" �� � � � ���� !���� �� � � � �

O elemento � ��� ����)MR�� � ������� ����� ��� ��� � define as regras de segurança, a permissão de acesso(execução) dos métodos dos EJBs, atributos de transação para cada método de cadaEJB e a lista dos métodos excluídos do deploy.

� ��H6H���)+��� ���;���"H����� ������� �� H&����(��� ����������� � �

� ���"H���%� �<� � ��� � �� ����� � �?����)-� � � � �!�$� ��������) � �

� � H&����(�%� �������%��� � �� ) ��� /�������������)+� H6H,� ��� �

� ����� � �?����)-� � � � �!�$� ��������) � �� ) ��� /���� �

� ���"H���%� �<� � ��� � �� � � ��������)-��� � � � � ���?����)+���� )+�<� /���� �?� �$�;� � � � )-��� /�������� �������� )+�<� /���� �?����)-��� � � )-����/������?����)+���� )+�<� /���� �1��������)$H � � � )-��� /������?��������)lH �

� � )-��� /���� �� � )-��� /�������������)+� H.H,� ��� �� ������ ��� �$�$��� �!�%���"H&���� � ��� �� ���"H����� �<� � ��� � �� ) ��� /���� �

� � � ��������)-��� � � � � ���?����)+���� )+�<� /���� �?����)-��� � � )-����/������?����)+���

� � )-��� /���� �� �������"H �;�<��� �&� ������� � � � � �����"H �;�&�?�!��� ������� �� � ������ ��� ������� �������"H&���� � ��� �

� � ��H6H���)9��� ���;���"H����� �<� ��� �

Page 220: Jsp servlets j2_ee

�� <security-role> : define a regra de segurança utilizada para acesso aos EJBs. Comoatributos define uma descrição da regra de segurança e o nome da regrapropriamente dita.

�� <method-permission> : quais métodos podem ser acessados por quem a partir daregra de segurança definida em � ����%$� � ��� ��� ��� � � . Para cada método, informa-se o nomedo EJB que o contém, além de informar se este método é acessado para algumainterface, o seu nome e os parâmetros que ele recebe. Pode-se definir uma regrapara todos os métodos de um EJB, utilizando o asterisco (*) no elemento <method-name>, por exemplo. Este elemento pode aparecer quantas vezes for necessário,para configurar uma regra de segurança para um método de um EJB.

�� <container-transaction> : define atributos de transação para cada método de cadaEJB. Pode conter um atributo que descreve a transação e deve conter para cadamétodo o nome do EJB e o nome do método que será utilizado um tipo detransação, configurada no elemento ��� � ����� � ��� � � � R�$��� � .

�� <exclude-list> : lista dos métodos excluídos do deploy. Apresenta um atributo com adescrição da lista de exclusão e um elemento que contém o nome de cadamétodo de cada EJB que será excluído do deploy.

Page 221: Jsp servlets j2_ee

� ����������� �

����� � ����� � �� � ! � ���#" ��� �

Este apêndice apresenta um guia de referência rápida para a API EnterpriseJavaBeans. Observe que a API da plataforma J2EE é muita mais extensa, sendo queesta apresentada neste tópico é somente uma parte dela. Não visamos tambémexplicar em detalhes a API EJB. Para detalhes consulte a documentação oficial da APIe a especificação EJB 2.0.

Iremos apresentar o pacote ! ��"�� ��# ��! R explicando as suas interfaces e exceções.

� ��� @ �C8 $��+H �-E $ ����#������ � ���� � ��

A interface � ���� � ��� ��� é extendida pelos contextos de cada tipo de EJB, isto é, pelasinterfaces '�������� ������ ��� ��� , ������� ���������� � �� e � ����� ����� ����� "�� ���� ��� ��� . Fornece informações de segurança,transação e dados sobre as interfaces � ��) � ( ����� ��� e ����) � ��� ) do EJB, sendo possível utilizá-lapara criar, destruir ou localizar um objeto ����� por exemplo.

������� � � �$�����!������+�&�> �� ��������5,� ���> �2��)-� ' ��� ���> ����)-� " .;:���> �������� �8��)-� '���� � �� �������� ����)-� " .;:� �%�������?� � ��H1'2��� �����(� �����>)-����� " .;:� ������� � � �+'(����� ��� � ����� ������� � ��� " .;:� �&� ���� ������'2����� ��� � ��� � ��� �$�� ����� " .;:������� �����9� H � ��� � ��� � ������� � " � ������� � � � �%��� ��.;:������� �����9� H � ��� � ��� � ������� � " ��� ��� ��' �%�$� �� #��)-��.;:� H,��� � �����)H%��&�!� ��� '2��� � H���� � �����"H&���� � ��� " .8� /(��� �dH � � � ��'2��� �����&������5�����<�!� ����:����� �$H&��� ����� � ������ � ��� � " .2� /������ H � � � ��'2��� �����&� ����5�����<�!� ����:������� �����7'(��� ����� � ������ � ��� � " .8� /(��� �dH � � � ��'2��� �����&������5�����<�!� ����:

���#�������� � �

Esta interface deve ser extendida pelas interfaces � ��) � (acesso ����) � ��� � ����) � ) doscomponentes EJBs implementados. Ela oferece serviços para criação, remoção elocalização de objetos EJB. Oferece informações sobre o metadados do EJB e o handle

Page 222: Jsp servlets j2_ee

do EJB, que pode ser utilizado para futuras chamadas de métodos ao objeto, sem anecessidade de realizar a sua localização por exemplo.

������� � � �$�����!������+�&�> ����)-� ��5&� �����)H �>��)-�<� � ����� �0�%��) ����� " ��������� �-/�������� ��.8�!/��%��� H�����)-��� ����5������� � ����*�����)-���$����5�����<�!� ����:����� �0�%��) ����� " � � � ��&�1����� ) ����� �����(. � /������ H ����)+��������5������� � ���(*��>��)-�<�(����5������� � ����:���> �� ����� � �&� � ' ��� ���> �� ����� � �<��� " . � /(�!��� H�����)-�������$5�����<��� ����:����)-� �����>��� � '2�����8��)-� �2������� � " .8� /(��� �dH �$��)+�<�����$5=����<�!� ����:

���#��� � ���� � ��� � � � �

Deve ser extendida pelas interfaces � ��)*� (acesso ���� ����� ����� ��� � ��) � ) dos componentes EJBs.Apresenta serviços de criação, remoção e localização dos objetos EJB.

������� � � �$�����!������+�&�> �������� ����)-� ����� �0�%��) ����� " � � � ��&�1����� ) ����� �����(. � /������ H ����)+��������5��������� ����*�� �� ���5������� � ����:

���#�������� � � � � � ���� � �A interface ��� ���� ��� �IR�! ���� deve ser extendida pela interface ����� ��� (interface ����) � ��� � � �����%� � ����� ���)para os EJBs que provêm acessos locais. Apresenta métodos para obter referência paraa interface LocalHome e obter a chave-primária (Primary Key) do objeto caso o mesmoseja um EJB Entity Bean. Além de prover um método para destruir a instância do objetoe um serviço que avalia se o objeto atual, isto é, o ����� ����� ��� �IR�!����� é idêntico a outroinformado.

Quando definir a interface �������� para um componente EJB, a mesma deve conter osmétodos de negócio que estarão disponíveis para o cliente local.

������� � � �$�����!������+�&�> �������� � � � ��&��������� � ���� �������� �2��)-� '(���!���> �������� ����)-� " .8� /(�!��� H ���> ��$5���$�<� � ���>:������� � � � � ��<� ' ��� � ��� )+����� �>��� " .8�!/>����� H �&�> ���5��������� ����:������� � ����� �0�%��) ����� " .8�!/��%���dH �>��)-�<�(����5=��$�<� � ���>*����> ���5������� � ����:������� �����9� H�� ������� � ���� " ���> �������� � � � ��&� ��� � .8�!/��%���dH � �> ���5=������ � ����:

���#�������� ����� � � �

Permite que o cliente acesse informações dos metadados do EJB. Esta interface não émuito utilizada, mas pode ser obtida através da chamada ao método ��! R ����) ��# ���� � �� � � � � ����� ���� . As informações contidas nesta interface e fornecidas ao cliente remoto em forma deum objeto serializado, pode ser utilizado para obter dinamicamente informações sobreo EJB.

������� � � �$�����!������+�&�> ��1����� � �<��� ���> �2��)-� ' ��� ���> ����)-� " .;:�#� ��HLH '������8��)-��� �������?�������� � ��H6H " .;:�#� ��HLH '���� �>��)+�<����� ��� �����;������ � ��H.H " .;:�#� ��HLH '���� � ��� )-����� ��� � � � � H.H " .;:������� �����9� H ���"H6H,� ��� " .;:

Page 223: Jsp servlets j2_ee

������� �����9� H ����������� � HPH ��� H.H=� ��� " .;:�

���#�������� ��� � �Esta interface deve ser extendida pela interface ����) � � � (acesso remoto) doscomponentes EJBs. Apresenta uma visão dos serviços oferecidos pelo EJB para o clienteremoto. A interface ����) � �� definida para cada EJB, deve conter as assinaturas dosmétodos de negócio que o EJB implementa e as quais o cliente remoto terá acesso.

Por esta interface, o cliente pode ter acesso a referência para a interface � ��) � do EJB,obter a chave-primária no caso de EJB Entity Bean, remover a instância do objeto,obter o Handler deste objeto que contém informações sobre ele e verificar se algumobjeto é idêntico ao objeto atual.

������� � � �$�����!������+�&�> � � � ��&� ��5,�������ZH ����)-��� � ������� � ���� ����) � ' ��� ���> ����)-� " .8� /(��� �dH �$��)+�<�����$5=����<�!� ����:������� � � � � ��<� ' ��� � ��� )+����� �>��� " .8�!/>����� H�����)-��������5�����<� � ����:������� � ����� �0�%��) ����� " .8�!/��%���dH �>��)-�<� ����5������� � ����*�����)+��������5��������� ����:������� � ��������� � '(�����2������� � " .8� /������ H ����)+��������5������� � ����:������� �����9� H�� ������� � ���� " ���> � � � ��&� ��� � . � /������ H ����)+��������5������� � ���(:

���#����� ���� ������� !" �# ���A interface ��� ����� ���� ����������� é a interface genérica de cada tipo de EJB. Ela é extendida pelasinterfaces '�������� ����������� , ������ � ������� e � ���%� ����� � � � "%��� ������ . Além de ser serializada é utilizada como umainterface ) ��� � ��� , isto é, informa que a interface é realmente um EJB.

������� � � �$�����!������+�(��� ���%����� H&�� ������ ��5��������"H � �&��� � � � � ������� ��� � B������ � �

���#����� ��� � � � ����Quando implementamos EJB EntityBean, devemos implementar esta interface.Apresenta os métodos de ciclo de vida do EJB, executados pelo container nosmomentos apropriados.

Define os métodos para configurar e desconfigurar o contexto associado ao EJB EntityBean, método de remoção da entidade persistente, ativação da entidade caso tenhasido passivada pelo container, passivação da entidade em caso de falta de recursos ouporque muitos EJBs estão instanciados por exemplo, carrega uma entidade do meiopersistente para a memória quando o container precisa atualizar os dados do objeto,ou atualiza os dados no meio persistente de acordo com os valores dos atributosconstantes em memória.

Além destes métodos, se faz necessário a implementação do método ��! R� � ���������� jámencionado anteriormente, o qual irá criar a instância do objeto em memória e persistiro mesmo.

������� � � �$�����!������+�(��� � � �( ������-��5��������)H �������������%� H&�� ������ ������� � ������ �DH&��� ���$� � ����� ��������5�� " ����� � ����� ����� �<5,�1&��5�.

� /������ H ���> ���5=����<� � ����*��$��)+�<�����$5=����<�!� ����:

Page 224: Jsp servlets j2_ee

������� � ������ �7���"H��<�!����� � ����� ��������5&� " .8�!/��%��� H���> ���5�����<��� ����*�����)-��������5�����<� � ����:������� � ������ � � � ������)-�<��� " .8� /������ H ����)-��������5������� � ����*����� ���5������� � ���(*��>��)-�<� ����5���$�<� � ���>:������� � ������ � � � � � �� � ������� " . � /��%��� H � �> ���5������� � ����*�����)-��������5�����<� � ����:������� � ������ � � � � � ��HPH,� �(�&��� " . � /��%���dH � �> ���5������� � ����* ����)-��� ����5�����<� � ����:������� � ������ � � � � ������� " .2� /������ H ���> ���5=����<� � ����*��$��)+�<�����$5=������ � ����:������� � ������ � � � ���������%� " . � /������ H ���� ���5�����<�!� ����*�����)+�<���$��5=������ � �$�>:

���#����� ��� � � � � ��� � ��Apresenta a interface específica do EJBContext para um EJB Entity Bean. Ela éassociada ao objeto após a criação da sua instância.

������� � � �$�����!������+�(��� � � � �2���$����5&� ��5&� ���$�)H �&�> �� ��������5,� ���> �������� � � � ��<� '(��� �&�$ �������� � � � ���� " . � /������ H � � � ��'2��� �����&� ����5�����<�!� ����:���> � � � ��&� '2��� ���� � � � ���� " . � /������ H � � � ��'2��� �����&� ����5��������� ����:� � � ��&� ' ��� � ��� )-����� ��� � " .8�!/��%��� H � � � ��'(��� �����<�����$5=������ � ����:

���#��� � ����� � Um Handle é uma referência persistente de um componente EJB. Ela é implementadapor todos os EJB Handles. Muito útil quando a aplicação necessita persistir a referênciapara um objeto EJB e recuperá-la posteriormente.

������� � � �$�����!������ �2������� ���5��������"H � ����� � � � � �����%� ��� � B������ � ������� � ���� � � � ��&� '2�������> � � � ���� " . � /������ H ����)-�������$5=����<�!� ����:

���#� � � � �� ����� � Tal como o Handle é uma referência persistente para a interface ����) �� � de um EJB, aHomeHandle é uma referência persistente para interface Home de um EJB. Também éútil para manter a referência da interface � ��) � de um EJB, persistente em algum meio erecuperá-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 osmétodos de ciclo de vida deste tipo de EJB. Observe que estes métodos não sãoexecutados pelos clientes, pois como este componente tem um comportamento deexecução assíncrona por meio de mensagens (JMS), os métodos são executados pelocontainer no recebimento de mensagens dos clientes.

Observe que o único método de negócio que a implementação de um EJB Message-Driven Bean deve oferecer é o método � � � ��������������� , implementado da API JMS. Estemétodo será invocado pelo container no recebimento de mensagens dos clientes edeve executar a lógica de negócio para o EJB em questão.

Page 225: Jsp servlets j2_ee

������� � � �$�����!������ � ��H6H��&'2� � ��� �����> ������ ��5����$�$��H ���������&���%� H%�� ������ ����� �$H&����� �"H.H%��'(� � ��� �(�����2��������5&� " � ��HLH��&' � � ��� ����� �2��������5�� ��?5<. � /(�!���dH ���> ��$5���$�<� � ���>:����� �+� � ���>��)-�<�$� " .8� /������dH ���> ���5������� � ����:

���#� � � �!"! � � � � � ���� � ��� � ��Apresenta a interface específica de EJBContext para um EJB Message-Driven Bean.Também associa o contexto ao EJB, depois que sua instância é criada.

������� � � �$�����!������ � ��H6H��&'2� � ��� ����� �2����� ��5�� ��5��������"H ���> ��2����� �<5�� �

���#� ���# �! !� ������ ����Deve ser implementada por todo EJB Session Bean. Apresenta os métodos do ciclo devida do EJB, tais como associação do contexto ao EJB, remoção da instância doobjeto, ativação e passivação do objeto pelo container, além de definir o método��! R� ������ ����� que criará uma instância do objeto pelo container.

������� � � �$�����!������ ����HLH=� ���� ������-��5��������)H �������������%� H&�� ������ ����� �$H&��� ��� HPH&� ����� ����� �<5,� " ���"H.H�� ����� ����� �<5,� <��5�. � /������ H ���> ���5�����<� � ����*��$��)+�<�����$5=����<�!� ����:����� �+� � ���>��)-�<�$� " .8� /������dH ���> ���5������� � ����*�����)+��������5�����<�!� ����:����� �+� � � � <� � �(�<��� " .2��/������ H � �> ���5=����<�!� ����*��>��)-�<� ����5������� � ����:����� �+� � � � ��H6H,� �$�<��� " .2��/��%��� H � �> ���5=������ � ����*��>��)-�<� ����5������� � ����:

���#� ���# �! !� ��� � ���#�� ��Esta é a interface específica de EJBContext para um EJB Session Bean. Também éassociada a instância do objeto após a sua criação.

������� � � �$�����!������ ����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-sesincronizar o estado transacional do objeto. Cada método é executado a cada etapadas fases de transação.

������� � � �$�����!������ ����HLH=� ��� ���(���/>������� B<�&� � ��� ������� � ������ � �<�;� ���, ���' � � " . � />��� �dH �&�> ���5������� � ����* �$��)-��������5�����<� � ����:������� � ������ �7�$���;������� ��)+��� ��� � ��� " .���/��%���dH � �> ���5=������ � �$��*��>��)-�<� ����5������� � ����:������� � ������ � �<�;� ��� �2��)+��� ��� � ��� " ������� �����-���)+)+� �?������.8�!/��%��� H���> ���5������� � ���>*

�$��)+�<�����$5=������ � ����:�

� �/4�6 JFE $&!"# $ �

Page 226: Jsp servlets j2_ee

����� � � � �� �! ! � � � ��� �� � �� � � �Exceção lançada caso o chamador não tem acesso para executar o método. Utilizadopara objetos locais.

����� ��� � � #� � �� �� ���� ���Deve ser definida no método de criação da instância de cada EJB. Ela é lançadaquando ocorrer uma falha na criação da instância de um objeto EJB.

����� � � ��� � �� �#� � �� � � �� ���� � �Esta exceção é lançada quando não pode-se criar um objeto, pois a sua chave jáexiste e está sendo utilizada por outro objeto. Normalmente é utilizada no método ��������������do EJB Entity Bean.

����� ������ � �# � � �� �Informa ao objeto chamador que ocorreu uma falha não recuperável, ou um erroinesperado. É lançada quando ocorre erros deste tipo nos métodos de ciclo de vida ounos métodos de negócio. É a única exceção do pacote ! ��"�� ��# ��!SR que extende a exceçãode ��$����� )*� � �&$�� � � )*� � ����������� ��� - e não permite ao chamador se recuperar do erro. As exceções( ��'�$ � N ��� ��� ����� ��� ����� � � � , (���'�$ � N��IR�!����� ����� ��� � ��������� � � � , ��� � ����� ����� ��� � ����������� ��� e ��� ������� ����� � ��������$�� � ����������� ��� ��������� ��� e��� ����� ���� � � ������� � ��PR � � � �������� � ����������� ��� extendem esta exceção.

����� ����� ����� �� � �� �� � �� �Deve ser utilizada em todos os métodos finders, normalmente usados em EJB EntityBean. São lançadas quando um erro de localização do objeto ocorre.

����� ����� � ��� � ��� ��� � � � �� � � ���É lançada pelo container quando em um EJB Entity Bean é executado um método,para o qual não existe o objeto em questão. Pode ser utilizada pelos métodos denegócio do EJB e pelos métodos de ciclo de vida ��! R ����������� e ��! R�'�� ��������� de um EJB EntityBean.

����� ����� � ��� � � � ��� �� � � � � ��� �� � �� � ���Parecida com a exceção (���'�$ � N ������� � ��� ����������� ��� , diferindo que esta é lançada para objetolocais que não exitem mais.

����� ��� � � � � �� � �� ����� ��� � �� � ���É lançada por um método � � ����� , para avisar que um objeto não existe. Deve-se utilizaresta exceção quando um método finder retornar somente um objeto. No caso devários objetos, deve-se retornar uma coleção nula.

Page 227: Jsp servlets j2_ee

����� ����� � � � � � �� � � �A exceção RemoveException é lançada quando o container não pode remover ainstância do objeto. É utilizada no método ��! R�����) ��" ����� .

����� � ��� � � � !"� � � �� ���� �� �� �� �� � � ��� � �� �� ��� ���Informa que a requisição não encontrou uma transação e a mesma era requerida.

����� ���� � � � !"� � � �� ��� ��� � � ��� �������� � � � � �� � � �Indica que a transação foi marcada com rollback ou estava sendo executado orollback, mas ocorreu algum erro nesta operação.

Page 228: Jsp servlets j2_ee

� ����������� �

��� � A� � � ��� � !�� ��� ��� � � �� I�

A seguir apresentamos o código completo da aplicação exemplo. Esta aplicaçãoconsiste de cinco EJBs, sendo um para cada tipo de EJB definido pela especificaçãoEJB 2.0. Então serão:

�� EJB Session Bean Stateless - SalesSupportBean

�� EJB Session Bean Stateful - SalesBasketBean

�� EJB Entity Bean BMP - UserBean

�� EJB Entity Bean CMP - ProductBean

�� Message-Driven Bean - UserNotifierBean

Observe que existe um deployment descriptor � !SR � ! ��� # ��) � para cada EJB nesta aplicaçãoexemplo. Isto não é necessário nem possível em uma aplicação J2EE, na qual façamparte dela todos esses EJBs. Para isso é preciso criar um único deployment descritor ��! R �! ���# ��)*� , no qual incluímos todas as informações de todos os EJBs contidos na aplicaçãoJ2EE em questão. Este arquivo é mostrado no final deste apêndice.

Iremos apresentar também o arquivo específico para o servidor de aplicações Jboss,utilizado para criar as tabelas do banco de dados utilizado para persistir os objetos daaplicação. Este arquivo, chamado de ! R���������) � � !��+R ��# ��) � está mostrado no final desteapêndice também. Salientamos que este arquivo não faz parte da especificação J2EEe é um arquivo complementar e de uso exclusivo para o servidor de aplicações Jboss.

Vejamos o código completo do EJB Sesison Bean Stateless - SalesSupportBean.Apresentamos as interfaces ����) � e ����) � � � , ' ��� ����'�$���� ��� � ����) � e ' ��� ����'�$�������� � respectivamente, aimplementação do EJB SalesSupportBean e por fim o deployment descriptor ejb-jar.xmldeste EJB.

Interface Home : SalesSupportHome.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � ������������ �2��)-��*>����� ��) ��)-��%���;���.F����� � ��������+� �����$� ������ ����)+������*��"H������� ��� � � )-� ������������$���� �"H�H,���?� � N��"H �>�DH��������?� �-���������� ���"H ���%�����$���"H �������� � � �$�����!������ ����� �"H ���(�������!������)-� ��5��������"H � �&���&5 � � � � � ���� ����)-�

Page 229: Jsp servlets j2_ee

������� � ����� ��H ���>�������?� ���������� " . � /������ H � �%���<�����$5������� � ����*��>��)-��������5������� � ����:�

Interface Remote : SalesSupport.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � �������?������ ����)-�����-���0���� � ������ � ����� �"H ���(�������!� � � �������� ���� � �>���"H����$���KH&���!�>� N���H ���+ ��� ��(� � ���+���"H,��������-�0�����%���� ��H �����!� ��) ����������� � �$) �(������� �������� � � �$�����!������ ����� �"H ���(�������!� ��5����$�$��H � �<�(�&5 � � � � � ���� � � � ��&��

������� � � �&�(� � � ����' � � ������'2���6���� � � H,����(��� " � �����<'(���6����� ����* � �$����'2��� ������'2��.� /������ H ����)+�<�����$5=����<�!� ����:

������� � � �&�(� � � ����' � � ������'2���6���� � � ���� " � �$����'(��� �(��� ����* � �����<' ���6��� )-��H�.� /������ H ����)+�<�����$5=����<�!� ����:

Session Bean Stateless : SalesSupportBean.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :

��� � �>���"H����$����"H�H&���?� � N�� H �����%� ��� ���� ���� � ��������*��>��H&��$��� ��*��(��� �$�!��H ���0���������� ���� ���������$������������ ��������� � ���������� �(��B<�"H �(���-�-����� ��� �(���ZH&��� ����'(� ���� �ZH����"H)H&���?� � N�� H�H ��� ��� � � � B<����� H���������������� �"H��!� �(���ZH,�������#������� � B<�����2�8���$�$��� ����H2�������(����� H �������� � �� ��H.H������ �"H �����������?� ������+� )+��� ��)-������H ��� HPH,� ���� ������

��� � ���$����5,��� ��� ����H6H,� ���+ $����� ����&� �(�&��� ����H6H,� ��� � ����� ��5&�aH&��H6H=� ��� �2���$����5�� :

��� � �&� �+��)-�� �"H������$�� � ���+��� � �����+����� �-���������� ����� ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+���7� �)H�� �>���� � ��� ��� � ����� �������� � ����� �+� � ��� �����&��� " . � /������ H � �!���<������5������� � ��� �

��� ����)-��N����-��� � �ZH������>�� ��>� ��� � ��� �+����� �-������ ��� ����� �������� � ����� �+� � ������)-�<��� " .�

��� � � � � � B<�����-����� �-����$����� ����� �������-��� � ����� �+�$� � ����� �(���-�"H�� �-����HPH�� ��� �������� � ����� �+� � � � �� � ������� " .�

��� � � � � � B<�����-����� �-����$����� ����� ������� � ��������� ����HLH,� �$�+��) ��� � �<���+�&�!� ��� �������� � ����� �+� � � � ��H.H=� �(�&��� " .�

��� � ����� � ' ���%� �+���������5���� ���+� �� ���"H6H,� ���+ ������ �

Page 230: Jsp servlets j2_ee

���� ��������)�H,�"H.H�� �����2��������5&� ���������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��� �����%�.�

���<�!���%�0��� � � �$����'2��� " �$��� ��� � � ����� ��� ��� " . � ���$�! � � �����6��� �$� " .;.;:�

��� � ��� ��>� � �-�(��� �$� ����H �$�������� ��H=*$��� ����������-���) �-����� ��� � ��������� �$�;�$�%)-�����-�+���)��� � ���>����� � �������-��� ��� B���H � ��)+� ��) � ���;����)-����� ����� ��������) �(��� �������� ���6������������� ���$�$��� ����� ��������) �!� )-�"H �(�$�����!� �������-���0���������� ��H ���"H�� � ����� ����� ����� ����� �(��� ���1���-������+�����%���� � �������� � � ���(� � � ����' � � ������'��$�6���� � � ���� " � �$����'(��� �(��� ����* � �����<' ���6� � )-��H&.�

���<�!���%�0��� � � �$����'2��� " �$��� ��� � � ����� ��� ��� " . � � � ) ��H � � ����� ��� �$� " .;.;:�

Deployment Descriptor : SalesSupportBean.� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� H��"H.H�� ��� �

� ��� H���� �������>��)-� � ����� ��H ���>��������� � � ��� H,��� � ��� �$��)-� �� � � �����>��)-� � ����� ��H �����������!� � � � � ��������)-� �� />��)-�������) � ����� � � ����� � ��&� � � � � � H��"H.H,� ��� � ����� � H������������!������)+� � � /���)-� �� ����)-����� �����) � ����� � � ����� � ��&� � � � � � H�� HPH&� ��� � ����� ��H �����������!� � � �%��)-����� �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � ����� � H�������������� ������ � � � � ���;�� ��HPH �� H��"H.H�� ��� � ���(��� � ��� �&����� ��HLH � � H%��H6H,� �$��� ���(������ � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �

� � H%��HLH=� ��� �� � ����� ���,����� H����?�������ZH �� ��H6H���)+��� ���;���"H����� �<���$� �

� ������ ��� ������� �������"H&���� � ��� �� )-�<� /���� �

� � � ��������)-� � ����� ��H ���>�������?� � � � � ��������)-� �� )-��� />�����?����)-��� � � � )-��� />�������>��)-� �

� � ) ��� />��� �� � �%���ZH�?�&���!�%� ������������������ ����� � � �!�����"H�?�&������� ���$��� �

� � ������ ��� ������� �������ZH���<�!� ��� �� � ��H6H���)+��� ���?����H%���� �<� ��� �

� � � � ��� � ��� �

Page 231: Jsp servlets j2_ee

No próximo código, apresentamos o EJB Session Bean Stateful - SalesBasketBean.Inicialmente seguem s interfaces ����) � e ����) �� � , ' ��� ������������� � � ��) � e ' ��� ����� ������� � respectivamente, aimplementação do EJB SalesBasketBean e por fim o deployment descriptor deste EJB.

Interface Home : SalesBasketHome.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � ������������ �2��)-��*>����� ��) ��)-��%���;���.F����� � ��������+� �����$� ������ ����)+������*��"H������� ��� � � )-� ������������$���� �"H�H,���?� � N��"H �$������+����&��� ��/���>� ���)+������H �������� � � �$�����!������ ����� �"H, ���H����<� ����)-� ��5��������"H � �&���&5 � � � � � ���� ����)-�

������� � ����� ��H& ���H������ ��%������� " . � /������ H � �%���<������5������� � ����*��>��)-��������5������� � ����:�

Interface Remote : SalesBasket.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � �������?������ ����)-��������-��"H�� � ���7�>�����$�$����H&*������%��H&����� ��H,���?�(� N���H �(����H���� ���0����� � � B������"H��� �>� �(������� ���"H ���!���(����� H ���0�"H=� ����� � ���� �ZH����"H�H������(� N��"H�H ����(� ��� �� ���1�-� � �$��� � B���� �$��������*������ �� �������6�0����)+������� ���%���(�������� ��� ��"H����-���0�������(������H�*�� � )+����� � ���H%� ��*>���� ���� ��� �-�$��� ���6���������>����H ����������� � H ���� �������� � � �$�����!������ ����� �"H, �� H������ ��5����$�$��H � �&�(�&5 � � � � � ���� � � � ��&��

������� � ������ �7� ��� � ����� � H " ���) � ����� � � ����� � ��&� � ��� � � H������ � �"H,���,.� /������ H ����)+�<�����$5=����<�!� ����:

������� � � �&�(� � � ����' � ������ ����� � � ����� � B�������� � " .8� /(����� H �$�$)-�<�����$5=����<�!� ����:������� � ������ � ����� � �������>&� " ���) � ������� � ����� � ��&� � ��� � � ��������&��� � �>�����$�>&� . � /������ H

�$��)+�<�����$5=������ � ����:������� � � �&�(� � � ����' � ������ �����+�%��)-����� � �%�������� " ���) � ����� � � ����� � ���� � �(� � � �����$�>&��� �

���%���(�$�� .8�!/��%��� H ����)-��� ����5�����<� � ����:������� � � �&�(� � � ����' � � ������'2���6���� � ���H����<� � �&� �� " . � />��� � H�����)-��������5�����<� � ����:������� � ������ �� �%���� ���H ���<� " . � /������ H�����) ��������5��������� ����:������� � ������ �����+����� />����� � ��&��� � H&��� " ���) � ������� � ����� � ��&� � ��� � � H������ � �"H&���&.

� /������ H ����)+�<�����$5=����<�!� ����:�

Session Bean Stateful : SalesBasketBean.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� ���) � ����� � � ����� � ���� � �(� � � :� )+�����?� ���) � ����� � � ����� � ���� � � � � � � :� )+�����?� ���) � ����� � � ����� � ���� � � � � � ����� � � � � � :

Page 232: Jsp servlets j2_ee

��� � �>���"H����$����$H����!�>� N�� ���-����,�%� ��/>��*����>� )+����� ��) ��H���������������) �����>������ ���+��) ����������)+� �$�����-�)H,� ����� � ���� �ZH����"H ��������������H�H �$�7) ����� � ��� H1��) �>)+� � ����*>�0��������)�H,���1�<� ����� � B<������H,*��� �%��) ���(� ��� H ���0� �"H������ ����H ��� ����&��� ��/���>� ���)+������H ���� � �"H,� ����� � � ��)+� ��) �0�%��' � H%� �������-���)-�+���%���>��� �������%� � ����H%� ����)+���!� �������� � �� ��H.H������ �"H, ���H ���<� ������+� )+��� ��)-������H ��� HPH,� ���� ������

��� � ��������5����-��� ���"H.H�� ���0 ������ ����&� �(�&��� ����H6H,� ��� � ����� ��5&�aH&��H6H=� ��� �2���$����5�� :

��� � �"H%��� ���+�������(�����"H ����&� �(�&��� � ���+����H����<�!:

��� � H,�����%� �-�������-��� H�������)+���%� ����&� �(�&��� � H,��� � � �EH,����:

��� � �&� � N ���-��� � �"H%�������� ���� H����-��� � �<���0���$� � ������ ��� ����� ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+���7� �)H�� �>���� � ���7� �> �������� � ����� �+� � ��� �����&��� " . � /������ H � �!���<������5������� � ���

� /(� H � ����H������� -����� ����H,/�� ��� " .;:�

��� ����)-��N����-��� � �ZH������>�� ��>�7� �> �*>����� � ��$��� ��� �$�$� �������� � ����� �+� � ������)-�<��� " .�

��� � � � � � B<�����-����� �-����$����� ����� �������-��� � ����� �+�$� � ����� �(���-�"H�� �-����HPH�� ��� �������� � ����� �+� � � � �� � ������� " .�

��� � � � � � B<�����-����� �-����$����� ����� ������� � ��������� ����HLH,� �$�+��) ��� � �<���+�&�!� ��� �������� � ����� �+� � � � ��H.H=� �(�&��� " .�

��� � ����� � ' ���%� �+���������5���� ���+� �� ���"H6H,� ���+ ������ ����� ��������)�H,�"H.H�� �����2��������5&� ���������5&� �-���7���� ����H6H=� ���9 ������ �������� � ����� �$H&��������H6H,� ����� ��������5&� " ���"H.H�� �����2����� �<5,�MH,�"H.H�� �����2�������<5�� .�

� /(� H � H��"H.H,� ��� � ��������5&�� ;H,� HPH&� ����� ����� �<5�� :�

��� � ��� �� ��-���)+��������"H ���%����������H ������� �0�"H,� ����� � � �$������)-����� ����� ��������) �)H���� �"H,� ����� � �(���+� ��� �� ��� ��-���)0���%� �>��H �������(������H ����� ����� ����� �(������������� �%� ���H,�+�-���)+�����KH%� � �7� ��� �� ����� ���) H,����"H6H�� �������� � ����� �0� ��� � ����� � H " � H���� � � �)H%�$�%.�

� /(� H � �ZH���� -�"H,���,:�

��� �(� ����� � B<��-���)+����� ���� �)H%�������������N����+�����LH,� H�� �-��H �������"H �>� �(���>����*��&�����&� ��H ���0�"H,�-���+���> ����� � � � ������

Page 233: Jsp servlets j2_ee

��� ���) �����HLH,�+� ��������0�$��� � � � ���0�)H&������� � ���$H,�>��"HPH%� ���;H=��� ���)9����� ����� ����� ����� �(������������� �%� ���H,�+�-���)+����� ������/$�KH,� ���7�%����� � B<��������)IH,�>��"HPH%� ����� � /���� �dH ��5������� � ���-��5���"N����0�����&� � N �$� ���+���$� � � � ������-��� � �����(�����"H �������� � � ���(� � � ����' � ������ ����� � � ����� � B�������� � " . � /(��� �dH ��5�����<��� ���

� �����$�>&� �������� ����)-�+� ������ �2��) � "� �����(�$&� �������� ����)-��.����� ��H �����?� � �� �$����<����� � '2����� �"H������>�� " . � '(�<� �������� �2��)+�" ����� ��H �������(� �� �>����<����� � � � � � � � � � �� � #.;:

�!��������� " � �����%�&� ��� � -����H �<��� � �����!��� ����� " . � � �����%�&����� " .;:(� � />��H #�<5,� " .;: .

� ��� � �>��� � �0����������<�� " � ��� � ����� ���(. � � ����5&� " .;:� �����(��&��� � ��� "� �!���(��&��� � . �������(��&� � '(�<��� ��� ��� " .;:� ������ ����)-� � ��%���&� � " �(� � '(�<� ��)-� " .;*��$� � '(��� � � " .;*���� � '(��� � �"H����� �<� � ��� " .;*

����� � ������'(��� " �(� � '(��� � ��� �� " .;.;.;:�

�%���������+�>��� ������ ����� " �!������.;:� ��<� �/ " � �����&���$��5=������ � ���-��5�.

� /������ ��� � ��5������� � ��� " �?�����%��� � /�� � � �!���(� ��'9� �-��� �$��� � B<� ����� � � � � ��5�.;:�

��� � ��� �� ����� ��) ���%���������+���-����,��� ��/��-���+���)+�>����H ����� ��������) ������������ ���%�����$��� ��H���� � �ZH����&� ���+��� ����&��� �>/�� ���+���)+������H �������� � ����� �+����� � �������>&� " ���) � ������� � ���%� � ��&� � ��� � � �����(��&��� � �>�����$�>&� .�

� /(� H � ����H������ � ����� " �������(�$&�!*����!������&��.;:�

��� ����)-���(�-��) ����������� ��>� ������&� ��/>����+���)+������H ����� ��������) ������������ ���%�����$��� ��H���� ����)-���(� ���-���+����&�,� ��/���>� ���)0����� H ����� ����� ����� �(������������� �%� ���H,�+�+����)-��N�����H,� � �������� � �(������*$����� H��+���H&�+������ � ���,� � �������� � � �&�(� � � ����' � ������ �����+�%��)-����� � �%�������� " ���) � ����� � � ����� � ���� � �(� � � �����$�>&��� �

���%���(�$�� .� � " � /(� H � ��� H������ � �%��)-�<��� " �������(��&� . � �>��� � .

�%���������+�>��� ������ ����� " �!������.;:���<�!���%�0��� � ������ ����� " �;��� H���.;:

��� � ��� ��>� � �-�(��� ���1���"H �>�����$��� ��H ������ � ����H �����"H%��� �0�!�������&���� H����-�(��� ��� ����� ����� ����� �(��� ���6� �����������0�������(�����"H1������ � ���"H ��� ��"H�� � �������� � � �����<' ���1���� � $��H������ � ��� �� " .�

� �$� ����� ��� � :����� " � � �����&����� � -����H����<� � �����!� � ���<� " . � � � �����&����� " .;:�� � /���H ��5&� " .;:�.

� ��� � ����� ���0����� ��� " � ��� � ����� ���(.#� � ����5�� " .;:����� �>� � ";" � �������>&��� � .#�����!� � � '(�<��� ��� ��� " .;. � '2��� � ��� �� " .;:

���<�!���%�0��� � � �$����'2��� " �$��� ����.;:�

��� ����)-���(� ��H���!���������"H1��� ��"H����-���+���)+������H �������� � ����� �-� �%���� ���H ���<� " .�

� /(� H � ����H������ � �� ����� " .;:

Page 234: Jsp servlets j2_ee

��� � ��� � ��� �+����������� � ���0�ZH,�����&� ��*������,� � � ������DH%�+�0)+��H&)-� �0��) �)H&������� �� ��� � ��� ���� �)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��"H.H�� ��� � ���(��� � ��� �&����� ��� � � H&��H6H,� ����� ���(��� �� � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �

� � H%��HLH=� ��� �� � ���������&����� H������������)H �� � HPH���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��������� � H= ���H����<� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

Vemos a seguir os códigos do EJB Entity Bean BMP - UserBean. Para este, além dasinterfaces ����) � e ����) � �� para acesso remoto, dispomos das interfaces para acesso local.Então seguem as interfaces � ����� � ��) � , � �%��� , � �%��� ����� ��� � ��)*� e � ����� ���� ��� . Depois a implementaçãodo EJB UserBean e por fim o seu deployment descriptor.

Interface Home : UserHome.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � ���$� � � �(:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

Page 235: Jsp servlets j2_ee

��� � �������?������ � ������ � ����)-� � � ������ ��$� � � � B<��������-����"H6H��0����)-����� ���� � �!���)F-�0) �<�������+�����%���,� ��N����+�������� � ������� �0� ������ � B<� N ���-��� ����� � ���������� �����>��DH&����/������+����� ) ����� � �������� � � �$�����!������ � H���� ����)-�-��5��������)H � �&�(�<5 � � � � � ���> ����)-�

������� � � H,���1������&� � " �<�!��� ��' ����)-��* � ��� �<'(��� ���� * ��� �,� ��' �����(�!��HLH=*�������� �$'0��) ��� � .� /������ H �#������������5�����<�!� ����*��>��)-��������5���$�<� � ���>:

������� � � H,���6� � ���� � � �%� )-����� �>��� " � �����<'(���1���� . � /������ H ��� ����������5�����<�!� ���(*�$��)+�<�����$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���� �������� ����)-���5��������"H � ������5 � � � � � ���> ��$������ ����)-�

������� � � H,��� �>������>��%���<��� " ��� �&� ��' ����)+��* � �$����'2��� ��<� *�������� �$'0��������� HPH&*���� �&� ��'0��)-��� � .� /������ H �#������������5�����<�!� ����:

������� � � H,��� �>������$� � �>�� � � ��� )-����� ����� " � ��� ��'����1�����. �!/��%��� H ��� �������%��5������� � ����:�

Interface Local : UserLocal.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � ���$� � � �(:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :

Page 236: Jsp servlets j2_ee

��� � �������?������ � ������ ���>��)-�<��� � � ������ ����!� � � 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 �&�(����������)+�����GF�����H2�������"H���� �"H,� ���,� � ��) ��) )-��� � �����LH,� H%�����$��� ���� � � ���� � �>���"H����$����"H ) ��� ������H �>� ��$��� � ' ���%��N���� �+���<� ���"N���� �>��H1����� �����"H ����H ���!�%� �������"H��� ��� �$���!� ��������*���&� � N �$��*�����)+��N ����*��<� ����� � B���N ���-�0� ������ � B<��N �$� ���-���$� � ���������� �>�7)-��� ����+�����LH,� H���F����� � �������� � �� ��H.H � H&���% ������+� )+��� ��)-�����GH ����� � � �( ������

��� � ��������5����-���7� �> �>���!� ���0 ������ ����&� �(�&���0���$� � ����� ����� ��5&� ����� � � � �2��������5&�!:

��� � ������5 ���-���) �0 �2����&� �(�&���-� �%���)H&� ������� ��������&� � ���-���������&� � ��� -���(� � :

��� � ����� �0���0� �ZH����.N ���-��� ��� � �����+���+ �2����&� �(�&���-��� ������������� ��' � ����� � � � � ��� �

��� ����� � � � � � ����� " ��)-��*�� ��� * � ���(��� HPH,*���)-��� � . � � � � ��� " � * � * � * � .���:

��� � ����� �0���+��� �$��� � B���N ���-���+��� � �����+���+ �2����&� �(�&���-��� ������������� ��' � � � � � � � ��� ��� �

� � � � � �#� � ����� ����� ��)+� � * �6�����%��H6H � *(��)-��� �� � � �2����� �#���� � �?:

��� � ����� �0���0����)-��N����-���-�$� � �����7�$�7 �2����&� �(�&���-��� ������������� ��' � � ��� �#� � ��� ��� � � � � ��� �#� ��� � � � ����� � �2����� �#���� � ��:

��� � ����� �0���+���<� ���EN ���-���+��� � ����� ���+ �2����&� �(�&���-��� ������������� ��' ��� ����� � � ��� ��� � ���$� ����� � ��) ��*��#�<� * � ���(�!��HLH,*

��)-��� ����� � � � ����� � � ����� � ���� � ��:

��� � ����� � ����� � � B������ ������� ����� ���1�"H ��� � ������H �������DH�����/��&���0���&� ) ����� � �

Page 237: Jsp servlets j2_ee

���&� �(�&���-��� ������������� ��' � � � � � � � � ����� ����� � ��)-��* � �<� * �6�������"H.H=*��)-��� ����� � � � ����� � � ����� � ���� � ��:

��� #��)-� ���7�ZH,������� � ����&� �(�&��� ��� �&� ��' �>��)-��:

��� � � �+�>�7�ZH,�����&� � ����&� �(�&��� � �����<' ���1��<� :

��� �(�$������� N�� ���0�"H,� ����� � ����&� �(�&��� ��� �&� ��'0�������%�"H.H=:

��� �()-��� �����+�)H&������� � ����&� �(�&��� ��� �&� ��'0��)-��� � :

��� � � � � � B<�����-����� �-����$����� ����� �������-���� ��� �+��� � �����7�ZH,������� � ����� ��������) ����)-� �>��)-� ���7�ZH,������� � ����� ��������) ���� ���� ���+�)H,� ����� � ����� ��������) �����(���"H.H �$�$�������"N�� ���+�ZH,�����%� � ����� ��������) �$)-��� ����)-��� �����+�)H,� ����� � ����� ����� �����-�/>�&�(�+����� ) ����� � ���-���$� � �>�����+�"H,� ����� � ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+����H%��� � �"H�� ������ � �������� � � �����<' ���1� � � � ��������� " ������� ��' �>��)-��* � ��� ��'��$�6���� * ��� �&� ��' �����(���"H.H�*��<�!��� ��'0��)+��� � .

� /������ H �#������������5�����<�!� ��� �!����

������>��<� � ��� '(��� �2���������� � ��� " .;:������

� �������������������&� ��)-�����aH�� )7�� ��$�>����&�!� ��� � �����������!� �<��������)-����� " � ����� � � ��� ��� � .;:�!� ��

H�� ) � � H������������ �$' "�� *��>��)-��.;:H�� ) � � H���� � ��� "�� *����� � � ����� ��� ��� " .;.;:H�� ) � � H������������ �$' "�� *������$�%��H6H,.;: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����+���"H����0)-��)-������� �

Page 238: Jsp servlets j2_ee

��� � � � � � B<�����-������� ������ � '2������� ��H�%�$� ���� ���$��)-�������"H �����%��0� �� -���$� � � � ������ � � ������� ��������) ����)-� �>��)-� ���7�ZH,������� � ����� ��������) ���� ���� ���+�)H,� ����� � ����� ��������) �����(���"H.H �$�$�������"N�� ���+�ZH,�����%� � ����� ��������) �$)-��� ����)-��� �����+�)H,� ����� � ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+����H%��� � �"H�� ������ � �������� � ������ � � � � � ��H�� � �����&� � " ��� �,� ��' ����)+��* � �$����'2��� ��<� * ������� �$'0�������%��H6H,*���� �&� ��'0��)-��� � .

� /������ H �#������������5�����<�!� ��� �

��� ����)-��N����-��� � �ZH������>�� ��>�7� �> �*>����� � ��$��� ��� �$�$� ����� � /���� �dH ����)-���(����5������� � ���-��5����N ���+���-����)-��N ��� �>� ��� � ��� � �������� � ����� �+� � ������)-�<��� " .8� /������ H ����)+��������5��������� ���

�!����������>��<� � ��� '(��� �2���������� � ��� " .;:������

� �������������������&� ��)-�����aH�� )7�� ��$�>����&�!� ��� � �����������!� �<��������)-����� " � � ��� � � � ��� ��� �(.;:�!� ��

H�� ) � � H���� � ��� "�� *�� /�� H � ���� � � �����6��� �$� " .;.;:H�� ) � � ��5��������� " .;:

� � �>��� � � JH�� ) � � �� �"H�� " .;: ��

� � ����� � � �������>��&�!� ��� � �� ��H%� " .;: �� ��<� �/ " ��5�����<�!� ���-��.�

� /������ ��� ������)-�������$5=����<�!� ��� " �?�(�%����� ����)+���(� ��'0��� ��)-����� � �;.;:�

��� � ����� � ' ���%� �0�>��)-� ���7�ZH,������� � ����� ��������) ����)-� �>��)-� ���7�ZH,������� � �������� � ����� �$H&��� ��)+� " �<�!��� ��' ����)-��.

� /(� H � �>��)-� +����)-��:�

��� � ����� � ' ���%� �+���� ���0�"H�������� � ����� ��������) ���� ���� ���+�)H,� ����� � �������� � ����� �$H&����� ��� " � ������'2��� ���� .�

� /(� H � ���� �����:�

��� � ����� � ' ���%� �+�����������"N��-���+�)H&������� � ����� ��������) �����(���"H.H �$�$�������"N�� ���+�ZH,�����%� � �������� � ����� �$H&����� ������� HPH " ��� �&� ��'0���>�$�%��H6H,.�

� /(� H � �����$�%��H6H ���������"H.H�:�

��� � ����� � ' ���%� �+��)-��� �����+�"H�������� � ����� ��������) �$)-��� ����)-��� �����+�)H,� ����� � �

Page 239: Jsp servlets j2_ee

������� � ����� �$H&��� ��)+��� � " �<�!��� ��'0��)-��� � .� /(� H � ��)-��� �� ��)+��� � :

����� �<� ��) �0�$��)+� ���7�EH,� ���%� � ����� ����� �����+����)-� ���0�"H&� ����� � �������� � �<�!�&� ��'+'2��� ��)-� " .

���<�!���%�0����)-��:�

����� �<� ��) �+��<� ���+�)H,� ����� � ����� ����� �����-����6���7�ZH,������� � �������� � � �����<' ���6'(�����#��� " .

���<�!���%�+���� :�

����� �<� ��) �+����������� N��-���0�"H,� ����� � ����� ����� �����-���������%��N��-���+�"H,� ����� � �������� � �<�!�&� ��'+'2����� �������"H.H " .

���<�!���%�+���������"H.H�:�

����� �<� ��) �+��)-��� �����+�)H,� ����� � ����� ����� �����-��)+��� �$���7�ZH,������� � �������� � �<�!�&� ��'+'2��� ��)-��� � " .

���<�!���%�+��)-��� � :�

��� ������� � B�� �+� ������ � B<��N���� �>� ��� � ��� �+����� �KH�����/����(�+����� ) ����� � ����� ��������) ���� ���� ���+�)H,� ����� � ����� ����� �����-�/>�&�(�+����� ) ����� � ���+��� � �����-��) ) ��)������ � ����� � /���� �dH �(� ����������5������� � ���-��5����N ���-��) ���H&� �>� �����%�+���0� ������ � B����1��� � ����� �������� � � �����<' ���1� � � ��� ���� �� � ��� )-����� �>��� " � �$����'��$�6�����.#� /������ H ��� �������%��5��������� ���

�!����������>��<� � ��� '(��� �2���������� � ��� " .;:������

� �������������������&� ��)-�����aH�� )7�� ��$�>����&�!� ��� � �����������!� �<��������)-����� " � � � � ��� � �(.;:�!� ��

H�� ) � � H���� � ��� "�� *����� � � ����� ��� ��� " .;.;:���"H,��� � ����� �JH ;H�� ) � � �<5��������� � ������� " .;:�!����

� � " �LH � ����5&� " .;.�!/�� H � H,�<� ��)-� " �LH � '(�<� �<�!��� ��' "�� .;.;:�!/�� H � H,�<��� �������"H.H " �AH � '(��� ���!�%� ��' "�� .;.;:�!/�� H � H,�<� ��)-��� � " �.H � '(����������� ��' "�� .;.;:�!/�� H � H,�<��� �<� " ��� � � ������'(��� " �LH � '2��� � ��� " � .;.;.;:

��

� � ����� � � %�JH � �� �"H�� " .;: �

Page 240: Jsp servlets j2_ee

� � �>��� � � JH�� ) � � �� �"H�� " .;: ��

� � ����� � � 6������>��<� � ��� � �� � H�� " .;: �� ��<� �/ " ��5�����<�!� ���-��.�

� /������ ��� � ��� �>�������$5=����<�!� ��� " �?�(�%�����6��� �$�$� ��'0��� � ��&� � � � � �� � ���� .;:�

���<�!���%�-� /�� H � ��<� :�

��� � � � � � B<�����-����� �-����$����� ����� �������-����&���<' ��� �"H �������"H ��� ��� � �����-���+)+��� ���� ���+�����LH=� H���F����� � �����%��+)-��)������ � �������� � ����� �+� � � ������� " .

�!����������>��<� � ��� '(��� �2���������� � ��� " .;:������

� �������������������&� ��)-�����aH�� )7�� ��$�>����&�!� ��� � �����������!� �<��������)-����� " ��� ��� � � � ��� ��� � .;:�!� ��

H�� ) � � H���� � ��� "�� *�� /�� H � ���� � � �����6��� �$� " .;.;:���"H,��� � ����� �JH ;H�� ) � � �<5��������� � ������� " .;:�!����

� � " �LH � ����5&� " .;.�!/�� H � H,�<� ��)-� " �LH � '(�<� �<�!��� ��' "�� .;.;:�!/�� H � H,�<��� �������"H.H " �AH � '(��� ���!�%� ��' "�� .;.;:�!/�� H � H,�<� ��)-��� � " �.H � '(����������� ��' "�� .;.;:

��

� � ����� � � %�JH � �� �"H�� " .;: ��

� � �>��� � � JH�� ) � � �� �"H�� " .;: ��

� � ����� � � �������>��&�!� ��� � �� ��H%� " .;: �� ��<� �/ " ��5�����<�!� ���-��.�

� /������ ��� � ���> ���5�����<� � ��� " �������%��� � ������� ��'0��� � ����GH � ��.;:�

��� � � � � � B<�����-����� �-����$����� ����� �������+���$�LH,� H�� � �1�"H ��������H ����)H�������� � H ��) )-��)������ ���� �����!� �() )+��� �-���7�����JH�� H%�GF��>�� � �������� � ����� �+� � ����������� " .�

�!����������>��<� � ��� '(��� �2���������� � ��� " .;:������

� �������������������&� ��)-�����aH�� )7�� ��$�>����&�!� ��� � �����������!� �<��������)-����� " � � � � �#� � ��� � � �(.;:�!� ��

H�� ) � � H������������ �$' "�� *�� /�� H � �$��)-��.;:H�� ) � � H������������ �$' "�� *�� /�� H � �����(�!��H6H,.;:H�� ) � � H������������ �$' "�� *�� /�� H � ��)-��� � .;:H�� ) � � H���� � ��� "�� *�� /�� H � ���� � � �����6��� �$� " .;.;:

Page 241: Jsp servlets j2_ee

H�� ) � � ��5��������� " .;:�

� � �>��� � � MH�� ) � � �� ��H%� " .;: ��

� � ����� � � 6������>��<� � ��� � �� � H�� " .;: �� ��<� �/ " ��5�����<�!� ���-��.�

� /������ ��� � ���> ���5�����<� � ��� " �������%��� �����LH,� H�� � �<'0��� � �����H � ��.?:�

��� � � � � � B<�����-����� �-����$����� ����� �������-��� � ����� �+�$� � ����� �(���-�"H�� �-����HPH�� ��� �������� � ����� �+� � � � �� � ������� " .�

��� � � � � � B<�����-����� �-����$����� ����� ������� � ��������� ����HLH,� �$�+��) ��� � �<���+�&�!� ��� �������� � ����� �+� � � � ��H.H=� �(�&��� " .�

���� �"H�����$�4� ' �(�!� �+������ �<5,��� ���+� �� -���$� � � � ������ �������� � ����� �0���"H���� ����� � �����2��������5&� " .

� /(� H � ����� � � ��� ����� �<5��� ����� � :�

��� � ����� � ' ���%� �+���������5���� ���+� �� -���$� � � � ������ ����� ��������) �$���!� � � �2�$��� ��5&� ��$��� ��5����-���+�&�> -������� ���0 ������ �������� � ����� �$H&��� ���$� � ����� ��������5&� " ����� � ����� ����� �<5,�6�$���!� � � � ��������5&�!.

� /(� H � ����� � � ��� ����� �<5��� ������� ����� ��������5&�!:�

��� � �&� �+��)-� �������5 ���-���) �0��������-���+�������"H ������� ��� ����� ����� �����-�������5 ���-���7�$������-���-��������H ����&� �(�&��� � �����>��&��� ���7'(����� ���������� � ��� " . � ���������� � ���-������ �>��� � :�!����

� �(� � � ��� �2���$����5��6���5 -��� � � ��� � � ��� �2��������5&� " .�:������ " �2��������<� � ����. ��?5 � � ��������� " � � �&�(� � � ��� ����� � � ����.;:

� ��<� �/ " ��5�����<�!� ���-��.�� /������ ��� ��������� � )-����5������� � ��� " � � '(�<� � �"H.H%��'(� " .�. :

���<�!���%�+�������:�

Deployment Descriptor : UserBean.� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� ����� � ��� �

Page 242: Jsp servlets j2_ee

� ��� 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���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��� � H���� � � � � �����>��)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

O próximo código apresenta o EJB Entity Bean CMP - ProductBean. Este EJB apresentatambém as interfaces ����) � , ����) ��� , ����� ��� e ���� ��� ����) � que são respectivamente, ���� ��$��� � ��) � , �� � ��$��� , �� � ��$ ��� ���� ��� e �� ���$ ��� ����� ��� � ��) � . Neste Entity Bean usamos uma classe de chave-primáriaespecífica, isto é, definimos uma nova classe para este fim que é a �� � ��$ ��� �� e segue naseqüência. Em seguida temos a implementação do EJB ProductBean. Observe quecomo definimos este EJB como Entity Bean CMP, a implementação do EJBProductBean não apresenta codificação para os métodos de persistência do objeto.Como sabemos, isto é feito pelo próprio container do servidor de aplicações. Bem, porfim apresentamos o deployment descriptor deste EJB.

Interface Home : ProductHome.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � ���$� � � �(:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � �������?������ � ������ � ����)-� � � ������ ��$� � � � B<��������-����"H6H��0����)-����� ���� � �!���)F-�0) �<�������+�����%���,� ��N����+�������� � ������� �0� ������ � B<� N ���-��� ����� � ���������� �����>��DH&����/����������>��� ) ����� � �������� � � �$�����!������ � ���������������)-���5������>�"H � �&�(�&5 � � � � � ���� ����)-�

������� � � �%�����>&� ��%���<��� " ��� �&� ��' �$��)-��* ��� �&� ��' ���"H����� �<� � ����* � �$����'2��� ���&� ���*� �%�����>&� � �9���%������&� � ��. � /��%��� H �#�����&�����$5=������ � ���>*�����) ��������5������� � ����:������� � � �%�����>&� � � ���� �� � ��� )-����� ����� "� �������>&� � �9����.

� /������ H ��� ����������5������� � ����*��>��)-�<� ����5���$�<� � ���>:�

Page 243: Jsp servlets j2_ee

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' ��� � ��������&� � � " .;:

Page 244: Jsp servlets j2_ee

������� � ����� �$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 � '(����� � ��HPH " . � �������� H " ��� � � ' �<��� � ��HPH " .?.;.

� �����(��&� � �7� /���� "� �!������&� � �(. ��� � :�%���!�>��� ";";" � /�� H � � � � -����� � .���� " � /��<� � � � � ����� � .;.�� � " � /�� H � � � � ���(� ���� � /�� H � � � � � ������� H " � /��&� � � ��.;.;.;:

��

���<�!���%�-�;��� H���:�

���� ����� �>��0) �<� �����+/���H&/��2����� " . ����� ����� �����-�/>�&�(�-���7/>��H,/ �������� � � ��� />��H,/ �2����� " .�

Page 245: Jsp servlets j2_ee

���<�!���%�0� � � /���H,/ � ����� " .;:�

Entity Bean CMP : ProductBean.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � ���$� � � �(:

� )+�����?� � �<�(�&5 � � � � � � :

��� ����� � � � $����� � � � *����"H������ZH �&�(���%����� )+�����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�$���(� ��� ���� � � ���� � ������)-� H1�����4� �(� �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&� ����� � � � �2��������5&�!:

��� � � � � � B<�����-����� �-����$����� ����� �������-���� ��� �+��� � �����7�>�����$��� � ����� ��������) ����)-� �>��)-� ���7�>�����$��� � ����� ��������) � �0� ������� � ��� ����������(�>� �� ���7�>�����$��� � ����� ��������) ����H&���� ��� � ���-���"H,��&� N����-���+����������� � ����� ��������) ����� ��0�����"N��-���+����������� � ����� ����� �����-�/>�&�(�+����� ) ����� � ���0���%���(����� ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+����H%��� � �"H�� ������ � �������� � � �%�����>&� � � � � ��� �%���&� � " � �&��� � � ���$' � �<� ��� ��' ����)-��* � ����� � � ����' � �<� ��� �$'7�>��H%���� �<� � ����*

� �&�(� � � ����' � � ������'2���1�>��� ���*>���) � ����� � � ����� � ���� � � � � � ����� � � � � � �����$�>&� � ����%���(�$�� � �(.8� /������ H � �%���<������5��������� ���

H,�<� ��)-� " �$��)-��.;:H,�<� � �"H����� ��� � ��� " ����H&��,� ��� � ����.;:H,�<� � ��� �� " ���,� ��$.;:H,�<� � ���������� � � " �������(�$&� � �(.;:���<�!���%�-'(��� � ���������� � � " .;:

��� ��5������������� ��� � H � ���� ��N �$� ���+� �ZH������>�� � ���� � ������H,��� ��� � � � B<����� �����%� �%����� � B<��� ��� '2��)-� ����������N����+���"H����0)-��)-������� ���� � � � � � B<�����-������� ������ � '2������� ��H�%�$� ���� ���$��)-�������"H �����%��0� �� -���$� � � � ������ � � ������� ��������) ����)-� �>��)-� ���7�>�����$��� � ����� ��������) � �0� ������� � ��� ����������(�>� �� ���7�>�����$��� � ����� ��������) ����H&���� ��� � ���-���"H,��&� N����-���+����������� � ����� ��������) ����� ��0�����"N��-���+����������� � ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+����H%��� � �"H�� ������ � �

Page 246: Jsp servlets j2_ee

������� � ������ � � � � � ��H�� � �����&� � " � �&�$� � � ���<' � ��� �&� ��' �$��)-��* � ����� � � ���$' � ��� ��� �<'0���"H���%� �<� � ���>*� �&�(� � � ����' � � ������'2���1�>��� ���*>���) � ����� � � ����� � ���� � � � � � ����� � � � � � �����$�>&� � ����%���(�$�� � �(.8� /������ H � �%���<������5��������� ���

��� ����)-��N����-��� � �ZH������>�� ��>�7� �> �*>����� � ��$��� ��� �$�$� ����� � /���� �dH ����)-���(����5������� � ���-��5����N ���+���-����)-��N ��� �>� ��� � ��� � �������� � ����� �+� � ������)-�<��� " .8� /������ H ����)+��������5��������� ��� �

��� � � � � � B<�����-����� �-����$����� ����� �������-����&���<' ��� �"H �������"H ��� ��� � �����-���+)+��� ���� ���+�����LH=� H���F����� � �����%��+)-��)������ � �������� � ����� �+� � � ������� " . �

��� � � � � � B<�����-����� �-����$����� ����� �������+���$�LH,� H�� � �1�"H ��������H ����)H�������� � H ��) )-��)������ ���� �����!� �() )+��� �-���7�����JH�� 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��-���+������������� �

Page 247: Jsp servlets j2_ee

��� � )+��� ��)-����������� ����� �-���������� �����1�����%��0����� � � � ������ � � ������� ��������) ����� ��0�����"N��-���+����������� � �������� � ��� H�� �%���� ���$� �$H,�<� � ��� �� " � �<�$� � � ����' � � ������'2���1�>��� ���.;:

��� � ����� � ' ���%� �-�/>�&���0���,� ) ����� � �>�7���!��������� ����� ��������) ������������ � �+�/��&���0���%� ) ����� � ���+����������� � �������� � ��� H�� �%���� ���$� �$H,�<� � ���������� � � " ���) � ������� � ���%� � ��&� � � � � � ����� � ��� � � �������>&� � �

���%���(�$�� � �(.;:

����� �<� ��) �0�$��)+� ���7���%�����$��� ���� � )+��� ��)-����������� ����� �-���������� �����1�����%��0����� � � � ������ � � ������� ����� �����+����)-� ���0���%���(����� �������� � ��� H�� �%���� � �&�(� � � ���<' � ��� ��� ��'+'���� ��)-� " .;:

����� �<� ��) �-��� H,��&� N����-���7�>�����$��� � ���� � )+��� ��)-����������� ����� �-���������� �����1�����%��0����� � � � ������ � � ������� ����� �����-��� H,��&� N����-���+����������� � �������� � ��� H�� �%���� � �&�(� � � ���<' � ��� ��� ��'+'���� � ��H&��,� �<� � ��� " .;:

����� �<� ��) �0���%��N��-���7�>�����$��� � ���� � )+��� ��)-����������� ����� �-���������� �����1�����%��0����� � � � ������ � � ������� ����� �����+���!��N�� �>�7���%��������� �������� � ��� H�� �%���� � �&�(� � � ���<' � � ��� �<'(��� ' �<� � ��� �� " .?:

����� �<� ��) �-�/$�����7�>��� ) ����� ����0���%���(����� ����� ����� �����-�/>�&�(�+����� ) ����� � ���0���%���(����� �������� � ��� H�� �%���� ���) � ����� � � ����� � ��&� � � � � � ����� � � � � � �!������&� � � '(��� � ���������� � � " .;:

Deployment Descriptor : ProductBean.� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� ����� � ��� �

� ��� H���� �������>��)-� � � ��������<� � � �(� H&��� �������>��)-� �� � � �����>��)-� � � �!�������� � � � � ��� �$��)-� �� />��)-�������) � ����� � � ����� � ��&� � � � � � ����� � ��� � � �%������&� ����)-� � � /���)-���� ����)-����� �����) � ����� � � ����� � ��&� � � � � � ����� � � � � � �����(�$&� � � ����)+�<��� �� � ������ ��/���) � �&���) � ������� � ����� � ���� � � � � � ���$� � � � � � ��������<� �������� �2��)-� � � � ������ �?/���)-� �� � ������ �����) � ����� � � ����� � ���� � � � � � ����� � � � � � ��������<� �������� � � � ������ �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � ����� � � � � � �����(��&� ������ � � � � ���4�� � H.H �� ���$�AH=� H�� ��������;���(��� � �2�$��� ��� �$��� � � �����LH,� H%�����>����;� �2��� �� ����� ) ���������?�� ��H.H �����) � ����� � � ����� � ���� � � � � � ����� � � � � � ��������<� � � � � ����� ) ������� ���� ��H6H �� ���������������$� � ����� H,� � � �������$� ������� �� �)+��� �����LH,� ��� � � � 5 � � �)+��� ���$�AH=� ��� �� ���"H�������&���GH&�/>��)-� ���>��)-� � � ��������<� � � ���"H�������&���GH&�/>��)-� ���>��)-� �� �)+��� � � ��� � �

Page 248: Jsp servlets j2_ee

� � � ��� ��������)-� ������)-� � � ��� ��� � ������)-���� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �<��� H,��&� �<��� ��� � � � � ��� ���?����)-���� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����%� �� � � ��� ��� ��������)-� �� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����!������&� � � � � ��� ��� ��������)-� �� � �)+��� � � ��� � �� ����� ) �������4��� ��� � ���>�������>&� � � � � ���%� ) ��� ���;��� ��� � �

� � �����!� � � �� � ���������&����� H������������)H �� � HPH���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��� � �����$�>&� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

Apresentamos a seguir, o código do EJB Message-Driven Bean - UserNotifierBean. Aimplementação do EJB segue logo a seguir. Após segue a implementação damensagem utilizada para notificar o EJB MDB UserMessage e por fim o deploymentdescriptor deste EJB.

Message-Driven Bean : UserNotifierBean.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � )-����:

� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(�&5 � � )�H � � :� )+�����?� � �<�(�&5 � )-��� � � � :� )+�����?� � �<�(�&5 � �$��)+� �<' � � :� )+�����?� � �<�(�&5 � )-��� � � � �����������<� � � :� )+�����?� ���) � ����� � � ����� � ���� � �(� � � :

��� �>��H������"H �&�(���>����� ����� � �4� ����1�0�"H,� ����� ���� H ���<�(��H �&�!����� � B���N�O$� 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&�&'(� � ��� �(���� �������*�� �"H.H���'�� ��� H����������

��� � ��������5����-��� � ��H.H&�&' ��� � ��� �$�+ ������ ����&� �(�&��� � �"H.H��<'(� � ��� �(����� ��������5,�1)-��HLH���'(� � ��� �(��� � ��������5&� :

��� � �"H�� ���$�� � �+�$� � �����+�>�DH����!�(� ����� ����� �-���������� ����� �

Page 249: Jsp servlets j2_ee

������� � ����� �+� � ��� �����&��� " .��

��� �>��)-�<�(��+� �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&�&'2� "?" � H&����� �"H.H��&'2��.#)lH�' . � '2��� � � H.H,�&'�� " .;:� H,��� � � �"H,��� "�" � H,����� ��H6H��&' ��. )�H�' . � ' �<� � H���� " .;:� /�� H � H%�����(��)-��� � " �"H���� � '(�����8��H%� " .;*(�EH���� � '2��� � ��� � � ��� ��)-��� � " .;*

������� ��H ��� � � � ��&�!� ������*�)-� HPH%�&' ��.;:�

� ���� �/ " ��5�����<�!� ���-��5�.����EH%����) � ���,� � ����� �$� � � " �?���������MH&���>��� ��'0��)+��� �$�;�$� �"H&��� � � � ��5�.�:

��

��� �����(� � ��) ��)-��� �����+����� � �4� �� N ���+�����%��0�"H�������� � ���� � ��������) />��H%� /��"H�� ���+�ZH,�����%� � ���� � ��������) � �+��)+��� �����-����H%� � �>�&� ����� � ���� � ��������)�H���� � ���� ��� � ��� ��>� ���<�!� �4� ���N���� ���� � ��������) � ��5&� )-���)H%�&'(��) ���7�>��� � ��� ���N �$� ���� � � /��!���dH �$5������� � ���-��5���"N����+�� H��0���$� ����ZH,� '2� �$��� � ��� �+�$)-��� � �

���&� �(�&���-����� �$H&���>����)-��� � " ���!�%� ��' /��"H�� * ���!��� ��'0����* ���!��� ��'=H,��� � ��&�!* ������� ��'0� �<5�� .� /(�!��� H ��5������� � ��� �!����

�%� � �<� ��) ��H �>�������&� ���������"H ���DH�� H�� ��)-�� �%�������?�!� ��H������� H ���[H�� ��) � '(��� � ���������?��� �"H " .;:�%� �2����� � ' ���%��$H����?� � ����� ���-��)+��� ����%���"H � ����� " �?)-��� � � H,) ��� � />��H�� �?*�/�� H�� .;:�%� � �<� ��) �DH&��H6H ����� ��� 5 �) �;����;�0H H ����iH �0H H ���� �� � � 5 �) � ����;�0H H ���� �' � � � � � �;� �� ��GH � � �?;� " �;� ���0H *�������. :�%� � ����� �>� �+)-���EH��&' ��)� � )-��� ��H.H%��'(� ) ��H.H&�&'(� �>��� � � )-��� ��H.H%��'(� " H,� H.H=� ����.;:)-�"H.H&�&'(� � H%��� �>����) " ����� � ���������$����� �������"H.H " � ���/�������� ��� �?.;.;:)-�"H.H&�&'(� � ������������ ��� ���$� " � �&�(�&5 � )-��� � � � � H.H,�&'�� � �>���� ��� ����� � �(��� � � � *

����� � ��� ���%������� ���$�!��HLH " ����.;.;:)-�"H.H&�&'(� � H%��������� � ��&� " H&��� � ��&�!.;:)-�"H.H&�&'(� � H%��� � ��5,� " ����5&� .;:�%� �>��� � � �+)+���"H���'���)� �����ZH,�����?� � H����>� " )-� H.H&�&'(��.?:

� ��<� �/ " ��5�����<�!� ���-��.�� /������ ��� � ��5������� � ��� " �?�����%����H&���$�$� ��' )-��� � � � � ��.�:

Page 250: Jsp servlets j2_ee

��

��� � ������� ' ������+����$����5,��� ���+���� � � ����� ��������) )+��H6H��&'2� � ��� ����� �2����� ��5&� ��$��� ��5����-��� � � �������� � ����� �$H&��� � ��HLH���'(� � ��� �(��� � ��������5&� " � ��H6H��&'2� � ��� ����� �2��������5&� )+� H.H&�&'(� � ��� �$�����2����� �<5,��.

� /(� H � )-�"H.H%��'(� � ��� �$�����2����� �<5��� ) ��H.H&�&' � � ��� ����� �2��������5�� :�

Mensagem : UserMessage.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � )-����:

� )+�����?� � �<�(� � � � � � :� )+�����?� ���) � ����� � � ����� � ���� � �(� � � :

��� � � � ����� �(���-������ ��) �7) ���"H��&'2��) �DH&���1����������' ��� �����%��0�ZH,������� � ���� � �"H,� ����� � � ��)+� ��) �+������� ��� ��� �>��H%��� ��� � ����� �������� � �� ��H.H � H&����� �"H.H&�&'(�+� )+��� ��)-�����JH ������� ��� � B<����� �

��� � H,�����%� �-� �$�>���"H&��� � �����(� ����� �+)-���ZH��&'(��) ����&� �(�&��� � H,��� � � �EH,����:

��� � ���EH��&' ��) ��H,��� �$���>� ����������%��0�ZH,������� � ����&� �(�&��� ��� �&� ��' ) ��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,� ����� � ����� ����� �����+)-���"H,�&'���) �DH%�$� �����(� ����� �������-�0�"H,� ����� � �������� � �<�!�&� ��'+'2��� � ��H6H��&' � " .

���<�!���%�0)-��H6H��&'2��:�

��� � ����� � ' ���%� �+)+���"H��&'2��) �DH&��� ����� � ������������ �0�)H,� ����� � ����� ��������) )+��H6H��&'2� )+���"H��&'2��) �DH&��� ����� � ������������ �0�)H,� ����� � �������� � ����� �$H&��� � ��HLH���'(� " �<� �,� ��' )-��H6H���'���.�

� /(� H � )-�"H.H%��'(� )-� HPH%��'(��:�

Page 251: Jsp servlets j2_ee

����� �<� ��) �0�EH,� ���%� � � �(�����ZH���� ������(� ������+)+���"H��&'2��) ����� ����� �����+�"H�������� �� �������)H&��� ������ � ������+)+���"H��&'2��) �������� � � H,��� � � '(��� � H%��� " .

���<�!���%�0�"H�����:�

��� � ����� � ' ���%� �0�ZH,������� �-� �������EH,��� �-�����2� �����-�7)-���)H%�&'(��) ����� ��������) �)H���� �"H,� ����� �� �(�����ZH,��� � �$���>� ����� �7) ���"H��&'2��) �������� � ����� �$H&��� � H&��� " � H������ � �"H,���,.

� /(� H � �ZH���� -�"H,���,:�

Deployment Descriptor : UserNotifierBean.� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� )+� H.H,�&'2���4�(��� ����� �

� ��� H���� �������>��)-� � � H����� #�<� � ��� ��� � � �$� H,��� � �����>��)-� �� � � �����>��)-� � � H����� #��� � � � ��� � � � � ���?����)-���� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � )��� � � H����� #��� � ��� ���� ������ � � � � ������ ��H6H �� � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �� ) ��H.H&�&'2���;����� �$�����4����H%� � �$��� � ��� �

� ���"H���� ���&��� ����� ���(����� � �����&5 � � )�H � � �$��� � � ����H!�!� �$�&�!� ����� ���(��� �� H&���"H����� ��� � �����;�����%����� � � � � �� ��� � ��������� � � � H,��� H����� �<� � �����4����������� � � � � �

� � )+��HLH,�&'(���?���,� ����� �;���"H�� � ����� � ��� �� � )+� H.H&�&'(�������&� ����� �

� � ���������&����� H������������)H �� � HPH���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��� � H����% ��� � �4� ��� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

Foi criado um EJB Session Bean Stateless - ProjecSupportBean - com o intuito depreparar o ambiente da aplicação exemplo. O código do EJB, tais como suasinterfaces, implementação e deployment descriptors não foram comentadas pois éutilizado somente como um serviço auxiliar para a aplicação. Segue os códigos do EJB.

Interface Home : ProjectSupportHome.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

Page 252: Jsp servlets j2_ee

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � ������������ �2��)-��*>����� ��) ��)-��%���;���.F����� � ��������+� �����$� ������ ����)+������*��"H������� ��� � � )-� ������������$���� �"H�H,���?� � N��"H �>�DH��������?� �-� ���>� � ���N ���-��5���)9��� � �������� � � �$�����!������ � ��� � ����������������?���2��)-���5��������)H � �<�$�<5 � � � � � ���> ����)-�

������� � � �%� � ��<��������������� ������&� � " . �!/>����� H � �%���<� ���$5������� � ����*�����)-�������$5=����<�!� ����:�

Interface Remote : ProjectSupport.���� �<��'(�-���) � ����� � � ����� � ���� � � � � � H&��H.H�� ����:

� )+�����?� � �<�(�&5 � � � � � � :� )+�����?� � �<�(� � ���!� � � � :� )+�����?� � �<�(� � �%)0� � � :

��� � �������?������ ����)-�����-���0���� � ������ � � �%� � ��&�������������?� ������ � � ������ � ���� � �>���"H����$���KH&���!�>� N���H ���$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���)+��� � ���� � � ���� � �!���)F�H,���?�2� N���H �������-������������� N ���-���+��)+��� ������� �������� � �� ��H.H � ��� � ����������������!� ������+� )+��� ��)-�����GH ���"H.H�� ���> ������

��� � ��������5����-��� ���"H.H�� ���0 ������ ����&� �(�&��� ����H6H,� ��� � ����� ��5&�aH&��H6H=� ��� �2���$����5�� :

��� � �&� � N ���-��� � �"H%�������� ���� H����-��� � �<���0���$� � ������ ��� ����� ����� � /���� �dH � �%���<� ���$5�����<��� ��� ��5����N ���+��� ���� ��N ���+���7� �)H�� �>���� � ���7� �> �������� � ����� �+� � ��� �����&��� " . � /������ H � �!���<������5������� � ��� �

��� ����)-��N����-��� � �ZH������>�� ��>�7� �> �*>����� � ��$��� ��� �$�$� �������� � ����� �+� � ������)-�<��� " .

Page 253: Jsp servlets j2_ee

��� � � � � � B<�����-����� �-����$����� ����� �������-��� � ����� �+�$� � ����� �(���-�"H�� �-����HPH�� ��� �������� � ����� �+� � � � �� � ������� " .�

��� � � � � � B<�����-����� �-����$����� ����� ������� � ��������� ����HLH,� �$�+��) ��� � �<���+�&�!� ��� �������� � ����� �+� � � � ��H.H=� �(�&��� " .�

��� � ����� � ' ���%� �+���������5���� ���+� �� ���"H6H,� ���+ ������ ����� ��������)�H,�"H.H�� �����2��������5&� ���������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�>�����������������(� �%����)-����� " .���EH%����) � ����� � ���%� ��� � � " � � ���������&� �<'0����� � ������)-���<� � ��.;:�!����

� �(� � � ��� �2���$����5��6���5 -��� � � ��� � � ��� �2��������5&� " .�:� �&�(�&5 � H��(� � � �������������!��-�)H " � �&�(�&5 � H���� � � �<���������������.

���5 � � ��� ����� " � � ����� � � ���;���(� � � ����.;:� �����>��<� � ���-������ �"H � ' �<��� ��������&�!� ��� " . :������

� �������������������&� ��)-�����aH�� )7�� ��$�>� � ���!�����������<� �&����)-����� " � � �(� � � � � � ��� � �����" � � � � ��� � � � � "�� � .;*�� � � � �#� � ��� "�� � .;* � � � ��� ��� � � � � � ��� " � � .;*��� �*� � � ����� � � � "�� � .;*�� � � � � � � � � � � � ����� � � � � � � � ��� � " � � �>. .���.;:

�!� ��H�� ) � � ��5��������� " .;:

� � �>��� � � H�� ) � � �� ��H�� " .;:

��

� � ����� � � ������ � �� � H�� " .;:�

� ��<� �/ " ��5�����<�!� ���-��5�.�� /������ ��� � ���> ���5�����<� � ��� " �������%��� �����������,� ��'0���$�(� �%����)-����� � � � ��5 � '���� � � HPH��&'2� " .;.;:

���EH%����) � ����� � ���%� ��� � � " � � � � � � � .;:�

��� �(� )+��� �+��)+��� ������� ���+��5=����ZN �$� ��� ����� � ���N ���+��5���)+��� � �������� � ����� �+�� �����%�����(� ������)-����� " .���EH%����) � ����� � ���%� ��� � � " � � � �����&� �<'0����� � ������)-���<� � ��.;:�!����

� �(� � � ��� �2���$����5��6���5 -��� � � ��� � � ��� �2��������5&� " .�:

Page 254: Jsp servlets j2_ee

� �&�(�&5 � H���� � � �&� ������������-�)H� " � �&�(�&5 � H��(� � � �&� �������>�����.���5 � � ��� ����� " � � ����� � � ���;���(� � � ����.;:

� �����>��<� � ���-������ �"H � ' �<��� ��������&�!� ��� " . :������

� �������������������&� ��)-�����aH�� )7�� ��$�>� � ���!�����������<� �&����)-����� " � � � � � � � �>� � �������?.;:�!� ��

H�� ) � � ��5��������� " .;:�

� � �>��� � � H�� ) � � �� ��H�� " .;:

��

� � ����� � � ����(� � �� ��H&� " .;:

�� ��<� �/ " ��5�����<�!� ���-��5�.�

� /������ ��� � ���> ���5�����<� � ��� " �������%��� �� �����&� ��' ����� � ������)-���$� � � � ��5 � '���� � � H.H,�&'�� " .;.;:�

���EH%����) � ����� � ���%� ��� � � " � � � � � � � .;:�

Deployment Descriptor : ProjectSupportBean.� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� H��"H.H�� ��� �

� ��� H���� �������>��)-� � � ��� � ��&� �����������?� � � �(� H,��� � � ������) � �� � � �����>��)-� � � �!� � ��&� �����������?� � � � � ���?����)+���� />��)-�������) � ����� � � ����� � ��&� � � � � � H��"H.H,� ��� � � ��� � ��&� �����������?� ����)-� � � /���)-���� ����)-����� �����) � ����� � � ����� � ��&� � � � � � H�� HPH&� ��� � � ��� � ��&� ���������$� � � � ����)+�<��� �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � � ��� � ��&� ���>�������?� ������ � � � � ���4�� � H.H �� H��"H.H�� ��� � ���(��� � ��� �&����� ��HLH � � H%��H6H,� �$��� ���(������ � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �

� � H%��HLH=� ��� �� � ���������&����� H������������)H �� � HPH���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��� � ��� � ��&� �����������?� � � � � �����>��)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �%���ZH�?�&���!�%� ������������������ ����� � � �!�����"H�?�&������� ���$��� �

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

Deployment Descriptor da Aplicação Exemplo : ejb-jar.xml

Page 255: Jsp servlets j2_ee

� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � �-� � ��� � ��� ��� � � ��� � ��� ���(� � � ��%��H �EH%����)lH,* � �� � ��� � � � ���������,����� H�� �$������ ������"H � � � ��� � ����/$�;� �� � � � ����� � H,��� � ���) � ����� � � � ���� ��� � � � � � ���������� � � ��� � ��� �

� �������������%� H%�����������ZH �� H��"H.H�� ��� �

� ��� H���� �������>��)-� � ����� ��H ���>��������� � � ��� H,��� � ��� �$��)-� �� � � �����>��)-� � ����� ��H �����������!� � � � � ��������)-� �� />��)-�������) � ����� � � ����� � ��&� � � � � � H��"H.H,� ��� � ����� � H������������!������)+� � � /���)-� �� ����)-����� �����) � ����� � � ����� � ��&� � � � � � H�� HPH&� ��� � ����� ��H �����������!� � � �%��)-����� �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � ����� � 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 �<���) � ������� � ���%� � ��&� � � � � � H���H6H,� ��� � � ��� � ��&� ���>�������?� ������ � � � � ���4�� � H.H �� H��"H.H�� ��� � ���(��� � ��� �&����� ��HLH � � H%��H6H,� �$��� ���(������ � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �

� � H%��HLH=� ��� �� ����� � ��� �

� ��� 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&��� �������>��)-� �� � � �����>��)-� � � �!�������� � � � � ��� �$��)-� �� />��)-�������) � ����� � � ����� � ��&� � � � � � ����� � ��� � � �%������&� ����)-� � � /���)-���

Page 256: Jsp servlets j2_ee

� ����)-����� �����) � ����� � � ����� � ��&� � � � � � ����� � � � � � �����(�$&� � � ����)+�<��� �� � ������ ��/���) � �&���) � ������� � ����� � ���� � � � � � ���$� � � � � � ��������<� �������� �2��)-� � � � ������ �?/���)-� �� � ������ �����) � ����� � � ����� � ���� � � � � � ����� � � � � � ��������<� �������� � � � ������ �� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � ����� � � � � � �����(��&� ������ � � � � ���4�� � H.H �� ���$�AH=� H�� ��������;���(��� � �2�$��� ��� �$��� � � �����LH,� H%�����>����;� �2��� �� ����� ) ���������?�� ��H.H �����) � ����� � � ����� � ���� � � � � � ����� � � � � � ��������<� � � � � ����� ) ������� ���� ��H6H �� ���������������$� � ����� H,� � � �������$� ������� �� �)+��� �����LH,� ��� � � � 5 � � �)+��� ���$�AH=� ��� �� ���"H�������&���GH&�/>��)-� ���>��)-� � � ��������<� � � ���"H�������&���GH&�/>��)-� ���>��)-� �� �)+��� � � ��� � �

� � � ��� ��������)-� ������)-� � � ��� ��� � ������)-���� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �<��� H,��&� �<��� ��� � � � � ��� ���?����)-���� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����%� �� � � ��� ��� ��������)-� �� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����!������&� � � � � ��� ��� ��������)-� �� � �)+��� � � ��� � �� ����� ) �������4��� ��� � ���>�������>&� � � � � ���%� ) ��� ���;��� ��� � �

� � �����!� � � �� )+� H.H,�&'2���4�(��� ����� �

� ��� H���� �������>��)-� � � H����� #�<� � ��� ��� � � �$� H,��� � �����>��)-� �� � � �����>��)-� � � H����� #��� � � � ��� � � � � ���?����)-���� � � ���;�� ��H6H �<���) � ������� � ���%� � ��&� � � � � � )��� � � H����� #��� � ��� ���� ������ � � � � ������ ��H6H �� � �����ZH���<� � ����� ��� ��� � � ���$����� ����� � � �!�����ZH���&�!� ����� ��� ��� �� ) ��H.H&�&'2���;����� �$�����4����H%� � �$��� � ��� �

� ���"H���� ���&��� ����� ���(����� � �����&5 � � )�H � � �$��� � � ����H!�!� �$�&�!� ����� ���(��� �� H&���"H����� ��� � �����;�����%����� � � � � �� ��� � ��������� � � � H,��� H����� �<� � �����4����������� � � � � �

� � )+��HLH,�&'(���?���,� ����� �;���"H�� � ����� � ��� �� � )+� H.H&�&'(�������&� ����� �

� � ���������&����� H������������)H �� � HPH���)+��� ���4����H&���� ������� �

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��������� � H����������$� � � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� ���������� �������4� �%���"H,��<� � ��� �

� ) ��� /���� �� � � ��������)-��������� � H= ���H����<� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �

Page 257: Jsp servlets j2_ee

� ���������� �������4� �%���"H,��<� � ��� �� ) ��� /���� �

� � � ��������)-��� � H���� � � � � �����>��)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� ���������� �������4� �%���"H,��<� � ��� �

� ) ��� /���� �� � � ��������)-��� � �����$�>&� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� ���������� �������4� �%���"H,��<� � ��� �

� ) ��� /���� �� � � ��������)-��� � H����% ��� � �4� ��� � � � � ��������)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� ���������� �������4� �%���"H,��<� � ��� �

� ) ��� /���� �� � � ��������)-��� � ��� � ��&� �����������?� � � � � �����>��)-� �� )-�<� /�����������)-� � � � � )-�<�!/���� �?����)-���

� � )+��� />��� �� � �����ZH�?�&��� �&� ������� ���>� ����� ����� � � �������)H����&�?� �,� ����� ���

� � ���������� ������� �!�%���)H%��&�!� ��� �� � � HPH%��)0��� ���4���"H���%� �<����� �

� � � � ��� � ��� �

Deployment Descriptor específico para o JBoss : jboss.xml� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � � � �$��H6H ��� � � � � � ��� �> ��"H.H ��� � � � �> � � � � � � ��� � � � /��;���� ��� � ��� � � ����H.H � ���?' � � � ��� � ����� � � ����HLH � � � � � ����� � ���� ���"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=� ��� �� ����� � ��� �

Page 258: Jsp servlets j2_ee

� � � �����>��)-� � � H���� � � � � ���?����)+������ ����� ���$��)-� � � H���� ����)-����� � � � ���(� �;����)-���� � ������ � � ���(� ������) � � � H���� � � � ������ � � ����� ���$��)-� �

� � �����!� � � �� ����� � ��� �

� � � �����>��)-� � � �!�������� � � � � ��� �$��)-� ���� ����� ���$��)-� � � ���������� ����)-����� � � � ����� ���$��)-� �� � ������ � � ���(� ������) � � � ��������&� � � � ������ � � ����� ������)-���

� � �����!� � � �� )+� H.H,�&'2���4�(��� ����� �

� � � �����>��)-� � � H����� #��� � � � ��� � � � � ���?����)-���� ����H!�!� �$�&�!� ����� � ����� ������) � �%� ����� � ����H!� � ����� � � ����H%� � ���<� � ����� � ����� �?����)-���

� � )+� H.H&�&'(�������&� ����� �� � ���������&����� H������������)H �

� � � ���"H.H �

Deployment Descriptor específico para o JBoss : jbosscmp-jdbc.xml� � 5�)0���$���LH,� ���� �� ��� ���#��������(� ��' �� � � ������� � �� � � � � � � � � � �$��H6H��)0��� � �(�� ��� � � ��� � ��� �> �� H.H ��� � � � �� � ����� � � � � � �� � � � � � � � � /$�;� �� ��� � � � � � ����H6H � ���?' � � � ��� � ����� � � ����H6H��)9���� �(���� � � � � ����� � ���� ���"H.H&�)+��� � ���� �

� �����;����� �GH �� ������� H��������� � � �&�(� � � �������>� � � � � � ������� H������������ ������� H������������)-������� ��' � � �>�����JH������ � � � � � ���&��� H������������)-������� ��' �� ������&� ��� ������� � �%�!�%��� � � ������&�����4� ����� � �� ����)-�<�(���4������� � �%������� � � ����)+�<�$��� � ����� � �

� � �>���;���>� ��H �� �������������%� H%�����������ZH �

� ����� � ��� �� � � �����>��)-� � � �!�������� � � � � ��� �$��)-� �� ������� ��������)-��� � � � � � � � � � ������� �����>��)-� �� �)+��� � � ��� � �

� � � ��� ��������)-� ������)-� � � ��� ��� � ������)-���� ���� ��)+�����$��)-� �� � � � � � ���� ��)+���;�>��)-� �

� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �<��� H,��&� �<��� ��� � � � � ��� ���?����)-���� ���� ��)+�����$��)-� � � � ��� � � � � � � � � ���� ��)+���;����)-���

� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����%� �� � � ��� ��� ��������)-� �� ���� ��)+�����$��)-� � � � � � � � � ���� �>)+���;����)-���

� � �)+��� � � ��� � �� �)+��� � � ��� � �

� � � ��� ��������)-� �����!������&� � � � � ��� ��� ��������)-� �� ���� ��)+�����$��)-� ��� � � � ���� ��)+���;����)-���

� � �)+��� � � ��� � �� � �����!� � � �

� � ���������&����� H������������)H �

Page 259: Jsp servlets j2_ee

� � � ���"H.H&�)+��� � ���� �

Page 260: Jsp servlets j2_ee

� ����������� �

����� ��� ��� � � � � ��� ���3� � � � ��� � �

GNU Free Documentation License

Version 1.2, November 2002 � ��������������������� �"!#!#!%$&�"!#!(')$&��! !*� +,�.-#-0/#�#1"��2,3��4-5+6��7#8�9#3 �:� �*8%$<;"8#=?>@ ACB -"D,� E�-GF�EH3�=�-I$�/�7"� �#-0J#J !I$LK��,M�� ��8N$PO�Q !H�)'#'"')R6'�J#!#S T�/UQV6W -��X�*�*8"-Y�:MY��-��ZD�� �"�#- 9[�"�G="�#���\3*8"9Y9#�:M��]���H^#7"� - W -]�_^"3 �:�UDG=U���H�U-,M�*1`���"�:M`EH�*="-*8*M6-[9"��=#7�D*-*8"�I$<^"7"�G= �"3�8��:�H8"�Y� �a�HMY8"�"�[3*E#E"��2�-#9b>

0. PREAMBLE

The purpose of this License is to make a manual, textbook, or other functional and usefuldocument "free" in the sense of freedom: to assure everyone the effective freedom to copyand 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 fortheir 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 documentmust themselves be free in the same sense. It complements the GNU General PublicLicense, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, becausefree software needs free documentation: a free program should come with manualsproviding the same freedoms that the software does. But this License is not limited tosoftware manuals; it can be used for any textual work, regardless of subject matter orwhether it is published as a printed book. We recommend this License principally forworks 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 noticeplaced 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 thatwork under the conditions stated herein. The "Document", below, refers to any suchmanual or work. Any member of the public is a licensee, and is addressed as "you". Youaccept the license if you copy, modify or distribute the work in a way requiringpermission under copyright law.

Page 261: Jsp servlets j2_ee

A "Modified Version" of the Document means any work containing the Document or aportion of it, either copied verbatim, or with modifications and/or translated into anotherlanguage.

A "Secondary Section" is a named appendix or a front-matter section of the Documentthat deals exclusively with the relationship of the publishers or authors of the Document tothe Document's overall subject (or to related matters) and contains nothing that could falldirectly within that overall subject. (Thus, if the Document is in part a textbook ofmathematics, a Secondary Section may not explain any mathematics.) The relationshipcould be a matter of historical connection with the subject or with related matters, or oflegal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, asbeing those of Invariant Sections, in the notice that says that the Document is releasedunder this License. If a section does not fit the above definition of Secondary then it is notallowed 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 Textsor Back-Cover Texts, in the notice that says that the Document is released under thisLicense. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be atmost 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in aformat whose specification is available to the general public, that is suitable for revisingthe document straightforwardly with generic text editors or (for images composed ofpixels) 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 offormats suitable for input to text formatters. A copy made in an otherwise Transparent fileformat whose markup, or absence of markup, has been arranged to thwart or discouragesubsequent modification by readers is not Transparent. An image format is notTransparent if used for any substantial amount of text. A copy that is not "Transparent" iscalled "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 availableDTD, and standard-conforming simple HTML, PostScript or PDF designed for humanmodification. Examples of transparent image formats include PNG, XCF and JPG.Opaque formats include proprietary formats that can be read and edited only byproprietary word processors, SGML or XML for which the DTD and/or processing toolsare not generally available, and the machine-generated HTML, PostScript or PDFproduced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pagesas 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

Page 262: Jsp servlets j2_ee

near the most prominent appearance of the work's title, preceding the beginning of thebody of the text.

A section "Entitled XYZ" means a named subunit of the Document whose title either isprecisely XYZ or contains XYZ in parentheses following text that translates XYZ inanother language. (Here XYZ stands for a specific section name mentioned below, such as"Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve theTitle" 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 thisLicense applies to the Document. These Warranty Disclaimers are considered to beincluded by reference in this License, but only as regards disclaiming warranties: anyother implication that these Warranty Disclaimers may have is void and has no effect onthe meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially ornoncommercially, provided that this License, the copyright notices, and the license noticesaying this License applies to the Document are reproduced in all copies, and that you addno other conditions whatsoever to those of this License. You may not use technicalmeasures to obstruct or control the reading or further copying of the copies you make ordistribute. However, you may accept compensation in exchange for copies. If youdistribute a large enough number of copies you must also follow the conditions in section3.

You may also lend copies, under the same conditions stated above, and you may publiclydisplay copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) ofthe Document, numbering more than 100, and the Document's license notice requiresCover Texts, you must enclose the copies in covers that carry, clearly and legibly, all theseCover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the backcover. Both covers must also clearly and legibly identify you as the publisher of thesecopies. The front cover must present the full title with all words of the title equallyprominent and visible. You may add other material on the covers in addition. Copyingwith changes limited to the covers, as long as they preserve the title of the Document andsatisfy 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 thefirst ones listed (as many as fit reasonably) on the actual cover, and continue the rest ontoadjacent 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 Opaquecopy, or state in or with each Opaque copy a computer-network location from which the

Page 263: Jsp servlets j2_ee

general network-using public has access to download using public-standard networkprotocols a complete Transparent copy of the Document, free of added material. If youuse the latter option, you must take reasonably prudent steps, when you begin distributionof Opaque copies in quantity, to ensure that this Transparent copy will remain thusaccessible at the stated location until at least one year after the last time you distribute anOpaque 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 beforeredistributing any large number of copies, to give them a chance to provide you with anupdated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions ofsections 2 and 3 above, provided that you release the Modified Version under preciselythis License, with the Modified Version filling the role of the Document, thus licensingdistribution 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 theDocument, 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 aprevious 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 forauthorship of the modifications in the Modified Version, together with at least fiveof the principal authors of the Document (all of its principal authors, if it has fewerthan five), unless they release you from this requirement.

� C. State on the Title page the name of the publisher of the Modified Version, as thepublisher.

� 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, inthe form shown in the Addendum below.

� G. Preserve in that license notice the full lists of Invariant Sections and requiredCover 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 Versionas given on the Title Page. If there is no section Entitled "History" in theDocument, create one stating the title, year, authors, and publisher of theDocument as given on its Title Page, then add an item describing the ModifiedVersion as stated in the previous sentence.

Page 264: Jsp servlets j2_ee

� J. Preserve the network location, if any, given in the Document for public access toa Transparent copy of the Document, and likewise the network locations given inthe 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 publishedat least four years before the Document itself, or if the original publisher of theversion it refers to gives permission.

� K. For any section Entitled "Acknowledgements" or "Dedications", Preserve theTitle of the section, and preserve in the section all the substance and tone of eachof the contributor acknowledgements and/or dedications given therein.

� L. Preserve all the Invariant Sections of the Document, unaltered in their text andin their titles. Section numbers or the equivalent are not considered part of thesection titles.

� M. Delete any section Entitled "Endorsements". Such a section may not beincluded in the Modified Version.

� N. Do not retitle any existing section to be Entitled "Endorsements" or to conflictin title with any Invariant Section.

� O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify asSecondary Sections and contain no material copied from the Document, you may at youroption designate some or all of these sections as invariant. To do this, add their titles to thelist of Invariant Sections in the Modified Version's license notice. These titles must bedistinct from any other section titles.

You may add a section Entitled "Endorsements", provided it contains nothing butendorsements of your Modified Version by various parties--for example, statements ofpeer review or that the text has been approved by an organization as the authoritativedefinition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to25 words as a Back-Cover Text, to the end of the list of Cover Texts in the ModifiedVersion. Only one passage of Front-Cover Text and one of Back-Cover Text may beadded by (or through arrangements made by) any one entity. If the Document alreadyincludes a cover text for the same cover, previously added by you or by arrangement madeby the same entity you are acting on behalf of, you may not add another; but you mayreplace the old one, on explicit permission from the previous publisher that added the oldone.

The author(s) and publisher(s) of the Document do not by this License give permission touse their names for publicity for or to assert or imply endorsement of any ModifiedVersion.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, underthe terms defined in section 4 above for modified versions, provided that you include inthe combination all of the Invariant Sections of all of the original documents, unmodified,

Page 265: Jsp servlets j2_ee

and list them all as Invariant Sections of your combined work in its license notice, and thatyou preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identicalInvariant Sections may be replaced with a single copy. If there are multiple InvariantSections with the same name but different contents, make the title of each such sectionunique by adding at the end of it, in parentheses, the name of the original author orpublisher of that section if known, or else a unique number. Make the same adjustment tothe section titles in the list of Invariant Sections in the license notice of the combinedwork.

In the combination, you must combine any sections Entitled "History" in the variousoriginal documents, forming one section Entitled "History"; likewise combine anysections Entitled "Acknowledgements", and any sections Entitled "Dedications". Youmust delete all sections Entitled "Endorsements."

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents releasedunder this License, and replace the individual copies of this License in the variousdocuments with a single copy that is included in the collection, provided that you followthe rules of this License for verbatim copying of each of the documents in all otherrespects.

You may extract a single document from such a collection, and distribute it individuallyunder 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 independentdocuments 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 legalrights of the compilation's users beyond what the individual works permit. When theDocument is included in an aggregate, this License does not apply to the other works inthe 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 CoverTexts may be placed on covers that bracket the Document within the aggregate, or theelectronic equivalent of covers if the Document is in electronic form. Otherwise they mustappear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of theDocument under the terms of section 4. Replacing Invariant Sections with translationsrequires special permission from their copyright holders, but you may include translationsof some or all Invariant Sections in addition to the original versions of these Invariant

Page 266: Jsp servlets j2_ee

Sections. You may include a translation of this License, and all the license notices in theDocument, and any Warranty Disclaimers, provided that you also include the originalEnglish 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 Licenseor 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 requirechanging the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expresslyprovided for under this License. Any other attempt to copy, modify, sublicense ordistribute the Document is void, and will automatically terminate your rights under thisLicense. However, parties who have received copies, or rights, from you under thisLicense will not have their licenses terminated so long as such parties remain in fullcompliance.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU FreeDocumentation License from time to time. Such new versions will be similar in spirit tothe present version, but may differ in detail to address new problems or concerns. Seehttp://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Documentspecifies that a particular numbered version of this License "or any later version" appliesto it, you have the option of following the terms and conditions either of that specifiedversion or of any later version that has been published (not as a draft) by the FreeSoftware 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 SoftwareFoundation.

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 thedocument and put the following copyright and license notices just after the title page: � �������������"� �4=]� � V Q�� ���:T����UQ*O V >FU-��&D#�:M M � �*8`�:MC���43�8U�#-"9[�"�G="�����?$�9:�:M6���.�*^#7U�#-03#8"9�#���PD*�#9#�*16�\���"�:M 9#��="7�DH-�8"�7 8"9#-]� ���U-Y� -��&D:M`��1 ���"-���*Ta+(�Z-#-� "��=#7�D*-*8"�"3#�:����8�� �H="-#8*M�-I$��,-���M �U��8['�>�����L3�8��[EH3"�#-�� W -���M ����80�#7#^UE*�#MH�"- 9[^��[���U- +��.-#-0/#��1U��2,3��Z- +_��7#8U9#3 �:�U��8��2(� ���08"�G;"8 W 3����U3�8"� /"-�="�#� �#8*M�$L8�� +(�.�#8"��R4�#� W -�� B -��*�,MN$ 3*8"9a8"�[K 3#=��(R4�"� W -��B -����*MI> Q =U����� ��10�#�"-\E �*="-*8*M�-\�#M0�*8#=�E:7U9#-"9a� 80���"-\M�-�=U�:�U��8C-�8��:� �HEH-"9

� ��*TG+,�.-#-� #�*=#7�D -�8U�#3#�#�U��8�� �*=U-�8HM�- � >If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the"with...Texts." line with this: 2(� �#�0���U-a;#8 W 3��&� 3*8"�0/#-*="�:�U��8HMY^�-:�H8"���";"/ B0B��*V ;�� B ; B � V /I$ 2]�����0�#�"-+,�.�#8"��R4� � W -]� B -��*�,MY^�-:�H8"���";"/ B $ 3*8"9 2(� ��� ���U-\K 3*=��(R4�"� W -�� B -����:M ^U-:� 8"���";"/ B >

Page 267: Jsp servlets j2_ee

If you have Invariant Sections without Cover Texts, or some other combination of thethree, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasingthese examples in parallel under your choice of free software license, such as the GNUGeneral Public License, to permit their use in free software.