Professional Documents
Culture Documents
SP PRIN NG
Pgina 2 / 40 0
Java Fram meworks Inyeccinporconstructor........... .................................................................................... ...................... ............18 do................. .................................................................................... ...................... ............19 Inyeccinpormtod
Pgina 3 / 40 0
Java Fram meworks ElDAO OFactory........ ...................... .................................................................................... ...................... ............34 Lainte erfazDAO:Pro oductoDao..... .................................................................................... ...................... ............35 Elclien nte:ProductM ManagedBean................................................................................... ...................... ............36
Pgina 4 / 40 0
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
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.
Pgina 6 / 40 0
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.
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
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
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
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
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.
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
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
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
Pgina P 13 / 40 4
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
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.
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>
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");
Pgina P 17 / 40 4
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; } }
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>
Pgina P 19 / 40 4
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
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.
Pgina P 21 / 40 4
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.
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
Pgina P 23 / 40 4
Java Fram meworks privat te String email; // Se debe crear los l mtodos getter y sett ter }
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
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. .
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); }
Pgina P 29 / 40 4
Pgina P 30 / 40 4
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>
Pgina P 31 / 40 4
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
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; //... }
<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.
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(); } } } }
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
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" "); } }
Pgina P 35 / 40 4
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
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
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.
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
<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
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