use a cabeça jsp & servlets
TRANSCRIPT
- 1. "Scidade de Ensino Sunerior da PamffJaElogios 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 Eme 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 quevoc tem agora nas mos! Os livros da srie Use a Cabea! nos tornaram melhores professores."- Philippe Maquet: Instrutor Snior da Loop Factory, BruxelasElogios 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 nahora 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 softwareutilizando tecnologias baseadas em Java, estou em constante busca por materiais de apoio queofeream motivao e uma linguagem compreensiva direcionada para o exame, mas que ao mesmotempo 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 avanadaque eu dou de Desenvolvimento de Aplicaes para Empresas. Parabns para os autores; continuemcom 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, olivro Use a Cabea! Java traz um grande nmero de questes prticas, que outros ttulos tratam comoo temvel exerccio para o leitor ...Ele inteligente, irnico, descolado e prtico - existem poucoslivros com estas caractersticas e que so capazes de ensinar sobre serializao de objetos e protocolosde execuo em rede ao mesmo tempo."- Dr. Dan Russel, Diretor de Pesquisas Experimentais eCientficas com Usurios, IBM Almaden Research Center (eprofessor de Inteligncia Artificial na Stanford University).Que maneira maravilhosa de aprender!!! EU NO CONSIGO LARGAR ESTE LIVRO!!! Meufilho de 3 anos acordou Ih40 da manh, e eu o col>queide volta na cama segurando o livro e umalanterna, 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 GUIcomo voc jamais viu. De um jeito diferente e descolado, os autores transformam a aprendizagem emJava em uma empolgante experincia, do tipo qual ser a prxima surpresa?" .- Warren Keuffel, Revista Software Development.
2. 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 olivro todo em 10 dias ..." - Basavaraj Devershetty( " ... a nica maneira de saber o valor de um tutorial saber se ele realmente ensinar bem. Use aCabea! Java excelente para ensinar. Tudo bem, eu pensei que ele fosse bobinho ... mas, me dei contade 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 materialdo Use a Cabea! EJB eu consegui uma tima pontuao (91 %) e estabeleci um recorde mundialcomo 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 comcaractersticas GUI! Com seu formato revolucionrio e elaborado com perfeio, o livro oferecevantagens que outros ttulos sobre Java simplesmente no conseguem ... Prepare-se para um passeiorealmente extraordinrio pelo universo Java."- Neil R. Bauman, Diretor Executivo e capito da GeekCruises (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 comum 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 bemdividido entre quebra-cabeas e histrias, questionrios e exemplos, que voc obtm uma abrangnciaquehenhum 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 OReilly: Existe umOReilly para issoz. Eu o escolhi, pois muitas outras pessoas que eu admiro o classificaram comorevolucionrio e eu descrevi uma tcnica totalmente diferente para este livro. Eles estavam (esto)certos ... Sem fugir do tpico formato da OReilly, eles conseguiram um formato cientfico, mas bemaceito. 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 - comos colegas ... Se voc quer ENTENDER Java, compre logo o seu."- Andrew Pollack, www.thenorth.com 3. Sociedade de Ensino Superbr da Paat1ira"Lembra quando voc estava no jardim de infncia? No? Bem, e quando voc aprendeu pela primeiravez o alfabeto? dificillembrar? Bem, no faz mal. Lendo o Use a Cabea! lava, voc vai voltara se divertir enquanto aprende ... Para aqueles que se interessam por aprender novas linguagens deprogramao e no vieram da rea de cincia da computao ou da programao, este livro umapreciosidade ... Ele torna divertido o aprendizado de uma linguagem dificil de computao. Espero queexistam mais autores interessados em quebrar o velho e corriqueiro modelo tradicional do estilo deescrever. 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 aindaestou no comeo do livro, mas o que me encantou foi que, mesmo estando com sono naquela primeiranoite, 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... muitodificil escrever um bom livro ... preciso muito tempo para explicar os assuntos, em uma seqncianatural e cujo foco o leitor. muito trabalho. Muitos autores, notoriamente, no esto prontos para odesafio. 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 deComponentes para a Web? E como eu fao para que meu videocassete grave umjogo de futebolenquanto 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 deexcees (erros), redes (sockets) e multitarefas, at como agrupar suas pilhas de classes em um nicoarquivo de instalao -, este livro completssimo ... Se voc gostar do estilo, estou certo de que ir adorar olivro 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 outrolivro (aquele sobre EJB tambm) de uma forma to brilhante. Porm, agora eles nos surpreenderamcom 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 aprendertudo da maneira como ensina este livro."- Anshu MishraEu trabalhei com EJB h cerca de 4 anos e o achei uma baguna s avessas. Depois de ler asespecificaes 2.1 e 2.0, eu descobri que apenas uma t*** 3 fumegante que ficou maior. Seu livrorespondeu maioria das incontveis perguntas que martelavam meu crebro de amendoim e permitiu-me 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 nosexerccios para o crebro." - Miehael Yuan, autor, Enterprise J2ME 4. se a Cabeca Servlets...:>& JSPTMSegunda EdioNo seria fantstico se existisse um livro sobre Servlets que fosse mais interessante do queapagar spam da sua caixa demensagens? Talvez isso seja uma iluso ...Bryan BashamKathy SierraBert BatesRio de Janeiro.2008 5. Use a Cabea Servlets & JSpTM Alta Books Editora - Starlin Alta Con Com Ltda 2008Do original Head First Servlets and JSPTM.Authorized translation of the English edition of Head First Servlets and JSPTM 2st Edition 2008 OReil/y ,Media,lnc. ISBN: 978-0596102340 This translation is published and sold by permission ofOReil/yMedia, 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, semautorizao prvia por escrito da editora, poder ser reproduzida ou transmitida sejam quais forem osmeios empregados: eletrnico, mecnico, fotogrfico, gravao ou quaisquer outros. Todo o esforofoi feito para fornecer a mais completa e adequada informao, contudo a editora e o(s) autor(es) noassumem responsabilidade pelos resultados e usos da informao fornecida. Recomendamos aosleitores testar a informao, bem como tomar todos os cuidados necessrios (como o backup), antes daefetiva 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 errostcnicos ou de contedo; porm, nem sempre isso conseguido, seja por motivo de alterao desoftware, interpretao ou mesmo quando alguns deslizes constam na verso original de alguns livrosque traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br. a seo Erratas, onderelataremos, 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, sejaexpressa ou implcita.Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercialso 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 podemter sido utilizados, e desde j a Editora informa que o uso apenas ilustrativo e/ou educativo, no visando aolucro, favorecimento ou desmerecimento do produto/fabricante.Produo Editorial: Editora Alta Books Coordenao Editorial: Roberto Baptista BarrocoTraduo: Eveline Vieira Machado Reviso: Fernanda RigamondReviso Tcnica: Helder Borges Diagramao: Equipe Alta BooksImpresso no Brasilo cdigo de propriedade intelectual de 10 de Julho de 1992 proibe expressamente o uso coletivo semautorizao dos detentores do direito autoral da obra, bem como a cpia ilegal do original. Esta prticageneralizada nos estabelecimentos de ensino, provoca uma brutal baixa nas vendas dos livros a pontode impossibilitar os autores de criarem novas obras.Editora Alta BooksRua Viva Claudio, 291 - JacarRio de Janeiro - RJ CEP 20551-010 Tel: 21 3278-8069 Fax: 21 3277-1253 www.altabooks.com.br [email protected] 6. Esse livro dedicado a todos aqueles que decidiram que EL implicit object 7. os autoresOs "procurados" da srie Use a Cabea! (e deste livro) Bryan BashamBeart BatesBert um antigo desenvolvedor Kathy gosta de teoria daBryan tem mais de vintee arquiteto de software, mas aprendizagem e assuntos anos de experincia emum perodo de 10 anos em relacionados mente desde adesenvolvimento de software,inteligncia artificial o fezpoca em que era designer deincluindo um perodo comse interessar por teoria dajogos (ela escreveu jogos parasoftware de automaoaprendizagem e treinamento a Virgin, MGM e Amblin) eavanada usando tcnicasvia computador. Ele passou a desenvolvedora em I.A2 Grande de I.A na NASA Eleprimeira dcada de sua carreiraparte do formato da srie Use tambm atuou em umacomo desenvolvedor viajandoa Cabea! foi desenvolvidoconsultoria, desenvolvendopelo mundo e ajudando clientes enquanto lecionava Interatividade aplicaes comerciais em 00como a rdio Nova Zelndia,Usando Novas Midias, no personalizadas. Atualmente,o The Weather Channel e aprograma de extenso de Bryan Desenvolvedor derede de entretenimentos Arts Estudos em Entretenimento Cursos da Sun, com nfaseand Entertainment Networkda Universidade da Califmianos princpios de design em(A&E) em suas transmisses.(DCLA). Recentemente, seJava e em 00. Ele j trabalhouAtualmente, ele membro datomou instrutora-chefe da em diversos cursos de Javaequipe da Sun responsvel pelo Sun Microsystems e ensina osda Sun, incluindo JDBC,desenvolvimento de diversosinstrutores de Java a divulgaremJ2EE, Servlets e JSP, alm deexames de certificao em Java,as mais novas tecnologias Desenvolvimento de Softwareincluindo o recente SCWCD. desta linguagem. Alm disso,utilizando 00. Ele foi tambmBert um antigo e incorrigveldesenvolve diversos exameso primeiro designer dos examesaficionado pelo GOl e vempara certificaes Sun, incluindo SCWCD, nas verses originaltrabalhando h bastanteo SCWCD. Junto com Bert e atual.tempo em um programa. OBates, ela tem aplicado Bryan pratica o Zen Budismo,Java h de se tomar umaextensivamente os conceitos dajoga Ultimate Frisbee, adoralinguagem expressiva o srie Use a Cabea! no ensino som e pratica o ski telemark.suficiente para que ele finalize de milhares de desenvolvedores.seu projeto. Ele um bomEla fundou uma das maioresguitarrista e, atualmente, estcomunidades em Java noexperimentando o banjo.mundo virtual, a javaranch.Sua mais recente aventuracom, premiada em 2003 e 2004foi a compra de um cavalocom o Prmio Produtividade emislands, o que dever trazerDesenvolvimento de Software.novos desafios aos seusEla adora correr, esquiar, montarconhecimentos na rea de a cavalo, andar de skate etreinamento ...cincias esotricas.VIII 8. contedo(Sumt19) IntroduoXIX Por que usar Servlets & JSPs: uma introduo 1 Arquitetura da aplicao web: viso geral de alto nvel37 Minitutorial do MVC: praticando com o MVC67 Sendo um servlet: request e resposta 93 Sendo uma aplicao web: atributos e listeners 147 Estado de conversao: sincronizando o bean/entidade 223 Sendo um JSP: escrevendo cdigos em JSP281 Pginas sem scripts: escrevendo JSPs sem scripts 343 As tags customizadas so poderosas: usando a JSTL439 Quando nem a JSTL o bastante: desenvolvendo tags customizadas499 Distribuindo sua aplicao web: distribuio da aplicao web601 Mantenha em segredo, mantenha seguro: segurana da aplicao web 649 O poder dos filtros: wrappers efiltros 701 Padres de Design Enterprise: padres e Struts 737 Apndice A: TestePreparatrio Final791 ndice 865IntroduoSeu crebro pensando em Servlets. Aqui est voc tentando aprender algo, enquantoseu crebro lhe presta o favor de certificar-se de que tal aprendizado no serinterrompido. Ele pensa, " melhor reservar espao para coisas mais importantes, comoqual animal selvagem evitar e se esquiar sem roupa ruim mesmo". Ento, como vocvai induzi-lo a pensar que sua vida depende do conhecimento em Servlets? A quem se destina este livro?XX Ns sabemos o que seu crebro est pensando XXI Metacognio XXlll Domine seu crebrpxxv O que voc precisa para este livro XXVI Passando no exame de certificaoXXVlll Os revisores tcnicos XXX Agradecimentos XXXI IX 9. 1Por 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. Principais elementos do fluxo Objetivos do Exame 2 de solicitao: O mtodo HTTP (a ao de se~ executada) A~ 451Usando as tags e 455Com a , h trs maneiras de incluir contedo460Customizando o que voc inclui462Fazendo o mesmo com 463A para todas as suas necessidades de hyperlink465Crie suas prprias pginas de erro468A tag . Semelhante a try/catch ... mais ou menos 472E se voc precisar de uma tag que NO esteja na JSTL? 475Preste ateno ao 480O que pode existir no corpo de uma tag482O tag handler, o TLD e o JSP483A taglib apenas um nome, no um local 484Quando um JSP usa mais de uma biblioteca de tags487 () .H-ritr.rlc.te #fler+4.f;tJ ,lll.prN.ltLlsiJ 4!JJ"CwsadeshItvrc,IV;" 1"+(;5f~f~d",("4S +Prhwl-e &1/4",1-""$ "1I+r"s)-I/1-",1+ L"",dhede: J""5 ---.----/ A"drew1Lf.""k/,{Jtlse fl.ee,l-ish (~lA.adaftaXXX introduo 30. introduo J.tU ct~J.t.fdefine um formulrio(que geralmente oferecei.0)lIItas eS+Q.lllttJsuSQ./IlftJ-as elllt um campo para a entrada de dados)/IltJS StJS eXt!.l!fi(JS;o cabealho de primeiro nvelselelllt 1t141"$sil!flesft. StJ4Sdefine os limites do header do documento st.leltl llilfJ.Slespec+tv4Sdefine os limites do documento HTML /a.f p61ZUedefine um tipo de entrada em um formulrio es-ra asvl Il
um novo pargrafoIfrM~,) o ttulo do documento HTMLvoc est 7 39. escrevendo HTMLo que vocescreve ...(o HfMUImagine que voc est criando uma pgina de login. O HTMLsimples poderia se parecer com isto: 4::-- {J1f Ce.lf!ifl1+:1/4 /frMLALogin Page tt +~ es+: fJ.11/"I1t.adfJ.del1+lt:.de viria +~ de tfJ.I:51fJ.1t:.; 4 11t de c/e.C41 ti 1t~elf!i IrItus V If!ifl14S lJl1de 3velflrl.s.(Lelrlble-se; SkylersLogin Page +~ fJJvflrl JfSVS(J;
fJ. seI !Ma) tC Jeci/ihl.lJS vSQ-la tlJlser sl~/eslf!iitS Je@
Name: abel"-!-v"4; ele el7+l"a.elll lIId6 de de pI"4CeSSallle~4d6 I/rK.4.L e ex-!!e a / / p~lP;a ." t/SVfJ.I"it>. ~valJd bl"wsel" elJclJ-!-I"Qlllav -!-~de Iw..~e..., ele jel"a V+l"a sllct-!-a{iltrrppal"14,,. bvscal" 6 l"ecvl"sespecllteadlJ. / AJes-h ca.SIJ; 6 bl"wsel" !al"a. Vllla.SejVlJda sllcl+a.{i I/rrp pal"a b-h"a 1w..4jelll descl"i+. lJaf~flf!lmc" ti" sellIlt1tJ1 Ca""I"IItUQ.(J 4f1iclJ.g;fJ dle1ff) eXfA..f-a.htt1ff C"ht(J alie f"ddo. 1M elas f6f"alit c"/(JctAdas 1() selr/liA.rJf. S,!f"IIi"JtJf"servidor Mas e se eu quiser, digamos, que a hora atual aparea na minha pgina? E se eu quiser uma pgina com contedodinmico? Eu no poderia teralgo como uma varivel dentro do meu HTML? f. se 3l1lSelhtS,f!1cD.ixo.f" o.5l1hta CiHSo. V4f"1fJ.llel [ da f>~I"l1aHrKA.L?The current timei8 [insertTimeOnServer].c- MMMM,C~GqJ8lligr~cOllipGGr~qA,CGD- MMMM,C~GqJ8lligr~cOllipGGr~qA,CG8GJGC~8GJGC~BGGrp~llirlB- MMMMC~GqJ8lligr~cOlli8~"uVqACGJ24 56. introduo e arquiteturaMas algutHas vezes voc precisa de tHais doque s o servidor Mas como isso vai ajudar? Meusclientes so todos clientesweb. O browser s conhece oservidor ... ou seja, ele no vai sercapaz de chamar aquela outraaplicao. o servidoroutra aplicao do servidorIsto no problema. Eu cuidarei deentregar 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 pessoaparticipou do trabalho.outra aplicaodo servidorvoc est 25 57. quando um servidor no o bastanteVuas coisas que o servidor no faz sozinho As Ph1nclSInstantnelBSe voc precisa de pginas instantneas (pginas criadasdinamicamente e que no existiam antes da solicitao) e n9 eXIstem antes deda capacidade para escrever/salvar dados no servidor (que lsignifica escrever em um arquivo ou banco de dados), vocser telta a s91lclta-9.Eno pode contar apenas com o servidor. C9m9 tqz.er uma pblna1 Contedo dinmicoB11t[., de tepente.A aplicao que roda no servidor disponibiliza somentepginas estticas, porm uma outra aplicao "assistente", A s91lcltay9cbet;a. qcom a qual o servidor pode se comunicar, pode construirpginas dinmicas instantaneamente. Uma pgina dinmicaapllca-9 beIpet ~~escteve"poderia ser qualquer coisa, desde um catlogo at um 9 BINIL, e 9 setVld9tweblog, ou at mesmo uma pgina que escolha imagensaleatoriamente para exibi-Ias. tet9tna a9 clIente. Quando em vez disto: Voc quer isto: The curenttime isThe curenttime isalways 4:20 PM [insertTimeOnServer]on the serveron the serveralways4:20 PMon theserver 2 Salvando os dados no servidorQuando o usurio envia os dados em um formulrio, o servidoranalisa os dados e pensa: "E a? Eu devo me preocupar?".Para processar esses dados, salv-Ios em um arquivo oubanco de dados, ou at mesmo para us-Ios na criao dapgina de resposta, voc precisa de outra aplicao. Quando oservidor recebe uma solicitao para uma aplicao helper, eleconsidera que aqueles parmetros so destinados ao assistente.Assim, o servidor passa os parmetros, fornecendo aplicaouma forma de gerar uma resposta ao cliente. 26 captulo 1 58. introduo e arquiteturao fernto t1o-Java para uttta aplicao helperque roda tiO servidor o "C&I~~A maioria dos programas CGI escrita como scripts em Perl,mas vrias outras linguagens podem servir, incluindo o C, oPython e o PHP. (CGI significa Common Gateway Interface- Interface de Passagem Comum -, e no nos importamos porque ele chamado assim.)Usando o CGI, veja abaixo como funciona uma pginadinmica que possui a data atual do servidor.oservidor o usurio dica em um~-,link que tem uma URL,que chama um CGI emaplicao vez de uma pgina do servidoresttica.Cliente ..Cliente )aplicao do servidor servidorparmetrosaplicao helper 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 parmet- ros do GET ou POST. servidorA aplicao helper constri a novapgina (que tem a data atual inserido)e devolve o HTML ao servidor. ~)Clienteaplicao helperPara o servidor, o HTML da aplicaohelper uma pgina esttica. servidorA aplicao helper [Japlicao do servidorfechada e o clienterecebe de volta umapgina HTML contendoa data atual, agoraesttica, como parte voc est aqui ~ 27 59. dois lados, CGI e Ser,;ietsOs Servletse o CG-I aruaIM COlMOuIMa aplicaohelper no servidorPreste ateno na conversa dos nossos dois faixas-pretas sobre os prs e os contras do CGI e dos Servlets.CGIServletso CGI melhorque os Servlets. Ns criamos osCom todo o respeito, mestre, existem muitasscripts CGI em Perl na nossa empresa, pois todovantagens em se usar o Java, em vez do Perl, paramundo sabe PerI. essas coisas que voc quer fazer com o CGI.Eu acho que legal usar Java, se voc souber. Desempenho, por exemplo. Com o Perl, oMas certamente, no valer a pena para ns servidor tem que rodar um processo superpesadomudar para Java. No h nenhuma vantagem.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 doIsto no diferente do Java ... O que voc chamaServlet so tratadas como threads de um nicode JVM? Cada ocorrncia da JVM no umServlet em execuo. No existe overhead aoprocesso superpesado?carregar a NM, as classes e tudo mais ...Eu vejo que voc esqueceu muita coisa. Eu no esqueci, mestre. Mas no so todos osAtualmente, os servidores web so capazesservidores que podem fazer isso. Voc est sede manter um nico programa Perl rodando referindo a um caso isolado que no se aplicaentre as solicitaes dos clientes. Por isso, seua todos os programas CGI em PerI. Porm, osargumento de que ele mais pesado no valeServlets sero sempre mais eficientes quando issode nada. 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 coisacompatvel com o CORBA pode ser umcliente J2EE.Eu no quero dizer um cliente para umprograma J2EE, e sim um cliente que um J2EE.Um Servlet rodando em um container J2EE podeChega, estou atrasado para minha aula de Pilates.participar da segurana e das transaescomMas no pense que acabou. Vamos terminar issoenterprise beans e existem ...mais tarde. continua ...Eu duvido que todos saibam PerI. Eu gosto doPerl, mas todos somos programadores Java aquina empresa; ento, preferimos Java. 28 captulo 1 60. introduo e arquitetura o I/Sil~l. J.iji.f(J, t/W(J, u~l-.Solicitao~Resposta11 HTTP/UComplete as caixasGET /test1lBeer1.htm .WicKedysmart.comescrevendo o que acontece Host. www1 /5 o (Macintosh ...user-Agent: Mozl a .durante cada passo noprocesso. Esta uma cpiada pgina 18. Ou seja, ao terminar, volte l para BeerLogin Pagecomparar suas respostas. Seleet a beer type ar buy beermaking supplies?
Select a beer
Buy supplies
Sd~i ervl or 1 HTIP/1.1 2000K Set-Cookie: ... BeerLogin 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 .fffI.#isa{i(JBeer Login PageS~(J,
ff4l-;lJ.tifl. c.o~ St/Cf!S SlJ.Select a beer type or buy beer
making .supplies?O Selccr a beerC Buy $upplesvoc est 29 61. uma
rpida olhada nos servletsServlets Desmistificados(criar,
distribuir, executar)Pois , os novatos em servlets j podem parar de
prender arespirao; aqui est um guia rpido para criar, distribuir e
executarum servlet. Este guia pode gerar mais perguntas que
respostas -no se assuste! Voc no precisajaz-Io neste exato momento.
Oapenas 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). Ch1Servletjava weh.xml8Crie 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).importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;
public void doGet(HttpServletRequestrequest,HttpServletResponse
response)publicclass ChlServlet throwsextends HttpServlet
IOException{{ ~ PrintWriter out ~ response.getWriter(); ou t .pr in
tln (" " + rrrJl4.L IPJSf;l"it/.t) ""+vw, PI"t)51"fJ.""(J. Java. "
J ";. e"",J l""HF s Chapterl Servlet" +;1"1J!t)+ "
" + today + "" + ""); IV! java.util.Datetoday ~ new
java.util.Date(); "46 ti! w,es""(J?8Crie um deployment descriptor
(DD) chamado web.xml e ponha-o no diretrio ete.c..- (J1tIJ.
clfJ.Sse J4VIJ.. ChapterlServlet-11"", e IIsad"IIIJ efew,fl1+1Jli!
1Iw, "I"Sdtll$ selvle-f.s. p.n"r(~ 4(jC{;jl+4/~ellfi Internalnamel
I~sele de ~{;jiJ{;jw,(! foo.Servletl flJ Internal name
2foo.Servlet2 .................Ii! Internalname lc~ss /Publicl tl
ti e1ew,el+/ ~ lisa ItI, IS+tlftl I.IIP~~li!: ti Ijt:;w,f! t ftl,I4
Internal name2/Public2 ;I Z.I.ISI WtlJcllilJS 11048 2 79.
arquitE1tW"a de alto nvelMas espere! retlt tltais coisa que voc
pode fazer COtlt o UUAlm de mapear URLs aos servlets verdadeiros,
voc podeusar o DD para personalizar outros aspectos da sua
aplicao,incluindo atribuies de segurana, pginas de erro,
bibliotecasde tags, informaes sobre a configurao inicial e, se for
umservidor J2EE completo, voc pode inclusive declarar que o
de,p19fmentde,SCtlpt9l"estar acessando enterprise javabeans
especficos. (DD) 9te,l"e,ce,umNo se preocupe ainda com os detalhes.
O ponto crucial,por enquanto, que o DD oferece uma manira de
me,cUllsm9 ~doolfltad9"modificar declaradamente a sua aplicao, sem
alterar ocdigo- fonte! pata a cust9m1zay9 dasPense nisso ...
significa que mesmo aqueles que no sosuas apllcly9e,s, se,m
t9Cmprogramadores Java podem personalizar sua aplicao Java,sem
precisar arranc-Io das suas frias ao sol.n9 c9dlg9--t9nte,!N9
exSbiompethuntlS Idl9tlsr: Estou confuso. Olhando para o DO,voc
ainda no tem nada que indique oOs Benefciosdo DO Reduz a
necessidade de alteraoverdadeiro nome do caminho do servlet! do
cdigo-fonte que j foi testado.Apenas diz o nome da classe. Isto
aindano responde pergunta de como oPermite que voc ajuste os
recursosContainer usa aquele nome de classe para da sua aplicao,
mesmo que vocencontrar um arquivo de classe de um no possua o
cdigo-fonte.servlet especfico. Existe ainda UM OUTRO Permite que
voc adapte suamapeamento em algum lugar que diga que aplicao de
acordo com diferentestal nome da classe, mapeia para tal arquivo
recursos (como bancos de dados),em tal lugar? sem ter que
recompilar e testar nenhum cdigo.1: Voc prestou ateno. Voc est
certo, Facilita a manuteno daspois colocamos apenas o nome da
classe informaes dinmicas sobre(totalmente qualificada para incluir
o nome do segurana, tais como listas de controlepacote) no elemento
. Isso de acessos e funes de segurana.porque o Container tem um
lugar especfico Permite que aqueles que noem que procurar por todos
os servlets para os sejam programadores modifiquemquais voc
especificou um mapeamento no DO. e distribuam suas aplicaes,Alis, o
Container usa um sofisticado esquema enquanto voc d mais atenode
regras para encontrar um par entre a URLs tarefas mais
interessantes. Porque chega da solicitao do cliente, e uma exemplo,
se o seu guarda-roupasclasse Java real localizada em algum lugar
doest apropriado para uma viagemservidor. Mas entraremos neste
assunto emao Hava.um captulo mais adiante (em Distribuio).
Porenquanto, o mais importante que voc develembrar que voc pode
fazer isto mapeando. 49 80. Bob se corresponde no siteHistria: Job
Cot1stri Uit Site de Et1cotrtrosMarcar um encontro est dificil hoje
em dia. Quem temtempo, quando tem sempre um outro disco para
serdesfragmentado? Bob, que quer uma fatia desse mercadovirtual (o
que sobrou, pelo menos), acredita que criar umsite de encontros
especfico para nerds o seu passaportepara deixar o emprego
Dilbertiano1 que ele tem agora.O problema que Bob j um gerente de
software htanto tempo, que ele est, digamos, por fora das
prticasatuais de engenharia de software. Mas ele conhecealguns
conceitos bsicos, um pouco de Java e j leu umpouco sobre servlets.
Ele ento faz um projeto rpido ecomea a escrever o cdigo ... Input
your state Handle ~I ~GeekDatesAge OS ~I ~! ~ _ Attributes ~! _
Exceptionsl~_ Refactor DQLQuery Modify your profile:[profile
hereJI===~-===__50 caplitulo 2 81. arquitetura de alto nvelEle
cotMea a construir utMa poro de servlets ... UtMpara cada pginaEle
pensava em ter um nico servlet, cheio de testes if, masdecidiu que
servlets separados seriam mais 00 - cada servletdeveria ter uma
responsabilidade, como a pgina de questionrio,a pgina de cadastro,
a pgina com os resultados da busca, etc.Cada servlet ter toda a
lgica de negcio que precisa paramodificar ou ler o banco de dados e
exibir o HTML de volta comos dados da resposta do cliente.
IIdeclaraesde import public classDatingServletextends
Http$ervlet{public voiddoGet(HttpServletRequestrequest,
HttpServletResponse response) throws IOException { II a lgica de
negcio entra aqui, dependendo II do que este servlet deve fazer
II(escrever para o banco de dados, fazera query, etc.) PrintWriter
out = response.getWriter(); II escreve a pgina HTML
dinmicaout.println( ~something really uglygoes here") ; 101HI1
IonOI 1010100001.0 lQHllOO 010101101101lOllOl1010100001.0f)
servle-l-fa~ 4 ?l.le10111100 lClOlOl lClOlOlO(110101.101C101ele
precise par3.prtlCe:ssal" a 100101010110101010
InputDQLServlet1001010101S4IiClh{i4 (C4"M4/;,serir
(J~SignupServlet101101 101101DoDQLQueryServlet Jat/4 4(J prtIC(Jrlu
#tt![J WIOIOOOOIO 1010100 010101 101(1101 Je: t/aJ4s) e:,,
1.0101010 1001010101 web Accept 19nup ervlet1/1714
#tarespt!#tse,server/container10110l1Ja a
145,o.Je10110110101000010pa51;,a Je
respal1se,10101000101011010101101010101001010201
AcceptProfiJeChangesServletJ~ clte#t+e MainPageServet
InputProfileChangesServJetc~Jij~ t/avoc est aqui ~ 51 82. 80b
adiciona JSPsMas fica horrvel e ele acrescetrta os JSPsAquelas
declaraes printlnO irritantes para sadade resposta se tomam
realmente terrveis muitorapidamente. Ele l sobre os JSPs e decide
fazer o design desteJSP est muitocom que cada servlet faa qualquer
que seja atranqilo. Agora. o cdigo doservlet est mais claro...
cadalgica de negcios de que ele precise (query no servlet roda sua
prpria lgica e chama um JSP especfico parabanco de dados, inserir
ou atualizar um novotratar o HTML que ser usado naregistro, etc.) e
encaminhe a solicitao para resposta, separando a lgica denegcio da
apresentao.um JSP, que far o HTML para a resposta.Ele tambm separa
a lgica de negcio daapresentao ... e j que ele andou lendo
sobredesi~n, ele sabe que separar as preocupaes um Otimo Negcio.II
declaraes de import public classDatingServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse
response)throws IOException { II a lgica de negcio entra aqui, II
dependendodo que este servlet deve fazer II(escrever para o banco
de dados, fazer a query, etc.) II envia a solicitao a uma pgina JSP
especfica II em vez de tentar exibir o HTML II junto com os dados
de sada }._..-1.., AcceptPrOfileChanlj.~~.sSe~lel InpulSignupJSP
AcceplSignupJSP InputProfileChangesJSPAcceplProfileChangesJSP
MainPageJSP InpulDQLJSPDoDQLQueJYJSP DoDQLQueryJSP/ lJib ib "J)"O
cllf!l;.f.efl"eel;ct.e lilI"IYoVI!J.I"I4J 4t1e~7 e c/tcl). 11t!J
!I4L bI:J.f:a I~ s.f.eel;vi tlIYo4 slJlil+ali" Hrrp POSrfal"4 a
D"J)$L$vel"].O sel"vtJ,,1" ",ell ct.alYofJ.f!I1CalYol;"t.aJ4 J-sP
o.fNprltJ.JlJ, O ,)-sp CtIJl1s+rfJta N:sffJl1se Hrl..-tLliCt+fJ.ji
fJ serv1e+; servle+ execv+a a y,tler 1;" btJ.l1ctIJ JfJ.Js e
f!11+ifJ.a ~es e t.l Jev()/ve.52 capitulo 2 83. arquitetura de a/to
nvelMas etrto o seu aiMigo diz: "Voc ESr usando MVC, certo?Kim quer
saber se o servio de encontro pode ser acessadoa partir de uma
aplicao GUI Swing. Bob diz: "No,eu no pensei nisso." Ento, Kim
fala: "Bem, isso no problema porque eu estou certo de que voc usou
MVC,ento ns podemos preparar num instante um cliente GUISwing, que
possa acessar as classes lgicas de negcio."Bob: "Glup."Kim: "No me
diga ... voc no usou MVC?"Bob: "Bem, eu separei a apresentao da
lgica denegcio ..."Kim: "J um comeo ... ma~-ne adivinhar ... a
lgicado seu negcio est toda dentro de servlets?!"Bob percebe,
rapidamente, porque ele se tomou gerente.Porm, ele est determinado
a fazer isto corretamente. Ento,ele pede a Kim uma explicao bem
rpida sobre MVC.Com o MVC a lgica de negciono fica apenas separada
daapresentao ... ela sequer sabe queEXISTE uma apresentao.A essncia
do MVC que voc pode separar a lgica denegcio da apresentao, mas
ponha algo entre elas para que algica de negcio possa agir sozinha
como uma classe Javareutilizvel, sem precisar saber nada sobre a
view.Bob estava quase l, separando a lgica de negcio daapresentao,
mas sua lgica ainda tem uma forte ligaocom a view. Ou seja, ele
misturou a lgica de negcio noservlet, o que significa que ele no
poder reutilizar sualgica em outros tipos de view (como um GUI
Swing ouat mesmo uma aplicao wireless). Sua lgica est presaem um
servlet, quando deveria estar em uma classe Javastndalone que ele
pudesse reutilizar!voc est53 84. o padro de design MVCo Padro de
Projeto Model~View~ComrollerMVc) cot1serta isto (Se Bob tivesse
entendido o padro de designMVC, ele saberia que a lgica de negcio
nodeveria estar inserida em um servlet. Ele teriapercebido que com
a lgica de negcio embutidao M9del*VleW*C9ntt91letno servlet, ele
ficaria "em maus lenis" casoalgum dia tivesse que acessar o servio
de encontro (MVC) tet1tl l 1991clde neg9c19de uma maneira
diferente. Como na aplicao t9tl d9 set"let e l 09190lemGUI Swing.
Ns falaremos mais sobre o MVC (eoutros padres) mais adiante, mas
voc precisa de um ~~M9de19" - uml llrtlglum rpido entendimento
agora, pois o tutorial queconstrumos no final deste captulo usa o
MVC.dlSseJl"l, plqnl e teutJl1z"e1.Se voc j est familiarizado com
ele, ento voc O lVl9de19 l 09mblnly9 d9S~sabe que o MVC no
especfico para servletse JSPs - a clara separao da lgica de negcio
dadld9S de neg9c19 (09m9 9 e5tld9apresentao igualmente vlida para
qualqueroutro tipo de aplicao. Porm, com aplicaesde um 0ltt1nb9 de
09mptls) eweb realmente importante, porque voc nunca 95 mt9d95
(tegtl5) Lue 9tetlm deveria considerar que sua lgica ser acessada
apenas da web! Estamos certos de que vocnesses dld9S. trabalha
neste negcio h tempo suficiente para saber que a nica garantia em
desenvolvimento de software : a especijicao sempre muda. o MVC no
mundo Servlet & JSPCONTROLADORRetira da solicitao do usurio
OSdados de entrada e interpreta o queeles significam para o
modelo.Obriga o modelo a se atualizar edisponibiliza o estado do
novo modelopara a view (o JSP). VIEWMODELO Responsvel pelae o
estadoverdadeira lgica Abriga a do modelo. Em apresentao. Ela
outras palavras, ele conhece recebe o estado do modelo doas regras
para obteno e atualizao do estado. Controlador (embora O contedo de
um Carrinho de no diretamente; oComl?ras (e as regras sobre o
Controlador pe osque fazer com isso) seria parte dados do modelo em
um Vlewqo Modelo no MVC. lugar onde a View possa E a nica parte do
sistema encontr-Io). Tambmque se comunica com o a parte que
recebebanco de dados (embora ele os dados de entrada provavelmente
use outro do usurio que volta ao objeto para a verdadeira
Controlador.comunicao com o DB, mas guardaremos este padro para
mais tarde ...). 54 captulo 2 85. arquitetura de alto nvelAplicando
o padro MVC na aplicao de encontrosPois bem, Bob sabe o que precisa
fazer. Separar a lgica denegcio dos servlets e criar urna classe
Java normal paracada um ... para representar o Modelo.Com isso, o
servlet legtimo ser o Controlador, a novaclasse para a lgica de
negcio ser o Modelo e o JSP sera View. 1111101lGllCllGUOJ. -0/
10101MClllll 111101001l0>-0-I1G100 010>-0101010 1
1"101_.""""" ~ Ej~ J>ooo(},,,,,, DoDQLQueryJSP -.::."?" "li" ...
;.1voc est 55 86. sim, mas isso um bom ?Neste tMotMemo, seu atMigo
KitM d utMa olhadaKim aparece e diz que embora esse SEJA um
projetoMVC, ele ruim. Claro, a lgica de negcio foi colocadaem um
Modelo, e os servlets atuam como Controladorestrabalhando entre os
Modelos e as Views, para que oModelo possa be brain-dead about the
Views2 Isso tudo muito bom. Mas olhe para todos aqueles pequenos
servlets. Que projeto mais fraco! ObserveO que elesfazem mesmo?
Agora que a lgica de negcio todos estes cdigos duplicados em cada
servlet. Voc tem queest "guardada" com segurana no Modelo, o
Controlador adicionar o mesmo cdigo geraldo servlet no est fazendo
nada alm de alguns trabalhos de aplicao, como segurana, nacomuns
para esta aplicao e, ah sim, ele atualiza o Modelomaioria dos
servlets.e coloca a View para funcionar.Mas o pior que toda aquela
simples lgica de aplicao o o repetida em cada um daqueles malditos
servlets! Sealgo requerer alterao, ter que ser alterado em todos
oslugares. A manuteno de um trem destroado est por vir."Sim, eu no
gostei muito deste cdigo duplicado", dizBob. "Mas o que mais eu
posso fazer? Naturalmente,voc no quer que eu ponha tudo em um
simples servletnovamente? Como isso funcionaria?"56 87. de a/to
nvelExiste utMa resposta?Ser que o Bob dev ria volta para apenas um
Controladorde servlet para evitar cdigo duplicado? Isso seria um
modelo 00 ruim, pois os servlets estorealmente fazendo coisas
diferentes? O Keanu Reevesluta mesmo Kung Fu? D oEXERCITE SUA
MENTEDeixe isto para voc meditar. o que ns vamos fazer.O que voc
acha? Voc sabe a resposta? EXISTEuma resposta? Voc concordaria com
Bob edeixaria os servlets como eles so, ou colocariao cdigo dentro
de um nico Controlador deservlet? E se voc usar mesmo apenas
umControlador para tudo, como ele saber qualModelo e View chamar?A
resposta para esta pergunta no vir antesdo final deste livro, ento
pense nisso poralguns momentos e depois coloque numathread em
background na sua mente ... voc est aqui...57 88. captulo 2 -
reflexo Usando o MVC no mundo servlet & JSP, cadaum destes trs
componentes (JSP, classe Java eServlet) desempenha um papel MVC.
Circule"M", "V" ou "C", dependendo de qual parte doMVC o componente
executa. Circule apenas umaletra por componente. MO Container
oferece sua aplicao web Vsuporte em comunicaes, gerenciamentodo
ciclo de vida, suporte a multithread, Csegurana declarada e suporte
para JSPs,para que voc possa se concentrar em suaJSPprpria lgica de
negcio.O Container cria um objeto request Me response que os
servlets (e outras Vpartes da aplicao) podem usar paraconseguir
informaes sobre a request e Cenviar dados ao cliente. non-servletUm
servlet tpico uma classe que Java c1assestende o HttpServlet e
sobrepeum ou mais mtodos de servio quecorrespondem aos mtodos HTTP
Mativados pelo browser (doGetO, VdoPostO, etc.). CO distribuidor
pode mapear uma classe deservlet servlet para uma URL, que o
cliente podeusar para solicitar tal servlet. O nomepode ser
completamente diferente doverdadeiro nome do arquivo da classe.8O
que as letras MVC representam design MVC? no padro deM significa_V
significa_C significa_58 captulo 2 89. arquitetura de alto nvel
Ap9nte seu lpisQuem o responsvel? Preencha a tabela abaixo,
indicando se o servidor, o container ou um servlet o mais
responsvel pela tarefa listada. Em alguns casos, mais de uma opo
pode ser verdadeira para a tarefa especificada. Para justificar,
acrescente um breve comentrio descrevendo o
processo.TarefaServidorContainer Servletdinmicos HTTPresponse
objetos request e no DDelemento responsesolicitaes Cria osConverte
HTTP no de vidaGerencia umciclos DD contedos umaEncontra URLsobjeto
response emConhece onova tbreadTem uma os preparo para o
comIniciaum nome que coincide objeto oasCoordena referncia de para
tratarumaAcrescenta objetos serviceOe responseApaga os mtodo
requestobjeto responseChama o o HTML ao voc est aquili> 59 90.
servlet e exerccio DDms de G-ela-deltLUm servlet funcionando e o
seu DD so misturados emuma frigideira. Voc capaz de unir os pedaos
de cdigorecortados direita com a listagem incompleta esquerda,a fim
de criar um servlet e um DD que funcionem e cujaURL termine com
/Dice? possvel que alguns cdigos direita no sejam usados!- Servlet
public class extendsHttpServlet { public void doGet(throws
IOException{String
dIInteger.toString((int)((Math.random()*6)+I;String
d2Integer.toString( (int) ((Math.random() *6) +1;out.println(" " +
"HFs Chap 2 Dice Rol1er" + "
" + dI + " and " + d2 + " were rolled" + " ");-DDteS+-4 #/;6 4
+-~de det+-vtfI. ServletRequestrequeStPrintWriter out
response.getWriter(); HttpServletResponse response)
ServletResponseresponse, HttpServletRequest request, PrintWriter
out request.getWriter() ; voc est aqui ~ 63 94. Dois objetos, dois
blocosUl1 PeploYl1ettt Pescriptor(PP) "funcionandoNo se preocupe
com o que isto realmente significa (voc veristo em outros captulos
e far testes). Aqui, ns quisemos apenasdemonstrar um DD web.xml que
funciona de verdade. Ficaramfaltando muitos pedaos a serem nseridos
na tag de abertura nos outros exemplos deste captulo. (Voc pode
perceberporque ns geralmente no nclumos isso em nossos exemplos.)A
forma que geralmente mostramos no livro < Ch3Beer
com.example.web.BeerSelect Ch3Beer /SelectBeer.do A forma que
REALMENTE funcionaL Ch3Beer com.example.web.BeerSelect Ch3Beer
/SelectBeer.do 642 95. arquitetura de a/to nvelCot10 o J!EE cabe
"isso tudoUm set"Id9t de aplIcac;9O Java 2 Enterprise Edition meio
um "superspec"- ele incorpora outras especificaes, incluindo aJ2EE
IncluI tant9 9 C9ntmnet para o Web Container.2.4 e a especificao
JSPJ2EE Istoespecificao Servlets Porm, a especificao 2.0. 1.4Web7
C9m9 9 C9ntain et EJB.1"tambm inclui a especificao Enterprise
JavaBean 2.1para o Container EJB. Em outras palavras, o Container O
]9mcat um C9ntmnetweb para EJB para componentes de negcios.e
oContainer componentes web (Servlets e JSPs) Web7 mas N11.0 um
set"Id9t AUm servidor ter aplicao Contalller web, como umo J2EE
deve de tanto um tota~ente compatvel comde apllcadi9 J2EE c9mplet9.
TContai~er EJB (al~ de outras coisas, c?mo uma JNDIe uma
lmplementaao JMS). O Tomcat e apenas umUm set"Id9t J2EE 1.4
IncluIespecIflcaao J2EE que se referem acordo s :pores daCont~iner
-:eb! Embora esteja de ao Contamer web. a especltlcadi9 Set"let
T2.4 7O Tomcat um Container web e no uma aplicao a especltlcac;9
JSf 2. o e aJ2EE completa, pois ele no possui um Container
EJB.especltlcac;.9 ElB 2.1. iJ2EE ApplicationServerr:Ento o Tomcat
um Containerweb standalone ... isso significa queo Resin.
Geralmente, os Containeresweb standalone so configurados paratambm
existem Containeres EJBtrabalharem com um servidor HTTP (como
ostandalone? Apache), embora o Container Tomcat possaatuar como um
servidor HTTP bsico. Mas,para a funo de servidor HTTP, o Tomcatnem
se aproxima da robustez do Apache.1: Antigamente, digamos, no
anoPor isso, as aplicaes web no-EJB2000, voc encontrava servidores
J2EE mais comuns usam o Apache e o Tomcatcompletos, Containeres web
standalone e configurados juntos - com o Apache comoContaineres EJB
standalone. Hoje, porm,Servidor HTTP e o Tomcat como
Container.quase que todos os Containeres EJBAlguns dos servidores
J2EE mais comunsso parte de servidores J2EE completos, so o
Weblogic da BEA, o JBoss AS deembora existam ainda poucos
Containeres cdigo aberto e o WebSphere da IBM.web standalone,
incluindo o Tomcat evoc est aqui ~65 96. Minitutorial do MVCCriando
e distribuindo uma aplicao Web MVC. Chegou ahora 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 decriar, distribuir e testar. Antes, porm, voc
dever configurar seuambiente de desenvolvimento - uma estrutura de
diretrios para oprojeto que esteja separado da sua aplicao real
distribuda. Emseguida, voc ter que configurar o seu ambiente de
distribuio,de acordo com as especificaesdo servlet e do JSP, e
asexigncias do Tomcat. A partir da, voc estar apto a comear
aescrever, compilar, distribuir e executar. Concordo, construmosuma
aplicao bem pequena. Porm, quase NO existe aplicaoque seja to
pequena e use o MVC. Afinal, a aplicao pequenade hoje o sucesso da
internet de amanh ... este um novo captulo. l 97. objetivos do
exame oficial da SunoDistribuio Aplicao Web Notas sobre a
Abrangncia:2.1 Construir a estrutura de arquivo e diretrios de
Todos os objetivos nesta seo so abordadosuma aplicao que possa
conter (a) contedocompletamente no captulo sobre
Distribuio;esttico, (b) pginas JSP, (c) classes servlet,aqui
daremos apenas uma primeira olhada. Este(d) o deployment
descriptor, (e) bibliotecas de o nico captulo com um tutorial
completo, do incio ao fim. Portanto, se voc pul-Io, podertags, (f)
arquivos JAR e (g) arquivos de classe ter problemas mais tarde,
quando for testarJava. Descrever como proteger os arquivos de
alguns outros exemplos nos prximos captulosrecursos do acesso HTTP.
(no repetiremos cada detalhe novamente).2.2 Descrever o propsito e
a semntica de cadaAssim como nos anteriores, voc no precisarum dos
seguintes elementos do deployment se preocupar em memorizar o
contedo destedescriptor: error-page, init-param, mirne- captulo.
Apenas v e faa.mapping, servlet, servlet-class, servlet-mapping,
servlet-name e welcome-file.2.3 Construir a estrutura correta para
cada umdos seguintes elementos do deploymentdescriptor: error-page,
init-param, mime-mapping, servlet, servlet-class, servlet-namee
welcome-file.68 captulo 3 98. praticando com o MVCVattos cot1struir
utta (pequetW aplicao de verdadeNs vimos a funo de um container,
falamos um pouco sobredeployment descriptors e demos uma primeira
olhada na arquitetura doMVC 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 quedeobrowser mostrar)a arquiteturaalto nvel. 8 Criar o ambiente
de desenvolvimento que usaremos neste projeto (que voc poder usar
para qualqueroutro exemplo no livro). Gl e Criar o ambiente de
distribuio que usaremos neste projeto (que voc poder usar para
qualquer outroexemplo no livro). i~~f~_~_~--...01_ ~o Desenvolver e
testar repetidas vezes os vrios componentes de nossa aplicao. (Tudo
bem, isto mais uma estratgia do que um passo.)Nota: Ns recomendamos
desenvolvimentose testes repetitivos, embora nem sempremostraremos
todos os passos aqui.voc est aqui ~ 69 99. A view do usurioA View
do Usurio para a aplicao "&eer Advisor"(Especialista eltt
Cervejas)Nossa aplicao ser uma esp~cialista em cervejas. Os
usuriospodero navegar em nossa aplicao, responder perguntas
ereceber conselhos valiosssimos sobre cervejas. ~ . ~t~ HrM.l_
eser:z.s.f-a p~tP1a ti": Beer Seleetion
PageN!.sps.f-aeJ?vio,PldlJCIJ~"Select ooer characteristicsClJir
~lIe Color: {light .; j s.f-alI~a IJ clJPlselt. C(l~ base PIo.I~dI)
lISlIfJ.li6.Beer Recommendations JSPtry: Jacks Pale Aletry: Gout
Stoutf: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 100. praticando com o MVCAqui est a arquitetura ...Ainda
que esta seja uma aplicao bem pequena, vamosconstru-la usando uma
arquitetura MVC simples. Desta forma,quando ela se tomar O SITE
mais badalado da web, estaremosprontos para aument-la.Container 1 -
O cliente solicita a pginajorm.html. -~ servlet C(J;r/-lcladcl" 2 -
O Container vai buscar a pginajorm.html. 3 - O Container retoma a
pginaao browser, o usurioresponde s perguntas doformulrio
e...A-pe"llJ.s tllJI componente D/J Java tJldec.f. BeerExpertJavlJ,
sllty.>les). 4 - O browser envia osdados da solicitao
aocontainer. Container 5 - O Container encontra oservlet correto
baseadona URL e passa asolicitao para o servlet. 6 - O servlet pede
ajuda aoBeerExpert. 7 - A classe responsvelretoma uma resposta, a
componentequal o servlet adiciona aosolicitao BeerExpertobjeto
solicitao. 8 - O servlet encaminha asolicitao ao JSP. 9 - O JSP
recebe a resposta doobjeto solicitao. 10 - O JSP gera uma pginapara
o Container. 11 - O Container retoma apgina para o usurio feliz.voc
est 71 101. ambiente de desenvolvimentoCriatldo O seu attbietttede
deset1volvittetttoExistem vrias formas de voc organizar a sua
estrutura de diretriosde desenvolvimento, mas esta a que
recomendamos para projetos depequeno e mdio portes. Na hora de
distribuir a aplicao, copiaremosuma poro disso para onde quer que o
nosso Container especficoqueira. (Neste tutorial, usaremos o Tomcat
5.) ru "" .- pl"eclstI. I,.v"ce 410.6 Jes-feJll"e-!-:1"16---7 Sevs
CtrJlI1flJl1t:l1ffS Vrf!W es-!-:-I-rctrJs e pal"tI. 6
-!-V-!-61"I"o.I) ..... JinlA",i(;sfleal?! a~tlr.jli. .... rr~vi
V6Ce c161:f1. 6S (U3V1vtrJSJA-Je Je -hI"Cfi"S (J" result.jsp
form.html Sfl"vle-!-rJe-vs).J Tr a~vr Sve fica Sf!V f..XfIl1fItJS
Je fI.;vnsJe C4I1fijvlo";.C6l11flJnel1-H::Svtew.
BeerSelect.javaBeerExperLjavaBeerSeleel.elassBeerExperLelassFi.
duave eS-!-lAl?!as tlSfl.I1J a ~jJeepfJ.I"e~ve Sf!PD.ID."lJSS
CIJ"fIJI?f!I?+es d"eS-!-l"v-!-vI"o.-po.Jl"a pal"a
Pfl.C6+e;clJl?-!-I""adal"ellJS c""fIJI1f!I?+es d "t>Jel.pal"tI.
~ve ps StI."S b+el" S Ibenef,cl6s 41l"hiIU"s elele:- I"5anl";4,;a
el" pl"~e-l-6"7 5eN!l?crD."f!I1.f. ela 1?D.",espD.ce p61"-!-d"Maele
e I"f!lI-hlt";aj72 capitulo 3 102. praticando com o MVCCriat1do O
atMbiettte de distribui~o !s+e ti dl"d:l"itJt.(JIrf1el
webl.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 servletFI Ed" WidHlSI hdtM%cd tomcatI -
Reinicie o tomcat!%bin/shutdown.sh% bin/startup.sh2 - Abra seu
browser e digite: http://localhost: 8080/Beer -vI /form.htrnl
http://localhost:80803 - Selecione uma cor de cerveja e diqueem
"Submit"Beer Seleetion PageSckct bcen;l1arncterisocs4 - Se o seu
servlet estiver funcionando, Color::ug~voc dever ver no browser a
resposta doservlet parecida com: Conselhos sobre Escolha de Cerveja
Voc escolheu a cerveja marrom voc est 81 111. classe
modeloCot1struit1do e testat1doa classe tModeloNo MVC, o modelo
tende a ser o "back-end" da aplicao. Em geral, o sistematradicional
que est sendo exposto na web atualmente. Em muitos casos ele apenas
umcdigo Java simples, sem saber que talvez possa ser chamado pelos
servlets. O modelono deve ficar restrito a ser usado por somente
uma nica aplicao, portanto ele deveficar dentro dos seus prprios
pacotes de utilidades.As especificaes para o modeloSeu pacote deve
ser com.example.modelSua estrutura de diretrios deve ser
/WEB-INF/c1asses/com/example/modelEla disponibiliza um mtodo,
getBrandsO, que obtm uma cor preferida (comoum String) e retoma uma
ArrayList de marcas de cervejas recomendadas (tambmcomo
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 modeloainda 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 envolvemconexes com bancos de dados tradicionais e
chamadas a lgicas complexas. Aqui estnosso 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("JackAmber"); C4i11l Cap+VIIl."4S as ,;;ftU"tl.gDes
brands.add("RedMoose");especiQ!"~flI.dtl.s e clJ"P1l!xas dlJ
l!Xl!"P!1J da celv~4.J } else { vSIJ.IdlJ exples sDes
ct:JIdiciIJIais allalsadfl.s.brands.add("JailPale
Ale");brands.add("GoutStout") ; } return(brands);% cd beerVl% java
-d classessrc/com/example/model/BeerExpert.java82 3 112. praticando
com o fvlVCMelhorando o servlet para chatMar o
tModelo,paraobtertMos conselhos VEVE~VAVE...Nesta segunda verso do
servlet, iremos melhorar o mtododoPostO para chamar o modelo para
oferecer o conselho (a versotrs far com que o conselho venha de um
JSP). As alteraesde cdigo so triviais, mas a parte importante
entender aredistribuio da aplicao melhorada. Voc pode tentar
escrever ocdigo, recompilar e distribuir por sua prpria conta, ou
ento virara pgina e seguir adiante ...AP9nte seu lpISMelhorando 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 113. chamando o modelo para o controlador servleto cdigo do
servlet verso doisLembre-se, o modelo apenas Java simples, ento o
chamaremoscomo faramos para qualquer outro mtodo Java: instanciar
aclasse modelo e chamar o seu mtodo! packagecom. example. web; AJ
se eS3f1esa lJ i"Y>tJt; parti. tJ PQC..fe lJIlille " import
import com. example .model. *; javax.servlet.*;
V-8eerl.xper";"es";": lP7seri(Jl). importjavax.servlet.http.*;
importjava.util.*;.J CtIfJ.I1"lJ ulI;a I1"V4 cltJ.sse. importjava
.io. * ; / S.ffJ.IMS 1I;1IJ"iIict/,lUJlJ servle";" (Jrij/P7al e l1"
publicclass BeerSelectextends HttpServlet (publicvoid
doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletExceptionString c =
request.getParameter("color");List result be
be.getBrands(c);BeerExpert = = new BeerExpert();~~
II1S";"fJ.l1clfJ.1 4 classe
8eet1..J(fel;fi!response.setContentType("text/html");PrintWri ter
out = response. getWri ter (); C tllI;I lJ,eli";"8,,,s
()ttll1out.println("BeerSelection Advice
");Iterator it =
result.iterator();while(it.hasNext({out.print("
try: " + it.next(; 114. praticando com o MVCOs pritlcipais passos
para o servlet verso doisTemos duas tarefas importantes a fazer:
recompilar o servlet edistribuir a classe modelo.Compilando o
servletNs usaremos o mesmo comando compilador que usamos
quandoconstruimos a primeira verso do servlet.FI Edl 1" d Hei PI
GoA-3v/~ esh."t6s"ece!JeI?J6V/IfIa..J.,..l!JlI.J.1J IJtje.J.6
S6/tcl.J.lJ.j6. dlJ !t5V"t J4V4 plJ.d,." dell.J."lJ das fJ"t
PIJVClJ "tais adl411.fe;+;3s
(clJl?t.eddlJCIJ"t1Jflep/i"cfJ."e"t6s.J.(/dlJ s66N!ClJd~lJ
scrtp.J.te.J.).a..J.,..l6",.J.IJS e C"tlJ cl?se5""N.IJS,,6.fe,. IJ
IJtje.J." SIJ/lci.J.lJ.jlJDistribuindo o JSPNs no compilamos o JSP
(o Container faz isso naprimeira solicitao). Mas ns temos que:1-
Cham-Io de "result.jsp".2- Salv-Io no ambiente de desenvolvimento,
em: /webl.3- Criar uma cpia dele no ambiente de distribuio, em:
/Beer-vII. result.jsp form.html voc est 87 117. despachando uma
solicitao para o JSPMelhorat1do O servlet para "chatMa(~O JSP
(verso trs)Neste passo, modificaremos o servlet para "chamar" o
JSPpara gerar o resultado (view). O Container providencia
ummecanismo chamado "request dispatching", que permiteque um
componente gerenciado pelo Container chamepor outro. assim que
usaremos: o servlet receber ainformao do modelo, ir salv-Ia no
objeto solicitao eentregar a solicitao para o JSP.Mudanas
importantes que devemos fazer noservlet: I - Adicionar a resposta
do componente modelo ao objeto request, para que o JSP possa
acess-Ia. 2 - Pedir ao Container que encaminhe a solicitao para
"result.jsp" (passo 5).I - O browser envia os dados dasolicitao
para o container. 2 - O Container encontra o servletContainer
correto baseado na URL e passa a solicitao ao servlet. 3 - O
servlet chama o BeerExpert para ajudar. 4 - A classe responsvel
retoma uma resposta, que o servlet adiciona ao objeto solicitao. 5
- O servlet despacha para o JSP.6 - O JSP recebe a
respostaoriginada do objeto solicitao. solicitao 7 - O JSP gera uma
pgina para o Container.8 - O Container retoma a pginapara o usurio
feliz.88 118. praticando com o fvJVCo cdigopara o servlet verso
trsEis aqui o que modificamos no servlet para adicionar aresposta
do componente modelo ao objeto solicitao(assim o JSP poder
recuper-Ia) e como pedimos aoContainer para despachar ao
JSP.paekageeom.example.web;import com.example.model.*;import
javax.servlet.*;import javax.servlet.http.*;import java.io.*;import
java.util.*;publie elass BeerSelect extendsHttpServlet (publie
voiddoPost(HttpServletRequest request,HttpServletResponseresponse)
throws IOExeeption,ServletException(String c ~
request.getParameter(~color");BeerExpert be ~ new BeerExpert();List
result ~ be.getBrands(c); tt161"4 ~vetJ JSPVfJljf.I"til.1" til
1"esUI.f-{).(/c Jevehs I"e~vel"
J(J;Iiresponse.setContentType(~text/html");)I I PrintWriter out =
response. getWriter () ;~sel"vld61"e.sUI.f-4Jti JtiIIout. println
(~Beer SeleetionAdviee
"); 1;fl.l1sll"WiG.~s t"" ...pfJJ"fl. Zue VCe fJ.t;;JtJ. P"SSt1,
A-dicitJl1fJ. u"" l6e.f-6 s6Itct.f-tJ.jfICi
request.setAttribute(~styles", result);.J / I 1_~VSfJ.I".NTe 3ve (j
pI"CCUI"fJ.l1dCiPt:J1"
RequestDispatcherviewrequest.getRequestDispatcher(~result.jsp");~ .
1I1s+fJ.J"JclQ.VI!?! view. forward(request,response);J.
1I~~t~4~~~fJ SfJ..,1"t!1JUt!S.f- dispa.f-ct.el" pal"ti. pf.Jll"
til.Q C"I1.f-fJ.i;;f.1" ave li7i(;tfJ.lt-;t! "J.sfJ., f!I1VifJ.I1J6
paN. e/e til.scllcl-l-a{iJe fJ. l"t!sp"S.f-u.. voc est aqui...89
119. comple, distribuae testeCotMpile,distribua e teste a aplicao
final!Neste captulo, construmos uma aplicao MVC completa(embora
pequena), usando HTML, servlets e JSPs. Voc jpode incluir isso no
seu currculo.Compilando o servlet Usaremos o mesmo comando
compilador que usamos antes: d" WiR I % cd beerVl % javac
-classpath /Users/bert/Applications2/tomcat/common/lib/
servlet-api.jar:classes:.-d classes
src/com/example/web/BeerSelect.javaDistribuindo e testando a
aplicaoAgora hora de redistribuir o servlet.1 - Mova uma cpia do
arquivo .class do servlet para
../Beer-vlIWEB-INF/c1asses/comlexample/web/(novamente, isto ir
substituir o arquivo .class da verso dois anterior).2 - Feche e
reinicie o tomcat.3 - Teste a aplicao via form.html.Beer
Recommendations JSP90 captulo 3 120. praticando com o MVCTudo bem,
ento agora ele sabe fazer uma aplicao MVC, mas ele ainda no tem
nenhuma idia de como usar a linguagem JSP ou JSTL. Eleno sabe nem
usar uma tag customizada, nem umItro. E eu o f1agrei escutando um
CD do Weezer ... e isso foi DEPOIS daquele lbum verde. Ele aindtem
MUITO o que aprender ...Ait1da h tltuitoO que apret1der.A festa
acabou. Voc teve trs captulos inteiros para curtir,escrever um
pequeno cdigo e revisar tudo sobre solicitao/resposta HTTP.Mas
ainda existem 200 perguntas preparatrias esperando por vocneste
livro. E elas comeam no prximo captulo. A menos quevoc j esteja
familiarizado com desenvolvimento e distribuio deservlets, voc no
deveria virar a pgina antes de realmente jazer otutorial deste
captulo.No que estejamos tentando pression-Io, ou faz-Io se
sentirculpado, ou algo parecido ... voc est aqui ~ 91 121. Sendo um
Servlet Ele usou uma solicitao GET para atualizar o banco de dados.
A punio ser a mais severa ... sem aulas de "Iogacom Suzy" por 90
dias.Servlets vivem para servir clientes. A funo deum servlet
receber uma solicitao do cliente e devolveruma resposta. A
solicitao talvez seja simples: "traga-mea pgina de Boas-vindas". Ou
pode ser complexa: "Finalizeo processo do meu carrinho de compras."
A solicitao trazconsigo dados cruciais e o cdigo do seu servlet tem
quesaber como encontr-Ias e utiliz-Ias. A resposta leva ainformao
que o browser precisa para montar uma pgina(ou baixar alguns dados)
e o cdigo do seu servlet tem quesaber como envi-Ias. Ou no ... em
vez disso, seu servletpode decidir encaminhar a solicitao adiante
(para outrapgina, servlet ou JSP).este um novo capitulo" 93 122.
objetivos do exame oficial da Suno Modelo de Tecnologia Notas sobre
a Abrangncia:do Servlet Todos os objetivos desta seo so cobertos1.1
Para cada um dos Mtodos HTTP (como GET, completamente neste
captulo, com exceoPOST, HEAD e assim por diante), descreverda parte
dos cookies, no objetivo 1.3. Grandeo propsito do mtodo e as
caractersticas parte do contedo deste captulo foi comentada no
captulo dois, mas l ns dissemos: "No setcnicas do protocolo do
Mtodo HTTP, preocupe em decorar isto. "listar triggers que possam
levar o cliente Neste captulo, voc TEM que ir devagar,(geralmente
um browser) a usar o Mtodorealmente estudar e memorizar o contedo.e
identificar o mtodo HttpServlet que Nenhum outro captulo cobrir
estes objetivoscorresponda ao Mtodo HTTP.com detalhes; ento, esta a
hora.Faa os exerccios, revise o material efaa seu primeiro teste
preparatrio nofinal deste captulo. Se1.2 Usando a interface
HttpServletRequest,voc no conseguir pelo menos 80% das
respostasescrever o cdigo que retira da solicitao corretas, volte
para descobrir o que voc deixouos parmetros do formulrio HTML, a
escapar, ANTES de passar para o captulo cinco.informao do header da
solicitao HTTP Algumas das perguntas do teste preparatrio queou os
cookies. fazem parte destes objetivos foram colocadas noscaptulos 5
e 6, por requererem um conhecimentoadicional de alguns assuntos que
no explicamos1.3 Usando a interface HttpServletResponse, at aqui.
Isto significa que teremos um nmeroescrever o cdigo que cria um
headermenor de questes preparatrias neste captulo epara a resposta
HTTP, configura o tipo de maior nos prximos, evitando test-lo
naquilo quevoc ainda no viu.contedo da resposta, recebe um streamde
texto para a resposta, recebe um streambinrio para a resposta,
redireciona umasolicitao HTTP para outra URL, ouNota importante:
enquanto os trs primeirosadiciona cookies na resposta. *captulos
abordaram assuntos que servem de base, desta pgina em diante quase
tudo o que voc ver est diretamente relacionado ou explicitamente
parte do exame.1.4 Descrever o propsito e a seqncia deeventos do
ciclo de vida de um servlet: (1) carregar a classe servlet, (2)
instanciar o servlet, (3) chamar o mtodo initO, (4) chamar o mtodo
serviceO, e (5) chamar o mtodo destroyO.*No falaremos muito a
respeito dos objetivos relacionados aoscookies at o captulo que
trata das Sesses.94 captulo 4 123. solicitao e respostaOs Servlets
so cot1trolados pelo CotttaitterNo captulo dois ns vimos as funes
completas do Container na vidado servlet: ele cria os objetos
request e response, cria ou aloca uma novathread para o servlet e
chama o mtodo serviceO do servlet, passando asreferncias de request
e response como argumentos. Aqui vai uma rpidareviso ... o
usurioclica em um link que tem uma URL para um servlet. -,Cliente
request o Container objetos: "v" que a solicitao para um servlet e
cria dois 1) HttpServletResponse 2) HttpServletRequeste --Cliente L
o Container encontra o servlet correto baseado na URL da solicitao,
cria ou aloca uma thread para a solicitao e chama o mtodo serviceO
do servlet, passando como argumentos os objetos request e response.
voc est95 124. Servlet no containerA histria cotttitlua...o o
mtodoserviceO ..) Cliente descobre qual mtododo servlet
chamar,baseado no MtodoHTTP (GET, POST,etc.) enviado pelocliente.
doGet(request, response)o clienteenvia umasolicitao HTTP GET,para
que o mtodoserviceO chame omtodo doGetO doservlet, passando
comoargumentos os objetosrequest e response.e o ..) servlet usa o
objetoresposta para escrever aresposta para o cliente .A resposta
volta atravs Clientedo Container . requestQuando o mtodoserviceO
termina,a thread morre ou Containerretoma para um poolde threads
gerenciadaspelo Container. Asreferncias dos objetossolicitao e
respostasaem do escopo e elesse do mal (prontospara virarem lixo).O
cliente obtm aresposta.96 capitulo 4 125. solicitao e respostaMas a
vida do servlet t1o s issoNs fomos at o meio da vida do servlet,
mas ainda existem perguntas:Quando a classe servlet foi carregada?
Quando o construtor do servlet foiexecutado? Quanto tempo vive o
objeto servlet? Quando o seu servletdeve iniciar os recursos? E
quando ele deve limp-Ias?o ciclo de vida do servlet simples: existe
apenas um estado principal- inicializado. Se o servlet no est
inicializado, ou ele est sendoinicializado (rodando seu construtor
ou o mtodo initO), sendo destruido(rodando seu mtodo destroyO), ou
simplesmente no existe. construtor initO IdestroyOContain~r
webClasse~ervlet Objeto 1"ervlet Ihd o
CtJl1s-l-rV-ftJI7,Ri/I;tl",J4 sfla elas seserlIle-l- ri/o.
(lIcIJt}O i/el/e escrever :Carreoar classe I:::~::Jfi""
CI1S-flfI-I-IJ vse ., po.i/I; Ill1eclJ AServl~t.classC1ll() sev
C"flIfJ.i/ffJl).Instanciar o servlet (o c~nstrutor roda)r Ct.41WJ.J
apel1fJ.SUM Vi2,i/Vt4nfe tiinitOv"i/s.daselvdj deve c~,eff41rlpe ti
~atl1f!l ct.a~ () setlIiceO.A-3(1t ~ 41Je {; ~etlIle+ p/J,ssa
aI>/J,I ar-l-e p J..e: s(la IItJa. serviceO: destrovO o
CffJl1-1-at"llf!tct.a1llfl.palR daIadoGetO ocorre cadaanula o mtodo
initO na mtodo HTTP (GET, vez que existe umasua classe servlet.
DoPOST, etc.) est na solicitao do cliente.contrrio, o mtodo initO
solicitao e chama Em um determinadodo GenericServlet roda. o
respectivo mtodo momento, voc ter aodoGetO ou doPostO.menos, tantas
threadsO doGetO e o doPostOsendo executadas,dentro do HttpServlet
quantas solicitaesno fazem nada, ento de clientes houver,voc ter
que anularlimitadas pelosum ou ambos. Esta recursos ou
polticas/thread morre (ou configurao do colocada de volta em
Container. (Voc pode,um pool gerenciado pelo por exemplo, ter um
Container) quando oContainer que permita serviceO finalizado.
especificar a quantidademxima de threadssimultneas, e quando onmero
das solicitaesdo cliente ultrapass-Ia,alguns clientes teroapenas
que esperar). 100 captulo 4 129. solicitaoe respostaCada solicitao
roda etlt utMathread separada!Voc talvez j tenha ouvido algum dizer
coisas como: "Cada instncia doservlet...", mas isto est errado. No
existem mltiplas instncias de nenhumaclasse servlet, exceto para um
caso especial (chamado SingleThreadModel, denatureza perversa).
Porm, ainda no estamos falando desse caso especial.o Container roda
vrias threads para processar as vrias solicitaes paraum nico
servlet.E cada solicitao do cliente gera um novo par de objetos
request e response .. Container sotiCif.cro Hn-pCat1a dte~-h
fcebe1I1tlQ +I.feaJSf!p4fat1o.pQ.fa caJI! SlJlict/-afi4 e4
C4/J+fJ1Pitf IJlifjCIJ. /J4V4$tjfftA .eCiJ tAresfcs+tA
iJHHf.serv!e+/t.esf~PSe+IJJt:>s3ve serIJ lflftlr+fl.PffS
tlcresceP+a . se viJc es-hvel" VSfl.1JtlH.,-.,-? eI"N;s) c(u;J.les
e ~e4Jers.102 4 131. solicitao e respostaA lt1icializao do Servlet:
quat1do UtM objetotoma-se UtM servleto momento mais orgulhoso da
minha vida quando o Grande Mestre Container me transforma em um
servlet,criando um ServletConfig para mime chamando meu initO. At
ento, eu sou apenas um mero objeto. Mascomo um servlet, eu tenho
privilgios especiais (almdo handshake secreto), como a capacidade
de logareventos, entregar referncias para outros recursos e
armazenar atributos para outros servlets ...Um servlet vai do no
existe para inicializado (que na verdade significa pronto
paraservir s solicitaes dos clientes), comeando com um construtor.
Mas o construtorcria apenas um objeto, no um servlet. Para ser um
servlet, o objeto precisa adquirirpadro de servlet.Quando um objeto
toma-se um servlet, ele recebe todos os privilgios que se tmquando
se um servlet, como a capacidade para usar sua referncia
ServletContext paraobter informaes do Container.Porque em algum
lugar entre o construtor e o mtodo initO, o servlet est no estado
servletSchroedinger*. Voc pode possuir um cdigo para inicializao do
servlet, como receberinformao de configurao da aplicao web, ou
procurar por uma referncia em outrotrecho da aplicao, que ir dar
erro se voc execut-Ia muito cedo na vida do servlet.Contudo, muito
simples se voc se lembrar de no colocar nada no construtor do
servlet!No h nada que no possa esperar at o initO.* Se sua parte
mecnica est um pouco enferrujada,talvez voc queira fazer uma
pesquisano 800glepor "Schroedingers Cat" (cuidado: se voc ama
animais, no a faa). Quando nosreferimos ao estado Schroedinger, nos
referimos a algo que no est nem totalmente morto, nemtotalmente
vivo, mas em algum lugar estranho entre ambos.voc est 103 132.
ServletConfig e ServletContextQuanto vale para voc "ser um
servlet"?o que acontece quandopara c?um servlet vai daqui:o Um
objeto ServletConfil:Um objeto ServletConfig por servlet.Use-o para
passar informaes de tempode distribuio para o servlet (um bancode
dados ou a pesquisa do nome de um No confunda osenterprise bean,
por exemplo) que voc no parroetros do queira fazer hardcode no
servlet (parmetros , ServletConfig coro init do servlet). veja
lst.os parroetros doServletContextl Use-o para acessar o
ServletContext.Os parmetros so configurados noNs realmen~e .no
fal~~~o~~:f:queisso at o proxlmo capl, sDeployment
Descriptor.fundem, vamotantas pessoas se con ra preste plantar uma
semente ago . ateno nas diferenas.lh d Pelos nomes:e Um
ServletContextComece o . an o " nfi"Um ServletContext por aplicao.
(Eles Palavra co gO ServletConfig tem aN" deveriam t-Io chamado de
AppContext.)me que lembra "configuraao .no no ,d t po deUse-o para
acessar parmetros da aplicaoEle lida com valores ~ eO~~gurou para o
(tambm configurado no Deployment . b o que voce c dlStrl til I t)
Aquilo que seu Descriptor) . servlet (um por serv e . voc rvlet
pode querer acessar e queUse-o como se fosse um quadro de avisos
sed mo o nomeno quer fazer hardco e, coIda aplicao, onde voc pode
escreverdum banco de dados, por exemp NO. mensagens (conhecidas
como atributos) queeI tC nfig nao armetros do Serv e o. as outras
partes da aplicao possam acessar Os P N desde que este servlet
esteja (mais sobre isto no prximo captulo). mudarao, d ndo Para
alter-Ios,distribudo e ro aIUse-o para obter informaes do
servidor,voc ter que redistribuir o s~rv et. incluindo o nome e a
verso do Container e a O ServletContext dever-se-la cdhamarI NOnos
eramverso da API que suportada. AppContext (mas e es na N ) pois h
somente um por ate~aoN NO um por servlet. De aphcaao .e .traremos
nestequalquer jeito: n.os en tulo _ isto sassunto no proxlmo caplum
alerta.104 captulo 4 133. solicitao e respostaMas a VERUAUEIRA
fut1~o deUiM Servlet tratar solicitaes. a que a vida do servlet faz
diferena.No captulo seguinte estudaremos o ServletConfig e o
ServletContext, mas por hora,estamos vendo em detalhes a solicitao
e a resposta. Porque o ServletConfig e oServletContext existem
apenas para darem suporte nica e Verdadeira Tarefa doservlet:
tratar as solicitaes do cliente! Portanto, antes de vermos como os
seus objetoscontexto e configurao podem ajud-Io em seus trabalhos,
teremos que voltar umpouco e rever os fundamentos da solicitao e
resposta.Voc j sabe que a solicitao e a resposta so passadas como
argumentos para o mtododoGetO ou doPostO, mas que poderes estes
objetos request e response oferecem? O quevoc pode fazer com eles e
por que voc se importa com isso?Coloque o nome nos Container Web
Classe ServletObjeto Servlettrechos em branco (ascaixas vazias) da
linhado tempo do ciclo devida. (Verifique suas101201respostas com a
linha IonelHil.llU0001011)101(; odo tempo mostrada 1.1(11)
1101.1)101anteriormente neste H,lOto!O1001010101captulo.)Acrescente
tambm suasprprias anotaes parafacilitar a memorizaodos
detalhes.est105 134. solicitao e respostaSolicitaeo e Resposta: a
chave para tudo, e osargutMetttos para o service(}*Interface
ServletRequest Interface ServletResponseG
avax.servlet.ServletRequest)G avax. servlet.
ServletResponse)interfaceinterfaceServletRe uest ServletReslJonse
getAttribute(String) : Objeet getBujJerSizeO : intgetContentLengthO
: intsetContentType(String) : voidgetlnputStreamO :
ServletlnputStreamgetOulputLenght(int) : voidgetLoealPortO : int
getOutputStreamO : ServletOutputStreamgetWriterO :
PrintWriterigetParameter(String) : StringgetParameterNamesO :
EnumerationgetContentTypeOIi MUITOS outros mtodos ...Ii MUITOS
outros mtodos ...Interface HttpServletResponseInterface
HttpServletRequestG avax. servlet.http .HttpServletResponse)G
avax.serv let.http.HttpServletRequest) inteace"mtertaceHtt
S~rvletRes onse .flttpS~rvletB.~qlJ~st addCookie(Coolde) : void
getContextPathO : String addHeader(String name, String value) :
void getCookiesO : Coolde {]encodeRedireetURL(String url) : String
getHeader(String) : String sendError(int) : void getQueryStringO :
String setStatus(int) : void getSessionO : HttpSessionIi MUITOS
outros mtodos ... getMethodO : String Ii MUITOS outros mtodos
...*Os objetos solicitao e resposta tambm so argumentos para os
outrosmtodos HttpServlet que voc escreve: doGetO, doPostO,
etc.106capitulo 4 135. solicitaoe resposta o.. .N9 eXIstemf
ethUntas d19tlS. que voc saiba ~:,~"lU$ exame no usandoOdesenvolver
espera servlets no-HTTP.f: Quem implementa as interfaces para
oHttpServletRequest e o HttpServletResponse?Voc no precisa saber
como usar servletsSo aquelas classes na API?com um protocolo que no
seja HTTP No : entanto, espera-se que voc saiba como aP . N~o. O
Contalner.L . _. __ : As c1a~ses na? esta o na. : hierarquia saber
classes HttpServletRequestvoc TEM que das que o funciona. Logo,API,
pOISfica a cargo dos fabncantes Implementa-:e o
HttpServletResponsesoextenses doIas. A boa notcia que voc no
precisa se :ServletRequest e do ServletResponse, e quepreocupar com
isso. Apenas creia que quando: a maior parte da implementao de umO
mtodo serviceO chamado em seu servlet,:HttpServlet vem, de fato, do
GenericServlet.ele receber referncias para dois excelentes: Mas
isso. O exame entende que voc umobjetos que implementam o
HttpServletRequest e : desenvolvedor HttpServlet.o
HttpServletResponse. Voc jamais se preocupa :com o nome e o tipo
verdadeiros da classeenvolvidos nesta implementao. Tudo que
interessa que voc ter alguma coisa comtodas as funcionalidades do
HttpServletRequest e do HttpServletResponse.Ou seja, tudo o que voc
precisa conhecer so os mtodos que voc pode chamar nosobjetos que o
Container oferece como parte da solicitao! A verdadeira classe na
qualsero implementados no faz diferena - voc se refere aos objetos
request e responseapenas pelo tipo da interface.f: Eu estou lendo
esta UML corretamente? Essas interfaces esto estendendo
interfaces?1: Sim. Lembre-se,as interfaces podem ter sua prpria
rvore de herana. Quando umainterface estende uma outra interface (e
tudo o que elas podem fazer - pois interfaces noimplementam
interfaces), significa que quem implementar uma interface deve
implementar todosos mtodos definidos na interface e em suas
superinterfaces. Isto quer dizer, por exemplo, queaquele que
implementar o HttpServletRequest deve prover mtodos de implementao
para osmtodos declarados nas interfaces HttpServletRequest e
ServletRequest.r: Eu ainda estou confuso com o porqu de existir um
GenericServlet, umServletRequest e um ServletResponse. Se ningum
est fazendo nada, exceto osservlets HTTP ... qual a inteno?1: Ns no
dissemos ningum. Algum, em algum lugar, no sei, est usando o
modelode tecnologia servlet sem o protocolo HTTP. Mas nunca
encontramos ou soubemos daexistncia desse algum.Alm disso, o modelo
servlet possui flexibilidade para atender queles que queiram
us-Iocom, por exemplo, o SMTP, ou talvez um protocolo proprietrio
customizado. Porm, a APIs oferece suporte nativo ao HTTP, que o que
quase todo mundo usa. voc est aqui ~ 107 136. mtodos HTTPo ~todo de
solicitao HffF defitle se o dokt()ou doFost() que rodar HTTP/1.J
Mac os X Mach-Host:
WWW.WckedJysmartcomlpeg,lmage/gif;q~O.2//*;q=o.1 Mach-O; en-US;
rv:L4) GeckofPPC . . lvIac OS X 9 MoZIJa/5.0 (Macintosh;
u;User-Agent:png,rmageJxhtml+xmi,text ptain;q=:O.8,vid Accept:
textlxm Host:www.wicked~mart.(om 20030624 Netscape!7.1
NetsGUs~r-Agent: Mozil20030624Iselect/selectBeerTaste. . GET
text/xrnl,apPlicatfon/xml,apPJicationlAccept-I..anguage:
en-us,en;q==o.5
xhtml+xml.textlhtml;q~.9,text!Plain;q=O,B,Video/x_mn9 POST
Iseleet!selectBeerTaste2.dodo? color~dark&taste~malty HTTP/1.1
Accept:im eILembre-se, a solicitao do cliente sempre inclui umMtodo
HTTP especfico. Se o Mtodo HTTP for umGET, o mtodo serviceO chama o
doGetO, Se for umPOST, o mtodo serviceO chama o doPostO. Voc
continua mostrando o doGetO e o doPostOcomo se eles fossem os
nicos... mas EU SEI que existem oito mtodos noHTTP 1.1.Q o bem
capaz de voc no se importar com os outros mtodos HTTP, exceto o GET
e o POST Sim, existem outros Mtodos HTTP 1.1 alm do GET e POSTo
Temos tambm o HEAD, TRACE, OPTIONS, PUT, DELETE e CONNECT. Todos,
exceto um, tm um mtodo doXXXO na classe HttpServlet. Ou seja, alm
do doGetO e doPostO, temos o doOptionsO, doHeadO, doTraceO, doPutO
e doDeleteO. No existe nenhum mecanismo na servlet da API para
tratar o doConnectO, ento ele no faz parte do HttpServlet. Mas,
enquanto os outros Mtodos HTTP talvez sejam importantes para,
digamos, um desenvolvedor web, um desenvolvedor servlet raramente
usar outro alm do GET ou do POSTo Na maior parte do desenvolvimento
servlet (provavelmente todo), voc usar o doGetO (para solicitaes
simples) ou o doPostO (para aceitar e processar dados de
formulrios), e no ter que se preocupar com os outros.108 captulo 4
137. sol/citaoe re:::postaNa verdade~ possvel que algum outro Mtodo
HffPfaa uma (rpida) apario no exame ...Se voc est se preparando
para o exame, deve ser capaz dereconhecer todos eles e ter pelo
menos uma idia de suas funes. Masno perca muito tempo aqui!No mundo
servlet de verdade, s interessam o GET e o POSToPara o exame, vai
interessar tambm um pouquinho dosoutros Mtodos HTTP. GETPede para
obter a coisa (recurso/arquivo) na URLrequisitada. POST Pede para o
servidor aceitar a informao do corpoanexada na solicitao, e a
entrega para aquilo queconsta na URL solicitada. como um GET com
maiscalorias ... um GET com informao extra enviada coma solicitao.
HEAD Pede apenas a parte do header daquilo que o GETvai retomar.
como um GET sem corpo na resposta.Informa a URL requisitada sem, de
fato, retomar acoisa. TRACESolicita um loopback da mensagem de
solicitao, paraque o cliente veja o que est sendo recebido do
outrolado, para teste ou troubleshooting. PUTDiz para colocar a
informao anexada (o corpo) naURL requisitada. DELETE Diz para
apagar a coisa (recurso/arquivo)na URLrequisitada. OPTIONSSolicita
uma lista dos mtodos HTTP para os quais acoisa na URL requisitada
pode responder.CONNECT Diz para conectar no caso de tunneling. voc
est 109 138. GETe POSTA diferet1a etttre tEr e posro POSTtem um
corpo. Essa a dica. Ambos podem enviar parmetros, mas com o GET, o
parmetro limitado ao que voc pode colocar na linha de Solicitao.fJr
VEI"S4I:J d6O bl1-cdO CQbli;t." fQI"tJ. /servlet .;::,.. com uma
pagma gerada em HTML O servlet usa os dadosNO Idempotentedo POST
para atualizar o banco de dados. voc est 115 144. o posr no
idetltpotenteo HTTP GET usado apenas para conseguir coisase no deve
mudar nada no servidor. Ento um GET ,por definio (e de acordo com a
especificao HTTP),idempotente. Ele pode ser executado mais de uma
vez, semcausar qualquer efeito colateral danoso.O POST no
idempotente. Os dados submetidos nocorpo de um POST podem ser
destinados a uma transaoque no pode ser desfeita. Portanto, tenha
cuidado com afuncionalidade do seu doPostO!oGET idem potente. O
POST, no. Cabe a vocter certeza de que a lgica da sua aplicao
podelidar com casos como o de Diane, em que oPOST aparece mais de
uma vez o GET sempre considerado idempotente no HTTP1.l ... voc
encontre cdigos...mesmo quem parmetroS GETno exa me que uselaterals
, O u..Feitos co. que causem eJ:idem atente de acordo seja, o GET ~
: HTTP. Mascom a especijicassa impedi-Iano existe nada que p~ todo
doGet() de- implementartumno~:u servlet. A d mpoten e nao-l e _ GET
dos clientes deve solicitaao . da ue a SUAser idempo~ente,
a:Fadosqause um efeitocmanipulaao dosre em mente a negativo. Tenha
sem? d HTTP GET e O di.(. ren a entre o meto o metodo do Ge t)do
seu servlet.IJ; J 1! I. N~""4: ",." /"4 V4ri"aS (U:fpUM!.S 141"4 ti
p41IJ.Vr4 "" ,J liifll!lpfrh"ff AJs t.sh."tJS tlslJ."JtJ-aparo. I)
Hr.,-p! serllle-l- ptJ.ra #;6S IItJl-I-o.J4 Jel,~tr&tlt. IJ.
"es""a s6Ilcl-l-tl{" p6Je ser lel-l-a titlas vejes) se", "e"l.tI",a
C6"S~;;~d4 "eSelect beer characteristics
size="l">eXf1icl-/-4it1el1-1-e t!11.f.16;"C()IM D.1I6erll Solicitao HTTP POST POST/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/20030624Netscape/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-aliveL.eIill6re-se; "" () 6r()wser311e5eNJ. es.f.fJ. s6Ite,..f.fJ.{;()~ I , V6Ce 1146frects4 se fN!lJclIffJ.rt1I crit;.-IfJ..JIiIIfJ.Se Eor=~O,ss"iJ SlIe elfJ.se fD.rece 311fMUi6lIelill"4 serlti:((Jr Classe servlet public void doPost(HttpServletRequest request,HttpServletResponseresponse)throws IOException,ServletException StringcolorParam= request.getParameter(~color"); // mais cdigosesclarecedoresaqui...~Is.f.6 c6,-"cti:(e C61i11() III()lIe /I() flJrlllIlfJ.rii~ voc est aqui"119 148. formulrios parmetrosEt1Viat1do e usat1do dois parltetros Formulrio HTML Select beer characteristics
COLOR:lightamberbrowndarkBODY:medium V :n"owst.r e1VU~la "",a es-rfJ.S -r1!f!S tJP5tiff.S " U/IlightheavyJ ! Ir. Sf:;lict..fajfJ.iJ) fJ.SSf:;cta(J, J f:; ii1@"t . 14 i.CO" J.... Nb@~; Solicitao HTTP POSTPOST ladvisorlSelectBeerTaste.do HTTP/l.lHost: www.wickedlysmart.comUser-Agent: Mozilla/5.0(Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:l.4)Gecko/20030624Netscape/7.1Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,textlplain;q=0.8,video/x-mng,image/png, image/jpeg,image/gif;q=0.2,*I*;q~0.1Accept-Language:eD~us,en;q=0.5Accept-Encoding:gzip,defiate Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7Keep-Alive: 300Connection: keep-alive Classe servlet public voiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throws IOException,ServletException String colorParam~ request.getParameter{~color"); String bodyParam ~ request.getParameter(~body"); IImais cdigo aquif}J.u~:IfJ.lt;vei 1S..ft~t15fJ.IJ:: ea h", f) 110./01120 149. 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. Umfonnulrio 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 getParameterValuesOque retoma um
array:String one = request.getParameterValues(~sizes")[O];String []
sizes = 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 150. o objeto
l-fttpSe!VletRequestAlltt dos parlttetros, O que Ittais eu
pOSSOobter de Ultt objeto Reques11As interfaces ServletRequest e
HttpServletRequest possuemuma tonelada de mtodos que voc pode
chamar, mas vocno precisa memorizar todos eles. Sozinho, voc
realmentedeveria ver todas a API para javax.servlet.ServletRequeste
javax.servlet.http.HttpServletRequest, mas aqui ns sInterface
ServletRequestveremos os mtodos que voc mais usar no seu trabalho
(eGavax.servlet. ServletRequest)que podem tambm aparecer no
exame).No mundo real, voc estar com sorte (ou sem
sorte,getAttribute(String)dependendo de sua perspectiva), se usar
mais de 15%getContentLengthQda API de solicitao. No se preocupe se
no ficougetInputStreamQclaro para voc como ou por que voc usaria
cada getLocalPortQuma delas; ns veremos mais detalhes de algumas
delasgetRemotePortQ(principalmente os cookies) mais
adiante.getServerPortQ getP arameter(String) getP arameter
Values(String) A plataforma do cliente e a informao do browser
getParameterNamesQ Ii MUITOS outros mtodos ... String
clientrequest.getHeader(~User-Agent"); Os cookies associados a esta
solicitaoInterface HttpServletRequest Cookie[]
cookiesrequest.getCookies(); Gavax. servlet.http.HttpServ
letRequest) ..HTTPServletReauest A sesso associada a este
clientegetContextPathQgetCookiesQ HttpSession
sessionrequest.getSession();getH
eader(String)getlntHeader(String)getMethodQ O Mtodo HTTP da
solicitao getQueryStringQgetSessionQ StringtheMethod
request.getMethod(); Ii MUITOS outros mtodos ... Um stream de dados
da solicitaoInputStream input request.getlnputStream();122 captuo 4
151. solicitao e res:posta N9 exlst~mYetbuntas Idl9tasr:Por que
algum dia eu iria querer obter uma InputStream da solicitao?I: Com
uma solicitao GET, no h nada alm da informao header da solicitao.
Em outraspalavras, 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
(porexemplo, "color=dark") usando o request.getParameterO, mas
esses valores podem ser enormes. Se vocquer analisar a fundo tudo o
que chega com a solicitao, voc pode usar o mtodo getlnputStreamO.
Comele 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,
headersso sempre Strings! At mesmo o mtodo getlntHeaderO leva uma
String representando onome 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
..). wOs valores retomados dos headers esto sempre no formato
String, mas para alguns casos, a Stringrepresenta um nmero. O
header "Content-Length" retoma o nmero de bytes que compe o corpo
damensagem. O header HTIP "Max-Forwards", por exemplo, retoma um
valor inteiro, indicando quantoshops (saltos de roteadores) a
solicitao pode fazer. (Voc pode querer usar este header se
estivertentando 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" usando o getReaderO: string forwards
request.getHeader(~Max-Forwards"); int forwardsNum =
Integer.parselnt(forwards);E isso funciona perfeitamente. Mas se
voc soubera valor que o header deve assumir como int, vocpode usar
o getlntHeaderO como um mtodo de convenincia para poup-Io da etapa
de conversoda String para int: int forwardsNum =
request.getIntHeader(~Max-Forwards"); getServerPortO,getLocalPortOe
getRemotePortOso confusos! A diferena entre getLocalP~rtQo
getServerPortQdeveria ser auto-e getServerPortQ mais sutzl: o
explicativo ... at que voc se perguntasse getServerPortQ diz "para
qual porta a " para que serve ento