You are on page 1of 40

ISIL L TECH Java a Enter rprise Develo oper

SP PRIN NG

Java Fram meworks

CON NTEN NIDO


CAPIT TULO 1. . PATR RN INVE ERSIN N DE CON NTROL (IOC) ( ............ 5
UNPROB BLEMA,UNASOLUCIN S .... ..................... ..................... ..................... ..................... .................................5 USOS......................... ..................... ..................... ..................... ..................... ..................... .................................6 TCNICAS SDEIMPLEMENTACIN... ..................... ..................... ..................... ..................... .................................6 SERVICELOCATOR..... ..................... ..................... ..................... ..................... ..................... .................................6 INYECCI NDEDEPEND DENCIAS ....... ..................... ..................... ..................... ..................... .................................7 Inyeccinbasadaen nConstructor................................................................................... ...................... ..............8 Inyeccinbasadaen nmtodosset tters............................................................................ ...................... ..............9 Inyeccinbasadaen ninterfaces... .................................................................................... ...................... ............10 APLICABI ILIDAD.......... ..................... ..................... ..................... ..................... ..................... ...............................11 CundoutilizarIoC C?................... .................................................................................... ...................... ............11 EDORES........ ..................... ..................... ..................... ..................... ..................... ...............................11 CONTENE CONCLUS SIN............. ..................... ..................... ..................... ..................... ..................... ...............................12

CAPIT TULO 2. . SPRIN NG IOC CONTAIN C NER ..................... .................... 13


INVERSIO ONOFCONTR ROL............... ..................... ..................... ..................... ..................... ...............................13 INVERSIO ONOFCONTR ROLCONTAINER................ ..................... ..................... ..................... ...............................13 LOSBEAN NS................ ..................... ..................... ..................... ..................... ..................... ...............................14 ALIASING GBEANS........ ..................... ..................... ..................... ..................... ..................... ...............................14 BEANSCO OPES............ ..................... ..................... ..................... ..................... ..................... ...............................15 INSTANC CIACINDELO OSBEANS...... ..................... ..................... ..................... ..................... ...............................15 INSTANC CIANDOELCO ONTENEDOR.. ..................... ..................... ..................... ..................... ...............................16 INYECCI NDEDEPEND DENCIAS ....... ..................... ..................... ..................... ..................... ...............................17 Inyeccinpormtod dossetters.... .................................................................................... ...................... ............17

Pgina 2 / 40 0

Java Fram meworks Inyeccinporconstructor........... .................................................................................... ...................... ............18 do................. .................................................................................... ...................... ............19 Inyeccinpormtod

CAPIT TULO 3. . SPRIN NG JDBC C .............. .............................. .................... 21


DEFINICI N............... ..................... ..................... ..................... ..................... ..................... ...............................21 JERARQU UADEPAQUE ETES............. ..................... ..................... ..................... ..................... ...............................21 DEFINICI NDEUNAFUENTE F DEDA ATOS............. ..................... ..................... ..................... ...............................22 DEFINICI NDEUNJDBCTEMPLATE E.................... ..................... ..................... ..................... ...............................22 CONSULT TAS............... ..................... ..................... ..................... ..................... ..................... ...............................22 Consultarundatoentero e ............ .................................................................................... ...................... ............22 Consultarundatodouble d ............ .................................................................................... ...................... ............23 Consultarunstring...................... . .................................................................................... ...................... ............23 Consultarunregistr rodeunatabla................................................................................. ...................... ............23 ConsultartodoslosdatosdeunatablautilizandoRowMape er........................................ ...................... ............25 ConsultartodoslosdatosdeunatablautilizandoMap.................................................. ...................... ............25

CAPIT TULO 4. . DAO Y SPRING ........... .............................. .................... 27


INTRODU UCCIN......... ..................... ..................... ..................... ..................... ..................... ...............................27 USANDOJDBC........... ..................... ..................... ..................... ..................... ..................... ...............................28 RowMapper........... ...................... .................................................................................... ...................... ............28 dbcTemplate? ?.................... .................................................................................... ...................... ............29 Yeljd Ycm moelSpringponeelvalordel d DataSource e?........................................................... ...................... ............29 Proyec ctoejemplo... ...................... .................................................................................... ...................... ............30 USANDOIBATIS......... ..................... ..................... ..................... ..................... ..................... ...............................30 Archivos.XMLparaiBATIS........... .................................................................................... ...................... ............30 beans. .xmlparaiBAT TIS................. .................................................................................... ...................... ............31 Laimp plementacindelaccesoaIBatis........................................................................... ...................... ............31 Proyec ctoejemplo... ...................... .................................................................................... ...................... ............32 USANDOJPA............. ..................... ..................... ..................... ..................... ..................... ...............................32 Laclas seentidad ...... ...................... .................................................................................... ...................... ............32 beans. .xmlparaJPA..................... .................................................................................... ...................... ............33 Implem mentacindelainterfazPro oductDao.................................................................... ...................... ............33 Proyec ctoejemplo... ...................... .................................................................................... ...................... ............34 ELRESTO ODELPROYEC CTO............... ..................... ..................... ..................... ..................... ...............................34

Pgina 3 / 40 0

Java Fram meworks ElDAO OFactory........ ...................... .................................................................................... ...................... ............34 Lainte erfazDAO:Pro oductoDao..... .................................................................................... ...................... ............35 Elclien nte:ProductM ManagedBean................................................................................... ...................... ............36

CAPIT TULO 5. . SPRIN NG MVC ............... . .............................. .................... 37


INTRODU UCCIN......... ..................... ..................... ..................... ..................... ..................... ...............................37 PARTIENDODEUNAAPLICACIN A WEB W .............. ..................... ..................... ..................... ...............................37 LIBRERA ASSPRINGMVC M ............... ..................... ..................... ..................... ..................... ...............................38 CONFIGU URANDOSPRINGMVC..... ..................... ..................... ..................... ..................... ...............................38

Pgina 4 / 40 0

Java Fram meworks

Ca apitulo o 1. PATR RN IN NVERSIN DE E CONTROL (IoC)


La Inve ersin de Control es s un patr n de dise eo pensa ado para permitir p un n menor acoplam miento entre e componen ntes de una a aplicacin y fomentar r as el res so de los mismos.

UN PR ROBLEM MA, UNA SOLUCI IN


Como to odo patrn, , comienza planteando o un proble ema y el vie ene a resolv ver. Muchas veces, un componente tie ene depend dencias de servicios s o componentes cuyos tipos t concre etos son iseo. especificados en tiempo de di

En el ejemplo de la a imagen, clase c A depe ende de Se erviceA y de e ServiceB. Los problemas que e esto plant tea son: Al reemplaz A zar o actual lizar las dep pendencias s, se necesita cambiar el cdigo fu uente de la clase A. mentaciones s concretas s de las dependencias s tienen que estar disponibles Las implem e tiempo de en d compilac cin. Las clases son difciles s de testear aisladame ente porque e tienen dire ectas definic ciones a s depend sus dencias. Esto significa que las dep pendencias s no pueden n ser reemp plazadas por compon nentes stub bs o mocks. Las clases tienen cdigo repetido o para crear r, localizar y gestionar sus depend dencias.

Aqu la solucin pasa p por de elegar la fu uncin de seleccionar s mentacin concreta c una implem dependencia as a un com mponente externo. de las d El contr rol de cmo o un objeto A obtiene la referencia a de un obj jeto B es invertido. El objeto A no es re esponsable de obtener r una refere encia al obje eto B sino que q es el Co omponente Externo el respo onsable de esto. e Esta es e la base del d patrn Io oC.

Pgina 5 / 40 0

Java Fram meworks

El patr n IOC aplica un princ cipio de dis seo denom minado prin ncipio de Hollywood H (No nos llames, nosotros te e llamaremo os).

USOS S
El patr n IoC se pu uede utilizar cuando: las clases de Se desee desacoplar S d d sus depe endencias de d manera de que las mismas puedan ser r reemplaza adas o actualizadas co on muy pocos o casi ningn camb bio en el c cdigo fuete e de sus cla ases. Desea esc cribir clases s que depe endan de clases c cuya as impleme entaciones no son c conocidas e tiempo de en d compilac cin. Desea testa ar las clases aisladame ente sin sus s dependen ncias. Desea desa acoplar sus s clases de ser respon nsables de localizar y gestionar el e tiempo d vida de sus de s depend dencias.

TCN NICAS DE E IMPLEM MENTAC CIN


Segn d diversos en nfoques, est te patrn pu uede implem mentarse de d diversas maneras. Entre E las ms con nocidas ten nemos: Inyeccin de d dependencias S Service Loc cator

SERV VICE LOC CATOR


Un Serv vice Locato or es un com mponente que q contiene referencia as a los servicios y en ncapsula la lgica que los localiza dic chos servic cios. As, en n nuestras clases, uti ilizamos el Service r para obten ner instancia as de los se ervicios que e realmente necesitamos. Locator

Pgina 6 / 40 0

Java Fram meworks

El Serv vice Locator r no instancia los serv vicios. Prov vee una ma anera de registrar ser rvicios y mantener una refe erencia a dichos d serv vicios. Luego de que e el servicio o es regist trado, el uede localiza arlo. Service Locator pu El Servi ice Locator debe prove eer una form ma de localizar un serv vicio sin esp pecificar el t tipo. Por ejemplo o, puede us sar una clav ve string o el e tipo de in nterface. Es sto permite un fcil ree emplazo de la de ependencia sin modific car el cdigo o fuente de la clase. Es asun nto de la im mplementac cin de est ta forma de e IoC, el de eterminar la a forma en n que se localizar el servicio requerido o.

INYEC CCIN DE D DEPEN NDENCIA AS


Una de ependencia entre un component te y otro, p puede esta ablecerse estticamen e nte o en tiempo de compilacin, o bien n, dinmica amente o en n tiempo de e ejecucin. Es en st te ultimo rio es donde cabe el concepto c de e inyeccin, , y para que e esto fuera a posible, debemos d escenar referenc ciar interfac ces y no imp plementacio ones directa as. En gene eral, las dependencias s son expre esadas en trminos t de e interfaces en lugar de e clases concreta as. Esto pe ermite un rpido reem mplazo de las implem mentaciones s dependientes sin modifica ar el cdigo o fuente de la clase. Lo que e propone entonces la Inyec ccin de dependencias, es no instanc ciar las dependencias exp plcitamente e en su cla ase, sino q que declara ativamente expresarla as en la n de la cla ase. La esencia de la a inyeccin de las dependencias s es contar r con un definici compon nente capa az de obte ener instan ncias valida as de las dependen ncias del objeto o y pasrse elas durante e la creacin o inicializa acin del ob bjeto.

1. A necesita una referen ncia a B, pe ero no nece esita saber r cmo debe e crear la instancia d B, solo quiere de q una referencia r a ella. 2. B puede se er una interf face, clase abstracta a o clase conc creta.

Pgina 7 / 40 0

Java Fram meworks

3. A Antes de que q una in nstancia de e A sea usada, nece esitara una a referencia a a una instancia de e B. Aqu no o hay un alto a acoplam miento entre e A y B, ambas a pued den cambia ar internamente sin afectar a la otra. Los L detalles de cmo se s crea y ge estiona un objeto B, no es decidido en la entacin de e A. Es un framework k IoC quien usa un mtodo como o setB() de e A para impleme inyectar r luego a un n objeto B. Existen tres princip pales maneras de imple ementar la inyeccin de d dependencias: Inyeccin basada b en Constructor C Inyeccin basada b en mtodos m set tters Inyeccin basada b en in nterfaces

Inyecc cin basa ada en Co onstructo or


con parmetros del objeto Las de ependencias s se inyec ctan utiliza ando un constructor c dependiente. ste constructor recibe las s dependenc cias como parmetros p s y las estab blece en butos del ob bjeto. los atrib Conside erando un diseo d de dos d capas donde d tenem mos una ca apa de BusinessFacad de y otra de Bus sinessLogic, la capa BusinessFa acade depe ende de la a Business sLogic para a operar correcta amente. Todas las clases de e lgica de d negocio o impleme entan la interface i IBusinessLogic. b en un constru uctor, se cr rear una instancia de d Business sFacade En la inyeccin basada tructor par rametizado al cual se le pas sar una referencia de un usando un const ra poder iny yectar la de ependencia. IBusinessLogic par
interface e IBusinessLo ogic { //Som me code } class Pro oductBL implements IBus sinessLogic { //Some c code } class Cus stomerBL im mplements IBusinessLogic c { //Some c code }

Pgina 8 / 40 0

Java Fram meworks public cla ass Business sFacade { privat te IBusinessL Logic businessLogic; public c BusinessFa acade(IBusine essLogic bus sinessLogic) { th his.businessLo ogic = businessLogic; } }

El objet to responsa able de las dependenci d as realizar la inyecci n de la siguiente form ma:
IBusines ssLogic produ uctBL = new ProductBL() ); Business sFacade businessFacade = new Busin nessFacade(p productBL);

La principal desve entaja de la IoC basa ada en constructor es e que una a vez que la clase ssFacade es instanciad da no podemos cambia ar las dependencias in nyectadas. Busines

Inyecc cin basa ada en m todos se etters


En este e tipo de IoC C, se utiliza a un mtodo o setters pa ara inyectar una depen ndencia en e el objeto que la r requiere. Se e invoca as s al setter de d cada de ependencia y se le pas sa como pa armetro una refe erencia a la a misma.
public cla ass Business sFacade { privat te IBusinessL Logic businessLogic; public c setBusiness sLogic(IBusin nessLogic bu usinessLogic) ) { this.b businessLogic c = business sLogic; } }

El objet to responsa able de las dependenci d as realizar la inyecci n de la siguiente form ma:
IBusines ssLogic produ uctBL = new ProductBL() ); Business sFacade businessFacade = new Busin nessFacade() ); business sFacade.setB BusinessLogic c(productBL);

La vent taja aqu es e que uno o puede ca ambiar la dependencia d a entre Bu usinessFaca ade y la impleme entacin de e IBusinessL Logic luego o de haber instanciado la clase Bu usinessFaca ade. La desv ventaja es que q un obje eto con sett ters no pue ede ser inmutable y su uele ser com mplicado determinar cules s son las dependenci d ias que se e necesitan n y en que e momento o se las a. Se reco omienda as s utilizar Io oC basada en constr ructor a me enos que necesite necesita

Pgina 9 / 40 0

Java Fram meworks

cambiar r la dependencia y sepa s claram mente los momentos en los cuales realiza ar estos cambios s. Otra desventaja es s que al utili izar setters (necesarios s para la iny yeccin), es stamos exp poniendo piedades de e un objeto al mundo exterior e cua ando en rea alidad no er ra un reque erimiento las prop de nego ocio hacerlo o.

Inyecc cin basa ada en int terfaces


Aqu se e utiliza un na interfaz comn qu ue otras cla ases imple ementan pa ara poderle es luego inyectar r depende encias. En n el siguiente ejem mplo, a to oda clase que imp plemente IBusinessFacade se le podr r inyectar cualquier objeto que e implemen nte IBusine essLogic te el mtodo injectBLO Object. mediant
interface e IBusinessLo ogic { //Som me code } interface e IBusinessFa acade { public c void injectB BLObject (IB BusinessLogic c businessLog gic); } class Pro oductBL implements IBus sinessLogic { //Som me code } class Cus stomerBL im mplements IBusinessLogic c { //Som me code } class Bus sinessFacade e implements s IBusinessFa acade { privat te IBusinessL Logic businessLogic; public c void injectB BLObject (IB BusinessLogic c businessLog gic) { th his.businessLo ogic = businessLogic; } }

El objet to responsa able de las dependenci d as realizar la inyecci n de la siguiente form ma:
IBusines ssLogic busin nessLogic = n new ProductB BL(); Business sFacade businessFacade = new Busin nessFacade() ); business sFacade.injec ctBLObject(b businessLogic c);

Pgina P 10 / 40 4

Java Fram meworks

Las tres s formas de e inyeccin presentadas, pasan una referen ncia a una implementa acin de IBusinessLogic ms que un n tipo part ticular de BusinessLo ogic. Esto presenta muchas s, como lo declara Je eremy Weis skotten, un reconocido o ingeniero de software de la ventajas empresa Kronos. Codific car contra in nterfaces bi ien definida as es la clav ve para alca anzar un menor m acopla amiento. Acoplan ndo un obje eto a una in nterface en lugar de a una implementacin especfica, permite utilizar c cualquier im mplementac cin con el mnimo m cam mbio y riesgo

APLIC CABILIDA AD
Cun ndo utiliza ar IoC?
La inyeccin de de ependencia as no deber ra usarse siempre s que una clase e dependa de otra, s bien es efectiva e en situaciones s especficas s como las siguientes: sino m Inyectar datos de conf figuracin en un compo onente. endencia en varios com mponentes. Inyectar la misma depe erentes imp plementacio ones de la misma m depe endencia. Inyectar dife Inyectar la misma impl lementacin n en varias configuraci iones S necesita Se an alguno de los servic cios provisto os por un co ontenedor.

La IoC no es nec cesaria si uno va a utilizar siem mpre la misma imple ementacin de una nos, no rep portar gran ndes benef ficios en dependencia o la misma configuracin, o al men asos. estos ca

CONT TENEDORES
En pos de implementar el patrn IoC en n alguna de e sus varian ntes, existen los denom minados edores de inyeccin de dependencias (CID) ), que son los componentes enc cargados contene de insta anciar las dependencia as y realizar las inyecc ciones nece esarias entr re todos los s objetos y adem s gestiona ar sus respe ectivos ciclo os de vida. En cua anto a la in nstanciacin e inyecc cin, un CID se conf figura para a especifica arle que dependencias deb be instancia ar y donde e deber luego inyec ctarlas. Para la instanciacin s, se debe definir d el modo de inst tanciacin, es decir, si se crear una nueva siempre adems que se lo requiera, o se reusa ar la instan ncia creada (singleton). nto a la ges stin de los ciclos de vida de los objetos o crea ados, implic ca que son capaces En cuan de administrar las diferentes etapas e de la a vida del componente c e (instanciac cin, config guracin, cin). eliminac

Pgina P 11 / 40 4

Java Fram meworks

El hecho de que el l contenedo or a veces mantenga m una referenc cia a los com mponentes creados e la instanc ciacin es lo o que lo hac ce un contenedor. luego de No todo os los obje etos deben ser gestio onados. El contenedo or mantiene e una refer rencia a aquellos s objetos que q son reusados para futuras inyecciones s, como singletones. Cuando configur ramos el contenedor c s cre ee nuevas instancias, , entonces ste se para que siempre suele olvidar de dichos objeto os creados, dejando la a tarea al GC G para rec colectarlos luego de u que no sean ms usados. Existen varios CID D, segn el l lenguaje de d program macin que soportan, que q modos s de IoC soportan, etc.. Par ra Java ten nemos el Butterfly Con ntainer, Spr ring, Pico Container, C G Guice, y otros.

CONC CLUSIN N
La natu ural mutabilidad de la as partes o mdulos de un siste ema, hace que el de esarrollar software e con mnim mo acoplam miento entre e sus comp ponentes se ea una nece esidad mas s que un mero re equerimiento o. La popu ularidad y efectividad e del patrn IoC en cua alquiera de sus formas (Service Locator, Inyecci n de dependencias, etc.) e se obse erva en la d diversidad de d framewo orks y conte enedores disponib bles en dive ersos lenguajes. En esto os contexto os, la aplica acin del patrn p IoC es una de las primer ras decision nes que deben t tomarse en el diseo de la arquite ectura de un n producto software. s

Pgina P 12 / 40 4

Java Fram meworks

Ca apitulo o 2. SPRING G IoC CONTAI C INER


INVER RSION OF O CONTROL
Si inten ntamos bus scar informa acin acerc ca de Inver rsion of Control, nos encontrarem e mos con varios a artculos que nos lleva aran al desc concierto. Algunos A dicen que inve ersion of co ontrol es un patr n de dise o y que es un sinnim mo de Depen ndency Inje ection. Otros s lo muestra an como un conc cepto, e indican que Dependenc cy inyection es una forma f de llevar a cab bo dicho concept to. Para nosotros n Inversion of Control e Dependen ncy Inyecti ion, si bien estn relacion nados, no son s equivale entes. Noso otros vemo os Inversion n of control como un concepto c ms am mplio, como un criterio de buen diseo, que nos permite e programa ar contra int terfaces, para de esacoplarno os de lgica a especifica a. Por otro lado Depen ndency Inye ection es un n patrn de dise eo desarro ollado bajo el criterio de Inversion of cont trol. La ide ea de Depe endency Inyectio on es prov veer a los s objetos de d nuestro o sistema otros obje etos, denom minados colabora adores, que e les permiten llevar a cabo su finalidad. El patrn es parecido p al Builder, pero co on un obje etivo diferente, provee er desacop plamiento entre e los objetos o de nuestro sistema a.

INVER RSION OF O CONTROL CONTAINER R


El mdulo Core es e el ms importante de Spring g. Es el qu ue provee el Contene edor IoC on of contro ol). Este con ntenedor no os permite aplicar a el pa atrn Dependency Inje ection en (Inversio nuestras aplicacion nes. En form ma muy res sumida, el objetivo de el contened dor IoC es encargarse e de instan nciar los objetos de nuestro o sistema, denominado os beans, y asignarle sus s depende encias. Par ra que el edor pueda a llevar a cabo esta tarea, debemos s, mediante e informac cin de contene configur racin, indic carle dnde e se encuen ntran dichos s beans. Supong gamos que dentro de nuestro sistema necesitamos re epresentar una computadora. Dicha c computador ra poseer un micropr rocesador, un placa madre, m mem morias, disco o rgido, etc. Al crear un objeto o de tipo computa adora tendramos que e asignarle, mediante cdigo, c es. Utilizand do el conte enedor de Spring, en n lugar de hacer toda as estas estos componente creacion nes y asi ignaciones de dependencias que q posee e la comp putadora con c sus compon nentes, le pediremos p a contenedor que nos instancie un al u objeto de e tipo comp putadora y el ser r el encar rgado de crear c y asig gnar las dependencias s de la com mputadora con sus compon nentes.

Pgina P 13 / 40 4

Java Fram meworks

El princ cipal conce epto es la interfaz Be eanFactory. Es una so ofisticada implementacin del patrn Factory, nos permite instanciar objetos o de forma f muy rpida y fc cil, libernd donos de la nece esidad de especificar e l las depend dencias en la lgica de nuestro programa y, y por lo tanto, desacoplar esta e depend dencia en ti iempo de co odificacin, quedando ligada al tie empo de zacin / sta art-up o incluso al e ejecucin / run-time ya y que pue eden cambiarse las inicializ impleme entaciones en tiempo de d ejecuci n.

LOS B BEANS
El conte enedor IoC C de Spring g administra a uno o muchos bean ns. Estos beans b son creados utilizand do las instru ucciones de eclaradas en n la informa acin de con nfiguracin del contene edor. Configu urar los beans mediant te un archiv vo xml es s lo una de las formas existentes. . Por ser la ms u utilizada es la que hem mos elegido para imple ementar los ejemplos.
<bea ans> ... <b bean id="miPrimerBean" " class="paqu uete.Ejemplo o"/> ... </bea ans>

Internam mente, Spring, guarda a las definiciones de cada bean representa adas por un objeto BeanDe efinition. Ca ada BeanDe efinition pos see la siguie ente informa acin: Nombre de e la clase (incluyendo ( o el paquet te) para la cual se de efine el bean, o el nombre de la clase fac ctory que cr rea la clase. Informacin n de compo ortamiento del d bean: Si S es Proto otype o Si inglenton, si utiliza mtodos pa ara inicializa acin o destruccin, et tc. A Argumentos s de construccin del objeto o o set teo de propiedades lue ego de la cr reacin. O Otros beans necesario os para el bean creado o. (Depende encias del bean). b

ALIAS SING BEA ANS


Para ca ada bean de efinimos un identificado or unvoco para referenciarlo med diante el atr ributo 'id' del elem mento 'bean n'. Pero exi iste la posib bilidad de r referenciar al mismo bean b con di iferentes nombre es definindole alias. Definici n del bean n:
<bea ans> ... <b bean id="miPrimerBean" " class="paqu uete.Ejemplo o"/>

Pgina P 14 / 40 4

Java Fram meworks ... </bea ans> Definici n de los alias: <bea ans> ... <a alias name="miBean" alia as="miPrime erBean"/> <a alias name="unBean" alias="miPrime erBean" /> ... </bea ans>

BEAN N SCOPE ES
Uno de e los princip pales atribu utos que se e utilizan en n la definicin de un bean b es el atributo 'scope' '. Dicho atributo permi ite definir el e alcance de d un bean. Spring po osee, por defecto 4 es principale es: alcance Se crea un S Singleton: na sola insta ancia del be ean por IoC C container. Prototype: Permite cr rear cualquier cantidad de instanc cias del bean. Request: Se crea automticam a mente una instancia del bean por cada request. Podemos modificar m el l bean y so olo ser mo odificado para el requ uest en el q que nos e encontramo os trabajan ndo, los otr ros request no vern n estos cam mbios. Solo o vlido utilizando ApplicationC A Context para a aplicacion nes web. Session: Se S S crea automticam mente una instancia del bean por cada session. Podemos modificar m el l bean y so olo ser mo odificado para la sess sion en la q que nos e encontramo os trabajan ndo, las otr ras session n no vern n estos cam mbios. Solo o vlido utilizando ApplicationC A Context para a aplicacion nes web. Global Session: Sim G milar al Session, es utilizado po or portlets para compartir la s session entre los distintos portle ets. En caso de que no n estemos s utilizando portlets e este scope degrada al scope sess sion. Solo vlido v utiliza ado ApplicationContext t

Adiciona almente, Sp pring nos pe ermite defin nir nuestros propios scopes.

INSTA ANCIACIN DE LOS L BEA ANS


El cont tenedor de IoC de Spring busc cara de la informacin n de config guracin lo os datos rios para ins stanciar al bean b solicit tado utilizan ndo reflectio on. necesar Para indicar la cla ase que se e deber ut tilizar para instanciar el bean se e utilizar el atributo del elemento o 'bean'. 'class' d

Pgina P 15 / 40 4

Java Fram meworks <bea ans> ... <b bean id="miPrimerBean" " class="paqu uete.Ejemplo o"/> ... </bea ans>

Otra for rma para in ndicar cmo construir un bean es e utilizando un mtod do esttico factory. Para es ste caso, el atributo 'c class' indica a el nombre e de la fac ctory para in nstanciar al objeto. Adems s, es necesario decla arar otro at tributo, 'fac ctory-method d', que pos see el nom mbre del mtodo esttico pa ara instanciar el objeto o. El tipo de e objeto dev vuelto por la a factory pu uede ser quier tipo. de cualq
<bea ans> ... <b bean id="beanCreadoPor rFactory" class="paquete e.SoyUnaFac ctory" factory-method="creoInstancias"/> > ... </bea ans>

Y la ltima forma para construir un bea an es utiliza ando un m todo factory de instancia. En u el atri ibuto 'class'. Se utiliza aran los atributos 'facto ory-bean' y 'factoryeste cas so, no se utiliza method'. 'factory-b bean' debe referencia ar a un be ean dentro del mismo o contenedor (o el edor padre) que posee e el mtodo factory. 'fa actory-metho od' debe ind dicar el nom mbre del contene mtodo a utilizar.
<bea ans> ... <b bean id="beanFactory" class="paque c ete.SoyFactory" /> <b bean id="beanCreadoPor rFactory" fac ctory-bean=" "beanFactory y" factory-method="creoInstancias"/> > ... </bea ans>

INSTA ANCIAND DO EL CO ONTENE EDOR


Ya hem mos definid dos los bea ans dentro de nuestr ro sistema. Ahora veamos la fo orma de acceder rlos. Spring g posee dos d interfac ces que de efinen los mtodos para p poder r utilizar nuestros beans. La a primera y ms simple e, BeanFac ctory , esta interfaz i def fine la funcio onalidad tionContext t extiende la l funcionalidad de Be eanFactory y es la bsica mientras que Applicat mentar aplic caciones J2E EE. preferida al implem mplicidad, va amos a trab bajar con la a interfaz BeanFactory y y, mas es specficame ente, con Por sim la clase e XmlBeanF Factory que la impleme enta.

Pgina P 16 / 40 4

Java Fram meworks Input tStream is = new FileInputStream("beans.xml"); BeanFactory bean nFactory = new n XmlBean nFactory(is);

De esta a forma definimos que la informacin de e configura acin de nuestros n be eans se encuent tra en el ar rchivo bean ns.xml. Utilizando el m mtodo getB Bean(string g) podemos obtener instancias de nues stros beans. .
beanDeEjemplo = beanFactor ry.getBean("miPrimerBea an");

INYEC CCIN DE D DEPEN NDENCIA AS


Generalmente cua ando utilizamos un objeto est te no trab baja solo sino s que lo hace cndose con otros objetos. o Es stos objeto os (depend dencias) so on pasados como comunic argume entos en co onstructores s o seteado os como pr ropiedades (inyectado os) al objeto por el contene edor IoC. Cabe destacar la importancia a de la inyeccin de dependenc cias: El cd digo se vue elve ms menos acoplado cuand do los objet tos no crean sus depe endencias. (no ( necesita an saber claro y m donde e estn localiz zados ni a que q clase pertenecen). Junto con la decla aracin del bean podemos incluir r inyeccin de dependencias. Par ra lograr odemos utili izar dos formas: inyecc cin por m todos sette ers o inyecc cin por con nstructor esto, po

Inyecc cin por mtodos m setters


La inyec ccin de de ependencias se realiza a a travs de d mtodos s setters lue ego de insta anciar al objeto in nvocando un u construct tor sin parmetros o un n mtodo fa actory sin pa armetros.
<bea ans> ... <b bean id="beanEjemplo" class="paqu c ete.Ejemplo" "> <property name="unBe ean"><ref bean="meIny b yectan"/></p property> <property name="otroBean" ref="m meInyectanT Tambien"/> <property name="soyU UnInteger" va alue="1"/> </ /bean> <b bean id="me eInyectan" cl lass="paque ete2.UnBean" "/> <b bean id="me eInyectanTam mbien" class="paquete3. .OtroBean"/> > ... </bea ans>

A contin nuacin se presenta el cdigo de la clase Eje emplo:


package paquete;

Pgina P 17 / 40 4

Java Fram meworks

public cla ass Ejemplo { privat te UnBean unBean; privat te OtroBean otroBean; privat te int i; public c void setUnBean( UnBea an unBean) { th his.unBean = unBean; } public c void setOtr roBean( Otro oBean otroBe ean) { th his.otroBean = otroBean; ; } public c void setSoy yUnInteger(int i) { th his.i = i; } }

Inyecc cin por construct c tor


La inye eccin de dependenc cias por medio m de constructor res se rea alizan llama ando al construc ctor de la clase c pasndole un co onjunto de argumento os como de ependencias s (De la misma f forma se re ealiza si el constructor c f fuera un m todo factor ry).
<bea ans> ... <b bean id="beanEjemplo" class="paqu c ete.Ejemplo" "> <construct tor-arg><ref f bean="meInyectan"/>< </constructor r-arg> <construct tor-arg ref="meInyectanT Tambien"/> <construct tor-arg type= ="int" value= ="1"/> </ /bean> <b bean id="me eInyectan" cl lass="paque ete2.UnBean" "/> <b bean id="me eInyectanTam mbien" class="paquete3. .OtroBean"/> > ... </bea ans>

A contin nuacin se presenta el cdigo de la clase Eje emplo:


package paquete;

Pgina P 18 / 40 4

Java Fram meworks public cla ass Ejemplo { privat te UnBean unBean; privat te OtroBean otroBean; privat te int i; public c Ejemplo(Un nBean unBea an, OtroBean n otroBean, int i) { th his.unBean = unBean; th his.otroBean = otroBean; th his.i = i; } }

Para res solver en qu posicin n debe ser pasado p cada parmetro al constru uctor, el con ntenedor chequea a el tipo de el argumen nto. Esto puede realiz zarse siemp pre que no se encuen ntre una ambige edad en lo os tipos. En E caso de e encontrar r una ambigedad, lo os parmet tros son pasados s en el orde en especific cado en la definicin d de el bean. La mejo or forma para definir lo os argumentos del constructor es usando el atributo a 'ind dex', que especifica el ubic cacin del argumento o. De esta a forma se e resuelve cualquier tipo de edad. ambige
<bea ans> ... <b bean id="beanEjemplo" class="paqu c ete.Ejemplo" "> <construct tor-arg index=0 ><ref bean="meIn nyectan"/></ /constructor-arg> <construct tor-arg index=1 ref="m meInyectanTa ambien"/> <construct tor-arg index=2 type="int" value="1"/> </ /bean> ... </bea ans>

Inyecc cin por mtodo m


Se puede dar el caso, c en qu ue un bean n singleton requiera como colabo orador un bean b no ton. Lo que e realmente necesita el singleton, es una instancia nuev va cada vez z que se singlent ejecuta alguno de sus mtodos. En este e caso nos encontram mos con el problema p de e que el s construid do una nica vez po or el conte enedor, con n lo cual, siempre bean singleton es dr la mism ma instancia a del bean no n singlento on. Un form ma que se nos n puede plantear contend resolver r esto es utilizando u la a interfaz ApplicationC A ContextAwa are, y acce eder al con ntenedor solicitan ndo que no os retorne el e colabora ador. El pro oblema de resolver es sto es que atamos nuestra implement tacin al framework.

Pgina P 19 / 40 4

Java Fram meworks

Para resolver esto, esta la iny yeccin de dependenc d ias por mt todo. Aqu, lo que hace emos es en el single eton un mt todo que ser el enca argado de proveernos p la nueva instancia definir e del cola aborador.
prote ected abstrac ct ClaseColab borador creat teColaborado orNoSingleton();

Luego, desde el archivo a de configuraci c n de Sprin ng, indicamos que deb be reemplazar este e un nuevo o Colaborad dor del tipo o ClaseCola aborador mtodo de forma tal de que nos genere ez que es lla amado un mtodo m del singleton. s cada ve
<bea an id="unColaboradorNoS Singleton" cla ass="ClaseCo olaborador" singleton="f false"/> <bea an id="unBea anSingleton" class="Clase eBeanSinglet ton"> <l lookup-meth hod name="c createColabo oradorNoSing gleton" bean="unC ColaboradorN NoSingleton"/ /> <p property> ... </ /property> </bea an>

Lo que har Spring, ser generar g dinmicament te una clas se que ree escribir el mtodo do de form ma tal que e use al contenedor c para crea ar la instan ncia neces saria del declarad colabora ador media ante el mto odo createC Colaborado orNoSingleto on(). Esto lo l realiza utilizando la librera CGLIB que le permite generar bytecode dinmicamente.

Pgina P 20 / 40 4

Java Fram meworks

Ca apitulo o 3. SPR RING J JDBC


DEFIN NICIN
Spring ofrece o un framework f p para JDBC C que abstra ae su comp plejidad y hace h mas simple s el trabajo con base de datos. iguiente cua adro se mu uestra los pasos que normalment n e el desarro ollador realiza para En el si procesa ar una sente encia.

Utilizand do el frame ework Spring JDBC s lo los punto os que est n en itlica as y azul de eben ser codifica ados por el programado p or.

JERA ARQUA DE D PAQU UETES


Spring JDBC J esta formado po or cuatro pa aquetes: cor re, dataSou urce, object y support. org.springfr o ramework.jd dbc.core C Contiene la a clase Jdbc cTemplate. org.springfr o ramework.d datasource E Este el principal acces so a las fuen ntes de dato os de Spring JDBC, es s el nivel ma as bajo. org.springfr o ramework.jd dbc.object

Pgina P 21 / 40 4

Java Fram meworks

C Contiene clases c que e representan las co onsultas (q queries) a los RDBM MS, las a actualizacio ones (updat tes) y los procedimien p tos almace enados (stored procedu ures) en o objetos reus sables. org.springfr o ramework.jd dbc.support t C Contiene la a traduccin n de excep pciones SQLException as como algunas clases de u utilera.

DEFIN NICIN DE D UNA FUENTE F DE DAT TOS


DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" ");

DEFIN NICIN DE D UN JD DBCTEM MPLATE


DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" "); JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate(dataSo ource);

CONS SULTAS
Consu ultar un dato d enter ro
DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("admin" "); JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate(dataSo ource); int rowC Count = jdbcT Template.queryForInt("se elect count(* *) from cuen nta"); System.o out.println(ro owCount);

Pgina P 22 / 40 4

Java Fram meworks

Consu ultar un dato d doub ble


DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("admin" "); JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate(dataSo ource); String sq ql = "select sum(dec_cue s ensaldo) from m cuenta"; Double saldo s = jdbcT Template.queryForObject t(sql, Double e.class); Syste em.out.println n(saldo);

Consu ultar un string s


DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" "); JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate(dataSo ource); String sq ql = "select vch_clienomb v bre from cliente where ch hr_cliecodigo o = ?"; String no ombre = (Str ring) jdbcTem mplate.query yForObject(s sql, new Obje ect[] {"0001" "}, String.class); System.o out.println(nombre);

Consu ultar un re egistro de una tab bla


Primero o se debe cr rear la clase e entidad:
package dao.entity; public cla ass Cliente { privat te String cod digo; privat te String pat terno; privat te String mat terno; privat te String nom mbre; privat te String dni; privat te String ciud dad; privat te String dire eccion; privat te String tele efono;

Pgina P 23 / 40 4

Java Fram meworks privat te String email; // Se debe crear los l mtodos getter y sett ter }

Luego c creamos la clase de tip po RowMap pper:


package dao.mapper r; import d dao.entity.Clie ente; import ja ava.sql.ResultSet; import ja ava.sql.SQLE Exception; import o org.springfram mework.jdbc c.core.RowMa apper; public cla ass ClienteMapper implem ments RowM Mapper { @Ove erride public c Object map pRow(Result tSet rs, int i) throws SQLE Exception { Cliente obj = new n Cliente(); ob bj.setCodigo( (rs.getString( ("chr_cliecod digo")); ob bj.setPaterno o(rs.getString g("vch_cliepa aterno")); ob bj.setMaterno o(rs.getString("vch_cliem materno")); ob bj.setNombre e(rs.getString g("vch_clieno ombre")); ob bj.setDni(rs.g getString("ch hr_cliedni")); ob bj.setCiudad( (rs.getString( ("vch_clieciu udad")); ob bj.setDireccio on(rs.getStrin ng("vch_clied direccion")); ob bj.setTelefon no(rs.getStrin ng("vch_clietelefono")); ob bj.setEmail(rs s.getString(" "vch_clieema ail")); re eturn obj; } }

Finalme ente podem mos ejecutar r la consulta a:


DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/eurekaba ank"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" "); JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate(dataSo ource);

Pgina P 24 / 40 4

Java Fram meworks String sq ql = "select * from cliente e where chr_ _cliecodigo = ?"; Cliente c cliente = (Clie ente) jdbcTe emplate.quer ryForObject(s sql, new O Object[]{"00 001"}, new ClienteMappe C er ); System.o out.println(cl liente.getNom mbre());

Consu ultar todo os los dat tos de una tabla ut tilizando RowMap per
// Definie endo un Spring DataSource DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/rh"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" "); // Definie endo un JdbcTemplate JdbcTem mplate jdbcT Template = new n JdbcTem mplate(dataSource); // Consu ultado el para ametro: depa artamento if( req.ge etParameter( ("dpto") == null ){ throw w new Except tion("Falta el parmetro."); } Integer d dpto = Integ ger.parseInt( (req.getParam meter("dpto" ").toString()) ); // Consu ultando un co onjunto de re egistros utiliz zando RowMa apper out.print tln("<h1 style e='color:blue e'>Utilizando o RowMappe er</h1>"); String qu uery = "selec ct * from em mpleado wher re iddepartam mento=?"; Object[] parm = {dp pto}; List<Empleado> lista a = jdbcTem mplate.query y(query, new EmpleadoMapper(), parm); for (Emp pleado emp : lista) { out.p println("<p st tyle='color:blue'>" + emp.getNombre() ) + " " + em mp.getApellido o() + "</p>"); }

Consu ultar todo os los dat tos de una tabla ut tilizando Map
// Definie endo un Spring DataSource DriverMa anagerDataS Source dataSo ource = new w DriverMana agerDataSour rce(); dataSource.setDriver rClassName("com.mysql.j jdbc.Driver") ); dataSource.setUrl("jd dbc:mysql:// /localhost:3306/rh"); dataSource.setUsern name("root"); ; dataSource.setPassw word("mysql" "); // Definie endo un JdbcTemplate JdbcTem mplate jdbcTe emplate = ne ew JdbcTemplate();

Pgina P 25 / 40 4

Java Fram meworks jdbcTem mplate.setDat taSource(dat taSource); // Consu ultado el para ametro: depa artamento if( req.ge etParameter( ("dpto") == null ){ throw w new Except tion("Falta el parmetro."); } Integer d dpto = Integ ger.parseInt( (req.getParam meter("dpto" ").toString()) ); // Consu ultado un con njunto de fila as utilizando Map out.print tln("<h1 style e='color:blue e'>Utilizando o Map</h1>"); List<Map p<String,Obj ject>> lista2 2 = jdbcTemplate.queryF ForList(query y, parm); for (Map p<String, Obj ject> rec : lista2) { out.p println("<p st tyle='color:blue'>" + rec.get("nombre e") + " " + rec.get("apel r lido") + "</p p>"); }

Pgina P 26 / 40 4

Java Fram meworks

Ca apitulo o 4. DAO O y SPR RING


INTRO ODUCCI N
Spring es un pode eroso frame ework para java donde su principal objetivo o (y muy t til) es la sde nuestros programa as - en vez de hacer new() n y con n cientos instanciacin de objetos. Des s de valore es - simplemente obte enemos el objeto ya armadito desde d el de inicializaciones spring. e este mic cro tutorial es cmo usar u Spring g bajo el pa atrn Dao y patrn Lo que veremos en cin web (us sando JSF) ) que acced de a la base e de datos "sample" " Factory. Veremos una aplicac ene incluido o en el Net tBeans. Nuestra aplica acin se ej jecutar en n Glassfish, y debe que vie contar c con un JDBC Resource e que acced de a la base e de datos mencionada m a. En los e ejemplos pu ublicados, veremos v qu ue existe el l archivo su un-resource es.xml que contiene c la configuracin del JDBC Resource R y JDBC Poo ol para cre ear el DataSource en nuestro sh: Glassfis
<?xml ve ersion="1.0" " encoding=" "UTF-8"?> <!DOCTY YPE resource es PUBLIC "-//Sun Micros systems, Inc.//DTD Appli ication Serve er 9.0 Resour rce Definitions //EN" "htt tp://www.su un.com/softw ware/appserv ver/dtds/sun-resources_1 1_3.dtd"> <resourc ces> <jdbc c-resource enabled="true e" jndi-name e="jdbc/sample" object-t type="user" pool-name="samplePool"> <d description/> > </jdb bc-resource> > <jdbc c-connection n-pool all low-non-com mponent-calle ers="false" as ssociate-with h-thread="fal lse" co onnection-cre eation-retry-a attempts="0 0" co onnection-cre eation-retry-i interval-in-se econds="10" " co onnection-lea ak-reclaim="false" co onnection-lea ak-timeout-in n-seconds="0 0" co onnection-validation-meth hod="auto-c commit" da atasource-cla assname="or rg.apache.de erby.jdbc.Clie entDataSourc ce" fail-all-connect tions="false" " idle-timeout-in n-seconds="3 300" is-connection-v validation-re equired="fals se" is-isolation-lev vel-guarantee ed="true" laz zy-connectio on-association n="false"

Pgina P 27 / 40 4

Java Fram meworks laz zy-connectio on-enlistment t="false" match-connections="false" " max-connectio on-usage-cou unt="0" max-pool-size= ="32" max-wait-time e-in-millis="6 60000" na ame="samplePool" no on-transactio onal-connecti ions="false" po ool-resize-quantity="2" re es-type="java ax.sql.DataSo ource" sta atement-timeout-in-seco onds="-1" ste eady-pool-siz ze="8" va alidate-atmos st-once-perio od-in-seconds="0" wr rap-jdbc-obje ects="false"> <property name="URL" value="jdb bc:derby://loc calhost:1527 7/sample"/> <property name="serv verName" value="localhost"/> <property name="PortNumber" val lue="1527"/> > <property name="Data abaseName" value="sam mple"/> <property name="User r" value="ap pp"/> <property name="Pass sword" value e="app"/> </jdb bc-connection n-pool> </resour rces>

En resu umen, para acceder a nuestra n bas se de datos lo haremos s por el data aSource, us sando el JDNI: jd dbc/sample. .

USAN NDO JDB BC


RowM Mapper
Este es quizs la manera m de acceder a a la a base de d datos ms simple s y bs sica. emos que cuando c usbamos un JDBC J norm mal, despus s de hacer un executeQuery(), Recorde haciamo os un while e (rs.next()) y dentro del d bucle ha aciamos un new a cad da objeto por cada fila y lo o agregba amos a una a lista. Pues con el Spring es lo mismo, pero nos da una ayudadita.
public c List getProd ducts() { RowMapper ma apper = new w RowMapper r() { public Objec ct mapRow(R ResultSet rs, int rowNum) ) throws SQL LException { //se lee cada c campo como c en el while w de un ResultSet R com mun de JDBC C Product p = new Prod duct();

Pgina P 28 / 40 4

Java Fram meworks p.setProd ductId(rs.getI Int("PRODUC CT_ID")); p.setManufacturerId(r rs.getInt("MA ANUFACTUR RER_ID")); p.setProd ductCode(rs.g getString("PR RODUCT_CO ODE")); p.setPurc chaseCost(rs. .getDouble(" "PURCHASE_ _COST")); p.setQuan ntityOnHand d(rs.getInt("Q QUANTITY_O ON_HAND")); ; p.setMark kup(rs.getFlo oat("MARKUP P")); p.setAvailable(rs.getS String("AVAIL LABLE")); p.setDesc cription(rs.ge etString("DES SCRIPTION") )); return p; } }; List list = jdbcT Template.que ery("SELECT T * FROM Pro oduct", mapp per); ret turn list; }

El Sprin ng es el que e hace el ex xecuteQuer ry() y le dec cimos cmo o lo va a tratar por cada a fila del resultad do. E Esto se hace implemen ntado la interfaz org.springframewo ork.jdbc.core e.RowMapp per.

Para ma ayor inform macin como o hacer quer ries desde Spring, S visita ar: http://st tatic.springf framework.o org/spring/d docs/2.5.x/r reference/jdb bc.html

Y el j jdbcTemp plate?
Pues es ste objeto es e una propi iedad que fue recibida desde el Spring: S
privat te JdbcTemp plate jdbcTem mplate; public c void setDat taSource(Dat taSource ds) { jdb bcTemplate = new JdbcT Template(ds); }

Y cm mo el Spring pone e el valor r del DataSource?


As:
<bean n id="dataSo ource" class= ="org.springf framework.jn ndi.JndiObjec ctFactoryBea an"> <p property nam me="jndiNam me" value="jd dbc/sample" /> </bea an> <bean n id="Produc ctDao" class= ="dao.derby y.DerbyProdu uctsDao"> <p property nam me="dataSource" ref="da ataSource" /> > </bea an>

Pgina P 29 / 40 4

Java Fram meworks

Proyecto ejemp plo


http://die esil-java.go ooglecode.c com/files/Sp pringDaoJdb bc.tar.gz

USAN NDO IBAT TIS


iBATIS es un framework de Apache A que consiste en mapear la as consulta as y los obje etos que as consultas o que son n usados co omo parm metros de ellas. Solo ha ace eso: son resultado de la N confund dir ni compa arar con JPA A. mapea consultas. No ATIS, ya no o se tiene que q poner los comand dos SQL dentro de lo os programa as Java, Con iBA sino se usa un arch hivo .xml.

Archiv vos .XML para iBA ATIS


Este es el contenid do del archivo Product. .xml que co ontiene las consultas c que refiere a la tabla UCT: PRODU
<?xml ve ersion="1.0" " encoding=" "UTF-8"?> <!DOCTY YPE sqlMap PUBLIC "-//ibatis.apache e.org//DTD SQL S Map 2.0/ //EN" "http://ibatis.apac che.org/dtd/ /sql-map-2.dt td"> <sqlMap p namespace e="sample"> <resu ultMap id="productResult t" class="bea ans.Product"> <re esult propert ty="productI Id" column="PRODUCT_ID" /> <re esult propert ty="manufac cturerId" colu umn="MANU UFACTURER_ _ID" /> <re esult propert ty="productC Code" column="PRODUC CT_CODE" /> > <re esult propert ty="purchase eCost" colum mn="PURCHA ASE_COST" /> / <re esult propert ty="quantity yOnHand" column="QUAN NTITY_ON_H HAND" /> <re esult propert ty="markup" " column="M MARKUP" /> <re esult propert ty="available e" column="A AVAILABLE" /> <re esult propert ty="descripti ion" column= ="DESCRIPT TION" /> </res sultMap> <sele ect id="produ uctSelect" res sultMap="productResult" "> SELECT * FROM M PRODUCT </sele ect> </sqlMap>

Pgina P 30 / 40 4

Java Fram meworks

Como se puede ver, el mapeo m de cada colu umna con cada propiedad del objeto Product est dado en el e tag <resu ultMap> y es s utilizado en e el <selec ct>. iBATIS ya sabe beans.P que cad da resultado o de ese query ser ma apeado por r el resultMa ap="produc ctResult". El archi ivo de conf figuracin de iBATIS re equiere cierta configur racin para a acceder a la base de dato os; pero usando u Sp pring, el archivo a que edar redu ucido a lo siguiente:(Archivo Sqlmap pConfig.xml) )
<sqlMap pConfig> <sqlM Map resource e="Products.x xml" /> </sqlMapConfig>

beans s.xml para a iBATIS


Ahora, necesitamo n s configurar r el beans.x xml para que e la conexi n a la base de datos lo o configu ure a nuestro o iBATIS.
<bean n id="dataSo ource" class= ="org.springf framework.jn ndi.JndiObjec ctFactoryBea an"> <p property nam me="jndiNam me" value="jd dbc/sample" /> </bea an> <bean n id="sqlMap pClient" class s="org.springframework. .orm.ibatis.SqlMapClientF FactoryBean" "> <p property nam me="configLo ocation" value e="classpath h:SqlmapCon nfig.xml"/> <p property nam me="dataSource" ref="da ataSource"/> > </bea an> <bean n id="Produc ctDao" class= ="dao.ibatis. .IBatisProduc ctsDao"> <p property nam me="sqlMapC Client" ref="s sqlMapClient" " /> </bea an>

La imp plementa acin del acceso a IBatis.


Ahora, n nuestra clas se para manejar el IBa atis es el sig guiente:
public cla ass IBatisPro oductsDao ex xtends SqlMa apClientDaoS Support imple ements Prod ductDao { public c List getProducts() { Lis st list = getS SqlMapClientT Template().q queryForList( ("productSele ect"); // solo llama a la consulta re eturn list; } }

Pgina P 31 / 40 4

Java Fram meworks

Por la a herencia a de la a ork.orm.ibati is.support.S SqlMapClien ntDaoSuppo ort, se tiene t org.springframewo MapClient(), que es lo que q se est usando en n el archivo beans.xml setSqlM

el

clase mtodo

mayor usar IBatis con Spring, Para informac cin de e cmo p://static.spr ringframewo ork.org/spri ing/docs/2.5 5.x/referenc ce/orm.html#orm-ibatis s ver: http

Proyecto ejemp plo


http://die esil-java.go ooglecode.c com/files/Sp pringDaoIBa atis.tar.gz

USAN NDO JPA A


Ser necesario usar Sprin ng con JP PA? Si va amos usar el patrn DAO + Factory, vamente qu ue s. Ya que el Factory F se e encargar de devo olver una interfaz definitiv impleme entada seg gn sea h haya decid dido usar. La aplicac cin misma a no camb bia, solo cambiar r la implem mentacin del d acceso a la base de e datos.

La clase entida ad
Para us sar JPA, es e necesario hacer unos ajustes s a nuestr ros Objetos s de Trans sferencia (Transfe er Objects, es decir, lo os objetos que q usamos s para most trar en el lis sta y obtener datos de la ba ase de datos). Es nece esario que sean s declara ados como Entidades.
@Entity @Table( (name = "PR RODUCT") public cla ass Product implements Serializable { privat te static final long serialV VersionUID = 1L; @Id @Bas sic(optional = false) @Colu umn(name = "PRODUCT T_ID") privat te Integer productId; @Colu umn(name = "PURCHASE E_COST") privat te BigDecima al purchaseCo ost; @Colu umn(name = "QUANTITY Y_ON_HAND D") privat te Integer qu uantityOnHan nd; @Colu umn(name = "MARKUP") ) privat te BigDecima al markup; @Colu umn(name = "AVAILABL LE") privat te String available; @Colu umn(name = "DESCRIPT TION")

Pgina P 32 / 40 4

Java Fram meworks privat te String description; @Colu umn(name="MANUFACT TURER_ID") privat te int manufa acturerId; @Colu umn(name="PRODUCT_CODE") privat te String prod ductCode; //... }

beans s.xml para a JPA


El arch hivo persist tence.xml ya y tiene la a conexin a la base e de datos s por el JNDI del datasou urce. Pero ahora lo que nos tiene que preocupar r es acced der desde nuestra impleme entacin de e ProductoD Dao usando o JPA. NetBeans tiene un asistente e para acce eder al JP PA usando el JNDI, pero p como nuestra entacin de e ProductoD Dao no es un u componente de JEE, entonces nos va a generar impleme bastante e cdigo co on referente e a Contex xt y demas cosas de JNDI. J Lo id deal es que e se use anotacio ones. Para ello, debem mos conside erar lo siguiente en nue estro beans s.xml.
<bean n id="emf" class="org.sp c pringframework.orm.jpa.LocalEntityM ManagerFacto oryBean"> <p property nam me="persisten nceUnitName e" value="Sp pringDaoJpaP PU"/> </bea an>

<cont text:annotati ion-config /> > <bean n id="Produc ctDao" class= ="dao.jpa.Jp paProductDao o"/>

El tag < <context:annotacion a -config/> es el que se s encargar de perm mitir las anot taciones en nues stra implementacin de e ProductDa ao.

Implem mentaci n de la in nterfaz Pr roductDao


Ahora b bien, nuestra a implemen ntacin de la a interfaz ProductDao P es como sigue:
@Reposi itory public cla ass JpaProdu uctDao imple ements Produ uctDao { @Per rsistenceUnit t(unitName = "SpringDao oJpaPU") privat te EntityMan nagerFactory emf; @Tra ansactional(re eadOnly = tr rue)

Pgina P 33 / 40 4

Java Fram meworks public c List getProducts() { En ntityManager r em = emf.c createEntityM Manager(); try y{ Query q = em.createQu uery("SELECT T p FROM Pr roduct p"); return q.ge etResultList() ); }f finally { if (em != null) n { em.close(); } } } }

Y todo lo dems, sigue s igual.

Proyecto ejemp plo


http://die esil-java.go ooglecode.c com/files/Sp pringDaoJpa a.tar.gz

EL RE ESTO DE EL PROY YECTO


Como hemos h visto o, nos hem mos centrado ms en el acceso a la base de d datos qu ue en la aplicacin en s.

El DAO OFactory y
Esa es la idea del DAO + Fac ctory: solo cambiar c el acceso a la a base de datos, d el res sto de la e sufrir mod dificacin alguna. De tal t manera que si se necesita n cambiar la aplicacin no debe a de acced der a la ba ase de dat tos, solo se e necesita cambiar en e el beans.xml la manera impleme entacin qu ue necesitem mos:
<!-- Usa ando JDBC --> <bean id d="ProductD Dao" class="d dao.derby.De erbyProducts sDao"> <property name= ="dataSource e" ref="dataS Source" /> </bean> > <!-- usando Ibatis --> <bean id d="ProductD Dao" class="d dao.ibatis.IBa atisProductsD Dao"> <property name= ="sqlMapClient" ref="sqlM MapClient" /> > </bean> > <!-- usando JPA --> <bean id d="ProductD Dao" class="d dao.jpa.JpaProductDao"/>

Pgina P 34 / 40 4

Java Fram meworks

Los tres s casos son accedido os por el no ombre "Prod ductDao". Esto E quiere e decir que nuestra clase DAOFactory, , deber ten ner el siguie ente cdigo:
public cla ass DaoFacto ory { privat te static Dao oFactory insta ance; privat te synchroniz zed static Da aoFactory ne ewInstance() { re eturn new Da aoFactory(); } privat te BeanFacto ory factory; privat te DaoFactor ry() { Ap pplicationCon ntext ctx = new n ClassPathXmlApplicat tionContext( ("/beans.xml" "); factory = (Bea anFactory) ct tx; } public c static DaoF Factory getIn nstance() { if (instance == = null) { instance = newInstance e(); } re eturn instance e; } public c ProductDao o getProduct tDao() { re eturn (Produc ctDao) factor ry.getBean("ProductDao" "); } }

La inte erfaz DAO O: Produc ctoDao


Product tDao es una a interfaz que q solo tiene los mto odos a implementar. No N tiene na ada ms. As que e nuestro Da aoFactory no n sabr qu u devolver r el mtodo o factory.ge etBean(). So olo sabe que lo que q devuelv va ser una interfaz Pro oductDao.
public interface ProductDao { List g getProducts() ); }

Pgina P 35 / 40 4

Java Fram meworks

El clie ente: Prod ductMana agedBean n


El objet to que usar r el DAOF Factory para a acceder a la base de d datos, queda reduc cido a lo siguient te:
privat te ProductDa ao productDa ao; privat te List list; public c ProductManagedBean() ){ pr roductDao = DaoFactory. .getInstance().getProduc ctDao(); } public c List getProducts() { if (list == null) ){ list = produ uctDao.getPr roducts(); } re eturn list; }

En nues stra aplicac cin es el Ma anagedBea an encargad do de mostr rar el listado o en el JSP.

Pgina P 36 / 40 4

Java Fram meworks

Ca apitulo o 5. SP PRING MVC


INTRO ODUCCI N
Spring - MVC es uno u de los mdulos de el Framewo ork de Spring, y como o su propio nombre nos indica impleme enta una ar rquitectura Modelo - Vista V - Contr rolador que e utilizaremo os como ara desarrol llar nuestra aplicacin web. base pa Si ya ha as utilizado antes el Framework de d Struts, que q tambin n implemen nta una arqu uitectura MVC, no tendrs muchos m prob blemas en utilizar u este e mdulo.

PART TIENDO DE D UNA APLICAC A CIN WE EB


Sabemo os que necesitamos nuestras her rramientas Java (JDK) ), un IDE (h hoy por hoy y Eclipse es el re ey y yoxos su s profeta) y un servid dor de aplic caciones (T Tomcat siem mpre es una buena eleccin n).

Bueno, pues con todo listo partimos p de e una aplic cacin web, que llama aremos hola amundo. omenzar no os basta un n nuevo pro oyecto web dinmico con c un fich hero de bien nvenida, Para co index.js sp. Recuerda que se indica en el web.xml w la lista l de ficheros de bienvenida. Despleg gando la aplicacin a e nuestro servidor de en d aplicacio ones deber ramos ver nuestra URL pgina de bienvenida iendo en n nuestr ro naveg gador la introduci ervidorAplic caciones>/h holamundo (si el servidor s es st en nuestro ord denador, <URLSe http://loc calhost:808 80/holamund do).

Pgina P 37 / 40 4

Java Fram meworks

LIBRE ERAS SP PRING - MVC


Aadim mos lo prim mero las lib breras del Tomcat. Encima E del proyecto, botn derecho > dades > Java Build Path > en la a pestaa de Librera as > Aadir r Librera > Server Propied Runtime e > Seleccio onamos el Servidor S de e Aplicaciones (Tomcat t) Ahora a aadiremos las librera as que nece esitamos pa ara utilizar Spring S - MV VC. Las nec cesarias son: s spring.jar, c contiene las s clases del ncleo de spring. s spring-mvc .jar, contien ne las clase es del mdulo de MVC de Spring.

Normalm mente tamb bin aadire emos al me enos s standard.ja r y jstl.jar pa ara utilizar etiquetas e JS STL en nue estro proyec cto. c commons-lo ogging.jar (o ( log4j.jar) para el logg ging de nue estra aplicac cin. j junit.jar par ra utilizar JU UNIT para la as pruebas de nuestras clases. Ev videntemen nte si e eres espaol esto te so obra, porqu ue aqu prog gramamos como c los ho ombres, a pelo, p a pecho desc cubierto y co on las luces s en el traje e.

CONF FIGURAN NDO SPR RING - MV VC


Debemo os indicar ahora a a nue estra aplicac cin web que utilice la a servlet de Spring. Sip p, eso lo hacemo os en el web b.xml. En este ejemplo o definimos una servlet t (holamund do) que responder al encon ntrar una URL con el patrn p *.lyck ka.
<servlet> <serv vlet-name>h holamundo</ /servlet-name> <serv vlet-class>or rg.springfram mework.web.servlet.Dispa atcherServlet t</servlet-cla ass> <load d-on-startup>1</load-on n-startup> </servle et> <servlet-mapping> <serv vlet-name>h holamundo</ /servlet-name> <url-pattern>*.ly ycka</url-pat ttern> </servle et-mapping>

Y Sprin ng MVC tam mbin tiene su archivo o de configu uracin, al estilo del struts-config s g.xml de Struts. En este caso el nomb bre es el no ombre de la a servlet (< <servlet-nam me>) seguido de "xml". En este caso, ho olamundo-se ervlet.xml. servlet.x
<?xml ve ersion="1.0" " encoding=" "UTF-8"?>

Pgina P 38 / 40 4

Java Fram meworks

<beans x xmlns="http p://www.springframework k.org/schema/beans" xmlns s:xsi="http:/ //www.w3.or rg/2001/XML LSchema-inst tance" xsi:sc chemaLocatio on="http://w www.springfr ramework.or rg/schema/be eans http:/ //www.spring gframework. .org/schema/ /beans/sprin ng-beans-2.5.xsd "> <!-- t the applicatio on context definition for the springap pp DispatcherServlet --> <bea an name="/h holamundo.ht tml" <bea an id="viewR Resolver" cla ass="org.spr ringframework.web.servle et.view.Inter rnalResource eViewResolve er"> <p property nam me="viewCla ass" value="org g.springframe ework.web.servlet.view.J JstlView"></ /property> <p property nam me="prefix" value="jsp/" v "></property y> <p property nam me="suffix" value=".jsp" v ></property y> </bea an> </beans s> class s="es.lycka.h holamundo.c control.HolaM MundoContro oller"/>

Hemos a definir un contro olador (es.ly ycka.holam mundo.control.HolaMun ndoControlle er), que r la llamada a un path h ("/holamun ndo.lycka"). atender
<bean name="/hola n mundo.lycka a" class="es.lycka.holamu undo.control.HolaMundoC Controller"/> >

Este co ontrolador realizar r su us operacio ones pertine entes, y se egn su re esultado decidir el siguient te paso : devolver como res sultado una a vista (un na jsp) con sus par rmetros correspondientes. En este ca aso, se dirig gir a la vis sta "holamu undo" pasa ando un parmetro, "ahora".
public cla ass HolaMun ndoController r implements s Controller { prote ected final Lo og logger = LogFactory.g L etLog(getCla ass()); public c ModelAndV View handleR Request(Http pServletRequest request, HttpServletR Response res sponse) th hrows Servlet tException, IOException { St tring ahora = (new Date( ()).toString() ); log gger.info("Se e dirige a la vista v holamu undo con aho ora = " + ahora); re eturn new Mo odelAndView("holamundo o", "ahora", ahora); a } }

Pgina P 39 / 40 4

Java Fram meworks

Ahora entra en juego el otro bean definido en nuestro o xml, "vie ewResolver r". Para ndizar la ub bicacin de los ficheros de las vis stas de los contraldore es podemo os definir indepen reglas p para encontrar la vista a a partir de e su nombre. En este e caso, van a estar de entro del director rio "jsp/" y su extensin n ser ".jsp" ". As que e nos queda a construir la a jsp que re esponder, holamundo o.jsp dentro del director rio jsp. Ahora s se debera desplegar en un serv visor y pro obar qu de evuelve si introducimo os en el navegad dor la ruta "<URLServ " idorAplicaciones>/hola amundo/holamundo.lyc cka".

Pgina P 40 / 40 4

You might also like