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.
IngenieradeSoftware 2012EdwinValenciaCastillo
DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
SeleccionarelJREdefinidoyclickenfinish
CambiarDefaultJREporelJDKseleccionadopreviamente
h.
Hacerclickenfinishparaterminarelproceso,elresultadoeselsiguiente
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:
<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>
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
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
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
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)
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.
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.
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.
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 } } }
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:
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>
LuegoseleccionarlosproyectosdepedientesdeesteproyectoyclickenFinish:
Ahoraprocedemosaejecutarelproyectoempresarialelresultadoobtenidoseria:
IngenieradeSoftware 2012EdwinValenciaCastillo
DepartamentodeSistemas,EstadisticaeInformatica FacultaddeIngenieraUNC
YalhacerclickenelbotnMantenimientodeUsuarios,elresultadoobtenidoseria:
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