900

Click here to load reader

use a cabeça - jsp & servlets

Embed Size (px)

Citation preview

"Sci'dade de Ensino Sunerior da PamffJa

Elogios antecipados para o Use a Cabea! Servlets & JSpTM"Este livro, Use a Cabea! Servlets & JSP, to bom quanto o Use a Cabea! EJB, que me fez rir E me garantiu 97% de aproveitamento na prova!" - Jef Cumps, Consultor de J2EE, Cronos "Para nossas aulas de Servlet/JSP, ns compramos mais de dez livros, sem encontrar nenhum, de fato, satisfatrio para nossas necessidades de ensino ... At que encontrarmos esta 'jia' pedaggica que voc tem agora nas mos! Os livros da srie Use a Cabea! nos tornaram melhores professores." - Philippe Maquet: Instrutor Snior da Loop Factory, Bruxelas

Elogios para o Use a Cabea! EJBTM e para o formato da srie Use a Cabea!"A tecnologia Java est em todos os lugares - em telefones celulares, carros, cmeras, impressoras, jogos, PDAs, ATMs, smart cards, bombas de gasolina, estdios, equipamentos mdicos, webcams, servidores, voc escolhe. Se voc desenvolve software e no conhece Java, definitivamente, est na hora de voc mergulhar de cabea - Use a Cabea!." - Scott McNealy, Chairman, Presidente e CEO, Sun Microsystems(Nota do departamento de marketing: isto foi o melhor que voc conseguiu do Scott? Veja se consegue fazer com que ele acrescente algo do tipo: "Se ns tivssemos os livros da srie Use a Cabea! h dois anos, ainda podamos ter aquela iluso ...'~).

"Um livro incrivelmente agradvel. Dividido e interconectado como uma rede de conhecimentos. Como professor da Purdue University, com especializao em desenvolvimento avanado de software utilizando tecnologias baseadas em Java, estou em constante busca por materiais de apoio que ofeream motivao e uma linguagem compreensiva direcionada para o exame, mas que ao mesmo tempo no desestimulem os alunos. O livro 'Use a Cabea! EJB' preenche estes requisitos facilmente! Livros como estes so extremamente raros. Inclu este livro como um dos textos essenciais para as futuras turmas do curso de graduao avanada que eu dou de 'Desenvolvimento de Aplicaes para Empresas'. Parabns para os autores; continuem com o excelente trabalho!" Professor Dan Gill, Departamento de Tecnologia de Computadores, Purdue University.

"Alm do estilo envolvente que o levar do nvel de leigo ao status de guerreiro aclamado no Java, o livro Use a Cabea! Java traz um grande nmero de questes prticas, que outros ttulos tratam como o temvel 'exerccio para o leitor ... ' Ele inteligente, irnico, descolado e prtico - existem poucos livros com estas caractersticas e que so capazes de ensinar sobre serializao de objetos e protocolos de execuo em rede ao mesmo tempo." - Dr. Dan Russel, Diretor de Pesquisas Experimentais e Cientficas com Usurios, IBM Almaden Research Center (e professor de Inteligncia Artificial na Stanford University). Que maneira maravilhosa de aprender!!! EU NO CONSIGO LARGAR ESTE LIVRO!!! Meu filho de 3 anos acordou Ih40 da manh, e eu o col>queide volta na cama segurando o livro e uma lanterna, e continuei lendo por mais uma hora. - Ross Goldberg "O Use a Cabea! Java, escrito por Kathy e Bert, d s suas pginas impressas uma aparncia GUI como voc jamais viu. De um jeito diferente e descolado, os autores transformam a aprendizagem em Java em uma empolgante experincia, do tipo 'qual ser a prxima surpresa?'" .- Warren Keuffel, Revista Software Development.

Parabns pelo formato Use a Cabea!" rpido, irreverente, divertido e envolvente. Cuidado - voc pode realmente aprender alguma coisa!"Ken Arnold, ex-Engenheiro Snior da Sun Microsystems e co-autor (com James Gosling, criador do Java) do livro "The J ava Programming Language"

"Eu passei no exame SCBCD com 94% de aproveitamento. Realmente, o 'P! EJB' demais! Eu li o livro todo em 10 dias ..." Basavaraj Devershetty

(

" ... a nica maneira de saber o valor de um tutorial saber se ele realmente ensinar bem. Use a Cabea! Java excelente para ensinar. Tudo bem, eu pensei que ele fosse bobinho ... mas, me dei conta de que estava aprendendo os tpicos totalmente, medida que avanava pelo livro." "O estilo do Use a Cabea! Java tomou meu aprendizado, digamos, mais fcil." - slashdot (anlise do site honestpuck) "Eu jamais poderia imaginar que algum pudesse rir enquanto lesse um livro de TI! Usando o material do Use a Cabea! EJB eu consegui uma tima pontuao (91 %) e estabeleci um recorde mundial como o mais jovem SCBCD, com 14 anos de idade." - Afsah Shafquat (o mais novo SCBCD do mundo) "Esse livro to bacana que me deu vontade de CHORAR! Estou chocado." - Floyd Jones, Escritor Tcnico Snior/Garoto da piscina, BEA "Se voc quer aprender Java, no procure mais: bem-vindo ao primeiro livro tcnico com caractersticas GUI! Com seu formato revolucionrio e elaborado com perfeio, o livro oferece vantagens que outros ttulos sobre Java simplesmente no conseguem ... Prepare-se para um passeio realmente extraordinrio pelo universo Java." - Neil R. Bauman, Diretor Executivo e capito da Geek Cruises (www.GeekCruises.com) "Se existe algum no mundo familiarizado com o conceito do 'Use a Cabea!', este sou eu. Este livro to bom que eu me casaria com ele na TV!" - Rick Rockwell, comediante. O noivo original do programa "Quem Quer Se Casar com um Milionrio?" ("Who Wants to Marry a Millionaire"), da FOX Television "O Use a Cabea! Java como o Monty Python meets the gang offourl ... o texto est to bem dividido entre quebra-cabeas e histrias, questionrios e exemplos, que voc obtm uma abrangncia quehenhum livro de informtica conseguiu at agora." - Douglas Rowe, Comunidade de Usurios de Java, Columbia. "'Use a Cabea! Java' ... d um novo significado frase de marketing da O'Reilly: 'Existe um O'Reilly para isso'z. Eu o escolhi, pois muitas outras pessoas que eu admiro o classificaram como 'revolucionrio' e eu descrevi uma tcnica totalmente diferente para este livro. Eles estavam (esto) certos ... Sem fugir do tpico formato da O'Reilly, eles conseguiram um formato cientfico, mas bem aceito. O resultado divertido, irreverente, atui, interativo e brilhante ... A sensao de ler este livro a de estar sentado bem prximo aos alto-falantes em uma sala de reunio, aprendendo - e rindo - com os colegas ... Se voc quer ENTENDER Java, compre logo o seu." - Andrew Pollack, www.thenorth.com

Sociedade de Ensino Superbr da

Paat1ira

"Lembra quando voc estava no jardim de infncia? No? Bem, e quando voc aprendeu pela primeira vez o alfabeto? dificillembrar? Bem, no faz mal. Lendo o Use a Cabea! lava, voc vai voltar a se divertir enquanto aprende ... Para aqueles que se interessam por aprender novas linguagens de programao e no vieram da rea de cincia da computao ou da programao, este livro uma preciosidade ... Ele torna divertido o aprendizado de uma linguagem dificil de computao. Espero que existam mais autores interessados em quebrar o velho e corriqueiro modelo 'tradicional' do estilo de escrever. Aprender linguagens de computao deveria ser prazeroso e no oneroso." - Judith Taylor, Comunidade de Usurios da Maeromedia, Southeast Ohio. "H poucos dias, recebi minha cpia do Use a Cabea! lava, de Kathy Sierra e Bert Bates. Eu ainda estou no comeo do livro, mas o que me encantou foi que, mesmo estando com sono naquela primeira noite, me peguei pensando: 'tudo bem, s mais uma pgina e vou dormir.'" - JoeLitton "FINALMENTE, um livro de lava escrito tal qual eu escreveria se tivesse sido eu. Falando srio, este livro simplesmente arrasa qualquer outro livro de software que euj li... muito dificil escrever um bom livro ... preciso muito tempo para explicar os assuntos, em uma seqncia natural e cujo foco o leitor. muito trabalho. Muitos autores, notoriamente, no esto prontos para o desafio. Parabns equipe do Use a Cabea! EJB por este trabalho primoroso! P.S. Quando vai sair o projeto Use a Cabea! l2EE? E o Use a Cabea! Desenvolvedor de Componentes para a Web? E como eu fao para que meu videocassete grave umjogo de futebol enquanto estou trabalhando?" - Wally Flint "Se voc relativamente um iniciante em programao e est interessado em lava, eis o seu livro ... Abordando tudo - desde objetos para a criao de interfaces grficas de usurio (GUl),tratamento de excees (erros), redes (sockets) e multitarefas, at como agrupar suas pilhas de classes em um nico arquivo de instalao -, este livro completssimo ... Se voc gostar do estilo, estou certo de que ir adorar o livro assim como eu. Espero que a srie Use a Cabea! possa ser estendida a vrios outros assuntos!" - LinuxQuestions.org "Quando eu li o 'Use a Cabea! lava', do mesmo autor, eu pensei que impossvel escrever outro livro (aquele sobre EJB tambm) de uma forma to brilhante. Porm, agora eles nos surpreenderam com este livro ainda mais legal. Os livros da srie Use a Cabeca! tornaram-se algo necessrio (QUASE UMA EXIGNCIA) em todos os assuntos. Eu queri~ ser uma criana para poder aprender tudo da maneira como ensina este livro." - Anshu Mishra Eu trabalhei com EJB h cerca de 4 anos e o achei uma baguna s avessas. Depois de ler as especificaes 2.1 e 2.0, eu descobri que apenas uma t*** 3 fumegante que ficou maior. Seu livro respondeu maioria das incontveis perguntas que martelavam meu crebro de amendoim e permitiume passar na prova com uma pontuao de 92% ... Vencendo facilmente aquele colega de 14 anos de idade por 1 ponto. :-) Muito obrigado. - Jim Steiner "Eu me VICIEI nos contos do livro, nos cdigos com anotaes, nas entrevistas preparatrias e nos exerccios para o crebro." - Miehael Yuan, autor, Enterprise J2ME

se a Cabeca Servlets...:>

& JSPTMSegunda Edio

No seria fantstico se existisse um livro sobre Servlets que fosse mais interessante do que apagar spam da sua caixa de mensagens? Talvez isso seja uma iluso ...

Bryan Basham Kathy Sierra Bert Bates

Rio de Janeiro.2008

Use a Cabea Servlets & JSpTM Alta Books Editora - Starlin Alta Con Com Ltda 2008 Do original Head First Servlets and JSPTM. , Authorized translation of the English edition of Head First Servlets and JSPTM 2st Edition 2008 O'Reil/y Media,lnc. ISBN: 978-0596102340 This translation is published and sold by permission ofO'Reil/y Media, Inc., the owner of ali rights to publish and sell the some. Todos os direitos reservados e protegidos pela Lei 5988 de 14/12/73. Nenhuma parte deste livro, sem autorizao prvia por escrito da editora, poder ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrnico, mecnico, fotogrfico, gravao ou quaisquer outros. Todo o esforo foi feito para fornecer a mais completa e adequada informao, contudo a editora e o(s) autor(es) no assumem responsabilidade pelos resultados e usos da informao fornecida. Recomendamos aos leitores testar a informao, bem como tomar todos os cuidados necessrios (como o backup), antes da efetiva utilizao. Este livro no contm CD-ROM, disquete ou qualquer outra midia. Erratas e atualizaes: Sempre nos esforamos para entregar a voc, leitor, um livro livre de erros tcnicos ou de contedo; porm, nem sempre isso conseguido, seja por motivo de alterao de software, interpretao ou mesmo quando alguns deslizes constam na verso original de alguns livros que traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br. a seo Erratas, onde relataremos, com a devida correo, qualquer erro encontrado em nossos livros. Avisos e Renncia de Direitos: Este livro vendido como est, sem garantia de qualquer tipo, seja expressa ou implcita. Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercial so de responsabilidade de seus proprietrios. A Editora informa no estar associada a nenhum produto e/ ou fornecedor apresentado no livro. No decorrer da obra, imagens, nomes de produtos e fabricantes podem ter sido utilizados, e desde j a Editora informa que o uso apenas ilustrativo e/ou educativo, no visando ao lucro, favorecimento ou desmerecimento do produto/fabricante. Produo Editorial: Editora Alta Books Coordenao Editorial: Roberto Baptista Barroco Traduo: Eveline Vieira Machado Reviso: Fernanda Rigamond Reviso Tcnica: Helder Borges Diagramao: Impresso no Brasil Equipe Alta Books

o cdigo de propriedade intelectual de 10 de Julho de 1992 proibe expressamente o uso coletivo sem autorizao dos detentores do direito autoral da obra, bem como a cpia ilegal do original. Esta prtica generalizada nos estabelecimentos de ensino, provoca uma brutal baixa nas vendas dos livros a ponto de impossibilitar os autores de criarem novas obras.

Editora Alta Books Rua Viva Claudio, 291 - Jacar Rio de Janeiro - RJ CEP 20551-010 Tel: 21 3278-8069 Fax: 21 3277-1253 www.altabooks.com.br [email protected]

Esse livro dedicado a todos aqueles que decidiram que EL implicit object

os autores

Os "procurados" da srie Use a Cabea! (e deste livro)Beart Bates Bryan Basham

Bert um antigo desenvolvedor e arquiteto de software, mas um perodo de 10 anos em inteligncia artificial o fez se interessar por teoria da aprendizagem e treinamento via computador. Ele passou a primeira dcada de sua carreira como desenvolvedor viajando pelo mundo e ajudando clientes como a rdio Nova Zelndia, o The Weather Channel e a rede de entretenimentos Arts and Entertainment Network (A&E) em suas transmisses. Atualmente, ele membro da equipe da Sun responsvel pelo desenvolvimento de diversos exames de certificao em Java, incluindo o recente SCWCD. Bert um antigo e incorrigvel aficionado pelo GOl e vem trabalhando h bastante tempo em um programa. O Java h de se tomar uma linguagem expressiva o suficiente para que ele finalize seu projeto. Ele um bom guitarrista e, atualmente, est experimentando o banjo. Sua mais recente aventura foi a compra de um cavalo islands, o que dever trazer novos desafios aos seus conhecimentos na rea de treinamento ...VIII

Kathy gosta de teoria da aprendizagem e assuntos relacionados mente desde a poca em que era designer de jogos (ela escreveu jogos para a Virgin, MGM e Amblin') e desenvolvedora em I.A2 Grande parte do formato da srie Use a Cabea! foi desenvolvido enquanto lecionava Interatividade Usando Novas Midias, no programa de extenso de Estudos em Entretenimento da Universidade da Califmia (DCLA). Recentemente, se tomou instrutora-chefe da Sun Microsystems e ensina os instrutores de Java a divulgarem as mais novas tecnologias desta linguagem. Alm disso, desenvolve diversos exames para certificaes Sun, incluindo o SCWCD. Junto com Bert Bates, ela tem aplicado extensivamente os conceitos da srie Use a Cabea! no ensino de milhares de desenvolvedores. Ela fundou uma das maiores comunidades em Java no mundo virtual, a javaranch. com, premiada em 2003 e 2004 com o Prmio Produtividade em Desenvolvimento de Software. Ela adora correr, esquiar, montar a cavalo, andar de skate e cincias esotricas.

Bryan tem mais de vinte anos de experincia em desenvolvimento de software, incluindo um perodo com software de automao avanada usando tcnicas de I.A na NASA Ele tambm atuou em uma consultoria, desenvolvendo aplicaes comerciais em 00 personalizadas. Atualmente, Bryan Desenvolvedor de Cursos da Sun, com nfase nos princpios de design em Java e em 00. Ele j trabalhou em diversos cursos de Java da Sun, incluindo JDBC, J2EE, Servlets e JSP, alm de Desenvolvimento de Software utilizando 00. Ele foi tambm o primeiro designer dos exames SCWCD, nas verses original e atual. Bryan pratica o Zen Budismo, joga Ultimate Frisbee, adora som e pratica o ski telemark.

contedo

(Sumt19)Introduo Por que usar Servlets & JSPs: uma introduo Arquitetura da aplicao web: viso geral de alto nvel Minitutorial do MVC: praticando com o MVC Sendo um servlet: request e resposta Sendo uma aplicao web: atributos e listeners Estado de conversao: sincronizando o bean/entidade Sendo um JSP: escrevendo cdigos em JSP Pginas sem scripts: escrevendo JSPs sem scripts As tags customizadas so poderosas: usando a JSTL Quando nem a JSTL o bastante: desenvolvendo tags customizadas Distribuindo sua aplicao web: distribuio da aplicao web O poder dos filtros: wrappers efiltros Padres de Design Enterprise: padres e Struts Apndice A: TestePreparatrio Final ndiceXIX

1

37 67 93 147 223 281 343 439 499 601 701 737 791865

Mantenha em segredo, mantenha seguro: segurana da aplicao web 649

IntroduoSeu crebro pensando em Servlets. Aqui est voc tentando aprender algo, enquanto seu crebro lhe presta o favor de certificar-se de que tal aprendizado no ser interrompido. Ele pensa, " melhor reservar espao para coisas mais importantes, como qual animal selvagem evitar e se esquiar sem roupa ruim mesmo". Ento, como voc vai induzi-lo a pensar que sua vida depende do conhecimento em Servlets? A quem se destina este livro? Ns sabemos o que seu crebro est pensando Metacognio Domine seu crebrp O que voc precisa para este livro Passando no exame de certificao Os revisores tcnicos AgradecimentosXXXXI XXlll

xxvXXVI XXVlll XXX XXXI

IX

1

Por que usar servlets & JSPs?

As aplicaes web esto na moda. Quantas aplicaes GUI voc conhece que so usadas por milhes de usurios em todo o mundo? Como desenvolvedor de aplicaes web, voc no precisar se prender aos problemas de distribuio presentes em toda aplicao standalone e ir distribuir sua aplicao a qualquer pessoa que possua um browser. Mas voc precisar dos servlets e dos JSPs, pois as velhas e estticas pginas HTML so to, digamos, "1999". Saiba como mudar do sUe na web, para a aplicao na web. Objetivos do Exame O que os servidores web e os clientes fazem e como conversam entre si Guia rpido de HTML 2 4 7 10

Principais elementos do fluxo de solicitao: O mtodo HTTP (a ao de se~ executada) A~

_si"",

irnediatamente INF/classes.

Otimizando o servlet de controle para chamar o JSP

Sendo um servlet

4NO Idempotente

Servlets vivem para servir clientes. A funo de um servlet receber uma solicitao do cliente e devolver uma resposta. A solicitao talvez seja simples: "traga-me a pgina de Boas-vindas". Ou pode ser complexa: "Finalize o processo do meu carrinho de compras."A solicitao carrega dados cruciais e o cdigo do seu servlet tem que saber como encontr-Ios e utiliz-Ios. E ele tem que saber como enviar uma resposta. Ou no ... Objetivos do Exame Os Servlets so controlados pelo Container Cada solicitao roda em uma thread separada! A verdadeira funo do servlet no tratamento das solicitaes A histria da solicitao no-idempotente O que determina se voc recebeu uma solicitao GET ou POST?oservlet

94 95 101 105 112 117 119 126

usa os

Enviando e usando parmetro( s)dados

do POST para atualizar

Ento, essa foi a Solicitao ... vejamos agora a Resposta

~

~

lIJoo. {(as fi.:N.js. .j"nll1\ (I:!-""jV;,,!DS

>

5i!"'!~5 5tte

'u fI,+"tJ,,,,+a

/"* exhl'~c.

MatrL,,{Ievoiutions

!:so,!h"''''f,,''~iro s,'''''J,n---'7'j

KillBilI BoondockSaints melie ReturnoflheKing MeanGirls

xv

Quando nem a JSTL o bastante ...

10

Em alguns casos, a JSTL e as aes-padro no so suficientes. Quando voc precisa de algo customizado, e no quer voltar aos velhos scripts, voc pode escrever os seus prprios tag handlers. Dessa maneira, os seus desenvolvedores de pginas podero usar a sua tag nas suas pginas, enquanto todo o trabalho duro feito nos bastidores, na sua classe tag handler. Mas h trs maneiras diferentes de se criar os seus prprios tag handlers, ento, h muito o que aprender. Dessas trs, duas foram introduzidas com o JSP 2.0 para tomar a sua vida mais fcil (Simple Tags e Tag Files). Objetivos do Exame Tag Files: iguais ao include, s que melhores Onde o Container procura por Tag Files Tag handlers simples Uma tag Simples com um corpo E se o corpo da tag usar uma expresso? Voc ainda precisa saber sobre os tag handlers Clssicos Um tag handler Clssico bem pequeno O ciclo de vida Clssico depende dos valores retomados A interationTag lhe permite repetir o corpo Valores-padro retomados pela TagSupport A interface DynamicAttribute Com BodyTag, voc tem dois novos mtodos E se voc tiver tags que funcionam conjuntamente? Usando a API PageContext para tag handlers 500 502 509 513 514 519 529 531 536 537 539 556 563 567 577

Distribuindo sua aplicao web

11Refernciaaumbeanlocal

Finalmente, sua aplicao est pronta para o horrio nobre. As suas pginas esto finalizadas, seu cdigo est testado e ajustado, e o prazo de entrega era h duas semanas atrs. Mas, para onde vai isso tudo? Tantos diretrios, tantas regras. Que nome voc d aos seus diretrios? Qual nome o cliente pensa que eles tm? O que que o cliente realmente solicita, e como o Container sabe onde procurar? Objetivos do Exame Principal tarefa da distribuio: onde entra o qu? Arquivos WAR ~ Como o mapeamento de servlets REALMENTE funciona =~?::::::~;~:::. Configurando arquivos de boas-vindas no DD Configurando pginas de erro no DD ~ __ ~ Configurando a inicializao de servlets no DD um JSP compatvel com XML: um Documento JSP ~" 602 603 612 616 622 626 628629

-Criando

XVI

contedo

Mantenha em segredo, mantenha seguro

12'IillJmpaucomais deprtirocomXML

Sua aplicao web est emperigo. O perigo espreita em cada canto da rede. Voc no quer os Caras Maus xeretando nas transaes da sua loja virtual, roubando nmeros de cartes de crdito. Tambm no quer os Caras Maus convencendo o seu servidor de que eles na verdade so os Clientes Especiais Que Recebem Grandes Descontos. E voc no quer ningum (amigo OU inimigo) olhando dados confidenciais dos empregados. Ser que o Jim, do departamento de marketing, precisa mesmo saber que a Lisa, do departamento de engenharia, ganha trs vezes mais do que ele?Sua

As Dez Melhores Razes para realizar a segurana declaratwamente11rJfazmal

a 11ingum.

Objetivos do Exame O Top 4 em segurana de servlets Como Autenticar no Mundo HTTP

650 653 656

O :~:U~::te,

e e

as.~eclaraes casamnaturalmente deparrame;oSd~~ ':mp~O) j existentesno

Fica multo bem no seu curriculo.

o ~~:: ~;~~asmais ::j~~:maG Est no exame. O legal, simplesmente.

flexveis,

As Dez Melhores Razespara realizara sua seguranadeclarativamente 659 Quem implementa a segurana em uma aplicao web? Autorizao: funes e restries Autenticao: quatro sabores OS QUATRO tipos de autenticao Protegendo a segurana dos dados em trnsito: HTTPS em ao Como implementar confidencialidade a caso e declarativamente 660 662 677 677 682 e integridade de dados caso 684

Permite aos dcsenvoh-edores de aplicaes IeUtJlizarem senlets, mesmo sem acesso ao cdigo-fonte.

o poder dos filtros

13

Os filtros lhe permitem interceptar a solicitao. E se puder interceptar a solicitao, voc poder tambm controlar a resposta. E, melhor de tudo, o servlet nem percebe o que aconteceu. Ele nunca ficar sabendo que algum intercedeu entre a solicitao do cliente e a invocao do mtodo serviceO do servlet pelo Container. O que isso significa para voc? Mais frias. Porque o tempo que voc levaria reescrevendo apenas um dos seus servlets pode ser despendido, em vez disso, escrevendo e configurando um filtro com a capacidade de afetar todos os seus setvlets. Adicionar tracking das solicitaes do usurio a todos os servlets da sua aplicao? Sem problema. Manipular o output de cada servlet da sua aplicao? Sem problema. E voc no precisa nem sequer tocar no cdigo do servlet. Objetivos do Exame Construindo um filtro para o monitoramento das solicitaes O ciclo de vida de um filtro 702 707 708 710 713 719 722 724

.... --_181'" a pilha a pilha

Declarando e ordenando filtros Comprimindo o output com um filtro no lado da resposta

9

a pilha

o Conta;tle

define os limites do corpo do documento pular linha centraliza o contedo define um formulrio

)

(1'c/IliCQ.llle/ll+ej

Skyler's

If!ifl14S lJl1de 3vel'flrl.s'. fJ.

f'lf!lmc" ti" sel'lIlt1t'J1' t

\

Ca""I"'IIfJ.NJ.

+6tas 4S apl'c4';es

/

sel'vtiJ{~/"I1t1.SV';fJ di,;'e.f-(J f>tU'Q.(J4f1i'clJ.g';fJ

dle'1ff) eXfA..f-a.htt'1ff

C"ht(J

alie f"ddo. 1MS,!f"IIi"JtJf"

elas f6f"alit\ c"/(JctAdas '1() sel''r/liA.rJf''.

servidor

Mas e se eu quiser, digamos, que a hora atual aparea na minha pgina? E se eu quiser uma pgina com contedo dinmico? Eu no poderia ter algo como uma varivel dentro do meu HTML?

f. se

3l1lSel'htS

f!'1cD.i'xo.f"

o.'5l1hta CiHSo. V4f"1fJ.llel

,

da f>~I"l1a The current time i8

[insertTimeOnServer].

[

HrKA.L?

c- MMM'M,C~GqJ8lligr~'cOlli\pGGr~qA,CG\ D- MMM'M,C~GqJ8lligr~'cOlli\pGGr~qA,CG\8GJGC~\8GJGC~BGGr'p~llirl B- MMMM'C~GqJ8lligr~cOlli\8~"uVqA'CG\

J

24

introduo

e arquitetura

Mas algutHas vezes voc precisa de tHais do que s o servidor

Mas como isso vai ajudar? Meus clientes so todos clientes web. O browser s conhece o servidor ... ou seja, ele no vai ser capaz de chamar aquela outra aplicao.

o

servidor

outra aplicao do servidor

Isto no problema. Eu cuidarei de entregar a solicitao aplicao helper correta. A, eu pego a resposta da aplicao e entrego de volta ao cliente. Na realidade, o cliente nunca precisa saber que outra pessoa participou do trabalho.

outra aplicao do servidor

voc est

25

quando um servidor no

o bastante

Vuas coisas que o servidor no faz sozinhoSe voc precisa de pginas instantneas (pginas criadas dinamicamente e que no existiam antes da solicitao) e da capacidade para escrever/salvar dados no servidor (que significa escrever em um arquivo ou banco de dados), voc no pode contar apenas com o servidor.

As Ph1nclSInstantnelB n9 eXIstem antes del'

ser te'lta a s91'lc'lta-9.E C9m9 tqz.er uma pblna B11\t[., de tepente. A s91'lc'ltay9cbet;a. q apllca-9 beIpet ~~escteve" 9 BINIL, e 9 setVld9t tet9tna a9 clIente.

1 Contedo dinmicoA aplicao que roda no servidor disponibiliza somente pginas estticas, porm uma outra aplicao "assistente", com a qual o servidor pode se comunicar, pode construir pginas dinmicas instantaneamente. Uma pgina dinmica poderia ser qualquer coisa, desde um catlogo at um weblog, ou at mesmo uma pgina que escolha imagens aleatoriamente para exibi-Ias.

Quando em vez disto: The curent time is

Voc quer isto: The curent time is

always 4:20 PM on the server

[insertTimeOnServer] on the server always on the 4:20 PM server

2 Salvando os dados no servidorQuando o usurio envia os dados em um formulrio, o servidor analisa os dados e pensa: "E a? Eu devo me preocupar?". Para processar esses dados, salv-Ios em um arquivo ou banco de dados, ou at mesmo para us-Ios na criao da pgina de resposta, voc precisa de outra aplicao. Quando o servidor recebe uma solicitao para uma aplicao helper, ele considera que aqueles parmetros so destinados ao assistente. Assim, o servidor passa os parmetros, fornecendo aplicao uma forma de gerar uma resposta ao cliente.

26 captulo 1

introduo

e arquitetura

o ferntoque roda

t1o-Java para uttta aplicao helpertiO

servidor o "C&I~~

A maioria dos programas CGI escrita como scripts em Perl, mas vrias outras linguagens podem servir, incluindo o C, o Python e o PHP. (CGI significa Common Gateway Interface - Interface de Passagem Comum -, e no nos importamos por que ele chamado assim.) Usando o CGI, veja abaixo como funciona uma pgina dinmica que possui a data atual do servidor.

o

servidor

~-,Cliente

aplicao do servidor

o usurio dica em um link que tem uma URL, que chama um CGI em vez de uma pgina esttica.

..Cliente

servidor A aplicao do servidor "v" que a solicitao para o programa assistente, ento o servidor abre e roda o programa. A aplicao do servidor envia junto os parmetros do GET ou POST.

)

aplicao do servidor

parmetros aplicao helper

servidor A aplicao helper constri a nova pgina (que tem a data atual inserido) e devolve o HTML ao servidor. Para o servidor, o HTML da aplicao helper uma pgina esttica.

~)

Cliente

aplicao helper

servidor

aplicao do servidor

[J

A aplicao helper fechada e o cliente recebe de volta uma pgina HTML contendo a data atual, agora esttica, como parte

voc est aqui ~

27

dois lados, CGI

e Ser,;iets

Os Servlets

e o

CG-I

aruaIM COlMOuIMa aplicao

helper no servidor Preste ateno na conversa dos nossos dois faixaspretas sobre os prs e os contras do CGI e dos Servlets.

CGI

Servlets

o CGI melhor

que os Servlets. Ns criamos os scripts CGI em Perl na nossa empresa, pois todo mundo sabe PerI.

Com todo o respeito, mestre, existem muitas vantagens em se usar o Java, em vez do Perl, para essas coisas que voc quer fazer com o CGI.

Eu acho que legal usar Java, se voc souber. Mas certamente, no valer a pena para ns mudar para Java. No h nenhuma vantagem.

Desempenho, por exemplo. Com o Perl, o servidor tem que rodar um processo superpesado para todas as solicitaes que sejam para este recurso!

Voc est me desafiando? Em quais assuntos? Ah, sim, mas os Servlets ficam carregados e as solicitaes dos clientes para um recurso do Servlet so tratadas como threads de um nico Servlet em execuo. No existe overhead ao carregar a NM, as classes e tudo mais ...

Isto no diferente do Java ... O que voc chama de JVM? Cada ocorrncia da JVM no um processo superpesado?

Eu vejo que voc esqueceu muita coisa. Atualmente, os servidores web so capazes de manter um nico programa Perl rodando entre as solicitaes dos clientes. Por isso, seu argumento de que ele mais pesado no vale de nada.

Eu no esqueci, mestre. Mas no so todos os servidores que podem fazer isso. Voc est se referindo a um caso isolado que no se aplica a todos os programas CGI em PerI. Porm, os Servlets sero sempre mais eficientes quando isso ocorrer. E no vamos esquecer que um Servlet pode ser um cliente J2EE e um programa CGI em Perl no.

Do que voc est falando? Qualquer coisa compatvel com o CORBA pode ser um cliente J2EE.

Chega, estou atrasado para minha aula de Pilates. Mas no pense que acabou. Vamos terminar isso mais tarde.

Eu no quero dizer um cliente para um J2EE, e sim um cliente que um J2EE. Servlet rodando em um container J2EE participar da segurana e das transaes enterprise beans e existem ...

programa Um pode com

continua ...

Eu duvido que todos saibam PerI. Eu gosto do Perl, mas todos somos programadores Java aqui na empresa; ento, preferimos Java.

28 captulo 1

introduo

e arquitetura

o I/Sil~l'. J.iji.f(J,

Solicitao RespostaComplete as caixas escrevendo o que acontece durante cada passo no processo. Esta uma cpia da pgina 18. Ou seja, ao terminar, volte l para comparar suas respostas.

t/W\(J,

u~l-.

~

11\HTTP/UGET /test1lBeer1.htm . WicKed\ysmart.com Host. www '1\ /5 o (Macintosh ... user-Agent: Mozl a .

Beer

Login Page

Seleet a beer type ar buy beer making supplies? Select a beer
Buy supplies

Sd\~i ervl or1HTIP/1.1 2000KSet-Cookie: ...

Beer

Login Page ...

SeIeet

a beer type or buy beer

A- c!ie#i-fe fJ.5t/tJ.1'(fi.a#iSl(jSfA~e#i-fe ~tlf st/a .ff'fI.#isa{i(J

Beer Login PageSelect a beer type or buy beer making .supplies? O Selccr a beer C Buy $upples

S~(J, f'f4'l-;l'J.tifl. c.o~ St/Cf!S SlJ.

voc est

29

uma rpida olhada nos servlets

Servlets Desmistificados (criar, distribuir, executar)Pois , os novatos em servlets j podem parar de prender a respirao; aqui est um guia rpido para criar, distribuir e executar um servlet. Este guia pode gerar mais perguntas que respostas no se assuste! Voc no precisajaz-Io neste exato momento.

apenas uma rpida demonstrao para tutorial mais no conseguem / esperar. O prximo captulo inclui um aqueles que detalhado/ Construa esta rvore de diretrios (em qualquer lugar, exeeto sob o tomcat).

O

Ch1Servletjava

weh.xml

8

Crie um servlet chamado ChlServlet.java e o coloque no diretrio sre (para simplificar este exemplo, no colocaremos o servlet em um pacote; mas aps este, todos os outros exemplos com servlet neste livro estaro em pacotes).javax.servlet.*; javax.servlet.http.*; java.io.*;

import import import

public public

void

doGet(HttpServletRequest HttpServletResponse

request, response) { ~

class

ChlServlet throwsextends HttpServlet IOException { out ~ response.getWriter(); " + +

PrintWriter

ou t .pr in tln (" ""

rrrJl4.Le"",

IPJSf;l"it/.t);1"1J!t) J

"HF\' s Chapterl Servlet" + "
" + today + "" + ""); java.util.Date today ~ new java.util.Date();

\'l"+IV

"46 ti! w,es""'(J?

Java. '" J ";. !

vw, PI"t)51"fJ.""'(J.

8

c.4/' l-a'J.f-e S:

.

- (J1t\IJ. clfJ.S se J4VIJ..11"",

flSfJ.

VIM pf.'1pe.l1tJ 1Mf./~

CIJIM

"fIM l1

37

objetivos do exame oficial da Sun

IS!!hS.i ....- - -

06jetivgs

A Arquitetura das Aplicaes de Alto Nvel

Notas sobre a Abrangncia: 1.1 Para cada Mtodo HTTP(como GET, POST,HEAD e assim por diante), descrever o seu propsito e as caractersticas tcnicas do protocolo do Mtodo HTTP, listar os triggers que podem levar o cliente (geralmente um browser) a usar o Mtodo e identificar o mtodo HttpServlet que corresponde ao Mtodo HTTP. Todos os objetivos nesta seo sero abordados completamente em outros captulos. Portanto, considere este captulo como uma base para o que vir depois. Em outras palavras, no se preocupe em terminar este captulo sabendo (e recordando) assuntos especificos destes objetivos. No existir nenhuma pergunta sobre estes assuntos nos testes prticos, at que voc chegue ao captulo especifico em que eles sero abordados. Aproveite este material legal, simples e que servir de base enquanto voc pode! PORM .. voc precisa conhecer estes assuntos para prosseguir. Se voc j tem alguma experincia com servlet, poder simplesmente pular as pginas, olhar as figuras, jazer os exerccios e avanar para o captulo 3.

1.4 Descrever o propsito e a seqncia de eventosdo ciclo de vida do servlet: (l) carregar a classe do servlet, (2) instanciar o servlet, (3) chamar o mtodo init, (4) chamar o mtodo service, e (5) chamar o mtodo destroy.

2.1 Construir a estrutura de arquivo e diretriosde uma aplicao que contenha (a) contedo esttico, (b) pginas JSP, (c) classes do servlet, (d) o deployment descriptor, (e) bibliotecas de tags, (f) arquivos JAR, e (g) arquivos de classe Java; e descrever como proteger os arquivos de recurso do acesso HTTP.

2.2 Descrever o propsito e a semnticapara cada um dos seguintes elementos do deployment descriptor: instncia do servlet, nome do servlet, classe do servlet, parmetros de inicializao do servlet e a URL que aponta para o respectivo servlet.

38 capitulo2

arquitetura de alto nv~1

o

que

um Container?

Os servlets no possuem um mtodo mainO. Eles esto sob o controle de outra aplicao Java chamada Container. um exemplo de Container. Quando sua aplicao web (como o Apache) recebe uma solicitao para um servlet (ao contrrio de, digamos, uma antiga e esttica pgina HTML), o servidor entrega a solicitao no ao servlet em si, mas para o Container no qual o servlet distribudo. o Container que entrega ao servlet a request e a response HTTP, e chama os mtodos do servlet (como o doPostO ou o doGetO).

o Tomcat

servidor

Yaplicao do Containerweb

cdigo Java

servidor

voc est aqui

11>

39

ti vida sem servlets

se voc tivesse o Java e no tivesse nel\t servlets, net\1 Oontaineres?E

E se voc tivesse que escrever um programa em Java para tratar as solicitaes dinmicas que chegam na aplicao do servidor (como o Apache), mas sem um Containet como o Torncat? Em outras palavras, imagine que no exista nada como os servlets e tudo que voc tem so as bibliotecas principais do J2SE? ( claro que voc pode admitir que tem a possibilidade de configurar a aplicao do servidor para que ela possa chamar a sua aplicao Java). Tudo bem, voc ainda no sabe bem o que o Container faz. Apenas imagine que voc precise de um suporte ao lado do servidor para uma aplicao e tudo o que voc tem um Java antigo e comum.

O

D

Liste algumas das funes que voc teria que implementar numa aplicao J2SE Se no existisse o Container:

"'U!J9UI~m ~p Olu~UIu~:)ml~ll'iud~ "'dSf ~llodns 'sllol OUIO:) US~O;) S lUlllY IUl~nb 'u6U1un1l~slUlu~m~ldm~ 'spu~.nn ~p lOPU~;)U~l~ll lU!J;) :s~~AJssodSUlsods~lI mn

40 capitulo 2

arq'ut,'Jtwra de alto nvel

o que o Cotttait1er oferece?Ns sabemos que o Container que gerencia e roda o servlet, mas por qu? Vale a pena o overhead extra?

..

Gta'i.cts a9 C9nt:Unet, VOC p9de se C9noonttlt " mais na 1.1" 9hICa d9 seu pt9ptl9 neh9c19, em ve;z de se pte9cupat em esctey'et c9dIh9s pata thteads, sehuttn,?a e tede. VOC tem 'Lue.- tnallz.u' c t9da a sua enetgIa na Ctla,?9 de uma 19ja y'Iltual tabu19sa pata emballhens de p15tlc9-b91ha e deIxat 9S sety'I,?9S de SUP91te, C9m9 a sehuttn,?a e 9 Pt900SSament9 JSf, plta 9 " C9ntUnet.

o container

oferece uma maneira simples para seus servlets se comunicarem com seu servidor. Voc no

precisa construir um ServerSocket, escutar uma porta, criar trfego, etc. O Container conhece o protocolo entre o servidor e ele mesmo, para que seu servlet no tenha que se preocupar com uma API entre, digamos, o servidor Apache e o cdigo da sua prpria aplicao. Tudo o que voc tem que se preocupar com a lgica do seu prprio negcio, que est contida em seu Servlet (como aceitar um pedido na sua loja virtual).

. ..

. .-

O Container controla a vida e a morte dos seus servlets. Ele cuida de carregar as classes, instanciar e inicializar os servlets, chamar os mtodos do servlet e tornar as instncias do servlet aptas a coletar o lixo. Com o Container no controle, voc no precisa se preocupar tanto com o gerenciamento dos recursos. O Container cria automaticamente uma nova thread em Java para cada request do servlet recebida. Quando o servlet conclui a execuo do mtodo de servio HTTP para a solicitao daquele cliente, a thread termina (isto , morre). Isto no significa que voc est liberado da segurana do thread voc ainda pode ter problemas de sincronizao. Porm, contar com o servidor para criar e gerenciar as threads para as vrias solicitaes ainda nos poupa de muito trabalho. Com um Container, Certeza de segurana voc pode usar um deployment descriptor XML para configurar (e modificar) a segurana, sem ter que escrever direto no cdigo da classe do seu servlet (ou qualquer outro). Pense nisso! Voc pode gerenciar e alterar sua segurana sem tocar, ou recompilar, seus arquivos-fonte em Java.

Agora, tudo o que eu tenho que me preocupar como vender me suado plstico-bolha, em vez de escrever todos aqueles cdigos para as coisas que o Container far para mim ...

oO

Suporte ao .,ISP Voc j sabe como os JSPs so legais. Bem, quem voc pensa que se encarrega de traduzir aquele cdigo JSP em Java de verdade? claro. O Container.

est

41

o ContainerCo~o o Comaitter trata u~a solieita~oVamos economizar alguns dos cartuchos para mais tarde, mas aqui est um breve esquema:

ocontainer

dica em um link que contm uma URL para um servlet, em vez de uma pgina esttica.

o usurio

-,Cliente

container "v" que a request para um servlet e ento ele cria dois objetos:

o

response

1) HttpServletResponse 2) HttpServletRequest

-.Cliente

encontra o servlet correto baseado na URL da request, cria ou aloca uma thread para essa request, e passa os objetos request e response para a thread do servlet.

o container

42 captulo 2

arquitetura de alto nvel

, I

Ij

~

i

C1Jcontaine~~er~let__

e IIsad"IIIJ\ efew,fl'1+1Jli! 1Iw,

,

dtll$ sel'vle-f.s. "I''''"S''

p.n"r '\

( ~...> name l

ServletResponse response,

HttpServletRequest

request,

PrintWriter

out

request.getWriter() ;

Ch3

Beer

com.example.web.BeerSelect Ch3

Beer

/SelectBeer.do

64

2

arquitetura de a/to nvel

Cot\10

o J!EE cabe "isso tudo

O Java 2 Enterprise Edition meio um "superspec" - ele incorpora outras especificaes, incluindo a especificao Container.2.4 e a especificao JSPJ2EE Isto para o Web Servlets Porm, a especificao 2.0. 1.4 tambm inclui a especificao Enterprise JavaBean 2.1 para o Container EJB. Em outras palavras, o Container web para EJB para componentes de negcios.e o Container componentes web (Servlets e JSPs) Um servidor ter aplicao Contalller web, como um o J2EE deve de tanto um tota~ente compatvel com Contai~er EJB (al~ de outras coisas, c?mo uma JNDI e uma lmplementaao JMS). O Tomcat e apenas um Cont~iner -:eb! Embora esteja de ao Contamer web. especIflcaao J2EE que se referem acordo s :pores da O Tomcat um Container web e no uma aplicao J2EE completa, pois ele no possui um Container EJB.

Um set"Id9t de aplIcac;9 J2EE IncluI tant9 9 C9ntmnet1 " Web7 C9m9 9 C9ntain et EJB.

O ]9'mcat

um C9ntmnet

A Web7 mas N11.0 um set"Id9t

de apllcadi9 J2EE c9mplet9. T Um set"Id9t J2EE 1.4 IncluI a especltlcadi9 Set"let T especltlcac;.9 ElB 2.1.

2.4

7

a especltlcac;9 JSf 2. o e a

iJ2EE

Application

Server

r:1\:

Ento o Tomcat um Container web standalone ... isso significa que tambm existem Containeres EJB standalone?

Antigamente, digamos, no ano 2000, voc encontrava servidores J2EE completos, Containeres web standalone e Containeres EJB standalone. Hoje, porm, quase que todos os Containeres EJB so parte de servidores J2EE completos, embora existam ainda poucos Containeres web standalone, incluindo o Tomcat e

o Resin. Geralmente, os Containeres web standalone so configurados para trabalharem com um servidor HTTP (como o Apache), embora o Container Tomcat possa atuar como um servidor HTTP bsico. Mas, para a funo de servidor HTTP, o Tomcat nem se aproxima da robustez do Apache. Por isso, as aplicaes web no-EJB mais comuns usam o Apache e o Tomcat configurados juntos - com o Apache como Servidor HTTP e o Tomcat como Container. Alguns dos servidores J2EE mais comuns so o Weblogic da BEA, o JBoss AS de cdigo aberto e o WebSphere da IBM. voc est aqui ~

65

Minitutorial do MVC

Criando e distribuindo uma aplicao Web MVC. Chegou a hora de colocar a mo na massa e escrever um formulrio HTML, um controlador de servlet, um modelo (classe Java simples), um deployment descriptor XML e uma view em JSP. hora de criar, distribuir e testar. Antes, porm, voc dever configurar seu ambiente de desenvolvimento - uma estrutura de diretrios para o projeto que esteja separado da sua aplicao real distribuda. Em seguida, voc ter que configurar o seu ambiente de distribuio, de acordo com as especificaes do servlet e do JSP, e as exigncias do Tomcat. A partir da, voc estar apto a comear a escrever, compilar, distribuir e executar. Concordo, construmos uma aplicao bem pequena. Porm, quase NO existe aplicao que seja to pequena e use o MVC. Afinal, a aplicao pequena de hoje o sucesso da internet de amanh ... este

um

novo captulo.

l

objetivos do exame oficial da Sun

oDistribuio Aplicao Web2.1 Construir a estrutura de arquivo e diretrios de uma aplicao que possa conter (a) contedo esttico, (b) pginas JSP, (c) classes servlet, (d) o deployment descriptor, (e) bibliotecas de tags, (f) arquivos JAR e (g) arquivos de classe Java. Descrever como proteger os arquivos de recursos do acesso HTTP. 2.2 Descrever o propsito e a semntica de cada um dos seguintes elementos do deployment descriptor: error-page, init-param, mirnemapping, servlet, servlet-class, servletmapping, servlet-name e welcome-file. 2.3 Construir a estrutura correta para cada um dos seguintes elementos do deployment descriptor: error-page, init-param, mimemapping, servlet, servlet-class, servlet-name e welcome-file.

Notas sobre a Abrangncia:Todos os objetivos nesta seo so abordados completamente no captulo sobre Distribuio; aqui daremos apenas uma primeira olhada. Este o nico captulo com um tutorial completo, do incio ao fim. Portanto, se voc pul-Io, poder ter problemas mais tarde, quando for testar alguns outros exemplos nos prximos captulos (no repetiremos cada detalhe novamente). Assim como nos anteriores, voc no precisar se preocupar em memorizar o contedo deste captulo. Apenas v e faa.

68 captulo 3

praticando com o MVC

Vat\tos cot1struir ut\ta (pequetW aplicao de verdadeNs vimos a funo de um container, falamos um pouco sobre deployment descriptors e demos uma primeira olhada na arquitetura do MVC Model 2. Mas voc no po.de ficar a sentado e lendo o dia todo agora hora de realmente jazermos alguma coisa.

Os quatro passos que seguiremos:

O Revisar as views doe usurio (o quedeo browser mostrar) a arquiteturaalto nvel.

8

Criar o ambiente de desenvolvimento que usaremos neste projeto (que voc poder usar para qualquer outro exemplo no livro).

Gl

eo

Criar o ambiente de distribuio que usaremos neste projeto (que voc poder usar para qualquer outro exemplo no livro).

_~

f~_~

i~~--...01_ ~

Desenvolver e testar repetidas vezes os vrios componentes de nossa aplicao. (Tudo bem, isto mais uma estratgia do que um passo.) Nota: Ns recomendamos desenvolvimentos e testes repetitivos, embora nem sempre mostraremos todos os passos aqui.

voc est aqui ~

69

A view do usurio

A View do Usurio para a aplicao "&eer Advisor" (Especialista eltt Cervejas)Nossa aplicao ser uma esp~cialista em cervejas. Os usurios podero navegar em nossa aplicao, responder perguntas e receber conselhos valiosssimos sobre cervejas.

Beer Seleetion PageSelect ooer characteristics

~ .

~

t~ HrM.l_ eser: z.s.f-a p~tP1a ti":N!.sps.f-a eJ?vi'o,PldlJ CIJ~"ClJir ~lIe

Color:

{light

.;

j

s.f-a

lI~a

IJ clJPlselt. C(l~ base PIo.

I

~

dI) lISlIfJ.l'i6.

Beer Recommendations JSPtry: Jack's Pale Ale try: Gout Stout

f:

Por que estamos criando uma aplicao que d conselhos sobre cervejas?

1\:

Depois de uma exaustiva pesquisa de mercado, conclumos que 90% dos nossos leitores apreciam cerveja. Para os outros 10%, basta simplesmente substituir a palavra "cerveja" por "caf".

70 capitulo 3

praticando com o MVC

Aqui est a arquitetura ...Ainda que esta seja uma aplicao bem pequena, vamos constru-la usando uma arquitetura MVC simples. Desta forma, quando ela se tomar O SITE mais badalado da web, estaremos prontos para aument-la. Container

-~C(J;r/-l'cladcl"

1 - O cliente solicita a pgina jorm.html. 2 - O Container vai buscar a pginajorm.html. 3 - O Container retoma a pgina ao browser, o usurio responde s perguntas do formulrio e...A-pe"llJ.stllJ'I

servlet

componente BeerExpert

D/J Java

tJldec.f.

JavlJ, sllty.>les). 4 - O browser envia os Container dados da solicitao ao container. 5 - O Container encontra o servlet correto baseado na URL e passa a solicitao para o servlet. 6 - O servlet pede ajuda ao BeerExpert. 7 - A classe responsvel retoma uma resposta, a qual o servlet adiciona ao objeto solicitao. 8 - O servlet encaminha a solicitao ao JSP. 9 - O JSP recebe a resposta do objeto solicitao. 10 - O JSP gera uma pgina para o Container. 11 - O Container retoma a pgina para o usurio feliz.

componente solicitao BeerExpert

voc est

71

ambiente de desenvolvimento

Criat'ldo

O

seu at\tbiettte

de deset1volvit\tettto

Existem vrias formas de voc organizar a sua estrutura de diretrios de desenvolvimento, mas esta a que recomendamos para projetos de pequeno e mdio portes. Na hora de distribuir a aplicao, copiaremos uma poro disso para onde quer que o nosso Container especfico queira. (Neste tutorial, usaremos o Tomcat 5.)

ru "" .- pl"eclstI. I,.v"ce 410.6Jes-fe pal"tI. Jll"e-!-:1"16

---7

Sevs CtrJl'I1flJl1t:l1ffS Vrf!W es-!-:-I-rctrJs e.....

6 -!-V-!-61"I"o.I)

JinlA",i(;s

fleal?! a~tlr.

j

li. rr~vi' V6Ce c161:f1.6S (U'3V1'vtrJSJA-Je Je -hI"Cfi"S (J" Sfl"vle-!-rJe-vs).J'

....result.jsp form.html

TSve fica Sf!V

\

r

a~vr

f..XfI'l1fItJS Je fI.;vns C6l'11flJnel1-H::Svtew.

Je C4I1fijvl'o"';.

BeerSelect.java

BeerExperLjava

BeerSeleel.elass

BeerExperLelass

F

i. du

ave eS-!-lAl?!as tlSfl.I1J a pal"a

~jJeepfJ.I"e~ve Sf!PD.I'D."'l'JSS CIJ"'fIJI?f!I?+es clJl?-!-I""'adal" ell'JS c""'fIJI1f!I?+es

eS-!-l"v-!-vI"o.-po.Jl"a

Pfl.C6+e;

d"

d

"'t>Jel.

pal"tI. ~ve ps StI."'S b+el" S I benef,cl6s 41l"h'iIU'"s elele: "7

I"5anl";4,';a

el" pl"~e-l-6

5eN!l?crD."'f!I1.f. ela 1?D.",espD.ce p61"-!-d"'Maele e I"f!lI-hlt";aj

72 capitulo 3

praticando com

o MVC

Criat1do

O

atMbiettte de

distribui~o

!s+e

ti dl"d:l"itJ

t.(JIrBeer Selection Page

~ Select beer characte:rstics"Calor: fllo.di" l'J.i"4 (;lJlfJcal" p05 PlIJ

tl fM.f.

e IIIt'jula

li 1J.i"~1I1"v(J ,das ts.f.rv.f.vi"IJ.

{tre.f.:i"I't!

de

c/(J;sses; de#1.f."tJi {a

l1 SI"s-l-i!""tJ.fel"IJ.CI't!I?I'J.! WI1{WS

Ci"l"e.f.1J. flJ.cff. {1/}

Setl

at'~vlvQ

,c/ass vai' webl.

acabai" e"'" IbeerV

IlclQ.sstslcfJl't'ilelfal!P>f1el

Distribuindo o servletPara distribuir o servlet, faa uma cpia do arquivo .class e mova-o para o diretrio /Beer-vlIWEB-INF/dasses/comlexample/web/ na estrutura de distribuio.

Testando o servletI - Reinicie o tomcat! 2 - Abra seu browser e digite: http:// localhost: 8080/Beer -vI /form.htrnl 3 - Selecione uma cor de cerveja e dique em "Submit" 4 - Se o seu servlet estiver funcionando, voc dever ver no browser a resposta do servlet parecida com: Conselhos sobre Escolha de Cerveja Voc escolheu a cerveja marrom

FI

Ed" Wid

Hl

SI hdtM

% %

cd tomcat bin/shutdown.sh

% bin/startup.sh

http://localhost:8080

Beer Seleetion PageSckct bcen;l1arncterisocs

Color::ug~

voc est

81

classe modelo

Cot1struit1do e testat1do

a classe tModelo

No MVC, o modelo tende a ser o "back-end" da aplicao. Em geral, o sistema tradicional que est sendo exposto na web atualmente. Em muitos casos ele apenas um cdigo Java simples, sem saber que talvez possa ser chamado pelos servlets. O modelo no deve ficar restrito a ser usado por somente uma nica aplicao, portanto ele deve ficar dentro dos seus prprios pacotes de utilidades.

As especificaes para o modeloSeu pacote deve ser com.example.model Sua estrutura de diretrios deve ser /WEB-INF/c1asses/com/example/model Ela disponibiliza um mtodo, getBrandsO, que obtm uma cor preferida (como um String) e retoma uma ArrayList de marcas de cervejas recomendadas (tambm como Strings).

Construa a classe de testes para o modeloCrie a classe de testes para o modelo (sim, antes de construir o modelo em si). Aqui, voc est por sua prpria conta, pois no temos uma neste tutorial. Lembre-se, o modelo ainda estar no ambiente de desenvolvimento quando voc test-Io pela primeira vez - como outra classe Java qualquer, e voc pode test-Io sem o Tomcat.

Construa e teste o modeloOs modelos podem ser extremamente complicados. Eles freqentemente envolvem conexes com bancos de dados tradicionais e chamadas a lgicas complexas. Aqui est nosso sofisticado e inteligente sistema baseado em regras que d conselhos sobre cerveja:package com.example.model; import java.util.*; public class BeerExpert { public List getBrands(String color) List brands = new ArrayList(); if (color.equals ("amber")) { brands.add("Jack Amber"); brands.add("Red Moose");}

C4i1'1l

Cap+VI'Il."'4S

as ,;;ftU"'tl.gDes

especi'Q!"~flI.dtl.s e clJ"'P1l!xas dlJ l!Xl!"'P!1J da cel'v~4.J vSIJ.'IdlJ expl'es sDes ct:J'Idi'ci'IJ'Iais alla'lsadfl.s.

else { brands.add("Jail brands.add("Gout}

Pale Ale"); Stout") ;

return(brands);

% cd beerVl % java -d classes

src/com/example/model/BeerExpert.java

82

3

praticando com o fvlVC

Melhorando o servlet para chatMar o tModelo,para obtertMos conselhos VEVE~VAVE...Nesta segunda verso do servlet, iremos melhorar o mtodo doPostO para chamar o modelo para oferecer o conselho (a verso trs far com que o conselho venha de um JSP). As alteraes de cdigo so triviais, mas a parte importante entender a redistribuio da aplicao melhorada. Voc pode tentar escrever o cdigo, recompilar e distribuir por sua prpria conta, ou ento virar a pgina e seguir adiante ...

AP9nte seu lpIS Melhorando o servlet, verso doisEsquea os servlets por um minuto, vamos pensar apenas em Java. Quais so os passos que devemos tomar para realizar estas tarefas? 1. Melhorar o mtodo doPostO para chamar o modelo. 2. Compilar o servlet. 3. Distribuir e testar a aplicao atualizada.

voc est

83

chamando o modelo para o controlador servlet

o

cdigo do servlet verso dois

Lembre-se, o modelo apenas Java simples, ento o chamaremos como faramos para qualquer outro mtodo Java: instanciar a classe modelo e chamar o seu mtodo!package import import import import import public com. example. web; com. example .model. *; javax.servlet.*; javax.servlet.http.*; java.util.*;. java .io. * ; / class BeerSelect void extends

V-

AJ se eS3f1esa lJ i"Y>tJt''';'' parti. 8eerl.xper";" es";": l'P7seri(Jl).

tJ

PQC..fe lJI'lille "

Ct'IfJ.I1"lJ ulI';a I1"V4 cltJ.sse. S.ffJ.IMS 1I';1IJ"i'Ii'ct/,l'UJlJ servle";" (JHttpServlet (

Jrij/'P7al

e l1"

public

doPost(HttpServletRequest HttpServletResponse throws IOException,

request, response) ServletException

String

c = request.getParameter("color"); ~

List result be be.getBrands(c); = = new BeerExpert();~ BeerExpert

II1S";"fJ.l1clfJ.1' 4 classe 8eet'1..J(fel''';''response.setContentType("text/html"); PrintWri ter out = response. getWri ter (); C tllI';I lJ ,e out.println("Beer Selection Advice
");

fi!

li

";"8,,,s () t'tll1

Iterator it = result.iterator(); while(it.hasNext( { out.print("
try: " + it.next(;

praticando com o MVC

Os prit'lcipais passos para o servlet verso doisTemos duas tarefas importantes a fazer: recompilar o servlet e distribuir a classe modelo.

Compilando o servletNs usaremos o mesmo comando compilador que usamos quando construimos a primeira verso do servlet.FI Edl '1" d Hei PI Go16;"C()IM' D.1I\6erll

U c616r IJ" nu' D

Solicitao HTTP POSTPOST /advisor/SelectBeer.do HTTP/l.l Host: www.wickedlysmart.com User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:l.4) Gecko/20030624 Netscape/7.1 Accept: text/xml,application/xml,application/xhtml+xml,text/htm1;q=O.9,text/ plain;q=O.8,video/x-mng, image/png, image/jpeg, image/gif ;q=O.2,*/*;q=O.1 Accept-Language: en-us,en;q=O.5 Accept-Encoding: gzip,deilate Accept-Charset: ISO-8859-1,utf-8;q~O.7,*;q~O.7 Keep-Alive: 300 Connection: keep-alive

L.eIil'l6re-se; "'"Eor=~

() 6r()wser

311e5eNJ. es.f.fJ. s6Ite,..f.fJ.{;()~ I , t'1I\ cri't;.-IfJ..J IiI'IfJ.S e

V6Ce 1'146 frects4

se fN!lJclIffJ.r

O,ss"iJ\ SlIe elfJ.se fD.rece 311fMUi6lIelil'l

"4

ser'lti:((Jr

Classe servletpublic void doPost(HttpServletRequest request, HttpServletResponse throws IOException, response) ServletException

String //

colorParam mais cdigos

= request.getParameter(~color"); esclarecedores aqui... ~

Is.f.6

c6,-"cti:(e C61i1'1 ()

I'I()lI\e /'I() flJrll\lIlfJ.rii~

I

voc est aqui"

119

formulrios parmetros

Et1Viat1do e usat1do dois par'ltetros

Formulrio HTML

Select COLOR:

light amber brown dark BODY:

medium light heavy

Solicitao HTTP POSTPOST ladvisorlSelectBeerTaste.do HTTP/l.l Host: www.wickedlysmart.com User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:l.4) Gecko/20030624 Netscape/7.1 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,textl plain;q=0.8,video/x-mng, image/png, image/jpeg,image/gif ;q=0.2,*I*;q~0.1 Accept-Language: eD~us,en;q=0.5 Accept-Encoding: gzip,defiate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive

Classe servletpublic void doPost(HttpServletRequest request, HttpServletResponse throws IOException, response) ServletException

String colorParam ~ request.getParameter{~color"); String bodyParam ~ request.getParameter(~body"); mais cdigo aqui

II

f}J.u'~:IfJ.l't';'vei 1fJ.I'J::

ea

S..ft~t'15

h",

f) 110./01'

120

solicitao e resposta

Voc pode ter vrios valores para um nico parmetro! Isto significa que voc precisar que o getParameterValues() retorne um array, e no um getParameter() que retorne uma String.

Veja lst9!Alguns tipos de entrada de dados, como um grupo de checkboxes, podem ter mais de um valor. Isso quer dizer que um nico parmetro ("tamanhos", por exemplo) ter diversos valores, dependendo de quantos boxes o usurio assinalou. Um fonnulrio em que o usurio possa selecionar diversos tamanhos de cerveja (indicando que ele est interessado em TODOS aqueles tamanhos) ser algo como: Seleet beer characteristics Can Sizes:

12 oZ.
16 oZ.
22 oZ.

No seu cdigo, voc usar o mtodo getParameterValuesOString String one = request.getParameterValues(~sizes") [] sizes

que retoma um array:[O];

= request.getParameterValues(~sizes");

Se voc quiser ver tudo no array, s por diverso ou teste, pode usar:String [] sizes = request.getParameterValues(~sizes"); for(int x=O; x < sizes.length ; x++) { out.println(~
sizes: ~ + sizes[x);

(Considere que "out" um PrintWriter que voc obteve da resposta)

Voc

est aqui"

121

o objeto l-fttpSe!VletRequest

Alltt dos parlttetros,

O que Ittais eu pOSSO

obter de Ultt objeto Reques11As interfaces ServletRequest e HttpServletRequest possuem uma tonelada de mtodos que voc pode chamar, mas voc no precisa memorizar todos eles. Sozinho, voc realmente deveria ver todas a API para javax.servlet.ServletRequest e javax.servlet.http.HttpServletRequest, mas aqui ns s veremos os mtodos que voc mais usar no seu trabalho (e que podem tambm aparecer no exame). No mundo real, voc estar com sorte (ou sem sorte, dependendo de sua perspectiva), se usar mais de 15% da API de solicitao. No se preocupe se no ficou claro para voc como ou por que voc usaria cada uma delas; ns veremos mais detalhes de algumas delas (principalmente os cookies) mais adiante.

Interface ServletRequest Gavax.servlet. ServletRequest) getAttribute(String) getContentLengthQ getInputStreamQ getLocalPortQ getRemotePortQ getServerPortQ getP arameter(String) getP arameter Values(String) getParameterNamesQ Ii MUITOS outros mtodos ...

A plataforma do cliente e a informao do browserString client request.getHeader(~User-Agent");

Os cookies associados a esta solicitaoCookie[] cookies request.getCookies();

Interface HttpServletRequest Gavax. servlet.http.HttpServ letRequest)

..

HTTPServletReauest

A sesso associada a este clienteHttpSession session request.getSession();

O Mtodo HTTP da solicitaoString theMethod

request.getMethod()

;

getContextPathQ getCookiesQ getH eader(String) getlntHeader(String) getMethodQ getQueryStringQ getSessionQ Ii MUITOS outros mtodos ...

Um stream de dados da solicitaoInputStream input request.getlnputStream();

122 captuo 4

solicitao

e res:posta

N9 exlst~m

Yetbuntas Idl9tas

r:I\:

Por que algum dia eu iria querer obter uma InputStream da solicitao?

Com uma solicitao GET, no h nada alm da informao header da solicitao. Em outras palavras, no h corpo com que se preocupar. MAS ... com um HTIP POST, h informao de corpo. Na maioria das vezes, tudo o que interessa em relao ao corpo retirar os valores dos parmetros (por exemplo, "color=dark") usando o request.getParameterO, mas esses valores podem ser enormes. Se voc quer analisar a fundo tudo o que chega com a solicitao, voc pode usar o mtodo getlnputStreamO. Com ele voc pode, por exemplo, destrinchar todas as informaes do header e processar byte a byte o payload (o corpo) da solicitao, copiando imediatamente para um arquivo no servidor, talvez.

r:

Qual a diferena entre getHeaderO e get/ntHeaderO? Pelo que eu posso dizer, headers so sempre Strings! At mesmo o mtodo getlntHeaderO leva uma String representando o nome do header; ento, para que serve o int?

I\:

Os headers tm um nome (como "User-Agent" ou "Host") e um valor (como "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.4) Gecko/20030624 Netscapel7.1" ou .. ww.wickedlysmart.com ..). w Os valores retomados dos headers esto sempre no formato String, mas para alguns casos, a String representa um nmero. O header "Content-Length" retoma o nmero de bytes que compe o corpo da mensagem. O header HTIP "Max-Forwards", por exemplo, retoma um valor inteiro, indicando quantos hops (saltos de roteadores) a solicitao pode fazer. (Voc pode querer usar este header se estiver tentando fazer um trace da solicitao, que voc suspeite estar presa em um loop em algum lugar.)

Voc pode obter o valor do header "Max-Forwards"string forwards int forwardsNum

usando o getReaderO:

request.getHeader(~Max-Forwards"); = Integer.parselnt(forwards);

E isso funciona perfeitamente. Mas se voc soubera valor que o header deve assumir como int, voc pode usar o getlntHeaderO como um mtodo de convenincia para poup-Io da etapa de converso da String para int:int forwardsNum = request.getIntHeader(~Max-Forwards");

getServerPortO,

getLocalPortO

e getRemotePortO

so confusos!

deveria ser autoexplicativo ... at que voc se perguntasse para que serve ento o getLocalPortQ. Vamos comear pelo mais fcil.~ . getRemotePortQ. Primeiro v~ce vaz ?" perguntar "remoto em relaao a quem ... Neste caso, j que o servidor q~em so!zczta, remoto o CLIENTE. O cliente e remoto na . vzsao do servzdor. Logo getRemotePortQ ".,,' significa "obter a porta do cltente . Ou se~a, o nmero da porta do cliente de ~nde partm a solicitao. Lembre-se: se voce for um servlet, remoto significa cliente.

o getServerPortQ

A diferena entre getLocalP~rtQ e getServerPortQ mais sutzl: o getServerPortQ diz "para qual porta a " solicitao foi inicialmente ENVIADA? , enquanto que o getLocalPortQ diz "em qual RAR?" S tem porta a solicitao FOI PA ., ~n:, _ uma diferena, porque emb?r.a as so!zcztaoes sejam enviadas para uma umca porta (a qual o servidor est escutando), o servzdor encontra uma porta local diferente para cada thread, para que a aplicao possa atender a vrios clientes ao mesmo tempo.

reviso do cicio da vida

Reviso: Cielo da vida do servlet e API

Container inicializa um servlet carregando a classe, invocando o construtor-padro do servlet e chamando o mtodo initO do servlet. initO (que o desenvolvedor pode anular) chamado apenas uma vez no ciclo de vida do servlet, e sempre antes do servlet atender a qualquer solicitao do cliente.

o

inter ace avax.servlet.Servlet service(ServletRequest, ServletResponse) init(ServletConfig) destroyO getServletConfigO getServletInfoO

o mtodo

j avax.servlet.GenericServletservice(ServletRequest, ServletResponse) init(ServletConfig) initO destroyO getServletConfigO getServletInfoO getInitParameter(String) getInitParameterN amesO getServ letContextO log(String) log(String, Throwable).~.

o mtodo

initO d ao servlet acesso para os objetos ServletConfig e ServletContext, que o servlet precisa para conseguir informaes sobre a configurao do servlet e a aplicao web.

o Container o servlet

termina com a vida de um servlet chamando seu mtodo destroyO. passa a maior parte da sua vida rodando um mtodo serviceO para uma solicitao do cliente. Cada solicitao para um servlet roda em uma thread separada! S existe apenas uma instncia para qualquer classe servlet. Seu servlet quase sempre estender o javax. servlet.http.HttpServlet, do qual ele herda uma implementao do mtodo serviceO, que traz um HttpServletRequest e um HttpServletResponse.

Ij avax.servlet.http.HttpServletservice(HttpServletRequest, service(ServletRequest, HttpServletResponse) ServletResponse) doGet(HttpServ IetRequest, H ttpServ IetResponse) doPost(HttpServletRequest, doHead(HttpServletRequest, doOptions(HttpServletRequest, doPut(HttpServletRequest, doTrace(HttpServletRequest, HttpServletResponse) HttpServletResponse) HttpServletResponse)

HttpServletResponse)

doDelete(HttpServletRequest,

o HttpServlet estende o javax.servlet.GenericServlet - uma classe abstrata que implementa a maioria dos mtodos bsicos do servlet. o GenericServletimplementa a interface Servlet.

getLastModified(HttpServletRequest)

As classes servlet (exceto aquelas relacionadas aos JSPs) esto em um dos dois pacotes: javax. servlet ou javax.servlet.http. Voc pode anular o mtodo initO e deve anular pelo menos um mtodo de servio (doGetO, doPostO, etc).

com.wickedlysmart.examples.MyServlet doPost(HttpServletRequest, HttpServletResponse) myBizMethodO

i

HttpServletResponse) HttpServletResponse)

124

capitulo 4

solicitao

e re::;posta

Reviso: HffF e HttpServletRequest

Pontos de bala

Os mtodos doGetO e doPostO do HttpServlet levam um HttpServletRequest e um HttpServletResponse. O mtodo serviceO determina se o doGetO ou o doPostO rodar, baseado no mtodo HTTP (GET, POST, etc.) da solicitao HTTP. As solicitaes POST tm um corpo; as solicitaes GET, no, mas as solicitaes GET podem ter parmetros anexados VRL da solicitao (algumas vezes chamada "query string"). As solicitaes GET so idempotentes por herana (de acordo com a especificao HTTP). Elas devem ser capazes de rodar vrias vezes, sem causar nenhum efeito colateral no servidor. As solicitaes GET no devem mudar nada no servidor. Mas voc pode escrever um mtodo doGetO no-idempotente e maldoso. . O POST no-idempotente por herana e cabe a voc projetar e codificar sua aplicao, de forma que, se o cliente enviar uma solicitao duas vezes por engano, voc possa cuidar disso. Se um formulrio HTML no diz explicitamente "method=POST", a solicitao enviada como um GET e no como POSTo Se voc no possui um doGetO em seu servlet, a solicitao falhar. Voc pode receber parmetros da solicitao com o mtodo getParameter("paramname"). O resultado sempre uma String. Se voc tem mltiplos valores de parmetros para um determinado parmetro, use o mtodo getParameterValues ("paramnane") que retoma um array de Strings. Voc pode obter outras coisas do objeto solicitao, como headers, cookies, uma sesso, a query string e um stream de dados.

Interface ServletRequestUavax.servlet. ServletRequest)

ServletReaesL getAttribute(String)

IgetContentLengthOgetInputStreamO getLoealPortO getRemotePortO getServerPortO getParameter(String) getParameter Values(String) getParameterNamesO MUITOS outros mtodos ...

Ii

Interface HttpServletRequest Gavax.servlet.http. HttpServletRequest)

tI

HTTPServletReauest getContextPathO getCookiesO getHeader(String) getIntHeader(String) getMethodO getQueryStringO getSessionO MUITOS outros mtodos ...

Ii

voc est

125

o objeto HttpServletResponse

Etrl'o,essa foi a Solicitao ... vejatMos agora a RespostaA resposta o que volta para o cliente. Aquilo que o browser recebe, analisa e retribui ao usurio. Tipicamente, voc usa o objeto response para conseguir um stream de sada (geralmente um Writer), e voc usa este stream para escrever o HTML (ou outro tipo de contedo) que retoma para o cliente. Contudo, o objeto response tem outros mtodos alm do IIO output. Veremos alguns deles com mais detalhes.

yoce usa a apenas pata envIal- dad9s de volta 9 Voc chama resp9sta: setConte.nf7jpei) egef\VdtetD.

!

A

interface ServletResponse Gavax.servlet. ServletResponse) ServletResonse etBuiferSizeO setContentTypeO---_

..

_----------------.-.-----.-----_.--------.-----

. __ ... _

.....

__

.... _.,

l/I#itJ.ts

etWriterO ~etoutputStreamo etContentLengthO 'IMUITOS outros mtodos ...

DepoIS dIss9>v9c estadt ttZendo sImplesmente pata escl"evet o alg9 mms) no ]\tlas \9c tamlJm pode a resposta pm-a outt9sheadets. ettOS

addCookieO addHeaderO encodeURLO sendErrorO setStatusO sendRedirectO 'IMUITOS outros mtodos ...

126

capitulo 4

solicitao

e resposta

Espere um momento ... Eu pensei que no amos enviar HTML de um servlet, porque horrvel format10 para o stream de sada ...

o

o

Usando a resposta para o I/OTudo bem, deveramos estar usando JSPs em vez de enviar HTML de volta no stream de sada a partir de um servlet. Formatar um HTML para enfi-Io no mtodo prntlnO do stream de sada penoso. Mas isso no significa que voc nunca ter que trabalhar com um stream de sada do seu servlet Por que? 1) Seu provedor de hospedagem pode no suportar JSPs. Existem vrios servidores e containers mais antigos por a que suportam servlets, mas no JSPs, ento, voc fica "preso". Voc no tem a opo de usar JSPs por algum outro motivo, como um gerente chato que no permite usar JSPs porque em 1998 seu cunhado lhe dissera que os JSPs eram ruins. Quem disse que HTML era a nica coisa que voc poderia enviar de volta em uma resposta? Voc pode devolver outras coisas em vez de HTML ao cliente. Algo para o qual um stream de sada faa sentido.

2)

3)

voc est aqui"

127

enviando bytes na resposta

ItMagit1eque voc queira mviar UtMJAR para o cliet1te...Digamos que voc tenha criado uma pgina para downloads onde o cliente pode baixar cdigos a partir de arquivos JAR. Em vez de enviar de volta uma pgina HTML, a resposta contm os bytes representando o JAR. Voc l os bytes dos arquivos JAR e os escreve no stream de sada dos dados da resposta.

o

Diane est desesperada para fazer o download do J AR com um cdigo do livro que ela est usando para aprender servlets e JSPs. Ela acessa o site do livro e c1ica no link "cdigo jar", que se refere a um servlet chamado "Code.do".

envia uma solicitao HTTP para o servidor com o nome do servlet requisitado ("Code.do").

o browser

o Container envia a solicitao para o servlet CodeReturn (mapeado para o nome "Code.do" no DD) para processamento.

~

o J AR inicia

o download na mquina do cliente. Diane est satisfeita.

o servlet os bytes resposta os bytesA resposta HTTP contm agora oS bytes que representam o J AR.

CodeReturn recebe para o J AR, recebe da um stream de sada e copia representando o J AR

resposta

128 captulo 4

solicitao

e resposta

o cdigo servletIium monte public class

que faz o dowt1load do JARaqui

de imports

CodeReturn

extends

HttpServlet

{

public

void

doGet(HttpServletRequest

request, throws

HttpServletResponse IOException,

response)

ServletException

~response. setContentType ("application/jarU);

IJ:S 3Vfl'fll>\aS ~ve a/l'tJwsel' I'fccl'Jt.e5Q 3Vf is+o e ClII>\

IA;e'" ClII>\Ji..-r;!ilAJ 1'J-raIpI > ~ .~

addCookieO addHeaderO encodeURLO sendErrorO setStatusO sendR.edirectO l/MUITOS outros mtodos ...

140 captulo 4

solicitao e feSJIIllII

fausa pata 9 caf 7e4tep~-e~4

1Como o cdigo do servlet de um mtodo service (por exemplo, doPost () ) obteria o valor doheader "User-Agent" da solicitao? (Escolha todas as que se aplicam.)

[J [J [J [J

A. String B. String C.String D.String

userAgent = request.getParameter(~User-Agent") ; userAgent = request.getHeader(~User-Agent"); userAgent = request.getRequestHeader(~Mozilla"); userAgent = getServletContext() .getInitParameter(~User-Agent");

2 Quais so os mtodos HTTPusados para mostrar ao cliente o que o servidor est recebendo?(Escolha todas as que se aplicam.)

[J [J [J [J [J

A. GET

B.PUT C. TRACE D.RETURN E. OPTIONS

3 outra URL? do HttpServletResponse Qual mtodo[J [J [J [J [JA. sendURL () B. redirectURL () C. redirectHttp () D. sendRedirect() E. getRequestDispatcher

usado para redirecionar uma solicitao HTTP para

()

voc est aqui"

14

teste

4 Quais

os mtodos

HTTP

que NO

so considerados idempotentes? (Escolha todas as que se

aplicam.)

oO O O

A.GET B. POST C.HEAD D.PUT

5

Sendo req um HttpServletRequest,

qual das alternativas recebe um

stream de entrada de

dados binrios? (Escolha todas as que se aplicam.)

oO

A. BinaryInputStream B.ServletInputStream C.BinaryInputStream D.ServletInputStream

s s s

= =

req.getInputStream(); req.getInputStream();

=

O O6

req.getBinaryStream();

s = req.getBinaryStream();

Como

voc configuraria um

header chamado

"CONTENT

-LENGTH"

no objeto

HttpServletResponse?

(Escolha todas as que se aplicam.)

oO O

A.response.setHeader(CONTENT-LENGTH,"1024"); B.response.setHeader(~CONTENT-LENGTH","1024"); C.response.setStatus(1024); D. response.setHeader(~CONTENT-LENGTH",1024);

O

t

Escolha o trecho do cdigo do servletque recebe um imagem,

stream binrio para escrever uma

ou outro tipo binrio,no HttpServletResponse.

oO

A. java.io.PrintWriter B.servletOutputStream C. java.io.PrintWriter

out out out

response.getWriter(); response.getOutputStream();

O O

new PrintWriter(response.getWriter(; D.ServletOutputStream out

=

response.getBinaryStream();

142

4

solicitao e respQSia

8 Quais mtodos so usados por um servlet para tratar os dados do formulrio vindos de um cIieoIe?(Escolha todas as que se aplicam.)

oOO O

A. HttpServlet.doHead() B. HttpServlet.doPost() C.HttpServlet.doForm() D. ServletRequest.doGet() E.ServletRequest.doPost() F.ServletRequest.doForm()

O O

9 Quais dos seguintesServletRequest?

mtodos so declarados no HttpServletRequest (Escolha todas as que se aplicam.)

ao contrrio do

oO O O O

A. getMethod () B. getHeader () C. getCookies () () D. getInputStream() E. getParameterNames

10

Como os desenvolvedores de servlet devem tratar o mtodo service () do HttpServlet quando estenderem o HttpServlet? (Escolha todas as que se aplicam.) A. Eles devem anular o mtodo service B. Eles devem chamar o mtodo service C. Eles devem chamar o mtodo service () na maioria dos casos. () do doGet () ou doPost () . () do mtodo init () .

oO O O

D. Eles devem anular pelo menos um mtodo doXXX (como um doPost () ). ()

voc est aqui ~

143

respostas do teste

'fausa pata 9 cate~-~4

1Como o cdigo do servlet de um mtodo

service (por exemplo, doPost () ) obteria o valor do header "User-Agent" da solicitao? (Escolha todas as que se aplicam.)

O

o

A. String userAgent = request.getParameter("User-Agent"); B. String userAgent = request. getHeader ("User-Agent") ;C. String userAgent =

-If

p{iBeerParamTests TestlnitParams

adminEmail [email protected]

No cdigo servlet:out.println(getServletConfig()

t

.getlnitParameter(~adminEmail");

150

5

atributos

e lsteners

Voc t'lo pode usar os partMetros it'lit do servlet setMque ele teKha sido it'licializadoVoc acabou de aprender que seu servlet herda o getServletConfigO; portanto, voc pode cham-Io de qualquer mtodo do servlet para conseguir uma referncia ao ServletConfig. Uma vez que voc tenha uma referncia ao ServletConfig, voc pode chamar o getInitParameterO. Mas, lembre-se, voc no pode cham-Io direto do seu construtor! A vida do servlet est apenas comeando ... ele no ter toda a sua funcionalidade at que o Container chame o initO.

Q..uand9 9 C9ntalnet In'ldq11za um setvlet~ c9nstt91 um UnIC9 SetvletC9nllg Plttele. O C9ntVnel' ~le~'9S"CJ

f

o

IJ/f/)/f de Set"v1e-!-CIJ'7fijpt" e'71//lJ.dlJ. I4vt-l-6 eedIJ -----:::;

I

e".f.1"6 ufI/J ; d hilJ.SFOJeA- de 3Vlai:SaVfr tleclal"4jCeS ; tJe+6 l Sel"lIie-I-Ctm-l-ex+. VIrI d6S sevs w.&adJS ~ a 5e+IPli..;..pfJ.r!J.lYle+-eI"O.

5e..f..Servit-I-C"".fex+D {f~4S JSPs ..f..alrlb~iJ\ .fe"w. IJ.CeSS6 speclo.i 1M C/J,,+ex..f..6). e

ou:ServletContext context = getServletContext();

\ A3l1l ,,:s dillitll",s (J c:d~a tw. J)fJ As par.fes - I"f!cf!be"il 4 l"elel""tJ. da Sel"lIle-I-Ctm+-ex+ e Ct.fllYl!J.Plda w.+'~Ja Sf!lI 5e-l-Il1l+Pal"tJ.lrle.ferO. voc est aqui.. 157

~

out.println(context.getlnitPararneter(~adminErnail";

para/natras init do contexto

X parmentros nit do servlet

Lel\tbre-se da diferett9a ettlre os parl\tetros ittit do servlet e os parl\tetros ittit do COtttextoAqui est uma reviso das principais diferenas entre os parmetros init do contexto e os parmetros init do servlet. Preste bastante ateno ao fato de que nos referimos a ambos como parmetros init, ainda que apenas os parmetros init do servlet recebam a palavra "init" na configurao DD.

parmetros init do ContextoDeployment Descriptor Dentro do elemento , mas NO inserido em um elemento especfico foo bar

parmetros init do Servlet

Dentro do elemento para cada servlet especfico BeerParamTests TestlnitParams foo bar

1Je.+e &Ue

i'1fJ

tl1t.f ftU'tA e.S

Cim+ex.fe.;

CfJ"""

flJ.l'~e.frds

tl1i.f tl.1JCdigo do Servlet

getServletContext()

.getlnitParameter(~foo");

getServletConfig() .getlnitParameter(~foo");

Disponibilidade Para quaisquer servlets e JSPs includos nesta aplicao. Somente para o servlet para o qual o foi configurado. (Embora o servlet possa decidir aumentar sua abrangncia armazenando-o em um atributo.)

158

CBt)tulo 5

atributos

e iisl!eflIE.!

ServletCotlfig Utft por servlet ServletCotttext Utft por aplicaoExiste um nico ServletContext para toda a aplicao e todas as partes da aplicao compartilham-no. Porm, cada servlet na aplicao tem seu prprio ServletConfig. O Container cria um ServletContext quando uma aplicao distribuda, disponibilizando-o para cada Servlet e JSP (que se transforma em servlet) na aplicao.

Inicializao da aplicao web:O Container l o DD e cria um par de String nome/valor para cada . O Container cria uma nova instncia do ServletContext. O Container d ao ServletContext uma referncia a cada par nome/valor dos parmetros init do contexto. Cada servlet e JSP distribudo como parte de uma nica aplicao tem acesso quele mesmo ServletContext. S/~ "s JSPs S6 +rfJ.l1sf6r4'\fJ.tl6s e"'"

ClJl1ffx-l-"" tia o.pllcai'i" ~ ClJ4'\ iS pfJ.r~e+r6s t

~a6s

r:- servle+sservletCo'{,I s/~/esil'!e",ff aba/xi!.l

>7

l

I

,,+.~

voc est

BUU!

169

tutoria I ServletContextUstener

Precisatltos

de trs classes

e Utlt 1111

Para o nosso teste com o listener de contexto, precisaremos escrever as classes e o arquivo web. xml. Para facilitar nosso teste, colocaremos todas as classes no mesmo pacote: eom.example ServletContextListener.L:::,.

o

I II

O ServletContextListener

MyServletContextListener eontextlnitialized(ServletContextEvent) eontextDestroyed(ServletContextEvent)

MyServletContextListener.javaEsta classe implementa o ServletContextListener, recebe os parmetros init do contexto, cria o Dog e o configura como um atributo de contexto.

e

Dog

A classe atributoDog(string) getBreedO

Dog.javaA classe Dog simplesmente uma classe Java simples. Sua funo ser o valor do atributo que o ServletContextListener instancia e configura no ServletContext para alimentar o servlet.

ServletContextListener

e

O Servlet

GenericServlet

ListenerTester.javaEsta classe estende o HttpServlet. Sua funo verificar se o listener funcionou atravs do recebimento do atributo Dog oriundo do contexto, chamando o getBreedO no Doge exibindo o resultado para a resposta (portanto, isso que veremos no browser). HttpServlet

doGet(HttpServletRequest,HttpServletResponse)

170

5

atributos e listeners

Escrevetldo a classe listetter

ServletContextListener Ela funciona como qualquer outro tipo de listener que 4'I I voc j deve estar familiarizado, como os tratadores de eventos GUl Swing. Lembre-se, tudo que precisamos MyServletContextListener fazer obter os parmetros init do contexto para descobrir a raa do co, criar o objeto Dog e coloc-lo eontextlnitialized(ServletContextEvent) dentro do contexto como atributo.eontextDestroyed(ServletContextEvent)

paekage import publie

eom.example; javax.servlet.*;

IlI!iflelVle~.f4 4j4V4Jf.serv1e.f.Serv1e-!-C4"iex.f!-lsie'fer

~elass MyServletContextListener implements ServletContextListener

publie

void

contextInitiali.zed

(ServletContextEvent

event)

( a

ServletContext

se = event. getServletContext

(); ~altclflA

Servle-!-Ca"ffJf+

IA"eve".f".String dogBreed

= se.getlnitParameter("breed");~

Dog d = new Dog (dogBreed);fJ3UfJ.'fJfJ fJct>"ieJf.ffJ ierlVll;'a., slj'flli'cfJ. 3ue .ffJJ IAj>llc4jt> v4ll,;'alijfJ.I"J ,;'clt,,;'JfJ a

voc est aqui ~

171

o atributo c/ass

Escrevet1do a classe atributo (Uog)Naturalmente, precisamos de uma classe Dog - a classe que representa o objeto que armazenaremos no ServletContext, depois de ler os parmetros init do contexto. Dog(string) getBreedOpackage com.example;

Dog

public class Dog { private String breed;

Alada de especl'al 4~V". A-pel7fJ.S vltla classe Java sl"Ify>les

public

String

getBreed()

return

breed;

"" Al6SSI.i

Sfrvle-f. recebel": 6])65 d6

clurhJ6111

V.])65

3Vf!"

Its-h:~r

C617115Vl"4 C61tl1.i a+l"tbv+~)

et.41t'>A1": 1"4j4 174

" ltl+ad65e-f.8I"eell!O

"6])65 e (;6f"4r:I7D

resp'cs+a.,ftJ.1"4 3ve f6SS41t\6S v-/4

br6wser

f:

Eu achei que tivesse lido em algum lugar que os atributos do servlet tinham que ser Serializveis ...

1\:

Pergunta interessante. Existem vrios tipos diferentes de atributos e se o atributo tem que ser Serializvel s interessa aos atributos Session. E apenas quando a aplicao est distribuda em mais de uma JVM que ele realmente importante. Ns falaremos mais sobre isso no captulo das Sesses. No existe nenhuma necessidade tcnica para que qualquer atributo (incluindo os atributos Session) sejam Serializveis, embora voc possa considerar criar todos os seus atributos Serializveis por padro. A no ser que voc tenha uma boa razo para NO faz-Ia. Pense nisso: ser que voc est mesmo seguro de que ningum jamais vai querer usar aqueles objetos como argumentos ou retornar valores como parte de uma chamada remota a um mtodo? Voc pode mesmo garantir que algum que use esta classe (Oog, neste caso) nunca rodar em um ambiente distribudo? Ento, embora tornar os atributos serializveis no seja uma exigncia, voc deveria sempre que pudesse.

172 caoi'tu}o5

atributos

e lstenelS

Escrevet1do a classe servletEsta a classe que testa o ServletContextListener. Se estiver tudo funcionando corretamente no momento em que o mtodo doGetO do Servlet rodar pela primeira vez, o Dog ser esperado como um atributo no ServletContext.

HtipServlet

ListenerTesterdoGet(HttpServletRequest,HttpServletResponse)

package import import import

com.example; javax.servlet.*; javax.servlet.http.*; java.io.*;

Ai."" "e especta/ a-# aJlIl ~el74S lI~ sel'v/el- C6/t1l1/t1extends HttpServlet request, throws HttpServletResponse response) IOException, ServletException

public

class void

ListenerTester doGet

public

(HttpServletRequest

response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("test context attributes set by listener
");

out.println("
");

~

.Dog dog = (Dog) getServletContext(} .getAttr1bute("dog"};~U

lr.,.lIt 6!rk~6s/

6d{J

7\

\:.. Ai';6 eSJlIf.ja 6 c:/CY/6f!is: " + dog. getBreed ());

//65 a-l-n.vf.s6

SeI'VIe+e6~J.

Se

out. println ("Dog' s breed

/ls+el7f,F' -IlII1Ci611(J(Jj

.pSe 4'56 17';6-IlIl1t:l611IJYj 1r~IJI JlIe tif.SC6bl""'e~6S Vfl.~6S recebel' lI/tI el7tJrhle AillIlRs,irhl'xcerlt'1I7 65e-l-8reetiO se +e17-1-'U'hlfJSt.ahllJ.l' c l"Jel"Jf"y~ !J65

" !J65 VIJ.tes-l-al' altIrAirS allf. () ~+()ti() serv,i:e sr.;tl ct.a~tlti6 pe/fJ. l'lm.etl"fI.ve; p

e l"J6t.6wer

retorna_ precisa fazer a conversao . " O orna uma String. Ou seja, voce Mas o getInitParameter retd t resposta o ge tAttributeO ' mas o retorno . S do precisa conver er a 'budo diretamente a uma trmg. getlnitParameterO pode ser atrl 1 s cdigos escritos noS exames que portanto, no seja iludi~o por aque e no usam uma tA "b t ("dog"l' '" conversao: ~ Dog d = ctx.ge ttrl U e /' (Considere ctx como um ServletContext.)t:

o getAttributeO

un;.~~~~:;~:~C

1I '('''fl.d6

voc est aqui

il>'

173

configurando um Iistener no DD

Escrevet1do O Peploytltettt PescriptorAgora, informamos ao Container que temos um listener para esta aplicao, usando o elemento . Este elemento simples - s precisa do nome da classe. S isso.

ListenerTester com.example.ListenerTester

ListenerTester /ListenTest.do breed Great com.example.MyServletContextListener Dane CIJJ1S+f'lIt,..

Pl"ecisa",,,s JedI> C6I'IffJ(.f6

i '" "'",'i1t.f li'" !,((NA"',"JeleplJ.f'tI.

!,41't1. ti. fJ.p'tCIJ.{;(J. p,..esfJ.

t>

lls.fe"e'"

6 b65

174 captulo 5

atributos

e lsteners

1'11'\.9

e:x1stem

YerhUntels dl9ttS

r:

Espera a... como voc est informando ao Container que isso um listener para os eventos do ServletContext? No parece ser um elemento XML para o , ou algo que diga para que tipo de evento serve este listener. Porm, eu percebi que voc tem um "Serv\etContextUstener" como parte do nome da classe. assim que o Container entende? Pelo nome?

1\: No.

No h nenhuma conveno de nomes. Ns s fizemos assim para tornar mais bvio o tipo de classe que criamos. O Container descobre ao inspecionar a classe e notar a presena da interface listener (ou interfaces; um listener pode implementar mais de uma interface listener).

r:

Isto significa que existem outros tipos de listeners na API servlet?

I\..: Sim,

existem vrios outros tipos de listeners que falaremos em um minuto.

voc est aqui ~

175

compilando e distribuindo

o lsterner test

COtMpile e

distribua..;-

L.eirJJI'f;"'Sf',

rubfj 1;veperhl7j4

40

Vamos fazer tudo funcionar. Eis os passos:

( .rev welJspps fica 41;1./1caA/4VItI CDltl a SIIfJ. fl':'1"ifi. es+ro.Jw.fJ.,,(e Jll'el-f.I'4sJ

o Compile as trs classesElas esto todas no mesmo pacote ...

f

If I'fi.") ffJ.1'fJ.es.fa tJ.p'tca{i/J. s-h Jtl'e.ff.I'It> Jeve es.f41'Jei'1.f1'6 JE) Ji'l'e.ff.I'It> webpfsP(lJ 1;/II'IC4+

e Crie uma nova aplicao no Tomcat Crie um diretrio chamado listenerTest e coloque-o dentro do diretrio webapps do Tomcat. Crie um diretrio chamado WEB" INF e coloque-o dentro do diretrio listenerTest. Coloque o seu arquivo web.xml diretrio WEBINF.nO

Crie um diretrio de classes dentro do WEB-INF. Crie uma estrutura de diretrios dentro das classes, que coincida com a estrutura do seu pacote: um diretrio chamado com, que contm o exemplo.

e

Copie seus trs arquivos compilados para dentro da estrutura de diretrios da sua aplicao no TomcatlistenerTest/WEB-INF/classes/com/example/Dog.class listenerTest/WEB-INF/classeS/com/example/ListenerTester.class listenerTest/WEB-IN~/Classes/com/example/MyServletContextListener.class

e Coloque o seu Deployment Descriptor web.xml no diretrio WEB-INF desta aplicao.listenerTest/WEB-IN~/web.xml

e176

Distribua a aplicao, desligando e reiniciando o Tomcat.5

atributos

e Iitlatf.

Q

VatBOS experitBetttarAbra seu browser e vamos direto ao servlet. Ns no nos incomodamos em fazer uma pgina HTML. Por isso, iremos acessar o servlet, digitando a URL do mapeamento servlet no DD (ListenTest.do).

A raa do co : Great Dane

rroubleshootit1gSe voc receber um NullPointerException, voc no recebeu um Dog do getAttributeO. Verifique o nome da String usado no setAttributeO e certifique-se de que ele coincide com o nome da Strin