Jsp, Servlets e J2EE ¢¡¤£¦¥¨§©¦CPqD Telecom  IT Solutions.!£¦¥¨#$%(¥)¡10%¡¤£23£54678Departamento de Ciências da Computação...
 ¢¡¤£ ¥¢¦¨§©Parte I..........................................................................................................
Capítulo 6...................................................................................................................
11.7 Classes e interfaces....................................................................................................
B.2 Exceções.................................................................................................................
  ¦¢¡¤£ ¥¦¥ § ©Este livro é dividido em duas partes. A primeira parte trata do desenvolvimento deaplicações Web utilizando...
 ¢¡¤£¦¥¨§ ©!¦#!$%)(01235476!89@BACDE1F3G¦HI%P(Q1R356STU¤8VXWY`bac$35d#
  ¡¢¡¤£ ¥¦¥¨§©  ¦ © ¡ ! ©Introduzimos, nesse capítulo, a tecnologia de Servlets e Páginas JSP e mostramosalgumas caracterí...
servidores, sendo que servidores podem ser adicionados ou removidos de maneira aacompanhar o aumento ou decréscimo dessa c...
Além disso, um Servlet pode tirar proveito dessa persistência para manter também emmemória recursos que demandem grande pr...
(Sx9  h§#y3 iiT¡ f5£¢©b@V8 G 53A#%9 58€(5QST54p ¥¤ F5QS(546£¦%bT¡8 G 5¡#%9 58€T542(3W(465 §¤ 6543W(425©¨8Byp¥ 4Hr 1h5$...
  ¡¢¡¤£ ¥¦¥¨§©  ¢¡ ¤£¦¥§£  ! © ¡ ¨ ©  £ §© ¡ ¦ £  !¢©Nesse capítulo são apresentados os tópicos referentes a instalação e ...
Normalmente esse processo de instalação é simples, e, uma vez finalizado, tem-se umservidor de aplicações pronto para prod...
Essa definição está contida, na verdade, na própria especificação de Servlets Java,não sendo específica, portanto, à utili...
   ¡Figura 2.3 Exemplo de estrutura para aplica ªo RemoteIP .ç ãObviamente, podem haver diversas aplicações instaladas, ge...
O path do contexto serve para que o Servidor possa mapear e distribuir as requisiçõesrecebidas para as diversas aplicações...
E 425¡#@9 5£$4F5¡#d9 5D)pt3(( W`1$4F5¡#d9 5D)pW(3t5 $€(53t$853r s  E 4F53A#%9 5D)pWt5 $S%69 )¡(2VV5FW0$ E €(53 V5(r ...
nome de um parâmetro e o seu valor correspondente. O desenvolvedor pode tambémoptar por não utilizar nenhum desses element...
A figura anterior também demonstra a utilização do elemento GEE0@4E§ !8)$HG duas vezes: aprimeira vez para mapear erros HT...
URLs com o sufixo indicado sejam tratados por um mesmo Servlet. Um último exemplode mapeamento interessante diz respeito a...
W  )V(6G$6 )VW(t5%$t 9  B©4F4S(W(V  E F )¡Wt5 $(6 ) #39 S(5©$8 #Uhi(4686Ui5th39  53Wp5© E 3A ) #(9 S(5%$ E  W  )V(6G$9 ...
  ¡¢¡¤£ ¥¦¥¨§©    ¡ ¦ ¡¢¥ ¡  ¡ ¥ £ ¦ £ ¥  ¡ ¦¤£ ¡  § ¥ £ ¡ ¥ ¥ ¡ § ¥ £¢¡Nesse capítulo, exploramos as características bási...
Assim, quando digitamos o endereço de uma página em um browser Web, estamosgerando uma requisição a um servidor, que irá, ...
b%cfe§g%$ (0)1$ E  (0)1$ E b@c eHg0$Assim, no exemplo anterior, o código de status¢§©§ indica que houve sucesso noatendime...
Todo Servlet segue, por outro lado, um ciclo de vida composto de 3 fases: inicialização,atendimento de requisições e final...
¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (Ftp(h5(4F4Pt5(W(VviUhi(4686Ui5W(#4§h39  53WV5(4 ¨TUhiUWT#%thiT4pFp x753...
É possível também, a partir de um objeto da classe ¨$G4E1£ G8 @$7¥¤ $ H, percorrer a lista dosparâmetros de inicialização ...
HHOutro uso comum para o método de inicialização do Servlet é para o despacho de umou mais Threads, que deverão ser execut...
poder receber requisições. A exception  74)1 )$  ) ¡  G£ ¢49G4!$ @$7 , em particular, pode recebercomo parâmetro em seu co...
Exemplo de uso do método “getInitParameter” do objeto “ServletConfig”e do objeto “ServletContext”3Syx(9  h§#%3 i  W £¢ G 5...
EFE 4d4F(W(i(U2FF x(SVUiT5Uh3W7V5128(6U W7i% h( 46V8ST4 i(  W h( 9  w$q ¤G 53A#T9 5$  (W85$1P 9 ¤f4F5¡#@9 5  Wp512  `...
u4¢¢¡9 ¤ 42S(h54F4PG¡ uC39 4F5%¨   d¢C9 ¤a46V8S74PsF t5 A G 53¡#d9 5F x(39 53W ¡ 9 ST5 ¢¨(¥§uV9 4F5%¨¨8Byp¥ W(5§ 4aW($#7...
I $¡ £¢73E 6 13£¢698 ¨ £A finalização de um Servlet deve ser tratada através da implementação do método!$G$5 E@ ¡: no inst...
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Jsp servlets j2_ee
Próximos SlideShares
Carregando em…5
×

Jsp servlets j2_ee

999 visualizações

Publicada em

  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Jsp servlets j2_ee

  1. 1. Jsp, Servlets e J2EE ¢¡¤£¦¥¨§©¦CPqD Telecom IT Solutions.!£¦¥¨#$%(¥)¡10%¡¤£23£54678Departamento de Ciências da ComputaçãoInstituto de Ciências Matemáticas e de Computação.Universidade de São Paulo9@0¡%#BA0%¢©!0CDCE0F¥)HG@0I1$10¥)#CPqD Telecom IT Solutions.4P0FQ1¥¨RTSU#BVS¤W%#B¦X%01¥YTelecom IT Solutions.Copyright (c) - 2004 – André Temple, Rodrigo Fernandes de Mello, Danival TaffarelCalegari and Maurício Schiezaro`)acbedEfhgDgDfDiqprfhgtscbvuwp)xEa€y3x€i‚€iwƒ¨„¤…†yhfhg‡xcbˆfq‰E)xEa‘uEp€yD’Eicb“dqiEyEfq”‡„•xw–€fhg—yEiw€˜d™awp€xDp€yEadbexw–)axDacbedhgriw”fxw–€atghhqikjlbmaEa3n€iwE¨dqaqp€x€uExhf˜iwppoDf™€aEpqg¨aU…rqsacbtgDf)iwp3ucvxwibyuwp˜„3z™u€xEacb†{hacbtgDf˜iwp‘ƒEE‰)zqfEg™–€aDy3‰˜„3xw–)a|jwbˆaEa‘}Eiw”)x¨~sucbma|jYiwEp)yEuDxhf)iwp€~lfDxw–‘p€i‚€p){hubtf)uwp€xp}€aw€xEfDiEpqg…yp¨i|jlbˆiEp€x‚vƒEi){hacb…„sa€†qxsg‡…ˆuqp€ykp€i3‰DuEhŠl‚vƒ€iD{hab„ha€†wxqgUv ‹Œ)iwƒ˜„piw”‘xE–€a•zDfq€aqpqg¨a•fEg‘fqpE˜zh)yEa€ykfDp‘xw–€a•g˜aw)xhf)iwptawp¨xhfDx™z™a€yegEhqi‚jsbˆaEa‘nEiqE˜dDawp)xEuExEf)iwppoDfq)awp™g˜a‡‡v
  2. 2.  ¢¡¤£ ¥¢¦¨§©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
  3. 3. 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
  4. 4. 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
  5. 5. B.2 Exceções.....................................................................................................................................225Apêndice C.......................................................................................................................................228Aplicação J2EE – Exemplo..............................................................................................................228Apêndice C.......................................................................................................................................260
  6. 6.   ¦¢¡¤£ ¥¦¥ § ©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.
  7. 7.  ¢¡¤£¦¥¨§ ©!¦#!$%)(01235476!89@BACDE1F3G¦HI%P(Q1R356STU¤8VXWY`bac$35d#
  8. 8.   ¡¢¡¤£ ¥¦¥¨§© ¦ © ¡ ! ©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)2143457698@BADCFE6HGIA9PSe 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:Q 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.Q 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).Q 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:Q Escalabilidade: na maior parte dos servidores de aplicações modernos, é possíveldistribuir a carga de processamento de aplicações desenvolvidas em diversos
  9. 9. 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.íQ 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.Q 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.#%$#¢¡¤£¦¥ )B6¨§ 6BE©£ A§ 1A C 5£¦¥¡!# CO 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”.
  10. 10. 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ç ã oe 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.#%$¡ £¢¥¤§¦DA C©¨ £ 9A§ 14A C©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 ªocom 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 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5I4P 39 54RQ7ST5U65V76WX(Y2`a W(Xbdcfe§gXh3£5W(i(5p5(qr sEFE ith39 53W7V5UQS(5t5(4FVYvuVDw5(Wi(th54P463Syx(9 hXh9 4F4X€(5(V5(r s G 53¡#d9 5©51V5W(i(4§bTV8 G 578#@9 5$!‚
  11. 11. (Sx9 h§#y3 iiT¡ f5£¢©b@V8 G 53A#%9 58€(5QST54p ¥¤ F5QS(546£¦%bT¡8 G 5¡#%9 58€T542(3W(465 §¤ 6543W(425©¨8Byp¥ 4Hr 1h5$8 (W‚s(P W F p53 9 ¤ §t¥¤ F54D(W(4P5( `d5 F V53¢¨V09 ¤ (F W3A9 W ¢!#b%c e§g%$¥(0)1$23¨C09 ¤ (F W3A9 W ¢!4 4253S 57W7i35p5q( r s65879232A@ ¥¤©p5(QS(5468 `%58€(5(tV5¥B©i(i7¢¨@C! 792D23¨C09 ¤ (F W3A9 W ¢!# E ¥E0)F$ E b%cfe§g%$2D¨ 09 ¤ uV9 ST4PBG¢¨C0HH#%$DI£¢¥¤§¦DA C©¨ £ )QPSRB3E6DCUT QV 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¡WXXsY`@ W(QY G s G (9 54 QS5t (F t5X53WTi(5365q(r sti( tYQS W(§Q%S(5t5468Y§uVw5(W(iXh5(4F42Ut5(4FV(Y2`@ WX`$b%cfe§g%$ (0)1$ 4P5(S5W(i5(p5(qr sa5b!#dcX65QST5468 `%58€(5(tV5¥B©i(i7¢¨(c($2 E ¥0)F$ E b@c eHg0$
  12. 12.   ¡¢¡¤£ ¥¦¥¨§©  ¢¡ ¤£¦¥§£ ! © ¡ ¨ © £ §© ¡ ¦ £ !¢©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. 9$# V § § A ¤§¦D3 C3 £ CO 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 (!$#%%(0)$12)435(687$39A@4B ).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)8CD)4E)83)8!F)$92G43@4EH. 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. 9$# 4E C 6B14698 ¨ £¦A 5£2EPI 33RR¦¨§ 6 8 ¨ £ E£¦ ) 6D5RQATS £¨¥F56 No site do Apache Tomcat são disponibilizadas versões do software com instaladorespara os diversos sistemas operacionais.
  13. 13. 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çãobin Executáveis, incluindo os aplicativos para iniciar e para encerrar a execução do servidorconf Arquivos de configuração do Tomcat. O arquivo “server.xml”, em particular, define umasérie de parâmetros para a execução do servidor, como por exemplo, a porta onde oservidor irá receber requisições (essa porta é, por default, 8080), devendo ser examinadocom cuidado e modificado conforme as necessidades.logs Arquivos de log do servidor. Além de gerar arquivos de log contendo entradas para cadarequisição recebida, como qualquer servidor Web, o Tomcat também pode gerar arquivosde log com tudo o que as aplicações desenvolvidas enviam para as saídas padrão dosistema: 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 arecompilação automática de páginas JSP (esse processo é explicado mais adiante nocapítulo “Páginas JSP”).webapps Nesse diretório são instaladas as diversas aplicações web desenvolvidas por você ou porterceiros. Figura 2.1 Subdiret rios na instala ªo do Apache Tomcat.ó 9$8  EC 6 146D8!¨ £ A ¡¤£2E I 33R§¦§ 6 8 ¨ £ ©DA ¦¥F6H0)214345 6 8 ¨ £ GA9PConforme 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.
  14. 14. 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   G ¡ )8!$!$5 ,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 !G4B @$G©# , contendo o Servlet“RemoteIPServlet” do exemplo do capítulo 1 desse livro, uma estrutura possível abaixodo diretório webapps seria a seguinte:
  15. 15.    ¡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.
  16. 16. 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 é  ¡£¢3  ¤¦¥3§ 3 , teremos os acessos às URLs iniciadas porBV8©¨ EpE© ¦ ¨ E €753tV5(r sdirecionadas para a aplicação !8G8B @$G ©# , os acessos às URLs iniciadas porBV8©¨ EpE© ¦ ¨ E i(4p86 9 5WV54direcionadas para a aplicação )£! )5E@ £# $ G$78G85, e assim por diante. Figura 2.5 Exemplo de mapeamento de requisi ıespara 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%1 93#7564P 3W% ( 53WThi W$` ¡r G 0) (1( ) 2% $¡W c )@s 6 5x3)¡s©4 3gTr !5) E6EPG SW e§ h3A346%4p85(t4 ¦r W(h EFE @cE 53x6B!((9 h$8 (W 7 EpE 8 2 !VB7C83¨ EpE # 4PSW h3 E iVi E 5x3)3(§¤ ¤97 iVi%23$d 53x@) 3(%$i 4(9 6A)¡Wt5 $€(5(XV53r s E i 4P9 B6C)VWT5©$2425¡#@9 5£$4F5¡#d9 5D)pW(3t5 $€(53t$853r s E 4F53A#%9 5D)pWt5 $4F5¡#d9 5D)¡h39 4F4$€5(tV5r s G 5(p#%9 5£ E 4P5(p#%9 5D)¡h39 4F4$
  17. 17. E 425¡#@9 5£$4F5¡#d9 5D)pt3(( W`1$4F5¡#d9 5D)pW(3t5 $€(53t$853r s E 4F53A#%9 5D)pWt5 $S%69 )¡(2VV5FW0$ E €(53 V5(r s E SF9 )V($C85(FW $ E 425¡#@9 5D)pt( W`1$ E 53x)C3(%$Como o Deployment Descriptor é composto de muitas seções, procuraremosapresentar as principais e suas respectivas funções, usando como exemplo a aplicação) !4)5E0@C $ G$78G$5 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%1 93#7564P 3W%2 (f5W(hi% W`12pr G ) (1( ) %©$¡W c )@s 6 5x3)¡s©4 (gr !D) EFE2G SW eH h3p(45646V5t4 ¦r W(h3 EFE @cEG 53x6B (9 h8 3W 7 EpE A8 2!¡BV8©¨ EpE $#7( 4PSTW h3 E i8i E 53x©)C(§¤ ¤97f i(Vi%23$d 53x@) 3(%$ E 53x)C3(%$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   G ¡ §0)F!$! : esse é o elemento E@$@$ (raiz) desse XML, ou seja,deve haver somente um elemento   G ¡ § )$!8! , e abaixo dele devem ficar todos os outroselementos do XML.Os principais elementos abaixo do elemento E@$@8 são os seguintes: !3$ 5A!¦ ) ¡§ 74)FB G , 9@$7FG£¢4§ !F)4E0)$B ,5G$55 $ @$7 § 9@$7¥¤2$ H,   G3 9A@4B G § ¤D$ G § $ 5A, G$E E@E§ !8)$HG , 5G E1 G$ e 5G E1 G$§ B )$!8!3$ 74H .O elemento !¦$ 5A!3 ) ¡§ 7) FB G 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”i 4(9 6A)¡Wt5 $ i(468Fti(5 9 5(W854 E i% 4P(9 B6C)VW( 5©$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
  18. 18. 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”h(W85$1D)p(FG$((p )CWTt5©$8 (t5©4P5 yi4 E (p( )VW(t5%$((p ) #y39 S75 $2ix9 h© E (6 ) #y9 ST5©$ E hWp51D)p(6G$h(W85$1D)p(FG$((p )CWTt5©$r s WTh©yiT4 E 7F )¡W(t5%$((p ) #y39 S75 $ ( ©( a E F ) #%(9 S(5 $ E hWp51D)p(6G$O elemento seguinte, 5G855 $ @47 § 9D@47 ¤ $ H, 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 !3$ 5D!¦ ) ¡§ 74)FB G, 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”4F5(4F4 (WA) h3W7uV `F$2425(4F4D 3W ) 8 t5(S $ 1 E 465424P W@) A t53S7£$ E 4P5(4F4 (WA) h(W(uV ` $Os elementos   G£ 9@ B G § ¤5$ G§ $ 5 e G4EE0@$E§ !$)$HG 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 539 h(t53) u8 9 53)p9 46£$ 5(9 h3t5©) u8 9 5%$ W(i51 B389 E 539 h(t53) u8 9 5 $ 5(9 h3t5©) u8 9 5%$ W(i51 4P% E 5(9 h(t5@) u8 9 5%$ E 539 ht53) u8 9 5@)V9 46£$532pB)V(2`d5©$$532p ) h(i(5 $ ¡ ¡ E 532p )¡hi5©$9 (h8 3W0$ E¢¡ ¡ FA76 B89 E 9 h2A 3W%$ E 5Pp )p($`%5©$532pB)V(2`d5©$$51h5(8 (WA) 26%5%$h3 t WB7536546 5$1h538 (W(4P F 3WW%31Dh53$8 3W% E 5$1h58 (W@) 6T75 $9 (h8 3W0$ E F PA32 B89 E 9 h28 3W%$ E 5Pp )p($`%5©$De acordo com o que é apresentado na listagem anterior, se tomarmos como exemplonossa aplicação ) !4) 5E0@£A $ G$7 G$5, quando é feito um acesso a URL!$#%%   ¡¦¢3  ¤¦¥3§ 3 #¥§¥§$% ) !8)$5 E@# $ G7FGF5(%, o Servidor tentará retornar a página “index.html”, conformeespecificado na lista do   G© 9@8B G § ¤2$ G § $ 5A. Caso essa página não exista, o Servidor tentaráutilizar a página “index.jsp”.
  19. 19. A figura anterior também demonstra a utilização do elemento GEE0@4E§ !8)$HG 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, 5G4E01 G$ e 5G4E01 G$§ B )$!$!©$ 78H , 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 5GE1£ GF, por sua vez, é composto dos seguintes elementos:Q servlet-name: deve conter o nome do Servlet.Q servlet-class: deve conter o nome da classe (incluindo a informação sobre opackage, se existir).Q 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.Q 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”4F5¡#@9 5£$2425¡#@9 5D)pW(t5%$s(p(h5424P i468F E 4P5(p#%9 5 )VWTt5©$2425¡#@9 5D)¡h9 4F4$2h( WB(53F54F i468F 9 53W7V54 s(p(h i(4F86© E 4253A#%9 5) h39 424 $ W )V(FG$(6 )CWTt5©$¡(t 9 G 5(p#% i( G e c s E 7p )CWTt5©$¥(p )#%9 ST5©$24v8( WB753(p546 h( x3 E 3p ) #%9 ST5©$ E W D)V((pb$ W )V(FG$(6 )CWTt5©$¡(t 9 €753t5V5(W(V5 E 3p )¡Wt5 $¡3A )#%9 ST5©$24 p5¡ © WB53(p5(4F h3 x( E 3p ) #%39 S(5%$ E Wy D)¡(6G$ W )V(FG$(6 )CWTt5©$¡(t 9 54p8 W2V(F E (6 )VW( 5©$(A )#%9 ST5©$6#y53W(i(4¢ © WB7536546 h( x( E 7p3 ) #%(9 S(5 $¡ E W )V(6G$ W )V(FG$(6 )CWTt5©$¡(t 9 B©4F4PSWp© E 6 )VW( 5©$(6 ) #%9 S(5 $£8 #%vhi(4pA6Ui(5h39 5(W85 E 3p ) #%39 S(5%$ E WT D)¡(6G$9 (i@)V(WA) 4Fpp8ST%$ E 9 i ) W@)¡4p8(¡AS $ E 4P5¡#d9 5£$Por fim, um elemento servlet-mapping contém um nome de Servlet, conforme definidoem 5G4E01£ GF§ 74)FB G, e um padrão da URL do Servlet no servidor (URL pattern).Exemplo de utilização do elemento “servlet-mapping”4F5¡#@9 5D)8tT3 W`1$2425¡#@9 5D)pW(t5%$s(p(h5424P i468F E 4P5(p#%9 5 )VWTt5©$SyF9 )p(2¡V5FW%$ E s(6h54P465W7V© E S69 )¡VV5FW0$ E 4P5¡#d9 5D)pt3(( W`1$No exemplo anterior, todos as requisições com URLs iniciadas por % ) ! )5E@ £ $ G7FGF5%#E @9 G$5A5)8B G7F@%serão mapeadas para o Servlet cujo nome é #E@49AG855A) ) !8) 5E@ .Outros mapeamentos interessantes podem ser obtidos através de padrões de URL dotipo £ 3¤ G ¢8G7F5¦¥ @¨§ , como por exemplo, £ 3  B ou £ 3! !¥¤ , de maneira que o acessos a todas as
  20. 20. 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”%1 93#7564P 3W%2 (f5W(hi% W`12pr G ) (1( ) %©$¡W c )@s 6 5x3)¡s©4 (gr !D) EFE2G SW eH h3p(45646V5t4 ¦r W(h3 EFE @cEG 53x6B (9 h8 3W 7 EpE A8 2!¡BV8©¨ EpE $#7( 4PSTW h3 E i8i E 53x©)C(§¤ ¤97f i(Vi%23$d 53x@) 3(%$2i% 4D(9 6A)VWTt5©$ i(4F86ti35 9 53W3854d E i% 4239 B6C)¡W(5 $$h3W3851D)p36G$3A3 )VW7t5 $B8ft5%4F5©yiT4 E F )¡W(5 $3A3 ) #(9 S(5%$2ix3(9 h© E 6 ) #%9 S(5 $ E hW85$1P )8(FG$h3Wp51D)p(6G$3A3 )VW7t5 $r s¡(W7h©yi(49 E 6 )VW((t5©$3A3 ) #(9 S(5%$ © ( E 6 ) #%39 S(5%$ E hW85$1P )8(FG$2425(4F4D 3W )Ch3W7u `1$4F5(4F4 (WA) A t53S7£$ ©1 E 4F5(4F4P (W@) F t5S£$ E 425(4F4P 3W )Ch3W7u ` $ 5(9 h3t5©) u8 9 5©)p9 4F£$d 59 h3t53) u8 9 5%$ WTi(51 B89 E 539 h3t5@) uV 9 5%$d 59 h3t53) u8 9 5%$ WTi(51 4 E 539 h3 53) u8 9 5©$ E 539 h3 53) u8 9 5 )¡9 46£$$532p )¡(2`@5 $5(P63B)Ch3i(5%$ ¡ ¡ E 5FA7 )Vhi5%$9 3h$8 3W%$ E ¡ ¡ FpF B89 E 9 h2A (W%$ E 52p )p(`y5©$$532p )¡(2`@5 $5$1h5338 (W@) 6%(5©$$h3 WB(5(3A54F 51h5$A 3W(42 F (WW%1h5(F (W% E 51h53$A 3W@) 26@5%$9 3h$8 3W%$ E F yFpF B89 E 9 h2A (W%$ E 52p )p(`y5©$2425¡#@9 5£$4F5¡#d9 5D)pW(3t5 $s3A3h5(4F42 iT4F86© E 425¡#@9 5)¡Wt5%$4F5¡#d9 5D)¡h39 4F4$h3 WB753(p5463 i(4F86 9 5WV54D s(p(h i468F E 42578#T9 5D)¡h9 4P4 $ W )V(6G$6 )VW(t5%$t 9 G 53A#% i( G e cfs E 6 )CWt5 $¡3A ) #%9 S(5 $42t8( W3BT253(p542 h3 x3 E (p ) #39 S(5©$¥ E W )¡(FG$ W )V(6G$6 )VW(t5%$t 9 €5(t585(WV5© E (p )¡W(t5©$¥3p ) #%9 ST5©$4 p5¡ I WB(5(UA54F h3 x( E 6 ) #%9 S5 $ E W D)¡(3Ab$ W )V(6G$6 )VW(t5%$t 9 y54pA W(2V36 % E F )¡W(3t5 $(p ) #39 S(5%$#5W(i4¢  t WB753(p5463 h( x E F ) #%9 ST5©$¥ E W D)V((pb$
  21. 21. W )V(6G$6 )VW(t5%$t 9 B©4F4S(W(V E F )¡Wt5 $(6 ) #39 S(5©$8 #Uhi(4686Ui5th39 53Wp5© E 3A ) #(9 S(5%$ E W )V(6G$9 3i@)¡3W )¡4p8A8S%$ E 9 (i@)¡3W@)¡46V3¡FS $ E 425¡#@9 5£$2425¡#@9 5£$4F5¡#d9 5D)pW(3t5 $¡ (FS9 6 i4pFp% E 4P5(p#%9 5D)pW( 5©$4F5¡#d9 5D)¡h39 4F4$h3 WB753(p5463 i(4F86 9 5WV54D  (F i(468p% E 4253A#T9 5$D)Vh(9 4F49$ E 425¡#@9 5£$2425¡#@9 5D)pt( W3`1$4F5¡#d9 5D)pW(3t5 $s3A3h5(4F42 iT4F86© E 425¡#@9 5)¡Wt5%$S%69 )¡(2VV5FW0$ E sph5424F 53WV E SF9 )V$VV5FW%$ E 425¡#@9 5D)pt( W`1$2425¡#@9 5D)pt( W3`1$4F5¡#d9 5D)pW(3t5 $¡ (FS9 6 i4pFp% E 4P5(p#%9 5D)pW( 5©$S%69 )¡(2VV5FW0$ E  (FS9 F % E S%69 )pC85(FW $ E 425¡#@9 5D)pt( W`1$ E 53x)C3(%$
  22. 22.   ¡¢¡¤£ ¥¦¥¨§©    ¡ ¦ ¡¢¥ ¡ ¡ ¥ £ ¦ £ ¥ ¡ ¦¤£ ¡ § ¥ £ ¡ ¥ ¥ ¡ § ¥ £¢¡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.I $#§¦ 3P2143£ A 5 6HA ©£25 ¦¥ A E 6D8!¨ £Antes que você possa iniciar o desenvolvimento de seus Servlets, é imprescindível quevocê tenha disponível a biblioteca de Servlets Java (normalmente, um arquivochamado 5GE1£ GF3)8E; se você estiver utilizando o Apache Tomcat, você pode encontraresse arquivo abaixo do diretório de instalação do Tomcat, no subdiretório 9@8B B @$7©¨ $¡ ). 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)3 5A6 739D@8B ).I $8  ¢ )¦§ £ £ 5 £ 1£ SSbVEmbora 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 50) G© GF55 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.
  23. 23. 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 %$ 7 !$G ¢83B e a versão 1.0 doprotocolo HTTP (o que equivale a digitar um endereço $!$#%A% ¤ G$7¦!$G$EG¤£F@ !8G )¦ HF68B 5GE1 $ !$@$E§% $ 7!8G ¢83B em um browser), temos a seguinte requisição enviada:Exemplo de requisição HTTP  c E WTi(513 B89(b@cac s E 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:Q “PUT”: transfere um arquivo do cliente para o servidorQ “DELETE”: remove um arquivo do servidorQ “OPTIONS”: obtém a lista dos métodos suportados pelo servidorQ “TRACE”: retorna o conteúdo da requisição enviada de volta para o clienteAlé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 5GE§ HG $78, quecontém informações sobre o cliente que está gerando a requisição (tipo, versão dobrowser etc.) e o header 9F9DG8!$, que serve para especificar os tipos de recursos aceitospelo cliente para a requisição enviada.Exemplo de requisição HTTP com headers  c E WTi(513 B89(b@cac s E 4d4253B) B©`d53WD¨yeR3w 9 9 E¢¡ ¢Ch( 28 xT9 530Te G r 1 a0¥ W(i 4 00d `F1£¨B hh5$¨7V51 E B89Uma 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 headersb%c c s E© ( G 5(p#5 ¨ B!(h(B(5 E© 7 ( ¢ 4 W 1©¨g(4p )Ve§i uV 5iA¨ G SW ¦ ( 53h ! ¨ ¡ ¨ 1#  ©e c 3W7V53W7D) c96%(5©¨(V51 E B8 9 3W7V53W7D)VgT53W3`8BA¨©7
  24. 24. b%cfe§g%$ (0)1$ E (0)1$ E b@c eHg0$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 ¢ §3§ , que indica que houve erro no processamento darequisição enviada.I $3I 03A § 6¨§¤ ¦D36 © A£¦¥ A§ 1AConforme descrito anteriormente, um Servlet nada mais é que uma classe Java queobedece a uma estrutura bem definida. Em especial, essa classe deve implementar ainterface 0)$12) ¢835GE1£ G$3¨$G4E1£ GF.Existem duas classes, na biblioteca de Servlets, que implementam essa interface:)1) ¢ 35G$E1£ GF3  G$78G$E$ 9¤¨GE1£ G$ e sua sub-classe, )1 ) ¢835G4E1£ G83!834!¨$G$E1£ G8. A classe   G$7 G4E$ 9¤¨G4E01£ G$, como opróprio nome indica, serve para atender requisições genéricas (utilizando qualquerprotocolo), e a classe !¨ GE1£ GF, para atender requisições HTTP. Figura 3.1 Hierarquia de classes associadas a um Servlet.No desenvolvimento do Servlet de nossa aplicação exemplo ) ! )$5 E@¦A $ G$7FG$5, temos assim aseguinte declaração de classe:Declaração do Servlet ProcCadastro ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (Ftp(h5(4F4Pt5(W(VviUhi(4686Ui5W(#4§h39 53WV5(43Syx(9 hXh9 4F4Xs(Fh i4F86t51285(W(i4 b@V8 G 53A#T9 5!‚ HI $¤£ ¡0345 1£© A D3© 6 ©DA ¦¨¥ A§ 1A
  25. 25. 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 @) £! §@$7 § 5)8E68! , 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.I $¡  4E345 36D13£¢D6D8 ¨ £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ção2) 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” ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0
  26. 26. ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (Ftp(h5(4F4Pt5(W(VviUhi(4686Ui5W(#4§h39 53WV5(4 ¨TUhiUWT#%thiT4pFp x753 4DS7h5iy i(©¦EFE 5W#@ X53 9(h (4§i(i((4 ithiT4F863Syx(9 hXh9 4F4Xs(Fh i4F86t51285(W(i4 b@V8 G 53A#T9 5!‚ (Sx9 h§#y3 i W S¢¨©‚ H HAs assinaturas do método $ 73$ ¡ ¡¢ são:Assinaturas do método “init ()”3Syx(9 h§#%3 i W £¢¨¡03Syx(9 h§#%3 i W £¢© #%213 4F5¡#%9 5A G 5¡#@9 5 7W3u ` ¥¤ah7W3u ` ¨V0Conforme pode ser visto, o método $ 7 $ £ ¡¢ admite duas assinaturas, sendo que em umadelas, é recebido como parâmetro um objeto da classe )1 ) ¢835GE1 G$3¨ G4E1£ GF2 @7 ¤5$ H: 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 $ 73$ £ ¡¢ sem nenhum parâmetro, é possível também obter umareferência para o objeto ¨$G4E1£ G82 @7 ¤5$ H por meio da chamada H$GF¨$G4E1£ GF @$7 ¤D$ H¤ ¡¢ da própria classe)1) ¢ 35G$E1£ GF3  G$78G$E$ 9¤¨GE1£ G$¥  )§¦$68) 7$@F5A5A)P9B )55G PG85 G47 !$G¨¢ .Assinatura do método “getServletConfig ()”3Syx(9 hU $#%213 4F5¡#%9 5F G 578#@9 5$ (Wu8 ``d5 G 5A#T9 5 3W7uV ` ¢¨¡0Para obter um parâmetro de inicialização do Servlet usando o objeto ¨G4E01£ GF2@$7 ¤5$ H , deve-seutilizar o método H$GF©73$ #4) E)FB GFG4E¡  ¢ , passando como parâmetro o nome do parâmetro que sedeseja obter.Assinatura do método “getInitParameter ()”3Syx(9 hU $#% 9 W`@ G FF W``d58r W 8sFt5$V57 ¢ 2#% 9 W` G 8F W` ¥¤ (6t5p53 8 t5 ¨¡0Temos, a seguir, um exemplo de uso desse método:Exemplo de uso do método “getInitParameter()” de um objeto“ServletConfig”3Syx(9 h§#%3 i W £¢ G 5¡#%9 5 (W(uV ` §¤ 4F5A#T9 5 3W7uV `1¨ 8Byp¥ 4 G 53A#%9 5 31Dh57$8 3W‚4PSy532 W £¢C¥¤a4653A#T9 5 3W7uV `1¨¡0G 82 W` 9 ¤a42578#T i(3 G e c saU©¤ 4F5¡#@9 5 3W3u `@ `%58r W 8s6t5V5 ¢!Dt 9 G 578#T i3 G e cfs 23¨C0 u3¢C9 ¤a4253A#% i( G e c s W XWST9 9 ¨f‚ HHObviamente o método HG $©73$ #4)8E)$B G$G4E© ¡¢ 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.
  27. 27. É possível também, a partir de um objeto da classe ¨$G4E1£ G8 @$7¥¤ $ H, percorrer a lista dosparâmetros de inicialização do Servlet, bastando utilizar o método HG$©7£$ # )E) $B GFG$E)$B G$5  ¡¢ .Assinatura do método “getInitParameterNames ()”3Syx(9 hU $#% S8 9 WS(t5(p28 3Wv`%58r W 8s6t5V5 8 t54d¢¨C0Temos, a seguir, um exemplo de uso deste outro método:Exemplo de uso do método “getInitParameterNames()” de um objeto“ServletConfig”3Syx(9 h§#%3 i W £¢ G 5¡#%9 5 (W(uV ` §¤ 4F5A#T9 5 3W7uV `1¨ 8Byp¥ 4 G 53A#%9 5 31Dh57$8 3W‚4PSy532 W £¢C¥¤a4653A#T9 5 3W7uV `1¨¡0WTSt53p$8 (W9 ¤ 7Ft5$853 8at54Qt§¤ 4F5¡#@9 5 3W7uV `@ `%5$8r W Vs(pt5p53 8 t5(4 ¢¨V0 u3¢C9 ¤ (pt5V57 8at54 W XW%ST9 9 ¨ B% 9 5©¢C9 ¤ 6t5V5 8 t54 B4Fe§(p5©T9 53t5(W(V4 ¢¨D¨‚G 82 W`H9 ¤ 3At5V5( 8 t5 8¢ G AF W(` ¨©9 ¤ (6t585( 8 t5(4P W(5$1£9 5(t53W¢¨¡0G 82 W`H9 ¤ 3At5V5( ¡ 39 S75 © ¤4V52 #395p PW6u `3`5A rW sFF FR5p 5P¢ 9¤%6A 8§5¡ 52 8FR5 ¨ 0 HHHAssim, em nossa aplicação de exemplo )£!8)5 E@ # $ G$78G$5, podemos implementar o métodode inicialização do Servlet #E0@89 ) !4)5E0@ como:Inicialização do Servlet “ProcCadastro” ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (Ftp(h5(4F4Pt5(W(VviUhi(4686Ui5W(#4§h39 53WV5(4 ¨EFE thi3W(#Uhi(468p x5 4PSh5(i iT©¦(5W#@ X53 9(h3£(4§ii((4 i(hiT4pFp3Syx(9 hXh9 4F4Xs(Fh i4F86t51285(W(i4 b@V8 G 53A#T9 5!‚EFE§G 578#@ i( G e c sXt4257RS46i( (pU5(W(#% Xi5t5t 9(2 #%2V54pp8 h G A6 W`C¤ G 5¡#d i( G e cfs8tWS9 9 0EFE €5(t5p53WV5 ¦i(5(4F8 W(VY2 t5424PS%W3VUi(53 9(t4257 5W#@ iTXUhi(thi468F(2 #%2V54pp8 h G A6 W` ¤ €(5(t5V53Wp5 UWyS9 9 ¦¥¤ 534AA W728F tW%ST9 9 ¦©¤ B©4P42SW88UWSy9 9 0(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE €(5(hS5pW(i(U(4 (£¢t5Fp(4 i5 WT h 9 w$q¥¤i( G 5¡#@9 5¤ G 57A#% i( G e!c sat¥¤a4253A#T9 5$ 3W7uV `@ `%5$Ar Wy 8spt5V53 ¢D!3t 9 G 53A#% i( G e c s©2D¨C0¤ €5(t5p53WV5GU©¤a4P5(p#%9 5 3W7u `@ `%58r W( 8sA5V5( ¢3!Dt 9 €(53t5$85W7V5©2D¨C0¤Ey5(4pF W(2pF §¤ 4F5¡#@9 5 7W3u8 `@ `%58r W 8s(pt5p53 ¢!Dt 9 y5(4p8 W(VF 23¨C0¤ B©424PSWp §¤ 4F5¡#@9 5 3W3u8 `@ `%58r W 8s6t5V5 ¢!Dt 9 B 464PSWV%23¨C0
  28. 28. HHOutro 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 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (F #%532 u8 hRh(W5$1 ¤Uh7£x(WThti5UiTi4¨9 Wq§8Byp5(iQ7ST5§#%5F uV hU46V8S(4RiXh7W751 ¤(5F i h5Wp53Syx(9 hXh9 4F4 ¡ 5F u8 h (W Fv51p53W(i4 b@CA G 53A#%9 5$! (9 53v53W384 €SWTW(x(9 5U‚EFE €5$uV53 ¡WTh Xt8B%A53iQS(5 FY uV$w$5 v#%5F u hq ¤(tiXh3WT51£¤c B%p5i6¤ c B%p5i ¡ 5F uUWTS9 9 0EFE r W h 9 w$q ¤ti G 5¡#@9 5(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE g(W(q(W(i( c B65i ¤ c BF5i ¡ 5(P uSUW75 cfByp5i%¢ 8B 4 ¨C0¤ c BF5i ¡ 5(P u8 4pppS¢¨¡0 HEFE (15h3S(q¥¤(ti(t8B%p5(i(Sx9 h§#y3 i 2SW%¢¨f‚ B% 9 5©¢ ¤ cfBA5i ¡ 5F uSW tWS9 9 ¨f‚ u3¢W 3W0©d b¢¨3¨f‚ HHH HUma 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 ¨$G4E1£ G8£ ¢49G ! D$ @$7 ou 74)1 )$ ) ¡ G £ ¢9AG4! $ @$7 ;nestes casos, o Servlet Container irá deixar o Servlet em um estado inativo, ou seja, sem
  29. 29. poder receber requisições. A exception 74)1 )$ ) ¡ G£ ¢49G4!$ @$7 , 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ção3Syx(9 h #%3 i W £¢ G 5¡#%9 5 (W(uV ` ¥¤a4253A#T9 5$ 3W7uV `1¨8B%A¡ 4 G 5(p#%9 5 1h5$8 (W%¦@4 W(# 9 x(9 5%1h5(8 (W ‚4PSy532 W £¢C¥¤a4653A#T9 5 3W7uV `1¨¡0 EFE €5h3S5pW(i(t5t#%9 i(W(it( ¢t5$Ap4 i5 W h( 9 w$q ¤ti G 5¡#%9 5¤ G 5¡#@ i3 G e cfs8U§¤ 4253A#%9 5 (W(uV `d `d58r Wy 8spt5$85( ¢!#3 D 9 G 5(p#% i3 G e cfs 23¨C0¤ €T53t5$853W3V5 t¥¤a4253¡#@9 5 3W7uV `@ `%5$8r W 8spt5p53 ¢!Dt 9 €(5(t5V5(W(V5 23¨C0¤ 534AA W728F t¥¤ 46578#T9 5$ Wu8 `d `%58r WT 8sFt5$V53d¢!3t 9 y5468 W(2pF ©23¨C0¤FB 424PSW38 t¥¤ 46578#T9 5$ Wu8 `d `%58r WT 8sFt5$V5 ¢!3t 9 B 424PSW3V©23¨C0 u3¢¢ ¤ G 53¡#d i( G eHc s8¡vWS%9 9 ¨¡   ¢ ¤ €T53t5$V53W7V5 ¡tWS9 9 ¨¡    ¢ ¤ B 4F4PSTW8 ¥UWTS9 9 ¨¨8B%A¡ W75 4aWT2# 9 x(9 5%1h5(F (W%¢!3yFp@¨(£¢t5Fp(4 i5 WT h3 9 w$q¥¤ W ¤5(Wh3WFpi4 W2 #¨C0No caso de você não ter percebido, todos os métodos $ 73$  ¡¢ apresentados até agora nosexemplos foram declarados de maneira a possibilitar o lançamento do exception¨ G$E1£ G$£ ¢49G8!D$ @$7 : isso é necessário devido à chamada do método 5A6$!$G4E3$ 73$  ¡¢ , que pode, por si,lançar essa exceção para indicar problemas em sua execução.I $£¢ 5146DCC A¥¤ DA § 1A ¡ £2E A§¦¨©¨Além da referência ao objeto da classe ¨ GE1 G$@$7¥¤2$ H recebido como parâmetro nainicialização, o Servlet pode obter também uma referência a um objeto da classe)1) ¢ 35G$E1£ GF3¨GE1£ G$ @$78G ¢ através do método HG$¨GE1£ G$ @47 G ¢4  ¡¢ GE!4) !$@ ! )P9 )55 AG   G$7FG4E2$ 9¤¨$G$E1£ G$.Assinatura do método “getServletContext ()”3Syx(9 hU $#%213 4F5¡#%9 5F G 578#@9 5$ (W85$1P `@5 G 53A#%9 5 (W(V512£¢¨V0Esse objeto ¨ G4E1£ G$@$7$G ¢ 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 ¨GE1£ GF @$7 ¤5$ H , existem métodos pararecuperar os parâmetros iniciais do contexto definidos no “DeploymentDescriptor” (videseção 2.2).Assinatura dos métodos “getInitParameterNames ()” e “getInitParameter()”3Syx(9 hU $#% S8 9 WS(t5(p28 3Wv`%58r W 8s6t5V5 8 t54d¢¨C03Syx(9 hU $#% S8 9 WS(t5(p28 3Wv`%58r W 8s6t5V5 ¢C # 9 W`@ G FF W` §¤©(p5$V5 8 t5©¨C0Por 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”.
  30. 30. Exemplo de uso do método “getInitParameter” do objeto “ServletConfig”e do objeto “ServletContext”3Syx(9 h§#%3 i W £¢ G 5¡#%9 5 (W(uV ` §¤ 4F5A#T9 5 3W7uV `1¨ 8Byp¥ 4 G 53A#%9 5 31Dh57$8 3W‚4PSy532 W £¢C¥¤a4653A#T9 5 3W7uV `1¨¡0EFE €5h3S5pW(i((£¢t5AA4 iT5U515h(S(q ¤UiT G 5¡#%9 5G 82 W` 9 ¤ (6G153h8U§¤ 4253A#%9 5 (W(uV `d `y58r WT Vs(pt5$85( ¢!Vs(At58A©71D5(hS(h©2#¨C0EFE§G 5 W ¤(t513 4p8 IV(9%73 ¢t58pti G 5¡#%9 5£¦(p53Wpt4Rh3t(£¢t58FXiTUh7W3851V u3¢C9 ¤ (pG(15h8¡tWS9 9 ¨f‚G 53A#T9 5$ (W85$1P 9 ¤f4F5¡#@9 5 Wp512 `%5 G 53A#%9 5$ (W(V512S¢¨V09 ¤ (pG71D5h 9 ¤f4F5¡#@9 5$ 3WV512A `y58r W 8s6t5V5 ¢!¡s6t586©315hSTh©2#¨C0H HAlé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()”3Syx(9 h 2#% 9 W`@ ©x3 5(h2©`@5$3BfV82 x(SV5%¢C 2#% 9 3W$` G 82 W(` §¤f2V82 x(S85£8 X5%¨C03Syx(9 h 2#% SF 9 WS(t5(p2A 3Wv`d53Bf¡8P x3S3V5 8 t54 ¢¨C03Syx(9 h #%3 iF5($#%5BfV82 x(Sp5©¢C 2#% 9 3W`@ G 8F W` §¤f2V82 x(SV5@8 t5©¨C03Syx(9 h #%3 it4P5B©CFF x(SV5©¢C 2#% 9 3W$`@ G 8P W` §¤ 2V82 x(Sp5£8ft5©¦2#% 9 W`@ ©x3 5(h2!¥¤aCFF x(S7V5 ¡ 9 S(5 ¨C0No 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” ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFE s6 t5 p G 5¡#d9 5 it515(9 3Syx(9 hXh9 4F4Xs(P t53 p G 53A#%9 5 512853W7i4 by¡8 G 5(¡#@9 5!‚(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE 32p5`%W(it 3 ¢ 586 W h 9x(9 53W9 ¤a4PSTh5(4F42 AFST530G 8P W` 9 ¤ (pr W( h 9 ¥¤a4253A#%9 5$ WuV `a `%5$Ar W 8spt5V53d¢!Vsps(F t53 p G 53A#%9 5£23¨C0 u4¢C9 ¤ (p r W% h 9 UWTS9 9 ¨f9 ¤f4PS(h54P46 uV39 4P5(0
  31. 31. EFE 4d4F(W(i(U2FF x(SVUiT5Uh3W7V5128(6U W7i% h( 46V8ST4 i( W h( 9 w$q ¤G 53A#T9 5$ (W85$1P 9 ¤f4F5¡#@9 5 Wp512 `%5 G 53A#%9 5$ (W(V512S¢¨V09 ¤a4P5(p#%9 5 3W7V5128 4F5DBfV82 x(SV5%¢!Vs(F t53 A G 53¡#d9 5£23¦yW(5(39 5W%¢C9 ¤a4PS(h54P46©¨¨V0EFE ¡ 5F u h(W(i(U46V8ST4 i4F5`@SW7i3 G 5¡#d9 53(9 5(W9 ¤a4FV$8S(4 G 5`@SW(i( G 53A#%9 5S8¢3(9 5(W%¨9 ¤a4253A#%9 5 (W(V5128 `d5DB CFF x(SV5©¢! G 5$`@SW(i( G 5¡#@9 5 2D¨C0 B% 9 5©¢C9 ¤ 4pp28S(4 G 5`aS(W(i G 53A#%9 5¡tWS9 9 ¨ ‚c B%A53i 4P9 553 ¢ 1 #( ¨C0 EFE T4P(5(F 1 4F5`@SyW(i(4 5t#%5F uV hX46V8S(4§W$#%t53W3V59 ¤a46V8S(4 G 5$` S(W(iT G 5(p#%9 58¢3(39 53W0¨9 ¤a4253A#%9 5 (W(V5128 `d5DB CFF x(SV5©¢! G 5$`@SW(i( G 5¡#@9 5 2D¨C0HEFEXG 5 BT3S#5vu8Fh4F42 W(U W h (9 w3q ¤Ui54FV5 G 5¡#@9 5 (Si465`dSW(i(©¦EFE 9 WTqt4HStX5$1h5q ¤ u4¢¢¡9 ¤ 42S(h54F4PG¡ uC39 4F5%¨   d¢C9 ¤a46V8S74 G 5`@SW7i3 G 53¡#@9 58 x(39 5(W ¡ 39 S75 ¢¨(¡ uV9 4P5 ¨¨8Byp¥ W(5§ 4aW($#7 9 x39 5©71Dh53$A 3W%¢!D%6p3¨T4Xi( 4 G 5A#T9 5$84HW ¤(3S7i536D 425h3F65`di((4 h(£4PSTh54P4F%W 23¨C0H HEFEHG 5`@SW(i( G 5¡#@9 5 i(5153T9 3Syx(9 hXh9 4F4 G 5`@SyWi G 5¡#%9 5$ 51Pp53W(iT4 byCA G 53A#%9 5!‚(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE 32p5`%W(it 3 ¢ 586 W h 9x(9 53W9 ¤a4PSTh5(4F42 AFST530G 8P W` 9 ¤ (pr W( h 9 ¥¤a4253A#%9 5$ WuV `a `%5$Ar W 8spt5V53d¢!Vsp G 5$`@SW(i( G 53A#%9 5£23¨C0 u4¢C9 ¤ (p r W% h 9 UWTS9 9 ¨f9 ¤f4PS(h54P46 uV39 4P5(0 EFE 4d4F(W(i(U2FF x(SVUiT5Uh3W7V5128(6U W7i% h( 46V8ST4 i( W h( 9 w$q ¤G 53A#T9 5$ (W85$1P 9 ¤f4F5¡#@9 5 Wp512 `%5 G 53A#%9 5$ (W(V512S¢¨V09 ¤a4P5(p#%9 5 3W7V5128 4F5DBfV82 x(SV5%¢! G 5`@SW7i3 G 53A#T9 5£23¦WT5(39 5W0¢V9 ¤a42S(h54F4P ¨¨V0EFE ¡ 5F u h(W(i(U46V8ST4 i4F5`@SW7i3 G 5¡#d9 53(9 5(W9 ¤a4FV$8S(4Ps6 t53 p G 5(p#%9 5S8¢(39 5(W%¨9 ¤a4253A#%9 5 (W(V5128 `d5DB CFF x(SV5©¢!¡s32 t53 F G 5¡#%9 5£2#¨C0 B% 9 5©¢C9 ¤ 4pp28S(4Ps6 t53 p G 5(¡#@9 5StWS9 9 ¨©‚c B%A53i 4P9 553 ¢ 1 #( ¨C0 EFE T4P(5(F 1 4F5`@SyW(i(4 5t#%5F uV hX46V8S(4§W$#%t53W3V59 ¤a46V8S(42sF t5( p G 53¡#@9 5SG¢(39 5(W%¨9 ¤a4253A#%9 5 (W(V5128 `d5DB CFF x(SV5©¢!¡s32 t53 F G 5¡#%9 5£2#¨C0HEFEXG 5 BT3S#5vu8Fh4F42 W(U W h (9 w3q ¤Ui54FV5 G 5¡#@9 5 (Si (2 5( p%¦EFE 9 WTqt4HStX5$1h5q ¤
  32. 32. u4¢¢¡9 ¤ 42S(h54F4PG¡ uC39 4F5%¨   d¢C9 ¤a46V8S74PsF t5 A G 53¡#d9 5F x(39 53W ¡ 9 ST5 ¢¨(¥§uV9 4F5%¨¨8Byp¥ W(5§ 4aW($#7 9 x39 5©71Dh53$A 3W%¢!D%6p3¨T4Xi( 4 G 5A#T9 5$84HW ¤(3S7i536D4253Rh3F65`di(34dW 2D¨C0H HPor fim, há um outro método da classe ¨ GE1 G$@$78G ¢ que vale a pena conhecer: o método @4H¤  ¢ 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 ()”3Syx(9 h§#%3 i 9 `F¢C # 9 W3`@ G AF W` §¤ t4p`1¨C0Em 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 @8H  ¡¢ são adicionadas a um arquivo de lognormalmente chamado @892)¦ @ F5¡ ( @H 43G ¢ 3¢8, onde G ¢8 é uma extensão contendo a datacorrente.Exemplo de uso do método “log ()” (da classe “ServletContext”) ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (F 8546V5i(5t`%5Fq ¤ti553W74F2`@5(W(4 i59 `3Syx(9 hXh9 4F4Hc 546V53gT` 51V5W(i(4HbT¡8 G 5¡#@9 5!‚EFE ¡ (9 i(5uVS9 (6U(3A586U W h3 9Ti G 5A#T9 5(2 #%2V54pp8 h§u8 W9 G FF W`G¤ ¡ 9 3 5uVS9 8sFtr WT h 9%8!£2¡0(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE €(5(hS5pW(i(U(4 (£¢t5Fp(4 i5 WT h 9 w$q¥¤i( G 5¡#@9 5G 8P W` 9 ¤ (6r W h 39 ©¥¤a4253A#T9 5 3W7uV `@ `%5$Ar W( 8spt5V53d¢!Vspt58p(r W( h (9 2D¨C0 u4¢C9 ¤ (p r W% h 9 UWTS9 9 ¨f‚G 5(p#%9 5 3W38512!9 ¤ hWV512 t§¤ 4F5¡#d9 5 (Wu8 `@ `%5 G 5¡#@9 5 3W38512S¢D¨C09 ¤ah3Wp518 9 $`1¢! B©#% 4P©¨W ¤tuC%73464£¢ #759(425h265`d ( ¢t58FU W h3 9 082 x(Sy W(i(§#(9 ( i5$uVS%9 ! 23¨C09 ¤ 3Ar W h 9 ¤ ¡ 9 3dy5uVSy9 8s6r W% h 9 0H H H
  33. 33. I $¡ £¢73E 6 13£¢698 ¨ £A finalização de um Servlet deve ser tratada através da implementação do método!$G$5 E@ ¡: no instante em que o Servlet é “descarregado”, seu método !$G$5 E@ ¡, 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 !FG5 E@ ¡ ¡¢ é a seguinte:Assinatura do método “destroy ()”3Syx(9 h§#%3 ii546AA£6 ¢¨C0Utilizando nosso exemplo de cadastro de clientes, temos a seguir um exemplo de nossoServlet ¤ G4E$ ¤5$ 9D)£ @$7¥ com os métodos $ 73$ ¡ ¡¢ e !8G$5 E@ ¡ ¡¢ implementados:Inicialização do Servlet “VerificaConBD” ¡! $#% ( )$0 ¡! $#%213 46578#@9 5$A )$0 ¡! $#%213 46578#@9 5$A B3CA( )D0EFEHG 5¡#@9 5 (F #%532 u8 hRh(W5$1 ¤Uh7£x(WThti5UiTi4¨9 Wq§8Byp5(iQ7ST5§#%5F uV hU46V8S(4RiXh7W751 ¤(5F i h5Wp53Syx(9 hXh9 4F4 ¡ 5F u8 h (W Fv51p53W(i4 b@CA G 53A#%9 5$! (9 53v53W384 €SWTW(x(9 5U‚EFE €5$uV53 ¡WTh Xt8B%A53iQS(5 FY uV$w$5 v#%5F u hq ¤(tiXh3WT51£¤c B%p5i6¤ c B%p5i ¡ 5F uUWTS9 9 0EFE r W h 9 w$q ¤ti G 5¡#@9 5(Sx9 h§#y3 i W £¢ G 578#T9 5$ 3W7uV ` §¤f4F5p#%9 5 3W7u `1¨ 8Byp 4 G 5A#T9 5$ 1h5$8 3W‚4PSy5(P W £¢C¥¤a4F5¡#%9 5 3W7u `1¨C0EFE g(W(q(W(i( c B65i ¤ c BF5i ¡ 5(P uSUW75 cfByp5i%¢ 8B 4 ¨C0¤ c BF5i ¡ 5(P u8 4pppS¢¨¡0 HEFE (15h3S(q¥¤(ti(t8B%p5(i(Sx9 h§#y3 i 2SW%¢¨f‚ B% 9 5©¢ ¤ cfBA5i ¡ 5F uSW tWS9 9 ¨f‚ u3¢W 3W0©d b¢¨3¨f‚ HHHEFE  % W(9 w$q ¤ti G 5¡#@9 5(Sx9 h§#y3 iiT546Ap¦6 ¢¨©‚¤ c BF5i ¡ 5(P uSUWTS9 9 0H

×