PlugIn Tapestry Autor @picodotdev https://picodotdev.github.io/blog-bitix/ 2019 1.4.2 5.4 A tod@s l@s programador@s que en su trabajo no pueden usar el framework, librería o lenguaje que quisieran. Y a las que se divierten programando y aprendiendo hasta altas horas de la madrugada. Non gogoa, han zangoa Hecho con un esfuerzo en tiempo considerable con una buena cantidad de software libre y más ilusión en una región llamada Euskadi. PlugIn Tapestry: Desarrollo de aplicaciones y páginas web con Apache Tapestry @picodotdev 2014-2019 2 Prefacio EmpecéElblogdepico.devyunosañosmástardeBlogBitixconelobjetivodepoderaprenderycompartir elconocimientodemuchascosasquemeinteresabandesdelaprogramaciónyelsoftwarelibrehastaanálisis delosproductostecnológicosquecaenenmismanos.Lasdelámbitodelaprogramacióncreoqueusándolas puedenresolverenmuchoscasoslosproblemastípicosdelasaplicacioneswebyqueencuentroeneldíaa díaenmitrabajocomodesarrollador.Sinembargo,pordistintascircunstanciasyaseanpropiasdelcliente,la empresaolaspersonaseshabitualquesolomesirvanmeramentecomosatisfaccióndeadquirirconocimientos. Hastaeldíadehoyunadeellaseseltemadelquetrataestelibro,ApacheTapestry. Paraescribirenelblogsolodependodemíydeningunaotracircunstanciasalvomitiempopersonal,escom- pletamentemíoconloquepuedohacerloquequieraconélynotengoningunalimitaciónparaescribiryusar cualquierherramienta,aunqueenunprincipiosoloseaparahacerunejemplomuysencillo,enelmomentoque lleguelaoportunidadquizámesirvaparaaplicarloaunproyectoreal. Pasadosyaunospocosañosdesdequeempecéelblogalláporel2010heescritovariosartículostratandoen cadaunadeellosdiferentestemasrelacionadosconApacheTapestryyquetodaaplicaciónwebdeberealizar independientementedellenguajeoframeworkqueseuse.Conelblogmediviertomuchoperonosesiesla formamásefectivaparadifundirtodaslasbondadesqueyaconozcodeesteframeworkyqueamedidavoy conociéndolo más sigo descubriendo. Ya llevaba pensándolo bastante tiempo y ha llegado un punto en que juntandotodoslosartículosqueheescritoenelblogcompletándolasconalgunacosamáspodríaformarun libroyelresultadoesloquetienesenlapantalladeldispositivoqueusesparaleerlo. ¿Esrealmentenecesarioqueescribieseestelibro?Puessíyno.No,porqueyahayotrosmuybuenoslibrossobre Tapestryalgunosescritosporloscommitersdelframework,comoTapestry5-Rapidwebapplicationdeve- lopmentinJava,quizámejorydeformamáscompletaqueloexplicadoenesteyquealguienconinteréspodría adquirirsinningúnproblema.Ysí,porqueescribiendounoenespañolhaymásposibilidadesdehacérselollegar amientornomásomenoscercano. Miobjetivoconestelibroesdifundirlapalabraparaqueotragentedisfruteconesteframeworktantocomo lohagoyocuandoprogramoconélyfinalmenteaumentaraunqueseaunpocolasposibilidadesdequepueda dedicarmijornadalaboralcompletausándolo(guiño,guiño).Tapestrynotieneel«hype»deotrosframeworks, nillevalaetiquetaágil(aunquepodría)queparecequeahorasinoseleponeaalgono«mola»ynomerece consideraciónperotienemuchascaracterísticasdesdecasisusiniciosenquefuepublicadoenel2002conla versión2queyadesearíanparasímuchosotrosaúnenlaactualidad. Comohabrásnotadoestelibronotehacostadoniuncéntimo,¿porquélodistribuyoalpreciode0,00€im- puestosincluidos?Larazónessimple,porquequiero.Sicobrasealgoporélprobablementelaaudienciaque 3 tuviesenoseríamuyampliaydetodosmodosnosaldríadepobre,siendogratisesperoqueunoscuantosdesa- rrolladoresalmenosloveanporencimasimplementeporculturageneralylocomparenconloqueusenpara programarahora,yaseaStruts,Grails,Play!,Django,Symfony,Silex,RubyonRails,.NETMVCuotrossimila- res.Sideentreesosqueloleenhayunoscuantosqueseanimanaprobarloyamesentiríasatisfecho,siademás algunolousaseparaunproyectorealconéxitomeharíamuyfeliz. Granpartedeestelibroestábasadoenloqueheaprendidodesdeel2004mediantesudocumentaciónoficial yusándoloprincipalmentedeformaautodidacta.Noconstituyeunaguíacompletayexhaustiva,nilopreten- de,simplementeesunmanualsuficientementeamplioparatransmitirallectorlosconceptosmásimportantes yqueunavezaprendidosseacapazdeaprenderelrestoprofundizandoporsímismosiconsigodespertarsu curiosidad.Ladocumentaciónoficialdelproyectoesamplia,buena,completaysuficienteparaaprenderdesde cero(algunasbuenaspartesdeestelibrosonpocomásqueunatraducción)peroademásdeladocumenta- ciónpuramentetécnicaquieroaportarlaexperienciayalgunasbuenasprácticasqueheobtenidocomousuario duranteestosañosydesdemicomienzocomoprogramadornosolodeesteframework. Loquevieneacontinuación Enlossiguientescapítulosencontrarásunaexplicacióndetalladadelascaracterísticasdelframeworkylafor- maderesolverunagranpartedelosaspectosconlosquetienenquetratarlasaplicacionesopáginasweb:el entornodedesarrollo,generarelhtmlconplantillas,lalógicadepresentación,lainternacionalizaciónyloca- lización,lapersistenciadelacapadepresentaciónypersistenciaenlabasededatos,elcontenedordeinver- sióndecontrol,laseguridad,peticionesajaxydatosenjson,enviarformularios,recibirarchivosydevolverlos, comocrearlayoutsparadarunaspectocomúnalaspáginassinduplicarcódigo,reutilizacióndecódigocon componentesyconlibreríasdecomponentes,pruebasunitarias,deintegraciónyfuncionales,assets(estilos, imágenes,javascript)yalgunascosasmásadicionalesenlasquenoentraréenmuchosdetallesperoquedaré lasindicacionesdecomorealizarlascomoelenviódecorreos,generacióndeinformes,gráficas,unaAPIREST yanalizadoresestáticosdecódigoquepuedensernecesariosenalgunoscasos. TeniendoexperienciayhabiendotrabajadoenproyectosrealesconJSP/Servlets,Struts,JSF,GrailsyApache Tapestrymequedoconunadiferenciasignificativaconlaúltimaopcióncomopuedessuponersihededicado unagrancantidaddetiempopersonalaescribirestelibroyelquededicoenmiblog.Tratarédeexponerenlas siguientespáginasmuchosdelosmotivosqueTapestrymedaparaelloyquequizátútambiénconsideres. ¡Empiezaladiversión!¿estáspreparad@? 4 Indice 1 Introducción 13 1.1 Principios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2 Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.3 Unpocodehistoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.4 Opcionesalternativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.5 Arquitecturadeaplicacionesweb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.6 Casosdeéxitoydereferencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2 Iniciorápido 33 2.1 InstalaciónJDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.2 Iniciorápido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.3 Entornodedesarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.4 Integraciónconelservidordeaplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.4.1 SpringBoot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.4.2 SpringBootgenerandounjar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.4.3 SpringBootgenerandounwar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 2.4.4 Servidordeaplicacionesexterno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.5 Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.6 Códigofuentedelosejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 5 INDICE INDICE 3 Páginasycomponentes 53 3.1 Clasedelcomponente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.2 Plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.2.1 ContentTypeymarkup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.3 Parámetrosdelloscomponentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.3.1 Bindingsdeparámetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.4 Laanotación@Parameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.4.1 Parámetrosrequeridos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.4.2 Parámetrosopcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.4.3 Parámetrosinformales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.4.4 Conversionesdetipoenparámetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.5 Laanotación@Cached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 3.6 Conversionesdetipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 3.7 Renderizadodeloscomponentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.7.1 Fasesderenderizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.7.2 Conflictosyordenesdemétodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 3.8 Navegaciónentrepáginas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 3.9 Peticionesdeeventosdecomponenteyrespuestas . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.10 Peticionesderenderizadodepágina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.11 Patronesdenavegacióndepáginas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 3.12 Eventosdecomponente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 3.12.1 Métodosmanejadoresdeevento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 3.13 Componentesdisponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 3.14 PáginaDashboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 3.15 Productividadyerroresdecompilación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6 INDICE INDICE 4 Contenedordedependencias(IoC) 115 4.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 4.2 Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 4.3 Inversióndecontrol(IoC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.4 Clasecontraservicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 4.5 Inyección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 4.5.1 ConfiguraciónenTapestryIoC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 4.6 Tutoresdeservicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.7 Conversionesdetipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.8 Símbolosdeconfiguración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 5 AssetsymódulosRequireJS 141 5.1 Assetsenlasplantillas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 5.2 Assetsenlasclasesdecomponente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 5.3 Minimizandoassets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 5.4 Hojasdeestilo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 5.5 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 5.5.1 AñadiendoJavaScriptpersonalizado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 5.5.2 CombinandolibreríasdeJavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 5.5.3 MinificandolibreríasdeJavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 5.5.4 Pilasderecursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 5.5.5 RequireJSymódulosdeJavascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 5.6 AssetsconWebjars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 5.7 Actualizarversionesassetsincorporadospordefecto . . . . . . . . . . . . . . . . . . . . . . . . 156 7 INDICE INDICE 6 Formularios 161 6.1 EventosdelcomponenteForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 6.2 Seguimientodeerroresdevalidación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 6.3 Almacenandodatosentrepeticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 6.4 Configurandocamposyetiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 6.5 Erroresydecoraciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 6.6 Validacióndeformularios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 6.6.1 Validadoresdisponibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 6.6.2 Centralizandolavalidación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 6.6.3 Personalizandoloserroresdevalidación . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 6.6.4 Configurarlasrestriccionesdevalidaciónenelcatálogodemensajes . . . . . . . . . . . 171 6.6.5 Macrosdevalidación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 6.7 Subiendoarchivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 6.8 Conversiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 7 Internacionalización(i18n)ylocalización(l10n) 177 7.1 Catálogosdemensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 7.1.1 Catálogoglobaldelaaplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 7.1.2 Accediendoalosmensajeslocalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 7.2 Imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 7.3 Seleccióndellocale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 7.4 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 7.5 Convencionesparaarchivospropertiesl10n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 8 Persistenciaenlacapadepresentación 185 8.1 Persistenciadepágina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 8.1.1 Estrategiasdepersistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 8.2 Valorespordefecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 8.3 Persistenciadesesión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 8.3.1 DatosdesesiónexternalizadosconSpringSession . . . . . . . . . . . . . . . . . . . . . . 190 8
Description: