Anda di halaman 1dari 30

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

DESARROLLANDO UNA APLICACIN EMPRESARIAL 1. Introduccin


LapresenteguabuscadescribirpasoapasolacreacindeunaaplicacinempresarialutilizandoJEE especficamenteusandolassiguientestecnologas: JavaEE7comoplataforma GlassFish3.1.2Server,comoservidordedesplieguedenuestraaplicacion JSF2.1paraelmoduloweb JPA2.0paraadministrarlasclasesdepersistencia EJB3.1paraescribirnuestrosjavabeansempresarialesqueimplementenlalogicadelnegocio EclipseLink2.3paraORM(ObjectRelationalMapping)paramaperarnuestrasrelaciones(tablas)a clasesentidad MySQLServer5.1comoDBMS(DatabaseManagementServer) ElentornodedesarrolloutilizadoeseclipseindigoR2. Comoejerciciodeprcticaseproponedesarrollarunaaplicacinwebquepermitagestionarservicios onlineparaunabiblioteca,verelarchivoadjuntoconelscriptsqlparamysql. Lospasosaseguirsonlossiguientes: Crearlaaplicacinweb,utilizandolarecomendacinJSF2,esdecirelusodePlantillasFacelets. Crearlaaplicacinejb,quecontendrlasclasesdeentidad,losejbsdaoynegocio CrearyconfigurarelDatasourceJDNIparaMysqlenGlassfish AccesaralosjavabeansdesdelaaplicacinJSF Configuracininicialdeeclipse a. Crear un directorio de trabajo donde gestionaremos nuestros proyectos, en nuestro caso D:\workspace b. Desempaquetarelarchivolibraries.rardentrodelfolderworkspace c. Ejecutareclipseyseleccionarelespaciodetrabajodefinidoenelpasoa.lavistaeslasiguiente:

d. Vamos a configurar el servidor de aplicaciones glassfish, para hacer esto hacemos clic en new serverwizarddelafichaserver:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
e. SeleccionamosdentrodelfolderGlassFish,eladaptadorGlassFish3.1.2,yhacemosclickennext.

f. Indicamos el directorio del servidor de aplicaciones (el instalador fue desempaquetado en c:\glassfish3).

g.

Paraqueglassfishfuncioneadecuadamente,esnecesarioreferenciarunjdkynounjre,entonces hacerclickenInstalledJREpreferencesyagregaraljdkcomoJREinstalado,comosemuestraa continuacin:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
SeleccionarelJREdefinidoyclickenfinish

CambiarDefaultJREporelJDKseleccionadopreviamente

h.

Hacerclickenfinishparaterminarelproceso,elresultadoeselsiguiente

2. El sistema de plantillas Facelets.


Sebasaenelusodelassiguientesetiquetas: ui:composition:envuelveunconjuntodecomponentesparaserreutilizadosenotrapgina,esla etiquetaque: o envuelveopuedeenvolverlaplantilla. o seutilizaparahacerreferenciaaunaplantilla. Todoloquequedefueradelaetiquetaui:compositionnoserrenderizado. ui:define:defineuncontenidonombradoparaserinsertadoenunaplantilla,sucontenidoesun conjunto de componentes y se identifica con un name. Ese conjunto de componentes ser insertadoenunaetiquetaui:insertconelmismoname. ui:insert:declarauncontenidonombradoquedebeserdefinidoenotrapgina, ui:decorate: es la etiqueta que sirve para hacer referencia a una plantilla, como la etiqueta ui:composition, solo que con ui:decorate lo definido antes y despus de la etiqueta s ser renderizado, ui:param:nossirveparadeclararparmetrosysuvalorenelusodeplantillasycomponentespor composicin, ui:include: es una etiquetaque sirve para incluir en una pgina el contenido de otra, como si el contenidodeestaltimaformasepartedelaprimera. Siguiendo las recomendaciones de facelets, las plantillas las incluiremos dentro del directorio WEB INF/facelets/templates/,demodoquenoseanvisiblesdesdeelcontenedorweb.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
1. CrearunaaplicacinwebdinmicaJSFLab04WEB,

Enlaopcinconfiguration,seleccionarJavaServerFacesv2.0Project,clickennext>next,enla ventanawebModule,seleccionarlacasillaGeneraweb.xmldeploymentdescriptor,yclickennext.

Ahora hay que seleccionar la librearia JSF a utilizar, y seleccionamos finish, de acuerdo a la siguiente:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
Nuestroproyectosehacreado,ahoraprocederemosaconfigurarnuestraplantilla. Ahora,probaremossiJSFestatrabajandoapropiadamente.Parahacerlocrearemosnuestrapgina prueba.Hayquerecordarquelaspaginaswebenunaaplicacinwebdinmicasoncreadasenel folderWebContentoensussubfolderes.Laspginasfueradeestefoldernosernpublicadaspor elservidorynosetendrnaccesodesdelaweb. Entoces, click derecho en el folder WebContent en el explorador de proyectos y click en new >XHTMLPage.Escribirpruebaenelcamponombreyclickenfinish,comosemuestraenlafigura:

Abrirelarchivoprueba.xhtmlyagregarelsiguientemensajeenelbody:

<?xmlversion="1.0"encoding="ISO88591" ?> "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd">


<htmlxmlns="http://www.w3.org/1999/xhtml"> <!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN"

<head>
<metahttpequiv="ContentType"content="text/html;charset=ISO88591"/>

<title>Inserttitlehere</title>

</head> <body> <divstyle="backgroundcolor:navy;with:100%;color:white"> JSFESTAFUNCIONANDOCORRECTAMENTE </div> </body> </html> Clickderechoenelarchivoprueba.xhtmlyclickenRunAs>RunonServeryveremoselmensaje deexitoenelbrowser,perodesecuentaquetodaviasemuestraenelbrowser/faces/test.xhtml. Necesitamosquesemuestretest.jsf.Estoselograhaciendopequeoscambiosennuestroarchivo web.xml

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
Abraelarchivoweb.xmlyhagaqueparezcacomolosiguiente.Encontraraelarchivoweb.xmlbajo /WebContent/WEBINF/web.xml

<?xmlversion="1.0"encoding="UTF8"?> <webappxmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/webapp_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/webapp_3_0.xsd" id="WebApp_ID"version="3.0"> <displayname>JSFLab04WEB</displayname> <welcomefilelist> <welcomefile>index.jsf</welcomefile> </welcomefilelist> <servlet> <servletname>FacesServlet</servletname> <servletclass>javax.faces.webapp.FacesServlet</servletclass> <loadonstartup>1</loadonstartup> </servlet> <servletmapping> <servletname>FacesServlet</servletname> <urlpattern>/faces/*</urlpattern> <urlpattern>*.jsf</urlpattern> </servletmapping> <contextparam> <description>Statesavingmethod:'client'or'server'(=default).SeeJSFSpecification2.5.2</description> <paramname>javax.faces.PROJECT_STATE</paramname> <paramvalue>Production</paramvalue> </contextparam> <contextparam> <paramname>javax.servlet.jsp.jstl.fmt.localizationContext</paramname> <paramvalue>resources.application</paramvalue> </contextparam> <listener> <listenerclass>com.sun.faces.config.ConfigureListener</listenerclass> </listener> </webapp>

EnServletmapping,sehaespecificadoqueelpatronurlsera*.jsf.Nuestrapaginadebienvenida seraindex.jsf,ahoraclickderechoenlapaginaprueba.xhtmlotravezyclickenRunAs>Runon Serveryveremosquelaurlahoraseestamostrandocontest.jsfcomosepuedeverenlafigura:

La mejor forma de trabajar con facelets es creando una plantilla, entonces, a continuacin crearemoslaspaginasheader,footerycomposition. EnJSF2.0,losfaceltssecreanusandoplantillasycomposiciondepaginas.Veamoscomoseusan las plantillas para crear facelets. Siguiendo las recomendaciones de facelets, las plantillas las incluiremos dentro del directorio /WebContent/WEBINF/facelets/templates/, de modo que no seanvisiblesdesdeelcontenedorweb.Procedamosacreardichosfolders,haciendoclickderecho enWEBINFyclickNew>Folder. Click derecho en el folder templates y click en New > XHTML Page. Si la opcin XHTML no se muestra aqui, hacer click en New > Other, y bajo GlassFish seleccionarXHTML Pagecomo se muestraenlafigura:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Colocar el nombre del archivo a template y click Next. En la siguiente ventana seleccionar New FaceletTemplate.comosemuestraenlafigurayhacerclickenFinish.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Clickderechoenelfoldertemplatesparacrearelarchivoheader.xhtmlseleccionandoNewFacelet Headercomosemuestraenlasiguientefigura,yclickenfinish:

Sigalosmismospasosparacrearelarchivofooter.xhtmlenelfoldertemplatesseleccionandoNew FaceletFootercomosemuestraenlafigura:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Abraelarchivotemplate.xhtml,elimineloscomentariosyhagalosiguiente:
<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"> <head> <title><ui:insertname="title">Defaulttitle</ui:insert></title> </head> <body> <divid="header"> <ui:insertname="header"> <ui:includesrc="header.xhtml"/> </ui:insert> </div> <divid="content"> <ui:insertname="content"> </ui:insert> </div> <divid="footer"> <ui:insertname="footer"> <ui:includesrc="footer.xhtml"/> </ui:insert> </div> </body> </html>

Estapaginatemplateseutilizaraparacrearnuestraspaginasxhtml.Puedenverquehemoscreado reasparalacabecera(header),elpie(footer)usandolaetiquetadeinsercion<ui>.Observeque hemoscreadoreadecontenidousandolaetiquetadeinsercion<ui>,peronoincluimoslapagina. Nuestras pginas de composicin estarn aqu, como lo veremos mas adelante. Ahora procederemosacrearnuestraspginasdecomposicinmedianteestaplantilla(template.xhtml).

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
ClickderechoenelfolderWebContentycrearunanuevapginacompuestallamadaindex.xhtml seleccionandoNewCompositionFaceletPagecomosemuestraacontinuacin:

Abre tu pgina compuesta y elimina las etiquetas header y footer, estos cargaran de la pgina plantilla. Coloca la ruta de pagina plantilla en la etiqueta <ui:composition>. Agrega los mensajes apropiadosenelreadecontenido.Tupginaseveraas:
<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <ui:compositiontemplate="/WEBINF/facelets/templates/template.xhtml"> <ui:definename="content"> <p>Estaparteconformalapaginacompuesta.</p> </ui:define> </ui:composition> </html>

Abre las pginas header y footer y agrega los mensajes apropiados. Ejecuta tu proyecto. Finalmenteelexploradordeproyectoylaventanadelnavegadorseverncomosigue:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Acontinuacinmejoraremosnuestroproyecto,agregandounahojadeestilos,paraellocrearemos un el folder resources y dentro de este el folder css (donde crearemos nuestro archivo con los estilosprincipales)yelfolderimages,paraalmacenarlasimgenesquenecesitemos,talcomose muestraacontinuacion:

Clickderechoenelfoldercssycrearunarchivoconextensincssllamadodefault.css,yagregarel siguientecdigo:
#header{ float:left; fontsize:32px; width:100%; lineheight:48px; margin:0pxauto; backgroundcolor:navy; color:white; textalign:center; } #content{ backgroundcolor:#04859d; } #footer{ float:left; width:100%; backgroundcolor:navy; color:white; textalign:center; }

No olvide eliminar los estilos de los archivos header.xhtml y footer.xhtml y modificar el archivo template.xhtmlconelsiguientecdigo <h:head> <h:outputStylesheetname="default.css"library="css"/> <title><ui:insertname="title">SistemadeControl Bibliotecario</ui:insert></title> </h:head>

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

3. Configurando la conexin a la base de datos desde eclipse


Para realizar esta etapa del tutorial, primero se debe tener instalado el DBMSMySQL Server y tener ubicado el conector correspondiente, el conector se puede obtener de la direccin: http://www.mysql.com/downloads/connector/j/, utilizaremos la versin 5.1.20 (la ultima disponible cuandoserealizoestetutorial). InstaladoyaMYSQL,abrirunaconsolaMySQLycrearlabasededatosBIBLIOTECADB

Cierrelaconsola. En el Data Source Explorer de Eclipse, click derecho en Database Connections y hacer click en new, seleccionarelconnectionprofileMySQLycolocarelnombredelperfildeconexinabibliotecadbluego hacerclickennext,talcomosemuestraenlafigura:

En la ventana New Connection Profile, hacer click en el botn New Driver Definition en la ventana Availabledriverstemplates,seleccionarMySQLJDBCDriverversin5.1.luegoclickenlafichaJARList, seleccionar el conector registrado por default y eliminarlo (Remove JAR/Zip), luego hacer click en el botonAddJAR/Zip,comosemuestraacontinuacin:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
A travs del explorador seleccionar el conector correspondiente mysqlconnectorjava5.1.20bin y seleccionarlo.

Hacerclickenabrir,luegoclickenOkdelaventanaDriverdefinition. Con el conector ya configurado, procedemos a registrar las propiedades de la conexin a la base de datos,ingresandoelnombredelabasededatos,laurl,elusuarioypassword,paraverificarqueexiste conexin,hacerclickenelbotnTestConnection,posteriormente,hacerclickenfinish,segncomose detallaenlasiguientefigura:

EnelDataSourceExplorersepuedeobservarlaconexinrealizada:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Para crear las tablas en la base de datos, ejecutar el script sql proporcionado, desde la perspectiva DatabaseDevelopment,atravsdelSQLscrapbook

4. Creando la aplicacin EJB y las clases entidad


AcontinuacindetallaremoslospasosnecesariosparacrearnuestraaplicacinEJB,atravsdelacual setendraccesoalosdatosdesdenuestraaplicacinwebpreviamentedesarrollada. ConlaperspectivaJavaEEactiva,desdeelmenFile>new,seleccionarEJBProject,endichaventana ingresar el nombre de nuestro proyecto JSFLab04EJB, verificar que el Target runtime sea GlassFish 3.1.2, y hacer click en el botn Modify de Configuration, se abre la ventana Project Faces, donde agregaremosanuestroproyectolaFacetaJPA,quenospermitirutilizarlaAPIdepersistenciaJPA,tal comosemuestraacontinuacin:

Luego hacemos click en Ok, y en la ventana EJB Project hacemos click en next>next, abrindose la ventanaJPAFacet,configurndolosegnlomostrado,yparafinalizarhaciendoclickenfinish,talcomo semuestraacontinuacin:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Podemosobservarquesehacreadoelproyecto

EnelfolderejbModulehacemosclickderechoennewyseleccionamosJPAEntitiesfromTablesenla ventanaSelectTables,seleccionamoslastablasyhacemosclickennext:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

Enlasiguienteventanaverificamoslacorrectaasociacindetablasypresionamosnext,enlaventana CustomizeDefaultEntityGenerationconfiguramoskeygeneratoryPackageyhacemosclickenfinish, talcomosemuestraacontinuacion:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
Eclipsecrearaclasesentidadporcadatabla,elresultadoeselsiguiente:

Ahora que hemos creado nuestras clases entidad, crearemos la lgica del negocio, en el que iremos creando nuestros java beans llamados EJBs. Antes de crear nuestros EJBs, crearemos un nombre de origendedatosJNDI.

5. Creando y configurando un origen de datos JNDI para MySQL en GlassFish 3.1.2 Server
En esta parte crearemos un nombre de origen de datos JNDI para que trabaje con nuestros EJBs(EnterpriseJavaBeans). Loprimeroquehayquehacerescopiarelarchivomysqlconnectorjava5.1.20bin.jarenelfolderlib del servidor GlassFish. La ruta de acceso debe tener este aspecto: glassfish3\glassfish\lib. Reiniciar eclipseyhacerlosiguiente: En la parte inferior en la ficha Servers, en la ventana de eclipse click derecho en GlassFish 3.1.2, seleccionarGlassFish>ViewAdminConsole.(RecuerdequeGlassFishdebeestariniciado)

Estoabrirlaconsoladeadministracionenlaventanadelnavegador.Unavezabierto,enelpaneldel ladoizquierdobajoResources,clickenJDBCyenJDBCConnectionPools.Enelladoderechoclickenel botnnew.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
En la ventanaNew JDBC Connection Pool, ingresar el Pool Name MYSQL_Pool, seleccionar javax.sql.DataSourcecomo Resource Type, yMySQLcomo Database Driver Vendor. En la esquina superiorizquierdahacerclickenelbotonnext.

En el listado de propiedades adicionales, encuentra las siguientes propiedades y completar como sigue: Url:jdbc:mysql://:3306/bibliotecadb URL:jdbc:mysql://:3306/bibliotecadb Port:3306 DatabaseName:elnombredetubasededatos(ennuestrocasobibliotecadb) ServerName:localhost User:root Password:elpassworddeMySQL Clickenfinishyveremoselpoolcreadoenlalista,hagaclickyluegoclickenelbotnpingparaprobar sielpoolhasidocreadosatisfactoriamente.Sinofueseelcaso,revisarlaspropiedadesotravez.

DebajodeJDBCclickenJDBCResources,clickennew.EnlaventanaNewJDBCResourceseleccionar MYSQL_PooldesdePoolName,ycolocarelnombreJNDIjdbc/bibliotecadsn;noolvidehacerclicken Okenlaesquinasuperiorderecha.

Ahora que ya tenemos creado nuestro DataSource, configuraremos nuestro archivo persistence.xml paraaccesaraestafuentededatos.Abretupersistence.xml,queseencuentradentrodelfolderJPA Content.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

En las opciones de navegacion del archive xml, click en Connection y realizar los cambios que se muestranenlasiguientefigura:

GrabarloscambiosyverificarqueelarchivexmlenlafichaSourceseasimilara:

En el cdigo se ha especificado una unidad de persistencia llamada JSFLab04EJB. Como tipo de transaccin utilizaremos JTA (Java Transaction API). Como JTA DataSource, se ha especificadojdbc/bibliotecadsn, que nosotros creamos con anterioridad, y finalmente tenemos especificadonuestrasclasesentidadquehansidomapeadasdelabasededatos.

6. Creando la lgica de la aplicacin


LosEJBqueconformanlacapamodeloysonresponsablesdelalgicadelaaplicacinserepartenen dospaquetes(ejb.dao,ejb.negocio). La distincin entre ambos paquetes se debe a su orientacin. El paquete ejb.daocontiene EJB orientadosprincipalmenteadarsoportealoscasosdeusotpicosenlastareasdemantenimientode una Base de Datos (operaciones CRUD [create, read, update, delete]: acceso, altas, bajas y modificaciones).Elpaqueteejb.negocioofrecesoporteacasosdeusounpocomsespecficosdems altonivelquehacenusolosEJBsdelanteriorpaquete. Enamboscasossehaseguidolamismaconvencindenombrado: XxxxDAO.javaXxxxService.java:ClasedeimplementacindelEJB(@Statelesso@Stateful) XxxxDAOLocal.javaXxxxServiceLocal.java:InterfazlocaldelEJB(@Local) XxxxDAORemote.javaXxxxServiceRemote.java:InterfazremotodelEJB(@Remote) Porsimplicidadambasinterfaces(localyremota)coinciden,aunquenosueleserlohabitual.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
Paqueteejb.dao Elpaqueteejb.daoproveedeEJBsparaimplementarlasoperacionesbsicassobrelasentidadesque componenlaaplicacin. La funcionalidad ofrecida por este conjunto de EJB se corresponde de un modo genrico con el patrnDAO (Data Access Object), que oculta las tecnologas y el modo de acceso a los datos, delegando,enestecaso,lasoperacionesconcretasenelEntityManagerdeJPA. EnestecasosehadefinidounDAOgenrico(GenericDAO)conoperacionesbsicas(crear,buscarpor ID,actualizar,borraryotrosmtodoscomunes).DeestaclaseheredanlosdemsEJBs(ysusinterfaces localyremoto),aadiendonuevasoperaciones,usualmenteoperacionesdebsquedaespecficas. Como ejemplo implementaremos las clases GenericDAO y UsuarioDAO, las otras clases seguirn la mismaestructura. GenericDAO:Operacionesbsicassobrelasentidades(independientesdelaEntidadconcreta) UsuarioDAO:OperacionessobreUsuarios. Paqueteejb.negocio EnestepaqueteseincluyenEJBsqueimplementancasodeusoespecficosdelaaplicacin.Engeneral proveen de operaciones de mayor complejidad que las del paqueteejb.dao, responsabilizndose de coordinarlasinvocacionesdeotrosEJBsencargadosdelmanejodedatos.Enestecasoseimplementa unpatrnServiceFacadepuro. GestorUsuariosService: EJB sin estado responsable de la autenticacin y de la gestin de usuarios (creacindenuevosUsuarios,juntoconlaaltadesurespectivoUsuario,ymodificacindelosdatosdel usuario) Ahora crearemos un clase interfaz GenericDAOInterface y posterioremente la clase GenericDAO, haciendoclickderechoenelpaqueteejbModuledenuestroproyectoEJByclickenNew>Interface, ingresarelnombredelpaquete'ejb.beans,elnombredeinterfazGenericDAOInterfaceyluegoclicken finish.

ElcdigodelainterfazGenericDAOInterface,ser:
packageejb.dao; importjava.util.List; publicinterfaceGenericDAOInterface<T>{ publicvoidcreate(Tentity); publicvoiddelete(Tentity); publicTupdate(Tentity); publicTfindByID(ObjectentityID); publicList<T>findAll(); publicintcount(); }

Creada la interfaz GenericDAOInterface procedemos a crear la clase GenericDAO, haciendo click derecho en el paquete ejb.dao, new> Class, luego ingresar el nombre de la clase GenericDAO, en la

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
opcin Interfaces agregar la interfaz ejb.dao.GenericDAOInterface<T>, se finaliza haciendo click en finish.

ElcdigofuentedelaclaseGenericDAO,es:
packageejb.dao; importjava.lang.reflect.ParameterizedType; importjava.util.List; importjavax.persistence.EntityManager; importjavax.persistence.PersistenceContext; importjavax.persistence.criteria.CriteriaQuery; publicclassGenericDAO<T>implementsGenericDAOInterface<T>{ privatefinalstaticStringUNIT_NAME="JSFLab04EJB";//NombredelaUnidaddepersistencia @PersistenceContext(unitName=UNIT_NAME) protectedEntityManagerem; @Override publicvoidcreate(Tentity){ em.persist(entity);//creaunatuplaenlabd } @Override publicvoiddelete(Tentity){ TentityToBeRemoved=em.merge(entity); em.remove(entityToBeRemoved);//eliminaunatuplaenlabd } @Override publicTupdate(Tentity){ returnem.merge(entity);//Actualizalosdatosde"entidad"ensucorrespondientetuplaBD } @SuppressWarnings("unchecked") @Override publicTfindByID(ObjectentityID){ Class<T>entityClass=(Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; //Identificalaclaserealdelasentidadesgestionadaporesteobjeto(T.class) returnem.find(entityClass,entityID);//retornaunobjetoquecoincideconelID }

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
@Override @SuppressWarnings({"unchecked","rawtypes"}) publicList<T>findAll(){//DevuelvelalistadeobjetosT Class<T>entityClass=(Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; CriteriaQuerycq=em.getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); returnem.createQuery(cq).getResultList(); } @Override @SuppressWarnings({"rawtypes","unchecked"}) publicintcount(){//devuelvelacantidaddeobjetosalmacenadosenlabd Class<T>entityClass=(Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; javax.persistence.criteria.CriteriaQuerycq=em.getCriteriaBuilder().createQuery(); javax.persistence.criteria.Root<T>rt=cq.from(entityClass); cq.select(em.getCriteriaBuilder().count(rt)); javax.persistence.Queryq=em.createQuery(cq); return((Long)q.getSingleResult()).intValue(); } }

Ahora crearemos nuestros EJBs. Para crear un enterprise java bean, click derecho en el paquete ejbModule>ejb.dao de nuestro proyecto EJB y click New > Other. De la lista de asistentes seleccionarSessionBean(EJB3.x)bajoEJByhacerclickenNext.

IngresarelnombredelaclaseUsuarioDAOyclickenelbotnbrowserdeSuperclass,buscarlaclase GenericDAO que pertenezca al paquete ejb.dao y seleccionarlo. Luego seleccionar 'State type' como 'Stateless'tambiencheckenLocalparacrearunainterfazlocalyhacerclickenfinish.

SehacreadolaclaseUsuarioDAOysuinterfazUsuarioDAOLocal,ahoraindicaremoslasoperacionesa implementarenlainterfaz,ingresandoelsiguientecdigotantoenlainterfazcomoenlaclase: CdigoparalainterfazUsuarioDAOLocal

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
packageejb.dao; importjavax.ejb.Local; importentidades.Usuario; @Local publicinterfaceUsuarioDAOLocalextendsGenericDAOInterface<Usuario>{ publicUsuariobuscarPorLogin(Stringlogin); }

CdigoparalaclaseUsuarioDAO
packageejb.dao; importjava.util.List; importjavax.ejb.LocalBean; importjavax.ejb.Stateless; importjavax.persistence.Query; importentidades.Usuario; /** *SessionBeanimplementationclassUsuarioDAO */ @Stateless @LocalBean publicclassUsuarioDAOextendsGenericDAO<Usuario>implementsUsuarioDAOLocal{ @SuppressWarnings("unchecked") publicUsuariobuscarPorLogin(Stringlogin){ Queryq=em.createQuery("SELECTobject(u)FROMUsuarioASu"+ "WHEREu.loginUsuario=:login"); q.setParameter("login",login); List<Usuario>resultados=q.getResultList(); if(resultados==null){ returnnull;//Noencontrado } elseif(resultados.size()!=1){ returnnull;//Noencontrado } else{ returnresultados.get(0);//Devuelveelencontrado } } }

Demanerasimilarimplementarparalasotrasclasesentidad. AhoracrearemoslaclaseGestorUsuariosServiceysuinterfazdentrodeunpaqueteejb.negocio,como semuestra:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
CdigoparalainterfazGestorUsuariosServiceLocal
packageejb.negocio; importjavax.ejb.Local; importentidades.Usuario; @Local publicinterfaceGestorUsuariosServiceLocal{ booleanautenticarUsuario(Stringlogin,Stringpassword); UsuarioactualizarPassword(intidUsuario,Stringpassword); booleanexisteUsuario(Stringlogin); UsuarioactualizarUltimoAcceso(intidUsuario); }

CdigoparalaclaseGestorUsuariosService
packageejb.negocio; importjava.util.Calendar; importjavax.ejb.EJB; importjavax.ejb.LocalBean; importjavax.ejb.Stateless; importejb.dao.UsuarioDAOLocal; importentidades.Usuario; /** *SessionBeanimplementationclassGestorUsuariosService */ @Stateless @LocalBean publicclassGestorUsuariosServiceimplementsGestorUsuariosServiceLocal{ @EJB UsuarioDAOLocalusuarioDAO; @Override publicbooleanautenticarUsuario(Stringlogin,Stringpassword){ Usuariousuario; booleanresultado=false; usuario=usuarioDAO.buscarPorLogin(login); if(usuario!=null){ if(usuario.getPasswordUsuario().equals(password)){ resultado=true; } } returnresultado; } @Override publicUsuarioactualizarPassword(intidUsuario,Stringpassword){ Usuariousuario=usuarioDAO.findByID(idUsuario); usuario.setPasswordUsuario(password); returnusuarioDAO.update(usuario); } @Override publicbooleanexisteUsuario(Stringlogin){ return(usuarioDAO.buscarPorLogin(login)!=null); } @Override publicUsuarioactualizarUltimoAcceso(intidUsuario){ Usuariousuario=usuarioDAO.findByID(idUsuario); usuario.setUltimoAcceso(Calendar.getInstance().getTime());//tiempoactual returnusuarioDAO.update(usuario); } }

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
NuestroproyectoEJBquedaracomosemuestraacontinuacion:

7. Implementando un CRUD con JSF 2.0 en una pagina web


EnlospuntosprevioshemoscreadonuestralgicadelnegocioatravsdeEJBs,ahoravamosacrear nuestraaplicacinweb. Como ejemplo se crearaun facelet mantenimientoUsuarios.xhtml quenos permita listar los usuarios registrados; adems tambin crearemos otros facelets que nos permitan modificar y agregar nuevos usuarios. Primero agregaremos un botn en la pgina index.xhtml, que nos permita llamar al facelet mantenimientoUsuarios.xhtml,elcdigoes:
<ui:definename="content"> <h:form> <h1>Opciones</h1> <h:commandButtonaction="usuarios/mantenimientoUsuarios"value="MantenimientodeUsuarios"/> </h:form> </ui:define>

Alejecutarnuestroproyecto,severaas:

Ahoraennuestroproyectowebcrearemosnuestralgicawebusandobeansadministrados(managed bean)quenospermitanaccesaralalgicadelnegociodesdelosfacelets. Porlotanto,hacerclickderechoenelpaquetesrcycrearunanuevaclasehaciendoclickenNew> class. Dar el nombre del paqueteweb.beans, y el nombre de la claseUsuarioManagedBean, y click finish.

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC

ElcdigoparalaclaseUsuarioManagedBean,es:
packageweb.beans; importjava.util.List; importjavax.ejb.EJB; importjavax.faces.bean.ManagedBean; importjavax.faces.bean.SessionScoped; importejb.dao.UsuarioDAOLocal; importentidades.Usuario; @ManagedBean(name="usuarioMB") @SessionScoped publicclassUsuarioManagedBean{ privateUsuariousuario=newUsuario(); @EJB UsuarioDAOLocalservicioUsuarios; publicUsuariogetUsuario(){ returnusuario; } publicvoidsetUsuario(Usuariousuario){ this.usuario=usuario; } publicList<Usuario>listarUsuarios(){ returnservicioUsuarios.findAll(); } publicStringnuevoUsuario(){ servicioUsuarios.create(usuario); return"mantenimientoUsuarios"; } publicvoidreset(){ usuario=newUsuario(); }

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
publicvoideliminarUsuario(intidUsuario){ Usuarious=servicioUsuarios.findByID(idUsuario); servicioUsuarios.delete(us); } publicStringactualizarUsuario(){ servicioUsuarios.update(usuario); return("mantenimientoUsuarios"); //retornaelnombredelfaceletparalanavegacion } }

EnelcdigoanteriorhemosinyectadonuestroEJBUsuarioDAOLocalusandolaanotacin@EJB.Esto permite acceder a los EJBs directamente en nuestra claseManagedBean. Como se puede ver hemos llamadoadistintosmtodosdirectamentedelainterfazUsuarioDAOLocal.java. Enlospasossiguientescrearemosnuestrapginawebparadarmantenimientoalosusuarios. Click derechoen el folderWebContent y crear un folderusuarios luego crearuna pgina compuesta mantenimientoUsuarios.xhtml,dentrodeWebContent>usuariosycolocarelcdigosiguiente:
<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <ui:compositiontemplate="../WEBINF/facelets/templates/template.xhtml"> <ui:definename="content"> <f:view> <h:form> <h1><h:outputTextvalue="ListadodeUsuarios"/></h1> <h:dataTablevalue="#{usuarioMB.listarUsuarios()}"var="item"> <h:column> <f:facetname="header"> <h:outputTextvalue="IdUsuario"/> </f:facet> <h:outputTextvalue="#{item.idUsuario}"/> </h:column> <h:column> <f:facetname="header"> <h:outputTextvalue="Nombre"/> </f:facet> <h:outputTextvalue="#{item.nombreUsuario}"/> </h:column> <h:column> <f:facetname="header"> <h:outputTextvalue="Apellidos"/> </f:facet> <h:outputTextvalue="#{item.apellidoUsuario}"/> </h:column> <h:column> <f:facetname="header"> <h:outputTextvalue="Direccion"/> </f:facet> <h:outputTextvalue="#{item.direccionUsuario}"/> </h:column> <h:column> <f:facetname="header"> <h:outputTextvalue="CorreoElectronico"/> </f:facet> <h:outputTextvalue="#{item.emailUsuario}"/> </h:column> <h:column> <f:facetname="header"> <h:outputTextvalue=""/> </f:facet> <h:commandButtonaction="editarUsuario"value="Editar"> <f:setPropertyActionListenertarget="#{usuarioMB.usuario}"value="#{item}"/> </h:commandButton> <h:outputTextvalue=""/>

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
<h:commandButton action="#{usuarioMB.eliminarUsuario(item.idUsuario)}"value="Eliminar"/> </h:column> </h:dataTable> <br/> <h:commandButtonaction="crearUsuario"value="NuevoUsuario"> </h:commandButton> </h:form> </f:view> </ui:define> </ui:composition> </html>

Ahoravamosaprobarnuestraaplicacin,paraellotenemosquecrearunproyectoempresarial,que estarcompuestodelosproyectosJSFLab04EJByJSFLab04WEB,haciendoclickenelmenFile>New >EnterpriseApplicationProjectyasignarelnombreJSFLab04EARyhacerclickenNext.

LuegoseleccionarlosproyectosdepedientesdeesteproyectoyclickenFinish:

Ahoraprocedemosaejecutarelproyectoempresarialelresultadoobtenidoseria:

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
YalhacerclickenelbotnMantenimientodeUsuarios,elresultadoobtenidoseria:

Completamos la funcionalidad de la aplicacin implementado los facelets crearUsuario.xhtml y editarUsuario.xhtml,crendolosdentrodelfoldeusuarios ElcdigofuenteparaelfaceletcrearUsuario.xhtmlser:


<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <ui:compositiontemplate="../WEBINF/facelets/templates/template.xhtml"> <ui:definename="content"> <f:view> <h2>RegistrodeNuevosUsuarios</h2> <h:formid="form"> <h:panelGridcolumns="3"> <h:outputLabelfor="nombre">Nombre</h:outputLabel> <h:inputTextid="nombre"value="#{usuarioMB.usuario.nombreUsuario}"required="true"> <f:ajaxevent="blur"render="nombreMessage"/> </h:inputText> <h:messageid="nombreMessage"for="nombre"/> <h:outputLabelfor="apellidos">Apellidos</h:outputLabel> <h:inputTextid="apellidos"value="#{usuarioMB.usuario.apellidoUsuario}"required="true"> <f:ajaxevent="blur"render="apellidosMessage"/> </h:inputText> <h:messageid="apellidosMessage"for="apellidos"/> <h:outputLabelfor="direccion">Direccion</h:outputLabel> <h:inputTextid="direccion"value="#{usuarioMB.usuario.direccionUsuario}"required="true"> <f:ajaxevent="blur"render="direccionMessage"/> </h:inputText> <h:messageid="direccionMessage"for="direccion"/> <h:outputLabelfor="email">Email</h:outputLabel> <h:inputTextid="email"value="#{usuarioMB.usuario.emailUsuario}"required="true"> <f:ajaxevent="blur"render="emailMessage"/> </h:inputText> <h:messageid="emailMessage"for="email"/> <h:outputLabelfor="telefono">Telefono</h:outputLabel> <h:inputTextid="telefono"value="#{usuarioMB.usuario.telefonoUsuario}"required="true"> <f:ajaxevent="blur"render="telefonoMessage"/> </h:inputText> <h:messageid="telefonoMessage"for="telefono"/> <h:outputLabelfor="password">Password</h:outputLabel> <h:inputSecretid="password"value="#{usuarioMB.usuario.passwordUsuario}"required="true"redisplay="true"> <f:ajaxevent="blur"render="passwordMessage"/> </h:inputSecret>

IngenieradeSoftware 2012EdwinValenciaCastillo

DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
<h:messageid="passwordMessage" for="password" /> <h:panelGroup/> </h:panelGrid> <h:commandButtonvalue="Grabar"action="#{usuarioMB.nuevoUsuario()}"> </h:commandButton> <h:commandButtonvalue="reset"action="#{usuarioMB.reset}"> <f:ajaxexecute="@form"render="@form"/> </h:commandButton> <h:messagesglobalOnly="true"layout="table"/> </h:form> </f:view> </ui:define> </ui:composition> </html>

ElcdigoparaelfaceleteditarUsuario.xhtmlser:
<!DOCTYPEhtmlPUBLIC"//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <htmlxmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <ui:compositiontemplate="../WEBINF/facelets/templates/template.xhtml"> <ui:definename="content"> <f:view> <h2>EditarUsuario</h2> <h:formid="form"> <h:panelGridcolumns="3"> <h:outputLabelfor="nombre">Nombre</h:outputLabel> <h:inputTextid="nombre"value="#{usuarioMB.usuario.nombreUsuario}"required="true"> <f:ajaxevent="blur"render="nombreMessage"/> </h:inputText> <h:messageid="nombreMessage"for="nombre"/> <h:outputLabelfor="apellidos">Apellidos</h:outputLabel> <h:inputTextid="apellidos"value="#{usuarioMB.usuario.apellidoUsuario}"required="true"> <f:ajaxevent="blur"render="apellidosMessage"/> </h:inputText> <h:messageid="apellidosMessage"for="apellidos"/> <h:outputLabelfor="direccion">Direccion</h:outputLabel> <h:inputTextid="direccion"value="#{usuarioMB.usuario.direccionUsuario}"required="true"> <f:ajaxevent="blur"render="direccionMessage"/> </h:inputText> <h:messageid="direccionMessage"for="direccion"/> <h:outputLabelfor="email">Email</h:outputLabel> <h:inputTextid="email"value="#{usuarioMB.usuario.emailUsuario}"required="true"> <f:ajaxevent="blur"render="emailMessage"/> </h:inputText> <h:messageid="emailMessage"for="email"/> <h:outputLabelfor="telefono">Telefono</h:outputLabel> <h:inputTextid="telefono"value="#{usuarioMB.usuario.telefonoUsuario}"required="true"> <f:ajaxevent="blur"render="telefonoMessage"/> </h:inputText> <h:messageid="telefonoMessage"for="telefono"/> <h:outputLabelfor="password">Password</h:outputLabel> <h:inputSecretid="password"value="#{usuarioMB.usuario.passwordUsuario}"required="true"redisplay="true"> <f:ajaxevent="blur"render="passwordMessage"/> </h:inputSecret> <h:messageid="passwordMessage"for="password"/> <h:panelGroup/> </h:panelGrid> <h:commandButtonvalue="Actualizar"action="#{usuarioMB.actualizarUsuario()}"> </h:commandButton> <h:commandButtonvalue="reset"action="#{usuarioMB.reset}"> <f:ajaxexecute="@form"render="@form"/> </h:commandButton> <h:messagesglobalOnly="true"layout="table"/> </h:form> </f:view> </ui:define> </ui:composition> </html>

IngenieradeSoftware 2012EdwinValenciaCastillo

Anda mungkin juga menyukai