10. Taller de Formación Java empresarial

63
10. Taller de Formación Java empresarial Ing. Laura González Ing. Guillermo Roldós Ing. Juan Herman

Transcript of 10. Taller de Formación Java empresarial

Page 1: 10. Taller de Formación Java empresarial

10. Taller de Formación Java empresarial

Ing. Laura González Ing. Guillermo Roldós

Ing. Juan Herman

Page 2: 10. Taller de Formación Java empresarial
Page 3: 10. Taller de Formación Java empresarial

631

Taller de Formación Java em

presarial

Instalación de Entorno de Trabajo

¿Qué herramientas tenemos que instalar?

Las herramientas que vamos a usar para el desarrollo de aplicaciones bajo la plataforma JEE durante el curso son las siguientes:• Java Developmet Kit (JDK): Conjunto de herramientas para el desarrollo de aplicacio-

nes JAVA. http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-down-

load-346242.html•PostgreSQL: Sistema de Gestión de Base de Datos (del inglés DBMS - DataBase Ma-

nagment System).http://www.enterprisedb.com/products-services-training/pgdownload#windows• JBoss Application Server (JBoss AS): Servidor de Aplicaciones JEE.http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.Final/jboss-as-distribu-

tion-6.0.0.Final.zip/download•Eclipse: Entorno de Desarrollo Integrado (del ingés IDE – Integrated Development

Environment).http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/heliossr2JBossTools: http://sourceforge.net/projects/jboss/files/JBossTools/JBossTools3.2.x/

jbosstools-3.2.0.GA.aggregate-Update-2011-02-16_18-30-44-H329.zip/download?use_mirror=ufpr

¿Qué pasos debemos seguir?

1. Paraempezar,debemoscopiarlacarpetaHerramientas,queseencuentraenelDVDentregadoparaeldesarrollodelcurso,enalgúndirectoriolocalalcualllamaremosenade-lante%TF_JEE%.

2. Instalamos la JDK: %TF_JEE%\Herramientas\1.Java\jdk-6u25-windows-i586.exesiguiendolospasosdelwizarddeinstalación.

Page 4: 10. Taller de Formación Java empresarial

632

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

3. Instalamos PostgreSQL: %TF_JEE%\Herramientas\2.PostgreSQL\postgresql-9.0.4-1-windows.exesiguiendolospasosdelwizarddeinstalación.

4. Instalaciónde JBossAS:Loúnicoquedebemoshaceresdescomprimirel archivo%TF_JEE%\Herramientas\3.JBoss\jboss-as-distribution-6.0.0.Final.zip.

5. Instalación de Eclipse: Al igual que con JBoss solo debemos descomprimir el archivo entregado%TF_JEE%\Herramientas\4.Eclipse\eclipse.zip.Laversióndeeclipseentrega-dacorrespondealaversiónHelios-SR2conlossiguientepluginsdeJBossToolsyainstalados:a. HibernateToolsb. JBossToolsRichFacesc. JBoss WebServices Toolsd. JBossAS Tools

Opcionalmente,seentregaelinstaladordeFirefox5,yaqueesperfectamentecompatibleconlasherramientasqueutilizaremosparaeldesarrolloWEB.Elinstaladorseencuentraen%TF_JEE%\Herramientas\5.Extras\FirefoxSetup5.0.1.exe

¿Cómo integramos Eclipse con JBoss?

El plugin JBossAS Tools (ya instalado en la versión entregada) nos brinda la posibilidad de manejarlaconfiguracióndelJBossdesdeelpropioIDE,ademásdelaposibilidaddeiniciarlo(enmodonormalodebug),reiniciarlo,detenerloyrepublicarlosproyectossinnecesidaddecopiarcarpetas,archivosoutilizarcomandosporconsola.Veamospasoapasocomorealizardichaintegración:1. SobrelavistaServersdamosclickderecho->New->Server.

Page 5: 10. Taller de Formación Java empresarial

633

Taller de Formación Java em

presarial

2. ElegimosJBossAS6.0.

3. SeleccionamoscomoHomeDirectorylarutadondedescomprimimosJBoss\jboss-6.0.0.Final.ConfiguracióndefaultypresionamosFinish.

4. Elpaso3agregaráunnuevoítemenlavistadeServers,sidamosdobleclicksobreélpodemosverlasiguientepantalladeconfiguración.

Page 6: 10. Taller de Formación Java empresarial

634

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Vemos,además,queseactivanlossiguientesbotones:

Page 7: 10. Taller de Formación Java empresarial

635

Taller de Formación Java em

presarial

Taller de Formación Java EETema: Introducción a componentes de

negocio (EJB)1era Parte

1 Introducción

Cuando se va a desarrollar un Sistema de Información de cierto tamaño (o que se espera quepuedacrecerenelfuturo),esnecesariotenerencuentavariosaspectosparasudiseñocomo,porejemplo,elmanejodelaseguridad,accesoaBasesdeDatosygestióndetransac-ciones,escalabilidad,posibilidaddedistribuirlainstalaciónenmúltiplesservidores,etc.LasespecificacionesJEE[1]resuelvenestaproblemáticaatravésdelacreacióndecom-

ponentesdenegocio llamadosEJB,quesimplificanmuchísimoeldesarrollo.La ideaestábasada en el uso de un contenedor de EJB (o EJB Container) que se encarga de gran parte delastareasmencionadasantes,dejandoaldesarrolladorlaimplementacióndelalógicadenegocioparticulardecadaservicio.Deestaforma,secumpleconelprincipiodequecadacomponente de software resuelve la parte de la que es responsable en un sistema débilmente acoplado.

1.1 Qué son y para qué sirven los EJB

LosEJB(porlassiglaseninglésdeEnterpriseJavaBeans,oComponentesdeNegocioJava),tambiénllamadosEnterpriseBeans,soncomponentesdesoftwareescritosenJavaqueencapsulan las complejidades relacionadas con todos los servicios de base necesarios para unaaplicacióndemedianoogranporte,permitiendoqueeldesarrolladorseconcentreen

Page 8: 10. Taller de Formación Java empresarial

636

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

implementar lo realmente importante. Estos componentes no son capaces de ejecutarse por sísolos,sinoquenecesitandeunservidorqueloscontengaylesbrindetodoslosserviciosnecesarios (el Contenedor).Enunaarquitecturaencapastradicional,losEJBseencuentranenlacapalógicay,even-

tualmente,enlacapadepersistencia,comopuedeverseenlaFigura1.

1.2 Cómo funcionan los EJB

CuandosedesarrollauncomponenteEJB,loqueseescriberealmenteesunaclasePOJOjunto con determinados annotations1queindicanlascaracterísticasypropiedadesdedichocomponente.EstaspropiedadessonleídaseinterpretadasporelContainerypermitenaéstedecidir cómo controlar cada instancia del EJB y su ciclo de vida. En un contenedor pueden existirdiferentesEJBs,losquepuedenformarpartedelamismaaplicaciónodemásdeuna.ExistendiferentestiposdeEJB,losqueseránvistosmásadelante,cadaunodeloscuales

tieneunfinespecíficoyesmanejadoporelcontenedordeformadiferente.Eselcontenedor

elquecreaydestruyelasinstanciasdelosEJBdeacuerdoasusnecesidades,asícomogestio-na el ciclo de vida de cada instancia. Esto no es controlable por el desarrollador.Cuandouncliente(seaésteunaaplicaciónJavaounapáginaJSPoJSF)deseaejecutarun

servicioprovistoporunEJB,debeprimerosolicitarunainstanciadelmismoytodalainte-racciónesatravésdelContainer,comoseobservaenlaFigura2.

2 Contenedor de EJB

Comoyasemencionóantes,unContenedordeEJBesunaaplicaciónquecumpleconunaseriedeespecificacionesparaejecutarcomponentesEJB.LasespecificacionesJEEsonprovistasporSun(ahoraOracle)ypuedenserimplementadaspormásdeunproveedor,cadaunodeloscualesimplementasupropiaversióndelasmismas.Existenservidoresgratuitosopagos,cadaunopuedebrindarmayoromenorfuncionalidadperotodosdebencumplirconlasespecificacionesoficiales.EnlaFigura3seobservaundiagramaquemuestracómolosEJBsonejecutadosdentrodeunEJBContainer,yésteespartedeunApplicationServer.UnadelasventajasdeestoesquelosEJBsonmultiplataforma,esdecir,quesondesarro-

lladosunavezynoesnecesariomodificarlossisecambiadeproveedordelContainer.

1Lasannotationssirvenparaexpresarmetadataacercadeunaclase,métodooatributodeformaintegradaconelcódigode la misma.

Page 9: 10. Taller de Formación Java empresarial

637

Taller de Formación Java em

presarial

AlgunosdeloscontenedoresdeEJBcomúnmenteusadosson:• JBossAS[2]esunservidordeaplicacionescompletodondenosoloseejecutanEJBs

sinotambiénaplicacionesWeb,portales,etc.Esmuyutilizadodebidoaqueesunproductoopen-sourcedeexcelentecalidad,robustoyconmuchosañosenelmercado.•GlassFish[3]fuedesarrolladoporSuncomounproductoopen-source,sibienesmás

recientequeJBossestámuyextendidoactualmente.ApartirdelaadquisiciónporpartedeOracle,SunformapartedelpaqueteMiddlewaredeOracle.•WebLogicServer[4]fuedesarrolladoporBEASystemsyadquiridorecientementepor

Oracle,esunproductocomercialmuyrobusto.•WebSphere [5],productocomercialdesarrolladopor IBM, se integra fácilmentecon

otrosproductosdelacompañía.Las responsabilidades principales de un Contenedor son las siguientes:•Manejo del ciclo de vida de las instancias de EJB.•PooldeinstanciasdecadaEJB,dondedebeequilibrarlacantidaddeinstanciasnecesa-

riaspararesponderrápidamentesinconsumirrecursosexcesivamente.•Gestióndetransaccionesparaqueseatransparenteparaeldesarrollador,éstesolamente

debe declarar unas directivas.•Seguridad a nivel de usuarios y roles.• Inyeccióndedependencias,loquepermitelainvocaciónremotadeotrosEJBsinqueel

desarrolladordebaespecificarsuubicación.•SoporteparaWebServices,quebrindanlaposibilidaddeinteractuarconserviciosalo-

jadosenotrasplataformasotecnologías.•Timer para ejecutar eventos cada determinada cantidad de tiempo.

3 Tipos de EJB

ExistendostiposprincipalesdeEJB, losqueseveránenestecapítulo.EstetipodebeespecificarsecomounaanotaciónenlaclaseJavaqueloimplementa.

3.1 Session Beans

Soncomponentesquecontienen lógicadenegocios,puedenversecomoserviciosex-puestosparaserconsumidosporlosclientes,tantolocalcomoremotamente(luegoseverácon mayor profundidad este concepto). Cuando un cliente desea ejecutar una operación de un determinado EJB el servidor (Container) le provee una instancia del mismo para que eje-cute el método deseado sobre ella.

Page 10: 10. Taller de Formación Java empresarial

638

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Existen,asuvez,trestiposdeSessionBeans,determinadosporcómosonmanejadaslasinstancias con respecto a los clientes que consumen sus servicios.

3.1.1 Stateless Session Beans

EstosEJBnomantieneninformaciónacercadelosclientesqueatienden,inclusoesposi-ble que un mismo cliente sea atendido por diferentes instancias del mismo EJB. Cuando un clientedeseaejecutarunaoperaciónpideunainstanciaalContainer,éstetomaunainstanciadedichoEJBdeunpooldeinstanciasdisponibles,ejecutaelmétodosolicitadoydevuelvelainstanciaalpoolsinquequederegistradaningunainformacióndelaoperaciónquerealizó.Estoseobservamásclaramenteen laFigura4(másadelanteseexplicaráelconceptodeProxyqueapareceenlafigura).

Sonlosmásutilizados,suprincipalventajaesqueconsumenpocosrecursosyaquelasinstancias son reaprovechadas y un mismo servidor puede atender a mayor cantidad de clien-tes. Esto brinda mayor escalabilidad a la aplicación.ParacrearunEJBdeestetipodebemosagregarlaanotación@Stateless,comoseveenel

ejemplodelaFigura5.Aestamaneradeespecificarlasdependenciasdeclarativamenteselellama“dependencyinjection”,yaqueelContainerinyectalasdefinicionesnecesarias.

3.1.2 Stateful Session Beans

Adiferenciadelosanteriores,enestecaso,cadainstanciadeunEJBatiendeaunúnicocliente,porloquepuedeguardarinformaciónacercadesuestado.Estetipodecomponentessonutilizadosencasosenquesenecesitemantenerunarelación“conversacional”entreelclienteyelservidor.Elejemplomáscomúnesel“carritodecompras”,enelqueelservi-dordebeconocerlosítemsqueelclientehaidocomprando.EnlaFigura6semuestraesteconcepto.

Page 11: 10. Taller de Formación Java empresarial

639

Taller de Formación Java em

presarial

ClaramenteestosEJBconsumenmayorcantidadderecursosquelosanteriores,yaqueporcadaclienteesnecesariocontarconunainstanciadelEJBconlocual,amayorcantidaddeclientescreceránlosrequerimientosparaelservidor.Estorestaescalabilidadalaaplica-ción.

Delmismomodoqueenelcasoanterior,paracrearunEJBdeestetipoesnecesarioes-pecificarlaanotación@Stateful.

3.1.3 Singleton Session Beans

Enestecaso,unaúnicainstanciadelEJBescreadaparatodalaaplicación,por loquetodoslosclientescompartirándichainstanciayéstamantieneelestadoentreunainvocaciónde un cliente y otra.Enloscasosanteriores(StatelessyStateful),elcontaineraseguraqueningunainstancia

estarásirviendoamásdeunclienteenunmomentodado.Sinembargo,enestecasosípuededarseesasituaciónylamismainstanciapuedeestarsiendoaccedidapormásdeunclientealmismotiempo.Porlotanto,esnecesariotenerestoencuentaysincronizarlaspartesdelcódigo que no puedan ejecutarse concurrentemente.

3.2 Message Driven Beans

EstetipodeEJB(tambiénllamadosMDB)nosoninvocadosdirectamenteporclientes,sinoquelosmismosenvíanmensajesasincrónicamenteaunsistemademensajeríaJMS(Java

MessageService)paraqueseantomadosdeallíyprocesadosporestosEJB.EstoseobservamejorenlaFigura7.

Page 12: 10. Taller de Formación Java empresarial

640

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Hastalaversión2.0laespecificaciónJEEsoportabasolamenteJMS,2 pero a partir de la versión2.1seextendióacualquiersistemaquesoporteJCA3 (Java Connector Architecture).

4 Ejemplo de EJB

Aefectosdeclarificar losconceptosvertidosenestedocumentosemuestra la imple-mentacióndeunservicioofrecidoporunEJB,incluyendoelaccesoalosdatos.SedescribeunservicioparaingresarlibrosaunaBasedeDatosparalocualexistendosEJBdetipo

Stateless:•Unoqueofreceserviciosdealtonivelseráelqueelclienteinvoquepararealizarlaope-

ración,cuyocódigoseobservaenlaFigura8.•Otroquebrindaserviciosdepersistencia,queseráusadoporelanteriorparaaccedera

losdatos.ElcódigoeselquesemuestraenlaFigura9.Deestaforma,selograencapsularlaresponsabilidaddecadacomponente,loquefavore-

celaextensibilidaddelaaplicación.Comosepuedeverenesteejemplo,elprimerservicioactúacomoclientedelsegundo.Lo

primeroquehayquenotaresquenuncasecreaunainstanciadeLibroDAO,sinoquedirec-tamenteseusa,esoesporqueelContainerseencargadeinyectarlasdependenciasnecesarias.EncuantoaLibroDAO,sedeclaraelcontextodepersistenciaatravésdeunareferencia

a“libroUnit”(tambiénseusadependencyinjectionaquí).EstecontextoindicainformaciónacercadelaBasedeDatos(suubicación,usuarioycontraseña,etc.)ydebeestardeclaradoenformaexternaalaaplicación.Puedeserdeclaradoenunarchivollamadopersistence.xml

2JMSesunserviciobrindadoporJavaparaaplicacionesbasadasenmensajes,esdecir,quelacomunicaciónentreclienteyservidoresasincrónicaatravésdecolasdemensajería.3JCAesunconceptomásamplioqueJMSyrefiereatodolorelativoaconectividadentreservidoresoentreclienteyservidor.

Page 13: 10. Taller de Formación Java empresarial

641

Taller de Formación Java em

presarial

oatravésdeunDataSource(esdecir,unadefinicióndefuentededatosqueserealizadirec-tamente en el Servidor de Aplicaciones).

5 Bibliografía

JavaCommunityProcess,JavaEE6Specificationhttp://jcp.org/aboutJava/communityprocess/final/jsr316/index.htmlJBoss Application Serverhttp://www.jboss.org/jbossas/GlassFishServerhttp://glassfish.java.netOracle WebLogic Serverhttp://www.oracle.com/technetwork/middleware/weblogic/overview/index.htmlIBM WebSpherehttp://www-01.ibm.com/software/websphere/

Page 14: 10. Taller de Formación Java empresarial

642

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Taller de formación Java EETema: Introducción a componentes

de negocio (EJB)2da Parte

1 Introducción

Comosevioenlaprimerapartedeestecursointroductorio,losEJBsoncomponentesdesoftware que ofrecen servicios a nivel de lógica de negocios y persistencia. Éstos no tienen entidadporsímismossinoquedebenejecutarseenunContainer,queesquienproveetodoslos servicios de base que el EJB necesita.Comosemostró,esposibleatravésdeestatecnologíalaimplementacióndesistemasde

medianoygranportesintenerqueimplementartodaslascomplejidadesqueestoimplica,comocontroldeconcurrencia,transaccionalidad,seguridad,etc.Enestasegundaparteseprofundizaráenlosdistintostiposdeinterfacesqueofrecenlos

EJB,asícomoendosconceptosimportantesalahoradeimplementarunasoluciónbasadaen JEE: manejo de transacciones y seguridad.

2 Cómo exponer un EJBUnavezdesarrolladoelcomponenteEJB,sedebedecidircómoseráexpuesto,esdecir,

cómoesofrecidoesteservicioparaserconsumidopor losclientes.Paraestoexistentresopciones,lasquesedesarrollaránenestecapítulo,quebásicamentedeterminanlavisibilidadque se le desea dar al servicio.

2.1 Interfaz Remota

Unainterfazremotapodráseraccedidaporcualquiercliente,tantoseaotroEJBqueestécorriendodentrodelmismoContainercomounaaplicaciónexterna,inclusoelclientepue-deestarubicadoenotramáquinafísica.Yaqueunainterfazdeestetipopuedeseraccedidatantoremotacomolocalmente,escomúnquelasinterfacessedefinancomoremotasenge-neral.Además,sibienestopuedeagregarunoverheaddelladodelContainer,afuturopuedeotorgarmásflexibilidada laaplicación.Téngaseencuentaque,aunqueunsistemapuedepensarsequevaaejecutarsiempreenunúnicoContainer,esprobablequeenelfuturosedecida(porrazonesdeescalabilidad)distribuirenmásdeunservidor.

Page 15: 10. Taller de Formación Java empresarial

643

Taller de Formación Java em

presarial

SielclientequeconsumeunEJBremotoestáejecutandodentrodelContainerpuedereferenciarlousandoinjectionpero,siesunaaplicaciónexterna,debebuscaryobtenerunareferenciaalserviciousandoJNDI(JavaNamingandDirectoryInterface).ParadeclararunainterfazremotaseanotacomoseobservaenlaFigura1,yenlaFigura2puedeobservarseelcódigodeunclienteexternoparaejecutarunEJB.

2.2 Interfaz Local

Una interfazdeeste tiposeráaccedidasolamenteporclientesqueejecutendentrodelmismoContainer,esdecir,queelservicionoesexpuestoparaserconsumidopúblicamentesino solamente por otros componentes conocidos o controlados. Si bien un cliente local es máseficientequeunoremoto,engeneralseconsideraquelasinterfaceslocalesgeneranunmayoracoplamientoenlaaplicaciónyaquenopermitenquelamismasedistribuyaenmásde un servidor.

Paradeclararunainterfazlocalseusalaanotación@Local,comoseobservaenlaFigura3.

2.3 Sin interfaz

ExistelaposibilidaddequeunEJBnoimplementeningunainterfaz,nilocalniremota.Enestecasosedeclaraimplícitamenteunainterfazlocalcontodoslosmétodospúblicos.

2.4 Referencias a objetos remotos

ComoseobservaenlaFigura4,cuandounclienteremotointeractúaconunEJBlohaceenrealidadatravésdeunainterfazremotayusandolosserviciosprovistosporelContainer.Pero,¿quésucedeconlosobjetosquesepasancomoparámetrosoconelvalorquepuederetornarunmétododelEJB?Comoserecordará,enJavacuandounmétodoretornaunob-

jetoestádevolviendo,enrealidad,unareferenciaaunobjetoqueseencuentraenelHeap.1¿Cómosesuponequeelclienteremotopuedaaccederaunobjetosinotieneaccesoal

Heapenelqueseencuentradichoobjeto?NuevamenteelContainerseencargadeesto,paraqueloquesedevuelvaalclientenoseaunareferenciaalheaplocalsinounproxyalobjetooriginal,llamado“stub”.Esteproxyactúacomosifueraelobjetooriginal,perocadavezqueselesolicitaalgoenvíalasolicitudalobjetoremotooriginal.

1ElHeapesunespaciodememoriautilizadoporlaJVMparaalmacenarobjetos.

Page 16: 10. Taller de Formación Java empresarial

644

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Paraquetodoestofuncionecorrectamente,tantolosparámetroscomolosvaloresde-vueltosporlosmétodosdelasinterfacesremotasdebenserserializables.2 Esto es debido a queencadainvocaciónlosobjetosdebenserserializadosparaserenviadosremotamente.

3 Persistencia

Enlagranmayoríadelossistemasdeinformaciónlapersistenciaesunodelosaspectosmásimportantesydondehayqueprestarmásatenciónduranteeldesarrollo.EnJEEexistendosconceptosbásicosquesimplificanmucholagestióndelapersistencia,losquesedescri-ben a continuación.

3.1 Transacciones

ElcontroldetransaccionesesunservicioimportantebrindadoporelContainer,yaquea través de una simple anotación éste se encarga de inyectar todo el código necesario para el manejodetransacciones,tantodesdeeliniciodelasmismashastaelcommitorollbackencasodeproducirseexcepciones.Comosesabe,unatransacciónesunaunidaddetrabajoformadaporunoomásaccesosa

losdatos.Estaunidaddetrabajodebeejecutarseexitosamenteensutotalidadonoseejecuta,nosepermitequeseejecuteparcialmenteyaqueestogeneraríainconsistenciasenlabasededatos.EnJEElastransaccionessedefinenaniveldemétodosdenegocio,yaquesonéstoslosquecorrespondenalconceptodeunidaddetrabajo,aunquesepuededefinirtambiénanivel de EJB haciendo que todos sus métodos posean el mismo atributo.ParaindicaralContainercómodebemanejarelinicioyfindelastransaccionesseutiliza

laanotación@TransactionAttribute,quepuedetenerunodelosvaloresindicadosaconti-nuación.

3.1.1 Required

Sialinvocaralmétodoyaexisteunatransacciónabiertaseusaésta(caso-a-enlaFigura5),encasocontrariosecreaunanueva(lacualescerradaunavezfinalizadalaejecucióndelmétodo,caso-b-).

2Unobjetoesserializablecuandoesposibleconvertirloabytesparaserenviadoatravésdelared.

Page 17: 10. Taller de Formación Java empresarial

645

Taller de Formación Java em

presarial

Esteeselvalorpordefectoquetomaelatributo@TransactionTypeencasodenodefi-nirseningúnvalor.

3.1.2 Requires_New

Sialinvocarelmétodoyaexisteunatransacciónabiertaéstaquedaensuspensoycreaunanueva.Elmétodoinvocadoutilizaestanuevatransaccióny,alfinalizar,vuelvearetomarsela anterior.

3.1.3 Mandatory

Indica que el método necesita una transacción abierta por el llamante. En caso de que no hayaunatransacciónabiertaarrojaunaexcepción.

3.1.4 Supports

Encasodequeexistaunatransacciónabiertaseutilizay,encasocontrario,ningunatran-sacción es creada.

3.1.5 Not_Supported

Encasodequeexistaunatransacciónabiertaéstasesuspendemientrasseinvocaaestemétodoy,unavezfinalizado,seretomadichatransacción.Sinoexisteunatransacciónnoescreada ninguna tampoco.

Page 18: 10. Taller de Formación Java empresarial

646

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

3.1.6 Never

Sinoexisteunatransacciónnosecreatampocouna.Siyaexisteunatransacciónabiertasearrojaunaexcepción.

EnelcuadrodelaFigura11seresumenlasposiblessituacionessegúnelatributo@Tran-sactionTypedefinidoparaelmétodoinvocado.

3.2 Entidades persistentes

Lasbasesdedatosrelacionalesnoestánorientadasaobjetossinoatablasrelacionadasatravésdedependenciasfuncionales,porloquedeberealizarseunmapeoentrelasentidadesqueformanunaaplicación(elmodelodedominio),ylastablasquevanapersistirsusatribu-tos.EstemapeoseespecificaatravésdelasanotacionesquedefinenlaJavaPersistenceAPI(JPA),lacualseráestudiadaenprofundidadenotrodocumento.

4 Seguridad

LaseguridadenJEEesmanejada tantodeclarativamentecomoprogramáticamenteenloscasosquenoessuficienteconlaprimera.Estábasadaenroles,esdecir,quelosusuariospuedenperteneceraunoomásrolesysobreéstosserealizanloscontrolesdeaccesoalosmétodos de los EJB.Existentresconceptosimportantesparadeterminarsiunaccesoestápermitidoparaeje-

cutar determinada operación:•Autorización:permiteodeniegalaejecucióndedeterminadaoperaciónométododeun

EJB.Estábasadaenlaidentificaciónyenlaautenticación.• Identificación:permitereconocerelusuarioqueestáintentandoejecutarelmétodo.

Page 19: 10. Taller de Formación Java empresarial

647

Taller de Formación Java em

presarial

•Autenticación:eselprocesodevalidaciónoverificacióndequeelusuarioesrealmentequien dice ser.Engeneral,enunaaplicaciónJEEelprocedimientodeautenticaciónimplicalossiguien-

tes pasos:•Selepidealusuarioqueingresesuidycontraseñaatravésdeunapáginawebodeuna

aplicación de otro tipo.•Estas credenciales son validadas contra un proveedor JAAS (Java Authentication and

AuthorizationService).•Silaautenticaciónesválida,elclienterecibeunobjetollamadotoken(oprincipals),el

cualseráusadoenformatransparenteencadainvocaciónamétodosdeEJBparaindicarlealContainerquiéneselusuarioqueestárealizandolaoperaciónyqueelmismoestáautorizado.•EnbaseadichotokenelContainertambiénobtendráelolosrolesalosquepertenece

elusuarioy,enbaseaeso,determinarásipuedeonoejecutarlosmétodosinvocados.Comosepuedever,lavalidacióndeusuarioycontraseñaserealizaaniveldelacapaWeb,

yelEJBrecibeyaunobjetoqueindicaqueelusuarioesválido(aunquetodavíanohadeci-dido si dicho usuario puede invocar al método solicitado).

4.1 Seguridad declarativa

Comosemencionó,laespecificacióndelospermisosparaejecutarlosmétodosdelosEJBserealizananivelderolesautorizadosparaeso.Estosehaceatravésdelaanotación@RolesAllowed,lacualsepuedeutilizartantoenmétodoscomoentodalaclase(enestecasoindicaquelosrolesespecificadospuedenaccederatodossusmétodos).EnlaFigura12puedeverseunejemplodeunEJBenelqueseespecificaestarestricción.

Ademásdelasanotacionesmencionadas,esposibleespecificar@PermitAllparaindicarque un método es accesible a todos los roles o @DenyAll para indicar que un método no es accesibleaningúnrol.

Page 20: 10. Taller de Formación Java empresarial

648

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

4.2 Seguridad programática

Enalgunasocasionesnosonsuficienteslasanotacionesmencionadasparapermitirode-negarelaccesoaunmétodo.Enestoscasosesnecesarioutilizarprogramaciónparaobtenermásinformación.SibienelusodeestametodologíaexcedeelalcancedeestedocumentoenlaFigura13seobservaunejemplodeusodelAPIdeseguridaddeJEEaefectosilustrativos.

Page 21: 10. Taller de Formación Java empresarial

649

Taller de Formación Java em

presarial

Introducción a Java Server Faces (JSF)

1era Parte

1 Introducción

1.1 Aplicaciones Web

UnaaplicaciónWebesunaaplicaciónqueescapazdeinteractuarconunclientequeseejecuta enunnavegadorde Internet (comoFirefox,Chromeo InternetExplorer).EstasaplicacionesgenerancontenidoHTMLdinámicamenteatravésdelainvocaciónporpartedelosclientesdepedidosHTTP(HTTPRequest),losquesonatendidosporunWebContainer(comoTomcat)queeselentornodeejecucióndelasaplicacionesWeb.EnlaFigura1seobservamásclaramenteelfuncionamientodeunaaplicaciónWebtradicional.

Losservlets sonsimplesclases JavacapacesdeatenderpedidosHTTPy retornarunarespuesta.Muchasveces,partedelcontenidodeunaaplicaciónWebesestático(comoporej.imágenes),estosarchivossonretornadosdirectamenteporelContainersinintervencióndeningúnservlet.

1.2 Java Server Faces

1.2.1 Descripción

JavaServerFaces(oJSF,[1])esunframeworkprovistoporlaplataformaJavaEEparadesarrollaraplicacionesWebyestácompuestopordosgrandesmódulos:•LibreríasdetagsparaagregarcomponentesapáginasWeb.•UnaAPIparamanejarelestadodeloscomponentes,escuchareventos,realizarvalida-

ciones,etc.,atravésdelosllamadosmanagedbeans(tambiénllamadosbackingbeans).

Page 22: 10. Taller de Formación Java empresarial

650

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

UnaaplicaciónJSFestá,entonces,compuestaporlossiguienteselementos:•UnaomáspáginasHTML,utilizadasgeneralmentecomocontenedoresdelaspáginas

JSF.•UnconjuntodepáginasJSF,quesonlasquecontienenlostags.•Unconjuntodemanagedbeans,componentesdelladodelservidorquemantienenel

estadodeloscomponentesrepresentadosenlaspáginas,entreotrastareas.•Unarchivodescriptordelaaplicación(llamadoweb.xml).•Archivosderecursos,comoimágenes,javascripts,css,etc.•Opcionalmente,esposibleincluirunarchivollamadofaces-config.xml,dondeseespe-

cificancomponentespersonalizadosdevalidación,conversiones,etc.

1.2.2 Facelets

Esunlenguaje[2]expresadocomounconjuntodetagsquepermiteconstruirpáginasatravésdelacomposicióndeotraspáginas,formandoárbolesjerárquicosdondelaspáginasse anidan unas dentro de otras.•EscomúnutilizartagsfaceletsparaorganizarlaspáginasJSF,deformadesimplificar

eldesarrolloyfacilitarlareutilizacióndecomponentes.Porejemplo,esposibledefinirunaplantillaformadaporuncabezal,uncuerpoyunpie,haciendoqueelcabezalypieseman-tengan a lo largo de la aplicación y cambiando solamente el cuerpo de la misma.

1.2.3 Ejemplo

Aefectosdeclarificarlosconceptosantesdecontinuarprofundizandoaspectosteóricos,enlaFigura2semuestrapartedeunapáginaJSF,mientrasqueenlaFigura3seobservaparte del código del managed bean correspondiente.

Page 23: 10. Taller de Formación Java empresarial

651

Taller de Formación Java em

presarial

2 Patrón Model-View-Controller (MVC)

2.1 MVC

Model-View-Controller(oMVC,[3])esunpatróndediseñodeaplicacionesquepermitela separación (desacoplamiento) entre los componentes de la misma de acuerdo a sus res-ponsabilidades:•Model:contienelosdatosointeractúadirectamenteconelcomponenteencargadode

obtenerlos.•View:muestralosdatosalusuariodeunaaplicaciónypermitesuinteracción.Unmo-

delopuedetenerasociadasmásdeunavista,dependiendodecómosequieranmostrarlosdatos en cada caso.•Controller:eselquerecibelospedidosdelusuario,invocaalasoperacionesdelmodelo

necesarias y retorna una nueva vista.Deestaforma,sesimplificaeldesarrolloymantenimientodelaaplicación,yaquecada

componentetieneclaramentedelimitadosucampodeacción.EnlaFigura4semuestraundiagrama de este patrón de diseño.

2.2 MVC aplicado a JSF

JavaServerFacesfuediseñadodeacuerdoalpatrónMVC,porloquerespetaclaramentelaseparaciónentremodelo,vistaycontrolador,comoseobservaenlaFigura5.CuandounusuariosolicitaunapáginaJSF,estepedidoescapturadoporelFacesServlet (Controller),

Page 24: 10. Taller de Formación Java empresarial

652

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

obtiene la información necesaria de los Managed Beans (Model) y arma la respuesta en base alapáginaJSF(View)quecorresponda.FacesServleteselservletprovistoporelframeworkdeJSFparaatendertodaslassolicitu-

des de los clientes. Es esta clase la que se encarga de iniciar el ciclo de vida de cada solicitud. Elconceptodeciclodevidaseestudiaconmásdetalleenelcapítulosiguiente.

3 Ciclo de vida

EsimportantecomprenderelciclodevidadeunrequestaunaaplicaciónJSFparapo-der entender mejor la forma en que se vinculan los elementos de la aplicación. A través del cicloqueseexplicaráenestasección,seejecutantodaslastareasque,deotraforma,deberíaescribireldesarrolladorcomoservalidaciones,actualizacióndelmodelodedatos,etc.Detodasformas,esposibleinterveniromodificarcadaunodelospasosdelciclodevida,siesnecesariomodificarelcomportamientoparaadaptarloaalgunanecesidadespecífica.EnlaFigura6seobservaeldiagramadeloseventosqueocurrenencadainvocaciónauna

páginaJSF,losquesedescribiránbrevementeenestasección.En[4]puedeverunadescrip-ciónmásdetalladadeloqueocurreenlasfasesdeconversiónyvalidación.

1. RestoreView(recuperarvista)Se crea una estructura (llamada component tree) conteniendo todos los elementos de la

vistayseguardaenunobjetollamadoFacesContext,elcualestádisponibledurantetodoelciclo de vida.

2. ApplyRequestValues(aplicarvaloresdelapetición)Paracadaelementodelcomponenttreeseobtienesuestado(osea,suvalorenelformu-

larioenviado)yseguardaenelFacesContext.Siocurrenerroresdurantelaconversióndedatos(porejemplo,seingresaronvaloresalfanuméricosenuncamponumérico),segeneranerrores y se salta directamente al paso 6 para generar la respuesta.

3. Process Validations (procesar validaciones)Serealizantodaslasvalidacionesespecificadasenloscomponentescontralosvaloresob-

tenidos en la fase anterior. Si hay componentes que no pasan la validación se generan errores y se salta directamente al paso 6 para generar la respuesta. Las condiciones de validación son expresadasenloscomponentesenformadeclarativa,comoseobservaenlaFigura7.

Page 25: 10. Taller de Formación Java empresarial

653

Taller de Formación Java em

presarial

4. UpdateModelValues(actualizarvaloresdelmodelo)Unavezqueseverificóquelosvaloresingresadossonválidos,seactualizanlosvaloresen

elmodelo(osea,losatributosdelbackingbean).5. Invoke Application (invocar aplicación)Reciénenestemomento,unavezquesevalidaronlosdatosyseactualizaronlosbeans,

esposibleejecutarlalógicadelaaplicación,comoejecutarelcódigoasociadoaunbotónonavegaraotrapágina.

6. RenderResponse(generarrespuesta)Se genera la respuesta al usuario. En caso que se hayan producido errores durante las

fasesanterioressemuestralamismapáginaperoincluyendomensajesdeerrorjuntoaloscomponentes que los generaron.

4 Managed beans

4.1 Descripción

Los managed beans (también llamados backing beans) son simples clases java anotadas como@ManagedBean,porloquesonmanejadasporelContainer.Elobjetivodeestascla-sesesalmacenarlosdatosdelaspáginasJSFy,almismotiempo,servirdenexoconlacapade lógica de la aplicación.

4.2 Scope

Cadamanagedbeanposeeunscopequedeterminaeltiempodevidadedichobean,esdecir,cómosegestionalacreaciónydestruccióndeinstancias.Estescopeseespecificaatravésdeunannotation,acontinuaciónsedetallanlosvaloresquepuedetomar:@ApplicationScoped:indicaqueelbeanpersistedurantetodalavidadelaaplicación,o

sea,quedesdequeselevantalaaplicaciónhastaquesebajaelWebContainer,todaslasinte-raccionesconelbeaniráncontralamismainstanciadelaclase.@SessionScoped:elbeanpersistedurantelasesióndelclientey,unavezfinalizadalase-

sión,seborralainstancia.Esdecir,queunanuevainstanciadeestebeansecrearáporcadasesión iniciada por el cliente.@ViewScoped:persistemientrasduralainteraccióndelclienteconunapágina.@RequestScoped:elbeanpersistesolamenteduranteelciclodevidadeunrequest.

4.3 Integración de Managed Beans y páginas JSF

4.3.1 Expression Language

ElExpressionLanguage(tambiénconocidocomoEL)permitelavinculaciónentrecom-ponentesdelavista(páginasJSF)yatributosdelosmanagedbeansatravésdeexpresionessencillasdelaforma“#{expr}”.Enunapáginasecolocaunaexpresiónparareferirseaunatributodelbean,comoseveenelejemplodelaFigura8.

Page 26: 10. Taller de Formación Java empresarial

654

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Enelejemplo,cuandosecargalapáginaseinvocaráalmétodogetNombre()paracargarelvaloramostrar.Cuandoseposteaelformulario,sielvalordelcuadrodetextocambió,seinvocaráalmétodosetNombre()actualizandoelatributoconelvaloringresado.Cuandolaexpresiónseutilizaenvaloresquesepuedenactualizar(comoenelcasodela

Figura8),solamentesepermitenexpresionescomolaquesemuestra,dondelamismahacereferenciadirectamenteaunatributodelbean.Sinembargo,encasosdondeelvalornosepuedecambiar,esposibleintroducirexpresionesmáscomplejascomo,porejemplo:#{Cus-tomer.status==‘VIP’}.Sibienunestudioprofundodeestelenguajeescapaalalcancedeestedocumento,espo-

sibleobtenerunareferenciacompletaen[5].

4.3.2 Manejo de eventos

Engeneral,cualquieraplicaciónnecesitaejecutareventosantedeterminadasaccionesdelusuariocomoseleccionarunítemdeunalistaocliquearenunbotón.EnunaaplicaciónWebesto implica una comunicación con el servidor de forma que se ejecute el código asociado alevento.EnJSF,estoseventosseespecificanatravésdeunareferenciaaunmétododelmanagedbean.ExistentrestiposdeeventosenJSF:•Eventos de cambio de valor:Son disparados cuando el usuario cambia el valor de un campo de entrada de datos (como

cuadrodetexto,checkbox,combo,etc.).Seespecificanatravésdelosllamadoslisteners,quesonmétodosquereaccionanadiferentessituaciones.UnejemploseobservaenelcódigodelaFigura9enelque,cuandoelusuariocambiaelvalorseleccionadodeunalista,seejecutael método ciudad() del bean formulario.

•Eventos de acción:Son disparados por componentes capaces de ejecutar acciones, como botones

(h:commandButton)olinks(h:commandLink).EnlaFigura10seobservaunejemplo.

•Eventos de fase:SondisparadosduranteelciclodevidadeJSFysuestudioexcedeelalcancedeestedo-

cumento.

Page 27: 10. Taller de Formación Java empresarial

655

Taller de Formación Java em

presarial

5 Bibliografía

JavaServerFacesTechnologyhttp://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.htmlIntroducciónaFaceletshttp://download.oracle.com/javaee/6/tutorial/doc/giepx.htmlPatrón MVC orientado a Javahttp://java.sun.com/blueprints/patterns/MVC-detailed.htmlFasesdeconversiónyvalidacióndedatoshttp://www.ibm.com/developerworks/java/library/j-jsf3/TutorialsobreExpressionLanguagehttp://download.oracle.com/javaee/6/tutorial/doc/gjddd.html

Page 28: 10. Taller de Formación Java empresarial

656

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Introducción a Java Server Faces (JSF)

2da Parte

1 Introducción

EnlaprimerapartedeestaseriesebrindóunaintroducciónaJavaServerFaces(JSF),semostrólabaseenquesesostieneaniveldediseño,ysedescribieronlosManagedBeansyelciclodevidadeunapetición.Enestedocumentoseorientaelestudiohacialavista,esdecir,laspáginasqueseráninterpretadascomoHTMLparalainteracciónconelusuario,eneltopesuperior de las capas que forman la arquitectura de Java EE.Sedescribirálaestructuraquedebentenerestaspáginasysemostraránalgunasdelasli-

breríasprincipalesqueexistenenlaactualidad,aunqueexistenmuchasmásquenosepodránmostrar en este documento.

2 Páginas JSF

LaspáginasJSFestáncompuestasporlossiguienteselementosprincipales:•UntagHTMLquecontienetodalapáginaeincluyeunconjuntodenamespaces,losque

especificanquélibreríasdecomponentesseusarán.•Unconjuntodecomponentesincluidosenlaslibreríasespecificadas.EnelejemplodelaFigura1seobservaunapáginamuysencillaamodoilustrativo.Como

seve,inicialmentesedefineelnamespace“h”,queseusaráluegoparareferirseaunadelaslibreríasbásicasdeJSF.

2.1 Facelets

Apartirdelaversión2.0deJSF(conocidacomoJSF2),secomienzaautilizarFacelets([1])pordefectoparaestructurardeunamaneramássencillalaspáginas,yaqueesposiblecrearplantillas(templates)ocomponerelementoscomplejosapartirdeotrosmássencillos.

Es necesario incluir el namespace “http://java.sun.com/jsf/facelets” (al que llamaremos ui),parapoderutilizarestoscomponentes.Esposibledefinirmódulosreusablesqueseránusadosluegoparacomponermódulosmáscomplejosoincluirlosdirectamenteenlapágina.Existendosmanerasimportantesdereutilizarlaspáginasutilizandofacelets,lasqueseverána continuación.

Page 29: 10. Taller de Formación Java empresarial

657

Taller de Formación Java em

presarial

2.1.1 Modularización

Sedefinentemplatesutilizandolossiguientestags:•ui:composition,permitecrearunmóduloreutilizable,•ui:define,paradefinirunáreaotipodecontenido,•ui:insert,parainsertarenunapáginaelcontenidodeunárea.EnelcódigodelasFiguras2y3semuestraunejemplodemodularizaciónatravésde

templates.Porunladosedefineeltemplateutilizandoui:define,yseinsertadondesedeseeusando ui:insert. Obsérvese el uso del atributo “template” en el tag ui:composition.

2.1.2 Inclusión

Seincluyedirectamenteelcontenidodeunapáginadentrodeotra,comoseveenelejem-plodelaFigura4,dondesemuestraademáscomodefinirparámetros.

3 Librerías más utilizadas

3.1 Componentes básicos

Existenalgunaslibreríasdecomponentesbásicos,provistosporSun,quebrindanlasfun-cionalidadesquecualquieraplicaciónrequiere.EstaslibreríassonllamadasCoredebidoaqueformanelnúcleoquebrindalasfuncionalidadesbásicas.En[2]seencuentralalistacompletadetagsdefinidosenestaslibrerías.

Page 30: 10. Taller de Formación Java empresarial

658

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

3.1.1 Librería Html

ContienecomponentesparalostagsmáscomunesdeHTML,comosepuedeverenlaTabla1,conloscomponentesmáscomúnmenteutilizados.Elprefijo“h”estádefinidocomoel namespace “http://java.sun.com/jsf/html”.

Aunque cada uno de estos componentes tiene un conjunto de atributos que se les puede especificar, algunosdeellos soncomunesa todosestos componentes.Esposibleutilizarexpresiones(utilizandoelExpressionLanguageyavisto)paralosvaloresdeestosatributos,loquebrindagrancontrolsobreelcomportamientodeloscomponentesdelapágina.Estosatributos se listan en la Tabla 2.

3.1.2 Librería Core

ContienecomponentesparafuncionalidadesbásicasquenosoncubiertosporlalibreríaHtml,comosermanejodeeventos,conversióndedatos,etc.EnlaTabla3seobservanal-gunosdeestoscomponentes.Elprefijo“f ”estádefinidocomoelnamespace“http://java.sun.com/jsf/core”.

Paramásinformaciónacercadeladefinicióndelistenerssobreloscomponentes,puedeconsultaren[3].

3.2 RichFaces

Estácompuestopordoslibreríasopen-sourcecreadasporJBoss([4]),lasqueextiendenlasfuncionalidadesqueselogranutilizandolaslibreríasbásicasdeSun.Ademásdequese

Page 31: 10. Taller de Formación Java empresarial

659

Taller de Formación Java em

presarial

liberanactualizacionespermanentemente,existeunacomunidadmuyactiva.Almomentodeescribirestedocumento,laúltimaversiónestabledeRichFacesesla4.0,consoporteparaJSF2.AlgunasdelasprincipalesfuncionalidadesdeRichFacessedetallanacontinuación,aun-

queunalistacompletaexcedeelalcancedeestedocumento.•SoporteAjax.•Validación del lado del cliente.•Posibilidaddecambiarelaspectodeunapáginadeformasimple,usandolafuncionali-

daddeskinning([5]).•Actualizarlavistaapartirdecambiosocurridosenelservidor,apartirdelatecnología

depushing([6]).•Soporte avanzadode colas de eventos generadospor el cliente, para escenarios que

requieren alta performance.

3.2.1 Principales componentes

Acontinuaciónsemuestranloscomponentesmáscomúnmenteutilizados,puedeaccederaunalistacompletaen[7],asícomoauncompletoshow-case([8]).Paraalgunoscompo-nentessemuestraunejemplo,afindeilustrarmejorsuuso.Losnamespaceutilizadosson:• rich: “http://richfaces.org/rich”•a4j: “http://richfaces.org/a4j”

Page 32: 10. Taller de Formación Java empresarial

660

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Page 33: 10. Taller de Formación Java empresarial

661

Taller de Formación Java em

presarial

4 Bibliografía

IntroducciónaFaceletshttp://download.oracle.com/javaee/6/tutorial/doc/giepx.htmlTags definidos en librerías Core. http://download.oracle.com/docs/cd/E17802_01/

j2ee/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/index.htmlDefinicióndelistenersencomponentesJSFhttp://download.oracle.com/javaee/6/tutorial/doc/bnasz.htmlRichFaceshttp://www.jboss.org/richfacesRichFacesskinninghttp://docs.jboss.org/richfaces/latest_4_0_X/Developer_Guide/en-US/html/chap-

Developer_Guide-Skinning_and_theming.htmlRichFacespushinghttp://in.relation.to/Bloggers/GettingStartedWithRichFaces40PushReferenciadecomponentesRichFaceshttp://docs.jboss.org/richfaces/latest_4_0_X/Component_Reference/en-US/html/Show-casedecomponentesRichFaceshttp://livedemo.exadel.com/richfaces-demo/richfaces/contextMenu.jsf

Page 34: 10. Taller de Formación Java empresarial

662

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Java Persistence API (JPA)

1 Introducción

1.1 Mapeo Objeto-Relacional

Asícomounmodelodedominiotieneclases,elmodelorelacionaltienetablas.Estosmo-delosparecenlosuficientementesimilarescomoparaqueexistalaposibilidaddecomunicarun modelo con el otro. La técnica de atravesar el puente entre ambos modelos se conoce comoMapeoObjeto-Relacional,más conocido comoORM (del inglésObject-RelationalModel).UnORMdefineunaformadetransformarautomáticamenteunmodeloenelotro.La

diferenciadeparadigmasexistenteentreelmodeloorientadoaobjetosyelmodelorelacionalse conoce como Impedance Mismatch (desajuste por impedancia).

1.1.2 Impedance Mismatch

Veamos algunos ejemplos de modelos de dominios y la variedad de modelos relacionales que pueden persistir el mismo conjunto de datos.•Representacióndeunaclase:

SupongamoslaclaseEmpleadocomomuestralafigura1.1.

Page 35: 10. Taller de Formación Java empresarial

663

Taller de Formación Java em

presarial

Consideremoslosmodelosrelacionalesdelafigura1.2.

La representación ideal de la clase Empleado corresponde al escenario (A) donde cada atributo mapea directamente contra una columna de la tabla.

En el escenario (B) la fecha de inicio del empleado es persistida en tres columnas separa-das(día,mes,año).DadoquelaclaseusaDatecomotipodedato,nopareceunadecisiónadecuada el mapeo en tres columnas distintas de tipo entero.El salario puede ser considerado un atributo sensible comercialmente, por lo que no

parececonvenientequeestéubicadoenlatablaEMP,lacualpuedeserusadaconvariadospropósitos.Enelescenario(C),latablaEMPesrecortadayelsalariosealmacenaenlatablaEMP_SAL.Estopermiterestringirelaccesoalsalariodeunempleadopermitiendoelaccesoalainformaciónbásicadelmismo.

Relaciones

Consideremos ahora la claseEmpleado de la Figura 1.1.Existen varios conceptos dedominioconloscualespodríamosasociarlaveamos,porejemplo,unaclaseDirecciónconlacualunempleadopuedatener,alosumo,relaciónconunainstancia.EsteejemplosemuestraenlaFigura1.3.

Vimosanteriormentetresformasdistintasdemapearlaclaseempleado,veamosahoraenlaFigura1.4tresmanerasdemapearlarelaciónentrelasclasesEmpleadoyDirección.

Page 36: 10. Taller de Formación Java empresarial

664

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Elescenario(A)muestraelmapeoidealdelarelaciónpresentadaenlaFigura1.3.LatablaEMPcontieneunaclaveforáneaalatablaDIRECCIONenlacolumnaDIRECCION_ID.Elescenario(B)hacealmapeomáscomplejo,dadoqueenelmodelodeobjetoseselem-pleadoquienreferenciaaladirecciónyenestecasolatablaDIRECCIONesquiencontienelaclaveforáneaalatablaEMP.Elescenario(C)esaúnmáscomplejo,introduceunatablademapeoEMP_DIRECCIONdondesealmacenanlasrelacionesentrelosregistrosdelatablaEMPylosdelatablaDIRECCION.

Herencia

RecordemoslaclaseEmpleadointroducidaenlaFigura1.1eimaginemosqueunaempre-sanecesitadistinguirentreempleadosfull-timeypart-time,dadoqueparaelempleadofull-time la empresa maneja un salario mensual mientras que para un empleado part-time maneja unsalarioporhoratrabajada.DeestarealidadsurgeeldominiodelaFigura1.5.

Veamos nuevamente tres maneras distintas de persistir en el modelo relacional el mismo juego de datos.Unaestrategiasimpledemapearherenciaescrearunatablaporcadaclasenoabstracta

contodossusdatos(incluso losheredados) talcomomuestraelescenario(A),notarquenoexisterelaciónentrelastablasloquepuedehacerquelasconsultassobrelosempleadosresultenmáscomplejas.

Page 37: 10. Taller de Formación Java empresarial

665

Taller de Formación Java em

presarial

Elescenario (B)presentaunaestrategiamáseficienteperononormalizadaen la cual,todoslosdatosdetodaslasclasessecolocanenunaúnicatabla.EstohacequelasconsultasresultenmássencillaseintroducelacolumnaTIPOparapoderdiferenciarentrelosemplea-dos part-time y full-time.

En el escenario (C) se separa nuevamente el modelo en tablas separadas por tipo de em-pleadoaligualqueenel(A),peroseintroduceunatablaEMPquemantieneunarelaciónconambas y los atributos comunes.

1.2 Entidad JPA

UnaclaseJavapuedeserfácilmentetransformadaenentidadagregandoalgunasanotacio-nes. Supongamos una clase Empleado escrita en Java de la siguiente manera:

ParahacerdelaclaseEmpleadounaentidaddebemosanotarlaclasecon@Entity,estaanotación le indica al motor de persistencia que la clase es una entidad. La segunda anotación quedebemosagregares@Id,indicandocuáleselatributoqueidentificaalaclase,elcualdebeserúnicoparalasdistintasinstanciasdelamisma.

Simplemente agregando estas dos anotaciones convertimos la clase Empleado en una entidad JPA.

Page 38: 10. Taller de Formación Java empresarial

666

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

2. ORM JPA

2.1 Asignación de Tablas

Comoyavimosenelcapítulo1,paramapearunaentidadaunatablasoloesnecesarioagregarlasanotaciones@[email protected],pordefecto,elmismoqueeldelaclase.Siqueremosqueelnombredelatablanoseaelquetomarápordefecto,entoncesdebemosanotarlaclaseconlaanotación@Tableincluyendoelnombreque deseamos para la tabla. Veamos un ejemplo:

Laanotación@Tableofrecelaposibilidadnosólodeelegirelnombredelatabla,sinotambién el nombre de un esquema de base de datos.

Algunasbasesdedatossoportanlanocióndecatálogo.Paraestasbasesdedatossepuedeespecificarlapropiedadcatalogdelaanotación@Table.

2.2 Asignación de Tipos Simples

Lalistadetipospersistentesesbastantelargaeincluyeprácticamentetodoslostiposquedeseamos persistir:•Tiposprimitivos:byte,int,short,long,boolean,char,float,double.•Wrappers de tiposprimitivos:Byte, Integer, Short,Long,Boolean,Character, Float,

Double.•ArraysdeBytesydecaracteres:byte[],Byte[],char[],Character[.•Tiposnuméricosgrandes:java.math.BigInteger,java.math.BigDecimal.•Strings: java.lang.String.•TipostemporalesJava:java.util.Date,java.util.Calendar.•TipostemporalesJDBC:java.sql.Date,java.sql.Time,java.sql.Timestamp.•Tiposenumerados:desistemaodefinidosporelusuario.•Objetosserializables:desistemaodefinidosporelusuario.

Page 39: 10. Taller de Formación Java empresarial

667

Taller de Formación Java em

presarial

2.2.1 Asignación de Columnas

Especificandolaanotación@Columnenelatributoseindicanlascaracterísticasespecífi-cas de la columna en la base de datos.Unaseriedepropiedadessepuedenespecificarparalaanotación@Column,veremosla

aplicación de algunas de ellas.Conlapropiedadnamedelaanotación@Columnsepuedeespecificarelnombreque

tomarálacolumnaenlabasededatosquepordefectotomaelvalordelcampo.

Algunas otras propiedades de la anotación @Column son las siguientes:•unique:booleanoqueindicasilacolumnaesclaveúnicaparalatabla.•nullable: booleano que indica si la columna acepta valores nulos.• length:enteroqueindicaellargodelacolumna(válidoparastrings).

2.2.2 Tipos Enumerados

Otro de los tipos simples que pueden ser tratados de forma especial son los enumerados. Los valores de un tipo enumerado son constantes que se pueden manejar de manera diferen-te dependiendo de las necesidades de aplicación.Pordefecto,se interpretan losvaloresdeuntipoenumeradoporsuvalorordinalyse

asumiráquelacolumnadelabasededatosesdetipoentero.Consideremos el siguiente tipo enumerado:

SidefinimosunatributopersistentedetipoTipoEmpleadotenemos lasdossiguientesopciones:

2.2.3 Tipos de Datos Temporales

Lasbasesdedatossoportanhoyendíadiferentestiposdedatostemporales:•Date•Time•Timestamp (date + time)

Page 40: 10. Taller de Formación Java empresarial

668

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Laanotación@Temporaldefinecuáldelostiposanterioressequiereusarparamapearun java.util.Dateo java.util.Calendar.Pordefecto, seasume timestamp,dadoqueeseldemenorgranularidad.Enelcasodelostiposjava.sql.Date,java.sql.Timeojava.sql.Timestampel mapeo no es necesario. Veamos un ejemplo a continuación:

2.3 Asignación de Clave Primaria

Cuandoidentificamosunacolumnacomoclaveprimarialoqueleestamospidiendoalabase es que fuerce unicidad. Las claves primarias que consisten en datos de negocio se de-nominannaturalkeys.Unejemplodeestoeselnúmerodecéduladeidentidad.ClavesdelaformaEMP_IDsedenominansurrogatekey.Estasúltimassonmuypopularesporsufaci-lidaddeautogeneración.Ensistemasqueutilizanframeworksdepersistenciasonaltamenterecomendadas.Existentresformaspopularesdegenerarclavesprimarias:•A través de campos identity.•A través de secuencias.•Utilizandounatablanumeradora.Cualquiera de los tres mecanismos se soportan a través de la anotación @GeneratedValue.

2.3.1 Generación Automática de Id

Unaposibleopciónesdejarenmanosdelproveedorlaestrategiadeautogeneracióndeidentificadores.EnestecasoseutilizaGenerationType.AUTO.

ElmodoAUTOes,enrealidad,unaestrategiadegeneraciónparalaetapadedesarrolloocreacióndeprototipos.Encualquierotrasituaciónseríamejorusarunadelasestrategiasdegeneración discutidas en las secciones posteriores.

2.3.2 Generación Automática Usando una Tabla

Lamaneramásflexibleyportátilparageneraridentificadoresesutilizarunatabladebasededatos.Nosóloesportableadiferentesbasesdedatossinoquetambiénpermitealmacenarvariassecuenciasdeidentificadoresdiferentesparadiferentesentidadesdentrodelamismatabla.Unatabladegeneracióndeidentificadoresdeberíatenerdoscolumnas.Laprimeraco-

lumnaesdetipostringyseutilizaparaalmacenarelgeneradordesecuenciaparticular.La

Page 41: 10. Taller de Formación Java empresarial

669

Taller de Formación Java em

presarial

segundacolumnaesdetipoenteroyalmacenaelvaloractualdelasecuencia.Laformamássencilladeutilizarunatablaparageneraridentificadoresessimplementeespecificarlaestra-tegia de generación TABLE en la estrategia:

Enestecasosecrearáunatablapordefecto.Unmodomásexplícitoseríaespecificarlatablaquesevaautilizarparaelalmacenamientodelidentificadormedianteelusodelaano-tación @TableGenerator y referenciarla en la anotación @GeneratedValue.

2.3.3 Generación Automática Usando Secuencias

Muchasbasesdedatossoportanunmecanismointernoparalageneracióndeidentifica-doresllamadosecuencias.*Talcomoenlageneraciónusandounatabla,sisedeseausarunasecuenciadebasesdedatosynonosinteresaqueseaunasecuenciaparticular,especificandoeltipodegeneradoressuficiente.

Tambiénpodríamosdefinirunnombredesecuenciaparticulardelasiguienteforma:

2.3.4 Generación Automática Usando Identidades

Muchasbasesdedatossoportanladeclaracióndeunacolumnacomoidentity.Cadavezqueseinsertaunafilaenlatablaalacolumnaidentityseleasignaautomáticamenteuniden-tificadorúnico.SeutilizalaestrategiaIDENTITYdelaanotación@GeneratedValue.

Engeneral,estevaloresobtenidounavezqueelregistroes“commiteado”enlabasededatos,porloquenosiempreestarádisponibleenelprograma.

*Secuencia:tablaconuncamponuméricoenelcualsealmacenaunvalorycadavezqueseconsultaseincrementatalvalorparalapróximaconsulta.

Page 42: 10. Taller de Formación Java empresarial

670

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

2.4 Relaciones

Lamayoríadelasentidadesdebensercapacesdeestarrelacionadasconotrasentidades.Desdeelpuntodevistadedireccionalidadpodemosclasificarlasrelacionescomounidirec-cionales y bidireccionales:•unidireccionales:Sólosepuedenavegardesdeunaentidadalaotra,•bidireccionales: Desde cualquiera de las dos entidades es posible navegar a la otra.Permutando la direccionalidad con las cardinalidades “a uno” y “a muchos” nos encon-

tramos con los siguientes nombres dados a las asignaciones:•one-to-one•one-to-many•many-to-one•many-to-many

2.4.1 OneToOne Unidireccional

Imaginemos que los empleados de la empresa tienen asignado su lugar de estacionamien-to.EstecasoseríaunarelaciónunoaunoentrelaentidadEmpleadoylaentidadEstaciona-miento.

EnJPA,lasentidadespodríamosescribirlasdelasiguientemanera.

Laanotación@JoinColumnnoesobligatoria,seutilizaenelcasodequesedeseesobres-cribirelvalorpordefectodelacolumnadondesealmacenaráelidentificadordelestaciona-miento en la tabla de empleados.

2.4.2 OneToOne Bidireccional

Supongamos que ahora necesitamos tener en la entidad Estacionamiento la referencia al empleadoalquepertenece.Deberíamos,enestecaso,modificarlaentidadparaquequedede la siguiente forma:

Page 43: 10. Taller de Formación Java empresarial

671

Taller de Formación Java em

presarial

El valor de mappedBy es el nombre del atributo de la entidad propietaria a la entidad inversa.

2.4.3 OneToMany - ManyToOne

Unejemploderelaciónone-to-manysedaentreundepartamentodeunaempresaylosempleados que trabajan en él.

Enesteejemplo,larelaciónesbidireccional,loqueimplicaaunarelaciónmany-to-onesilo miramos desde la entidad Empleado.

2.4.4 ManyToMany

Siguiendoconlosejemplosanteriores,supongamosquelaempresatrabajaenvariospro-yectos,encadaproyectoparticipanunconjuntodeempleadosy,asuvez,unempleadopue-departiciparenvariosproyectos.Enestasituación,larelaciónentrelaentidadProyectoylaentidad Empleado es una relación many-to-many.

En JPA las clases se pueden escribir de la siguiente manera:

Adiferenciadelostiposderelacionesanteriores,lasrelacionesentreobjetosenelcasomany-to-many se almacenan en una tabla separada ya que no es posible almacenarlo en una columnadeunadelastablas.Porlotanto,noseutilizalaanotació[email protected]ónpuedeutilizarselaanotación@Join-

Tableque,encasoquenoseespecifiquelamisma,tomaraunnombrepordefecto.

Page 44: 10. Taller de Formación Java empresarial

672

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

3 Entity Manager

Lasentidadesnosepersistenalsercreadasniseactualizanautomáticamenteenlabasededatosalsermodificadas.Eslaaplicaciónquiendebeencargarsedegestionarelciclodevidadelasentidades.Paraestepropósito,JPAofrecelainterfazEntityManager.ElEntityManageractúacomopuenteentreelmundoorientadoaobjetosyelmundorelacional.

3.1 Ciclo de Vida

UnaentidadqueestásiendoadministradaporelEntityManagerseconsideramanagedoattached,cuandoelEntityManagedterminadeadministrarlaentidad,decimosqueestáenestadodettached.SiunaentidadnopasaporelEntityManager,decimosqueestáenestadotransient.

Cuandounaentidadesreciéncreadaatravésdenew,entoncesestáenestadonewotran-sient.Unaentidadentraaestadomanagedcuandoespasadacomoparámetroalosmétodospersist,mergeorefresh, tambiénunaentidadestáenestadomanagedcuandoesrecibidacomoresultadodeunmétodofind.UnaentidadqueyanoestáasociadaaunEntityManager(porejemplo,alpasardeuna

capaaotradelaaplicación–alserializarse–)estáenestadodetached.Enesteestado,yanotenemosgarantíadequeelestadode laentidadseencuentresincronizadoconlabasededatos.LaaccióndeperderesevínculosedenominaDetachmentyladevolveravincularlose denomina Merge.

3.2 Persistence Context

Formalmente,unpersistencecontextesunconjuntodeentidadesadministradasporunEntityMangager durante un persistence scope. El persistence scope es el tiempo que un con-junto de entidades permanecen administradas.

Page 45: 10. Taller de Formación Java empresarial

673

Taller de Formación Java em

presarial

Existendostiposdepersistencescopes:

•Transaction:Lasentidades“attacheadas”durantelatransacciónsonautomáticamente“desatacheadas” al terminar la misma.•Extended:UnEntityManagertieneuntiempodevidaqueabarcavariastransacciones,

solopuedeserutilizadodentrodeunSessionBeanStatefuldurandotantocomolainstanciapermanezcaactiva.

3.3 Persistiendo Entidades

Veamos un ejemplo de persistencia de una entidad empleado sobre el cual trabajaremos en esta sección.

3.3.1 Cascada

Pordefecto,elcomportamientodeJPAesdenopersistirentidadesrelacionadas.Enelejemploanterior,elEstacionamientonoseríainsertadoautomáticamente,paraqueestofun-cione,debemosmodificarelparámetrocascadedelarelación.

Elcascadingdefinecomosepropagalaoperaciónsobreloselementosrelacionadoscuan-do hacemos una operación en el elemento “padre”. Los valores posibles salen del enumerado CascadeType:•ALL•MERGE•PERSIST•REFRESH•REMOVE

Sielcascadingnoesespecificado,entoncesdebemosmanualmentepropagarlasopera-cionesdepersistencia.Paraesto,enelejemploanterior,debemosprimeropersistirelEsta-cionamiento y luego el Empleado.

Page 46: 10. Taller de Formación Java empresarial

674

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

3.4 Recuperación por Clave Primaria

JPAsoportaelmétodofindenelEntityManager.Aestemétododebemospasarlelaclasequeestamosbuscandoyelvalordelaclaveprimariaqueestamosfiltrando.

3.4.1 Modos de Búsqueda

Elmododebúsquedadefinequédatosseráncargadosdesdelabasededatosalaaplica-ción al obtener una entidad.

Tenemos dos posibilidades:•Eager: los datos son cargados al levantar la entidad.•Lazy:losdatossoncargadosdelabasededatosademanda,cuandosonutilizados.

Esimportantetenerencuentaquealconfigurarunarelaciónaunacolecciónenmodoeager,quepodríaestarcargandodemasiadosobjetosamemoriadadoquenosolosecargarántodoslosobjetosrelacionados,sinotambiéntodoslosquelosmismostenganreferenciadosenmodoeager.Deestaforma,alrecuperarunainstanciadeunaentidadsepodríaestarcar-gandogranpartedelabasededatosamemoria,causandoineficienciaenlaaplicación.Elcomportamientopordefectodel fetchpara relacionesesdiferentesegúnel tipode

relación:•One-to-one=EAGER•One-to-many=LAZY•Many-to-one=EAGER•Many-to-many=LAZYNotarquelasrelacionesto-onesoncargadasallevantarlaentidad(EAGER)mientrasque

lasrelacionesto-manyselevantanademanda(LAZY).

3.5 Detachment y Merge

Sibienunaentidadattachedesextremadamenteútilesdifícilmantenerlas“attacheadas”todoel tiempo,uncasotípicosedaen lasaplicacionesweb.Escomúnque lasentidades

tenganqueserserializadasyenviadasalacapaweb,enlacapaweblasentidadespodríansermodificadas,fueradelscopedelEntityManager.Enalgúnmomentonecesitamosasociareste

Page 47: 10. Taller de Formación Java empresarial

675

Taller de Formación Java em

presarial

elementoconlabasededatosnuevamenteparasincronizarsuestado.Paraesto,usamoselmétodo merge.Elmétodomergenosgarantizaqueelobjetoestáasociadonuevamenteconelpersistence

contextyqueserásincronizadoconlabasededatos.

LuegodeejecutadoelmétodoupdateEmpleadolabasededatosseráactualizadaconelestadodelempleado.Elmétodomergesolopuedeserusadoparaentidadesqueexistanenlabasededatos,sitratamosde“mergear”unelementonoexistenteseproduciráunaexcepciónIllegalArgumentException.

3.6 Borrar Entidades

UtilizamoselmétodoremovedelEntityManager.Estemétodosolopuedeseraplicadosobreentidades“attached”comosemuestraenlafigura3.1.

3.7 Refrescar Entidades

Elmétodorefreshpermitecargarlosdatosdeunaentidaddesdelabasededatos.Noesmuycomúnusarestemétodo,aunqueavecespuedeserútilparadeshacerloscambiosenuna transacción.Sinembargo,hayunescenariodondeesmuyútil.¿Quépasasialinsertarunregistroen

labasededatoslapropiabasemodificaelvalordealgunascolumnasatravésdeuntrigger?Enestecaso,desdeJavasoloveremosloinsertado,yaquelosdatosgeneradosporlabasenoseráncargados.Enestoscasospodríamosobtenerlosdatosmodificadosrefrescandolasentidades correspondientes.

3.8 Flushing

LasoperacionesdelEntityManager,comopersist,mergeyremove,noalteranlabasededatosinmediatamente.Principalmenteestosehacepormotivosdeperformance,lasopera-cionesSQLenmodobatchsuelensermásperformantesquelasoperacionesemitidasdeaunaporvez.Lasoperacionesanteriores(alteracionesdelabase)sonpospuestashastaquese“flushee”

elEntityManager.Pordefecto,elmododeflushesAUTO,estosignificaqueesemitidopor

Page 48: 10. Taller de Formación Java empresarial

676

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

elEntityManagersegúnseanecesario.ElmododeflushlopodemoscontrolarconelmétodosetFlushModedelEntityManagerutilizandoelenumeradoFlushModeType.Paraefectuarelflushademandahacemos:

4 Recuperando Información

PararecuperarinformaciónutilizandoJPAexistentresposiblesformas:•AtravésdelmétodofinddelEntityManager.•Consultas escritas en Java Persistence Query Language (JPQL).•Consultas nativas escritas en SQL.El API de consultas de Java soporta dos tipos de consultas (queries):•Named.•Dynamic.LasNamedQueriessonconsultasalmacenadasquepuedenserreutilizadasenunpro-

grama,mientrasquelasDynamicQueriessonconsultasqueseformandinámicamenteenelprograma,suestructuraseconstruyeprogramáticamente.

4.1 Named Queries

LasNamedQueriessecreanasociadasalaentidadquequeremosconsultar,ladefiniciónpuedeseralmacenadaenformatoXMLoenelpropiocódigodelaclase.Asimismo,debentenernombreúnicodentrodeunaPersistenceUnit.

Luego,duranteelcódigodelprograma,secreanlasqueriesreferenciándolaspornombre.

4.2 Dynamic Queries

LaDynamicQueriessecreandinámicamenteenelcódigodelprograma,adiferenciadelas anteriores no llevan nombre.

Page 49: 10. Taller de Formación Java empresarial

677

Taller de Formación Java em

presarial

4.3 Parámetros en la Query

EnunaquerypodemosusarunacláusulaWHEREpararestringirlosvaloresobtenidos.Por ejemplo, todos los empleadosque tienenun salario superior aunvalordeterminadopuedenobtenerseasí:

Enelcasoanterior,parametrizamoslaconsultautilizandoparámetrosposicionales.Paraestablecerelvalordelparámetrobastaconhacer:

Podemosusarotrotipodeparámetros,llamadosparámetrosnombrados(namedparame-ters),delaforma:

Estosmejoranlalegibilidadybúsquedadeerroresdeunaquery.Establecerelvalordeunnamedparameterserealizadelasiguienteforma:

4.4 Recuperando una Entidad

Sinuestraconsultadevuelveunainstancia(tupla)resultado,conelmétodogetSingleRe-sultpodemosobtenerla.Silaconsultaretornamásdeunatupla,lainvocacióndeéstemétodoproduce un error.

4.5 Recuperando una Colección

Lamayoríadelasqueriesretornamásdeunatuplaresultado.Paraesto,podemosusarelmétodogetResultList():

5 Configuración XML

Sedebedefinirundescriptordelaunidaddepersistencia(META-INF/persistence.xml).

Page 50: 10. Taller de Formación Java empresarial

678

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Los posibles valores para la propiedad hibernate.hbm2ddl.auto son:•validate:validarelesquema,norealizacambiosenlabasededatos;•update:actualizaelesquema;•create:creaelesquema,implicaladestruccióndelosdatosanteriores;•create-drop: crea el esquema al iniciar y lo borra al terminar.Elvalorcreate-dropsueleutilizarseúnicamenteenetapadepruebasluego,elvalorreco-

mendable es update.

6 Bibliografía

[1]MikeKeith yMerrick Schincariol, Pro JPA 2:mastering the JavaPersistenceAPI,Apress,2009.

Page 51: 10. Taller de Formación Java empresarial

679

Taller de Formación Java em

presarial

1 Introducción

UnWebServiceesunaaplicacióndesoftwareidentificadaporunaURI,cuyasinterfacesyformasdeaccesopuedenserdefinidas,descriptasydescubiertascomoartefactosXML.UnWebServicesoportalainteraccióndirectaconotroscomponentesdesoftwareutili-

zandomensajesbasadosenXMLeintercambiadosatravésdeprotocolosbasadoseninter-net.1

1.1 Descripción General

LatecnologíadeWebServicespermitequeaplicacionesdiversas,queseejecutanendis-tintoscomputadores,puedanintercambiardatoseintegrarseconotrassinrequerirningúnotro componente de hardware o software propietario. Las aplicaciones que se basan en la tecnologíadeWebServices,puedencomunicarsesinimportarellenguaje,plataformaopro-tocolosinternosqueutilicen.[1]Deestaforma, losWebServicesson,actualmente,elmecanismopreferidopara lograr

interoperabilidadentreplataformasdedesarrolloheterogéneasyconstituyenlatecnologíapreferida para la implementación de Arquitecturas Orientadas a Servicios (Service Oriented Architecture,SOA).UnWebServiceesunaaplicacióndesoftwarequepuedeseraccedidadeformaremota

utilizandodiferenteslenguajesbasadosenXML.Comúnmente,unWebServiceseidentificaconunaURL,comocualquiersitioWeb.LoquehacequelosWebServicesseandistintosalossitiosWebeslaformadeinteracciónqueestospuedenproveer.[2]LamayoríadelossitiosWebestándiseñadosparaproveerunarespuestaaunapersona.Lapersona,atravésdeunexploradorWeb,ingresalaURLdelsitioo“haceclick”enun

enlaceparacrearunasolicitud.Estasolicitudtomalaformadeundocumentodetextoquecontienealgunasinstruccionessimplesparaelservidor,porejemplo,elnombredeldocumentoquesequiereacceder(ej.index.html).EstetipodeinteracciónsemuestraenlaFigura1.

UnWebServiceessimilaraunsitioWeb,enelsentidoqueseaccedeatravésdeunaURL.Ladiferenciaprincipalestáenloqueseenvíacomosolicituddesdeelclientealservicio.Los

Web services

1http://www.w3.org/TR/ws-desc-reqs/#definitions

Page 52: 10. Taller de Formación Java empresarial

680

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

clientesdeWebServicesenvíancomosolicitudundocumentoXML,conunformatoes-pecialqueseajustaalasreglasdelestándarSOAP(SimpleObjectAccessProtocol[3]).UnmensajeSOAPpuedeincluir,porejemplo,lallamadaaunmétodoespecificandolosvaloresdelosparámetros.LaFigura2muestralainteraccióndeuncliente(porejemplo,unaaplica-ción empresarial) interactuando con un Web Service a través de un Web Server.

1.2 Interoperabilidad

GranpartedelentusiasmoalrededordelatecnologíadeWebServicessebasaenlapro-mesadeinteroperabilidad[2].Lainteroperabilidadeslahabilidaddelossistemasdesoftwareydelosprocesosdenegocioalosquedansoporte,deintercambiardatosydecompartirinformaciónyconocimiento[4].LaarquitecturadeWebServicesestábasadaenenviarmensajesXMLqueseadhierenal

estándarSOAP.UnmensajeXMLpuederepresentarsecomocaracteresASCII,porloquepuedesertransferidofácilmentedecomputadoracomputador.Estopermitequecualquiertipodeaplicacióndesoftwarepueda,potencialmente,comunicarseconotra.Esta comunicación puede darse a través de distintas ubicaciones, sistemas operativos,

lenguajesyprotocolos,entreotros.LaFigura3presentalasprincipalesrelacionesentreestosestándares.

2.2.1 Simple Object Access Protocol (SOAP)

SOAPesunformatobasadoenXMLparaconstruirmensajes,deformaindependientealtransporteenquesetransmiten,yunestándarqueespecificacómoelmensajesedebeprocesar.LosmensajesSOAPconsistenenunsobre(envelope)quecontieneunencabezado(hea-

der)yuncuerpo(body).SOAPtambiéndefineunmecanismo,denominadoSOAPfaults,para indicar y comunicar problemas que ocurran al procesar el mensaje.LaFigura4presentalasdistintasseccionesenlasquesedivideunmensajeSOAP.LaseccióndeencabezadodeunmensajeSOAPesextensibleypuedecontenervariosen-

cabezadosqueseutilizanparaespecificardistintostiposdeinformación,porejemplo,comomuestralaFigura5,aniveldecomportamientotransaccionalydeseguridad.

Page 53: 10. Taller de Formación Java empresarial

681

Taller de Formación Java em

presarial

Porotrolado,laseccióndelcuerpodeunmensajeSOAPalojaelcontenidodelmensaje.EnuncontextodeWebServicesestecontenidoseencuentraenformatoXMLyseajusta

aloespecificadoenladescripcióndelWebService(WSDL)queseinvoca.EnelcuerpodeunmensajeSOAPtípicamenteseespecifica:•unasolicitudparaefectuarciertaoperación,• la respuesta a cierta solicitud que puede ser:•unresultadoo,•un error (fault).

LaFigura6muestra,enprimerlugar,elcuerpodeunmensajeSOAPdeunasolicitudpara

Page 54: 10. Taller de Formación Java empresarial

682

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

ejecutarlaoperación“Translate”(pasandocomoparámetrolapalabra“red”)y,ensegundolugar,elcuerpodeunmensajeSOAPconlarespuestaadichasolicitud.

2.2.2 Web Services Description Language (WSDL)

WSDL[8]esunlenguajededefinicióndeinterfacesbasadoenXMLquepermitedes-cribirdeformaestándaralosWebServices.LosdocumentosWSDLsecomponendedosgrandes partes: una descripción abstracta y una descripción concreta.ComosepresentaenlaFigura7,enladescripciónabstractaseencuentranloselementos

types,messagesyportType,loscualesespecificanlasdescripcionesfuncionalesy,aniveldedatos,delasoperacionesqueproveeelWebService.

Page 55: 10. Taller de Formación Java empresarial

683

Taller de Formación Java em

presarial

Porotrolado,comosepresentaenlaFigura8,enladescripciónconcretaseencuentranlos elementos binding y service. Los elementos binding proveen instrucciones para interac-tuarconelWebServiceatravésdeprotocolosespecíficos,porejemplo,SOAPsobreHTTP.Porúltimo,loselementosservice(atravésdelelementoport)proveenunadirecciónderedespecíficaatravésdelacualelWebServicepuedeserinvocado.

Amododeejemplo,laFigura9ylaFigura10presentanladescripciónWSDLabstractayconcreta,respectivamente,deunserviciodenominadoHelloWorldServiceelcualtieneunaoperacióndenominada“sayHello”,lacualrecibecomoparámetrounStringydevuelvecomorespuesta otro String.

Page 56: 10. Taller de Formación Java empresarial

684

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Page 57: 10. Taller de Formación Java empresarial

685

Taller de Formación Java em

presarial

Laprincipalventajadeestaseparación,abstractayconcreta,eslaposibilidaddedefinirlainterfazdeunservicioconsusoperacionesymensajes(descripciónabstracta)deformaindependiente(distintosdocumentosWSDL)alosprotocolosdetransporte,ubicacionesytecnologías(descripciónconcreta),loscualespodríancambiarmásfrecuentemente.

2.2.3 Universal Description Discovery and Integration (UDDI)

UDDI[9]esunestándarpararegistrarybuscarWebServicesendirectorios.Enprimerlugar,unproveedordeservicioutilizaUDDIparaalmacenarladescripcióndel

servicio,laubicacióndelservicioylasinterfacesparaaccederalservicio,entreotrosdatos.Atravésdeestoselementos,juntoconotrasposiblescategorizaciones,losconsumidoresdeserviciospuedenrealizarbúsquedasdeWebServicespara,posteriormente,ubicaralservicioyconectarseparautilizarlo.UDDIdefinelasinterfacesaundirectorioqueson,ensímismas,Web Services descriptos a través de WSDL.UDDIdefineentonces:•unmodelodedatosparaalmacenarinformacióndeserviciosyproveedores,•dosinterfacesparautilizarelregistroUDDI:•Publish•Inquiry

Atravésde laInterfazdePublicación(publish),unproveedordeWebServicespuedepublicar,actualizaroeliminarinformaciónenelregistroUDDI.Porotrolado,atravésdelaInterfazdeBúsqueda(inquiry),unconsumidordeWebServicespuedebuscarWebServices,proveedores de Web Services e información de los mismos.

2.2.4 Resumen

LaFigura11presentaunresumendelasespecificacionesquecomponenlaprimeragene-racióndeestándaresparaWebServices.

2.3 Segunda Generación de Estándares

LaprimerageneracióndeestándaresparaWebServicespermitelacreacióndeWebSer-vices independientes capaces de encapsular unidades aisladas de funcionalidad de negocio. Sinembargo, tambiéncuentaconvarias limitacionesquesonabordadasporunasegundageneracióndeestándares.

Page 58: 10. Taller de Formación Java empresarial

686

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

Algunasdelasproblemáticasqueabordaestanuevageneraciónsonelmanejotransac-cional(WS-Coordination,WS-AtomicTransaction,WS-BusinessActivity),lacomposicióndeprocesosdenegocio (WSBPEL),manejode seguridad (WS-Security,WSSecureConversa-tion,WS-Trust),mensajeríaconfiable(WS-ReliableMessaging)ymanejodepolíticasadistin-tos niveles (WS-Policy).LaFigura12muestracómoserelacionanalgunosdeestosestándaresentreellosyconlos

estándaresdelaprimerageneración.

2.4 Organizaciones Involucradas

ExistenvariasorganizacionesinvolucradaseneldesarrollodelatecnologíadeWebServi-ces.Deacuerdoalfocodeestedocumentosedescribentresdelasprincipalesorganizacionesinvolucradasconestatecnología:OASIS(OrganizationfortheAdvancementof StructuredInformationStandards),W3C(WorldWideWebConsortium)yWS-I(WebServicesIntero-perabilityOrganization).OASISesunconsorciointernacionalsinfinesdelucroqueconduceeldesarrollo,conver-

genciayadopcióndeestándaresparalasociedaddelainformaciónglobal.Estaorganizaciónsefundóen1993ytienemásde5000participantesquerepresentanamásde600organi-zacionesymiembros individualesen100países.Algunasde lasespecificacionesque llevaadelanteOASISsonWS-SecurityyUDDI.W3Cfuecreadoenoctubrede1994yagrupaamásde350organizacionesmiembrode

todoelmundo.Desdeel comienzode losestándaresde laWorldWideWeb, talescomoHypertextMarkupLanguage(HTML)yCascadingStyleSheets(CSS),laW3ChamanejadomuchasdelasespecificacionesfundamentalesdeInternet.EnlaactualidadtambiénmanejamuchasdelasprincipalesespecificacionesrelacionadasaXMLyWebServices,incluyendoXML,XPath,XSLT,SOAPyWSDL.WS-Iesunconsorciointegradoporlíderesdelaindustriaquepromuevelainteroperabi-

lidaddeWebServicesentreplataformas,sistemasoperativosylenguajesdeprogramación.EsteconsorcioseocupadedefiniryprobarunsubconjuntodeespecificacionesexistentesparamejorarlainteroperabilidadentreplataformasdeWebServicesdispares.Asuvez,tam-biénestádesarrollandoaplicacionesdeejemployherramientasdeprueba.

Page 59: 10. Taller de Formación Java empresarial

687

Taller de Formación Java em

presarial

3 Desarrollo de Web Services

3.1 Plataformas de Web Services

Las plataformas de Web Services son un conjunto de herramientas para un lenguaje de programaciónespecíficoquepermiteninvocarWebServicesyrealizareldespliegue(deploy)deWebServices.[11][12]Lasplataformastienen,engeneral,componentesenelservidoryenelcliente.Loscom-

ponentesenelservidorsealojanusualmenteenalgúntipodecontenedor,porejemplo,unservidorJavaEEouncontenedordeservlets.Loscomponentesenelclienteseempaquetan,engeneral,comoherramientasparaaccederainterfacesasociadasaWebServices.LasplataformasdeWebServicesproveen,engeneral,tressubsistemas:Sub-sistemade

Invocación,Sub-sistemadeSerializaciónySub-sistemadeDeployment.LaFigura13presentagráficamenteelsub-sistemadeinvocación,tantodelladodelcliente

como del lado del servidor.

Los componentes del sub-sistema de invocación que se alojan del lado del servidor se encargan de:•RecibirmensajesSOAPdesdeeltransporte(HTTP,etc.).• Invocarmanejadoresparaseguridaduotrascaracterísticasavanzadas.•Determinar la operación que se quiere invocar.•Determinar la clase/método que se quiere invocar.•EnviarelmensajeSOAPalsistemadeserialización.•Invocar la clase-método.•Enviarelresultadoalsistemadeserialización.•CrearyenviarelmensajeSOAPaltransporteparaelenvíodelarespuesta.

Porotrolado,loscomponentesdelsub-sistemadeinvocaciónquesealojandelladodelcliente se encargan de:• InstanciarlaclasequeimplementalainterfazparaaccederalWebServiceymanejarsu

invocación.•Enviarparámetrosalsistemadeserialización.•Adjuntar los mismos en un mensaje SOAP.• Invocarmanejadoresparaseguridaduotrascaracterísticasavanzadas.

Page 60: 10. Taller de Formación Java empresarial

688

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

•EnviarelmensajeSOAPatravésdeltransporte(ej:HTTP).•RecibirlosmensajesSOAPderespuestadesdeeltransporte.•EnviarlosmensajesSOAPalsistemadeserializaciónycompletarlainvocación.Elsub-sistemadeserializacióntienecomoresponsabilidadtransformarinstanciasdecla-

sesenelementosXMLyviceversa.Porúltimo,elsub-sistemadedeploymentproveeherramientasparaconfiguraruncom-

ponente de software para que pueda ser invocado como un Web Service a través de mensajes SOAP.

En particular permite:•Desplegar el componente de software.•MapeodeoperacionesespecificadasenelWSDL,conlasdelcomponentedesoftware.•Configuraciónserialización(esquema–parámetros).•Publicación del WSDL.•Configuraraspectosavanzados(seguridad,etc.).•Configurarel listenerenunadirecciónderedpara“escuchar” lassolicitudesalWeb

Service.

AlgunasplataformasdeWebServicesqueseutilizanactualmenteson:WindowsCommunicationFoundationhttp://msdn.microsoft.com/en-us/library/ms730294.aspx

ApacheAXIS2http://axis.apache.org/axis2/java/core/

ApacheCXFhttp://cxf.apache.org/

Proyecto Metrohttp://metro.java.net/

JBoss Web Serviceshttp://www.jboss.org/jbossws

3.2 Implementación de Web Services

LaimplementacióndeunWebServicesepuederealizardeformabottom-upotop-down.Cuandoserealizabottom-up,laimplementacióndelWebServicesecomienzaporelcó-

digofuente(porejemplo,unaclaseJava).Porotrolado,cuandolaimplementaciónserealizadeformatop-down,secomienzaporeldocumentoWSDLquedescribealservicio.Enamboscasos,esnecesariocontarademásconherramientasocomponentesdesoft-

ware, en general, provistospor las plataformasdeWebServices que, a partir del códigofuente,odeundocumentoWSDL,generanelrestodeloscomponentesnecesariosparalapuesta en marcha del Web Service.Laimplementaciónbottom-upconstituyeunaformarápidadeexponerfuncionalidades

denegocioa travésde la tecnologíadeWebServices.Además,norequiereconocimiento

Page 61: 10. Taller de Formación Java empresarial

689

Taller de Formación Java em

presarial

previodeXMLSchemayWSDLporpartede losdesarrolladores.Sinembargo, conesteenfoqueelesquema(queespecificalostiposdedatosquemanejaelWebService)queda,engeneral,embebidoenelpropioWSDL,dificultandosuaprovechamientoporotrosservicios.Otradesventajadeesteenfoqueesque,algenerareldocumentoWSDLapartirdelcódigofuente,puedencrearsedependenciasentreestedocumentoydichocódigo.Porotrolado,laimplementacióntop-downpermiteeldesarrolloindependienteyparalelo

entreclienteyservicio.Cuandosecreannuevostiposdedatos,estospuedenserreutilizadosporotrosserviciosydadoquesecomienzala implementaciónporeldocumentoWSDL,nosegenerandependenciasconelcódigofuente.Sinembargo,esteenfoquepresentacomodesventajaqueserequiereconocimientopreviodeXMLSchemayWSDL.

4 Web Services en Java

LaplataformaJavaproveevariosestándaresquedansoportealdesarrollodeWebServi-ces.EstosestándaresconstituyenunconjuntodetecnologíasquepermitenconsumirycrearWebServicesutilizandoJava.

4.1 Estándares Java para Web Services

AlgunosdelosestándaresJavaparaWebServicessonSOAPwithAttachmentsAPIforJava (SAAJ), JavaArchitecture forXMLBinding (JAXB), JavaAPI forXML-BasedWebServices(JAX-WS)yWebServicesMetadata(WS-Metadata).SOAPwithAttachmentsAPIforJava(SAAJ,JSR67)permitemanipularsobres(enve-

lopes) SOAPde formaprogramática.Es posible, por ejemplo, crear un envelope SOAP,agregarleunheaderyunbody,paraluegoenviarloporHTTPparainvocarunWebService.LaFigura14presentaunejemplodeusodeSAAJ.JavaArchitectureforXMLBinding(JAXB,JSR222)defineunenlaceJava-XMLestán-

darparaconvertirrepresentacionesJavaencomponentesXMLesquemayviceversa.EsteestándarapuntaafacilitaralosprogramadorestrabajarconinstanciasXMLdeunesquema.JavaAPIforXML-BasedWebServices(JAX-WS,JSR224)esunAPI,basadaenSAAJ,

paraconsumiryproveerWebServices.LacapaXMLseocultaalprogramador,quienutilizaobjetos generados por herramientas incluidas en Java SE y Java EE. Para la conversión Java XMLseutilizaJAXB.WebServicesMetadatafortheJavaPlatform(WS-Metadata,JSR181)defineunconjunto

deanotacionesquepermitenconfigurarcómoelcontenedorrealizaráeldesplieguedeunWebServiceatravésdelaclaseJavaqueutilizalasanotaciones.Algunosejemplosdeanotacionesson:@WebService,@[email protected]

Page 62: 10. Taller de Formación Java empresarial

690

Talle

r de

Form

ació

n Ja

va e

mpr

esar

ial

tiempo de despliegue (deployment) el contenedor interpreta estas anotaciones y genera el restodelosartefactosnecesarios(porejemplo,elWSDL).

4.2 Anotaciones para Implementar Web Services

Las anotacionesprovistaspor laplataforma Javapermiten fácilmente implementarunWebServiceconunenfoquebottom-up,apartirdeunaclaseJava.Amododeejemplo,laFigura15presentalaimplementacióndeunWebServicedeno-

minado“HelloWorld”queproveeunaoperacióndenominada“sayHello”.EstaoperaciónrecibeunparámetrodetipoStringydevuelveunvalortambiéndetipoString.Laanotación@WebServiceespecificaqueunaclasecorrespondealaimplementaciónde

un Web Service. Se puede aplicar también a interfaces. Si se aplica directamente sobre la clase ynolainterfaz,entonceselcontenedorgenerarálainterfazapartirdelosmétodospúblicos.Esta anotación se puede aplicar también a Stateless Session Beans.Laanotación@WebMethodpermiteespecificarlaformaenquelosmétodosdeunaclase

JavaseexponencomooperacionesdelWebService.Porejemplo,laFigura16especificaotronombreparaelmétodo“sayHello”.Deformasimilar,lasanotaciones@WebResulty@WebParampermitenespecificardis-

tintosaspectos(porejemplo, losnombres)delresultadoyparámetrosde lasoperaciones,respectivamente.LaFigura17presentaunejemplodeesto.

Page 63: 10. Taller de Formación Java empresarial

691

Taller de Formación Java em

presarial

5 Bibliografía

M.Papazoglou,WebServices:PrinciplesandTechnology,1sted.PrenticeHall,2007.S.Potts,SamsTeachYourself WebServicesin24Hours.Sams,2003.“SOAPSpecifications.” [Online].Available: http://www.w3.org/TR/soap/. [Accessed:

07-Jul-2011].“IDABC-DocumentationontheEuropeanInteroperabilityFramework.”[Online].Available: http://ec.europa.eu/idabc/en/document/3473/5585.html. [Accessed: 12-

Sep-2011].“ExtensibleMarkupLanguage(XML).”[Online].Available:http://www.w3.org/XML/.

[Accessed:10-Jul-2011].“W3CXMLSchema.” [Online].Available:http://www.w3.org/XML/Schema. [Acces-

sed:10-Jul-2011].“SOASpecifications-WS-*Specs.”[Online].Available:http://www.whatissoa.com/soaspecs/ws.php.[Accessed:14-Sep-2011].E.Christensen,F.Curbera,G.Meredith,andS.Weerawarana,“WebServicesDescription

Language(WSDL)1.1,”W3C,15-Mar-2001.“UDDIVersion3.0.2.”[Online].Available:http://uddi.org/pubs/uddi-v3.0.2-20041019.

htm.[Accessed:07-Jul-2011].“SOAPSpecifications.” [Online].Available: http://www.w3.org/TR/soap/. [Accessed:

07-Jul-2011].M.D.Hansen,SOAUsingJavaWebServices.PrenticeHall,2007.M.Kalin,JavaWebServices:UpandRunning,1sted.O’ReillyMedia,2009.