© CasadoCódigo TodososdireitosreservadoseprotegidospelaLeinº9.610,de10/02/1998. Nenhumapartedestelivropoderáserreproduzida,nemtransmitida,semauto- rizaçãopréviaporescritodaeditora,sejamquaisforemosmeios: fotográficos, eletrônicos,mecânicos,gravaçãoouquaisqueroutros. CasadoCódigo Livrosparaoprogramador RuaVergueiro,3185-8ºandar 04101-300–VilaMariana–SãoPaulo–SP–Brasil CasadoCódigo Sumário Sumário 1 Introdução 1 1.1 Umpoucodehistória . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Ondevocêvaichegarcomesselivro? . . . . . . . . . . . . . . . . . . . 2 2 OcomeçodeumprojetocomVRaptor 3 2.1 Vantagensedesvantagens . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Oprojeto—Lojadelivros . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3 Criandoosprojetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.4 CriandoumHelloWorld . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.5 Criandoosprojetosdalivraria . . . . . . . . . . . . . . . . . . . . . . . 11 3 Crieoseuprimeirocadastro 17 3.1 Criaçãodosmodelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2 CriandooCadastro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.3 Complementandoocadastro . . . . . . . . . . . . . . . . . . . . . . . . 26 4 OrganizaçãodocódigocomInjeçãodeDependências 33 4.1 CompletandoofuncionamentodoController . . . . . . . . . . . . . . 33 4.2 InversãodeControle:InjeçãodeDependências . . . . . . . . . . . . . 40 4.3 ImplementandoaEstante . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.4 Criandoobjetoscomplicados-ComponentFactory . . . . . . . . . . . 48 4.5 Tempodevidadoscomponentes-Escopo . . . . . . . . . . . . . . . . 50 4.6 Callbacksdeciclodevida . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.7 Outrostiposdeinjeçãodedependênciae@PostConstruct . . . . . . 55 i Sumário CasadoCódigo 5 Tomandoocontroledosresultados 57 5.1 Redirecionandoparaoutrométododomesmocontroller . . . . . . . 57 5.2 Disponibilizandováriosobjetosparaasjsps . . . . . . . . . . . . . . . 59 5.3 Maissobreredirecionamentos . . . . . . . . . . . . . . . . . . . . . . . 60 5.4 Outrostiposderesultado . . . . . . . . . . . . . . . . . . . . . . . . . . 61 6 Validandooseudomínio 67 6.1 Internacionalizaçãodasmensagens . . . . . . . . . . . . . . . . . . . . 72 6.2 Validaçãofluente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6.3 OrganizandomelhorasvalidaçõescomoBeanValidations . . . . . . 77 6.4 Boaspráticasdevalidação . . . . . . . . . . . . . . . . . . . . . . . . . 80 7 IntegraçãoentreSistemasusandooVRaptor 85 7.1 Serializandoosobjetos . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 7.2 Recebendoosdadosnosistemacliente . . . . . . . . . . . . . . . . . . 93 7.3 Consumindoosdadosdoadmin . . . . . . . . . . . . . . . . . . . . . 95 7.4 TransformandooXMLemobjetos . . . . . . . . . . . . . . . . . . . . 99 7.5 AproveitandomelhoroprotocoloHTTP-REST . . . . . . . . . . . . 101 7.6 Usandométodoserecursosdamaneiracorreta . . . . . . . . . . . . . 104 7.7 UsandoRESTnonavegador . . . . . . . . . . . . . . . . . . . . . . . . 108 8 DownloadeUploaddearquivos 109 8.1 Enviandoarquivosparaoservidor:Upload . . . . . . . . . . . . . . . 109 8.2 Recuperandoosarquivossalvos:Download . . . . . . . . . . . . . . . 115 8.3 OutrasimplementaçõesdeDownload . . . . . . . . . . . . . . . . . . 118 9 Cuidandodainfraestruturadosistema:Interceptors 121 9.1 Executandoumatarefaemváriospontosdosistema:Transações . . . 121 9.2 Controlandoosmétodosinterceptados . . . . . . . . . . . . . . . . . . 125 9.3 Evitandoinstanciaçãodesnecessáriadeinterceptors:@Lazy . . . . . . 128 10 Melhorandoodesigndaaplicação:ConversoreseTestes 137 10.1 Populandoobjetoscomplexosnarequisição:Conversores . . . . . . . 138 10.2 TestesdeunidadeemprojetosqueusamVRaptor . . . . . . . . . . . 153 11 Próximospassos 157 ii CasadoCódigo Sumário 12 Apêndice:MelhorandoausabilidadedaaplicaçãocomAJAX 161 12.1 Executantoumaoperaçãopontual:Remoçãodelivros . . . . . . . . . 163 13 Apêndice:ContainersdeInjeçãodeDependência 171 13.1 PicoContainer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 13.2 SpringIoC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 13.3 GoogleGuice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 13.4 CDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 14 Apêndice:PluginsparaoVRaptor 181 14.1 VRaptorJPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 14.2 VRaptorHibernateeVRaptorHibernate4 . . . . . . . . . . . . . . . . 183 14.3 VRaptorEnvironment. . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 14.4 VRaptorSimpleMaileVRaptorFreemarker . . . . . . . . . . . . . . . 187 14.5 Agendamentodetarefas:VRaptorTasks . . . . . . . . . . . . . . . . . 189 14.6 Controledeusuários:VRaptorSACI . . . . . . . . . . . . . . . . . . . 191 14.7 Criandooseupróprioplugin . . . . . . . . . . . . . . . . . . . . . . . 194 15 Apêndice:FuncionamentointernodoVRaptor 197 15.1 InicializaçãodoServidor . . . . . . . . . . . . . . . . . . . . . . . . . . 197 15.2 Definindoospapéisdoscomponentes:estereótipos . . . . . . . . . . 202 15.3 TratamentodeRequisições . . . . . . . . . . . . . . . . . . . . . . . . . 207 15.4 CatálogodeInterceptors . . . . . . . . . . . . . . . . . . . . . . . . . . 208 15.5 MaisinformaçõessobreofuncionamentodoVRaptor . . . . . . . . . 215 iii Capítulo1 Introdução 1.1 Um pouco de história Hámuitotempo,desenvolverumaaplicaçãowebemJavaeraumatarefamuitotra- balhosa. Porumlado, tínhamososServletseJSP,nosquaistodootratamentodas requisiçõeseramanualecadaprojetoouempresaacabavacriandoseuprópriofra- mework—“O”framework—paratrabalhardeumaformamaisagradável.Poroutro lado,tínhamosváriosframeworksquesepropunhamaresolverosproblemasdadifi- culdadedesetrabalharcomosServlets,masquelheobrigavamaescrevertoneladas de XML, arquivos .properties e a estender classes ou implementar interfaces parapoderagradaraesseframework. Nesse cenário surgiu a ideia de um framework mais simples, que facilitasse o desenvolvimentowebsemtornaroprojetorefémdassuasclasseseinterfaces. Sur- giaoVRaptor,criadopelosirmãosPauloSilveiraeGuilhermeSilveira,em2004na UniversidadedeSãoPaulo.Em2006foilançadaaprimeiraversãoestável:oVRap- tor2,comaajudadoFabioKung,doNicoSteppateváriosoutrosdesenvolvedores, absorvendováriasideiaseboaspráticasquevieramdoRubyonRails. 1.2. Ondevocêvaichegarcomesselivro? CasadoCódigo Em2009,oVRaptorfoitotalmentereformulado,levandoemcontaaexperiên- ciaobtidacomoserroseacertosdaversãoanterioredemuitosoutrosframeworks daépoca. Aversão3levaaoextremoosconceitosdeConvençãosobreConfigura- çãoeInjeçãodeDependências,emquetodososcomportamentosnormaispodem ser mudados facilmente usando anotações ou sobrescrevendo um dos componen- tesinternos—bastando,paratanto,implementarumaclassecomainterfacedesse componente. Além disso, esta nova versão possibilita criar de uma maneira fácil não apenas aplicações web que rodam no browser, mas também serviços web que seguemasideiasdeserviçosRESTful,facilitandoacomunicaçãoentresistemasea implementaçãodeAJAXnobrowser. 1.2 Onde você vai chegar com esse livro? OobjetivodesselivroémostrarmuitoalémdousobásicodoVRaptoresuascon- venções. Mais importante que aprender essas convenções é entender a arquitetura interna do VRaptor e como criar suas próprias convenções, adaptando o VRaptor paraasnecessidadesespecíficasdoseuprojeto.Sabercomoascoisasfuncionamin- ternamenteémetadedocaminhoandadoparaquevocêtenhaumdomíniosobreo frameworkesesintaconfortávelparafazeroquequisercomele. Durante esses mais de três anos do VRaptor 3, tenho respondido as mais vari- adas dúvidas sobre o seu uso no GUJ (http://www.guj.com.br) , o que nos ajudou muito a modelar as novas funcionalidades e descobrir bugs. Mas, muito mais do queisso, mostrou-nostodoopoderdaextensibilidade: mesmoosproblemasmais complexosenecessidadesmaisespecíficasdosprojetosconseguiramserresolvidos sobrescrevendoocomportamentodoVRaptorusandoosmeiosnormaisdasuaAPI ousobrescrevendoumdeseuscomponentes. Neste livro você vai ver o uso básico e esperado, junto com o que considero boas práticas e uso produtivo das ferramentas que esse framework proporciona. Mastambémcompartilharvárioscasosdousonãoesperadoecomotambéméfácil implementá-los. Portanto,esselivroépraquemquerentendercomofuncionaoVRaptorecomo aproveitartodooseupoderesuaextensibilidadeparatornarodesenvolvimentode aplicaçõesomaisfácileprodutivoquantopossível. Estáprontoparacomeçar? 2
Description: