Upload
chinuez
View
59
Download
3
Embed Size (px)
DESCRIPTION
como crear una aplicacion wen con java implementando JPA
Citation preview
Captulo2.CrearaplicacinWeb
ModeloGeneralDesarrollodeunaaplicacionWeb
DependenciasMavenUsandoelAsistenteMavendelIDEEditarelarchivopom.xml
MODELODESARROLLOJPA
ProcederaCrearlosEntityconNetBeansCreacindelosEJBCDIvsManagedBeansCREARUNCDIPARAELMANEJODEMENSAJESCdigocompletodelCDIJSFUtil.java
FACELETSCREARPLANTILLAFACELETSCONdePRIMEFACESCdigocompletodetemplate.xhtmlEditartemplate.xhtmlCrearlapginaIndex.xhtml
CREARCDIBEANSESTATUSCONTROLLER.javaCrearlosFaceletsTemplateClientparainsertarEstatusEditarelentityEstatus.javaEditarEstatusFacade.javaConvertidores
CrearEstatusConverter.java
1
Modelo General
2
3
DesarrollodeunaaplicacionWebEstecaptulomuestraeldesarrollodelaaplicacindeejemplodeScrumusando
tecnologasJEE7.EstaaplicacinpermitirinsertarregistrosenunatablautilizandoJPA,primefaces/JavaServerFaces,EJB,CDI.Paraelloutilizamos:
NetBeansIDE8.0.1 Maven(comopartedelIDE) GlassFish4.1 BasededatosMySQL
1.CrearunproyectoMavenWebApplicationdesdeNetBeans:
2.IndicarProjectName:scrumwebGroupid:com.avbravo(Eselgrupodeproyectosalquepertenecenuestroproyecto)
4
EnSettings,seleccionamosGlassFishServer4.1.yenJavaEEVersion7
ElIDEgeneralaestructuradelproyecto:
Ahora,vamosaseleccionarProjectsPropertiesConfigurationsConfigurations:ypresionarelbotnActivate.
HacemosclicenlacategoraFrameworks
5
HacerclicelbotnAdd,yluegoseleccionarJavaServerFaces
EnlapestaaConfigurationverificarqueestseleccionadolaopcinFaceletsenlaopcinPreferredLanguage:
yenlapestaaComponentsseleccionamosPrimefaces
6
DependenciasMavenMavenconstaderepositoriosdondeseencuentranlasdependencias(bibliotecas.jar)
necesariasparaejecutarnuestrosproyectos.Laventajaqueofreceesquenoesnecesariodescargarmanualmenteestasdependencias.SimplementeMavenseencargadebuscarlasyenlosrepositoriosynospermiteagregarlasfacilmente.Siunabibliotecadependedeotra,Mavenseencargaragregarestasdependenciasanuestroproyecto.Paranuestraaplicacinwebutilizaremoslassiguientesdependencias:
primefacesallthemes mysql primefaces itext jasperreports jfreechart
NetBeansnosofrecedosalternativaspararealizarlo:laprimeramedianteelasistenteylasegundaeditandoelarchivopom.xmlqueencontramosenProjectFiles.
UsandoelAsistenteMavendelIDEUsaremoslaalternativadelasistentedelIDE.Paraello,enelnodoDependencieshacerclicderechoyseleccionarAddDependency...
EneldilogoAddDependencyescribiremosenelcampoQueryladependenciaabuscarypresionamoslateclaIntro.Enesemomentosemostrarunlistadoconlasdependenciaslocalesyremotasyseleccionamoslaquedeseamosdelalista.
Paraprimefacesallthemes(Permitemanejarlostemasdeprimefaces)
7
Dependenciamysqlconnectorjava(Paramanejarlacomunicacinconmysql)
Actualizamoslaversindeprimefacesa5.1(ltimaversindeprimefacescommunityalmomentodeescribirestelibro)
8
Dependenciaitext(Utilizadoparareportes)
Dependenciajasperreports(Utilizadoparareportes)
9
Dependenciajfreechart(Generacindegrficas)
Editarelarchivopom.xmlLasegundaalternativaeseditarelarchivopom.xmlubicadoenProjectFiles
Podemosescribirdirectamenteladependencia,odarclicderechoInsertCodeDependency.Mostrareldilogoparabuscardependencias.
10
Enelarchivopom.xmlingresamosdirectamenteladependenciaindicandoelgroupId(generalmenteeslaorganizacinoempresaquedesarrolla),artifactId(nombredeljar),versin(nmerodeversin)org.primefacesprimefaces5.1commonsfileuploadcommonsfileupload1.3org.primefaces.extensionsallthemes1.0.8mysqlmysqlconnectorjava5.1.26com.lowagieitext2.1.7net.sf.jasperreportsjasperreports5.2.0
11
jfreejfreechart1.0.13javaxjavaeewebapi7.0providedyenrepositoriesagregarhttp://repository.primefaces.org/PrimeFacesmavenlibdefaultRepositoryforlibraryPrimeFacesmavenlib
12
Alterminardeagregarlasdependencias,hacerclicderechosobreelconodelproyecto,yseleccionamosBuildwithDependenciesparadescargarlasdependenciasdelproyectoMaven.
Seobservaunlistadodedependencias
13
MODELODESARROLLO JavaServerFacesofreceunmecanismosencilloparaeldesarrollodeinterfacesde
usuarioweb,elmodeloserdivididoentrescapas(CapaWeb,CapaNegocio,CapadeDatos),
14
ParapodermanejarlabasededatosMySQLdesdeNetBeansIDE,seagregalabasededatosdesdelapestaaServicesDatabasesDriversMySQL
Indicarelnombredelabasededatoselusuarioypassword,ypresionarelbotnTestConnection,paracomprobarquelaconexinalabasededatosseaexitosa.
NetBeansIDEnosofreceunpotenteeditordeconsultasyoperacionessobrelabasededatos.
Nota:Desdeestepanelpodemosconectarnosacualquierbasededatos,decualquiertipo,siempreycuandocontemosconelcontroladorJDBC.
15
JPAELORM(ObjectRelationalMapping),predeterminadoenJEE7esJPA,queofreceun
mecanismosencillodemanejoderegistrosdelastablasysuequivalenteenclasesenJava.GeneralmentePOJOs(PlainOldJavaObject),quesedenominanEntity,yaqueadiferenciadeunobjetoJavatradicional,elEntitypermitequeelvalordesusatributosseaalmacenadopermanentementeenlabasededatos.
LosEntityofrecenunaseriedeatributosyanotacionesquefacilitanelmanejodelos
mismos,aprovechandolasventajasdelaplataformaJavaEE7.
ProcederaCrearlosEntityconNetBeans DesdemenFile,seleccioneNew enCategories,seleccionePersistence enFileTypes,seleccioneEntityClassesfromDataBase
Luego,sinoexisteeljdbc/scrumwebprocedemosacrearelDataSourceparanuestraaplicacin,paraelloseleccionaremosNewDataSource...
16
Seguidamente,indicamoselnombreJNDIquevamosautilizar.Ennuestrocaso,usaremos:jdbc/scrumweb
Deahoraenadelante,cadavezquequeramosreferirnosalabasededatos,loharemosusandoJNDI.SeleccionamosDataSourceelnombreJNDIquedeseamoscrearjdbc/scrumwebContinuamosconelasistente,ycuandonospreguntequetablasvamosaimportar(AvailableTables):
Ycomoqueremosimportartodaslastablas,hacemosclicenAddAll
17
Notaremosquealgunosnombresdetablassepresentarnencolorgrisestassonlasquedependendeotrastablas,porquetienenunaclavefornea,yesnecesariaimportarlaparaquelatablaprincipalpuedafuncionar.Continuamosconelasistente.EneldilogoEntityClasses,muestralascolumnasconelnombredelatabla,clasesytipodegeneracin.
EneldilogoMappingOptions,dejamoslosvalorespredeterminadosenelcampoCollectionTypeconelvalorjava.util.CollectionypresionamoselbotnFinalizar
18
SeiniciaralageneracindelosEntity,enbasealanlisisdelastablas.
EnlaimagenpodrapreciarlosEntitygenerados,cadaunocorrespondeaunatabladelabasededatos
NosubicamosenOtherSources/src/main/resourcesydarclicderechosobrepersistence.xml,seleccionarOpen.
19
semuestralaconfiguracindelarchivopersistence.xml,ycomprobarqueDataSource:muestrajdbc/scrumweb
sidamosclicenlapestaaSource,podemosobservarlaconfiguracin.jdbc/scrumwebfalse
CreacindelosEJBLosEnterpriseJavaBeanssonclasesespecialesenJavaqueseejecutanenelContenedorJavaEE.Enestoscomponentesseestablecelalgicadenegocioparanuestrasaplicaciones.Estonospermitesepararlimpiamentelalgicadenegocio,delavistaydelacapadedatos.NetBeansnospermitecrearestosEJBconelmodeloCRUD(CreateReadUpdateDelete)paranuestrasEntitiesdeunamaneramuyrpidadelasiguientemanera.
DesdemenFile,seleccioneNew enCategories,seleccioneEnterpriseJavaBeans enFileTypes,seleccioneSessionBeansForEntityClasses
20
SeleccionardelalistaAvailableEntityClassesypresionarelbotnAddAll>>paragenerartodoslosEJBparanuestrasentidades.
EneldialogoGeneratedSessionBeans,indicarelcampoPackagecom.avbravo.scrumweb.ejb(Paraalmacenarenesepaquetelosejbquesegeneren)ypresionarelbotnFinalizar
21
Secreanenelpaquetecom.avbravo.scrumweb.ejblosEJBAbstractFacade.javayunEJBparacadaEntityseleccionado.
22
CDIvsManagedBeansJEE7 utilizapordefectoCDIenlugardeManagedBeans,yaqueestosestanms
integradosconlaplataformaypermitenlainyeccindedependencias.
Parautilizarladebemosimportarelpaquetejavax.enterprise.contextydebenimplementarlainterfazSerializableparalosSessionScoped.porejemploimportjavax.annotation.ManagedBeanimportjavax.enterprise.context.SessionScopedlospaquetesquecorrespondenaManagedBeansyanoseusarnimportjavax.faces.bean.ManagedBeanimportjavax.faces.bean.SessionScopedCDIdefinelosalcances
@ApplicationScoped:Semantienedurantetodalaejecucindelaaplicacion. @SessionScoped:Semantienedurantelasesiondeununicousuario. @RequestScoped:CorrespondeaunaunicasolicitudHTTPolainvocacindeun
mtodo.Elbeanssolopersistemientraselmtodoesinvocado.
@ConversationScoped:Semantieneentremultiplesinvocaciones. @Dependent:Eselmismocicloqueeldeuncliente.Unbeandependiente
escreadocadavezqueseinyectaylareferenciaesremovidacuandolainyeccinesremovida.
Utilizamoslaanotacin@Namedparahacerreferenciadesdelaspginasxhtml,seutilizalasiguienteestandarizacin:sielCDIsellamaJSFUtilyseutiliza@NamedesteseusarenlaspginasxhtmlcomojSFUtil,conlaprimeraletraenminsculas.
23
CREARUNCDIPARAELMANEJODEMENSAJES1.CrearelCDIJSFUtil
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypes,seleccioneJSFManagedBeans ClassName:JSFUtil Packagecom.avbravo.scrumweb.generales Scope:request
SepermiteseleccionarelScope(Alcance)enesteejemploutilizamosrequest,indicarelpaquetegeneralesdondesealmacenar.CdigogeneradoporelIDE
24
Seprocedeaeliminarlaanotacin@ManagedBeanyserreemplazadapor@Named,laimportacinjavax.faces.bean.ManagedBeanyjavax.faces.bean.RequestScopedsedebeneliminar.YaqueestasendepreciadasparausarensulugarCDI.
DarClicderecho>Fiximportyseleccionarjavax.inject.Namedyjavax.enterprise.context.RequestScoped
25
Semostrarelcdigodelasiguientemanera:packagecom.avbravo.scrumweb.generalesimportjava.io.Serializableimportjavax.enterprise.context.RequestScopedimportjavax.inject.Named/****@authoravbravo*/@Named@RequestScopedpublicclassJSFUtil{/***CreatesanewinstanceofJSFUtil*/publicJSFUtil(){}}Enelcdigousaremosmtodosparaenviarmensajesaloscomponentesy,ytambienseusaraparadesplegardilogosutilizandoDialogFramework.PorejemploelmtodoaddSuccessMessage()actualizaelydelapaginaxhtml.
26
MientraselmtodoinfoDialog()muestranundilogoconlosmensajesutilizandoDialogFrameworkdePrimefacesimplementadoenlaversin4.0,ynoactualizanidelapaginaxhtml.
CdigocompletodelCDIJSFUtil.javaimportjava.util.ArrayListimportjava.util.Calendarimportjava.util.Dateimportjava.util.Iteratorimportjava.util.Listimportjava.util.Mapimportjava.util.TreeMapimportjavax.enterprise.context.RequestScopedimportjavax.faces.application.FacesMessageimportjavax.faces.component.UIComponentimportjavax.faces.component.UIInputimportjavax.faces.component.UISelectItemimportjavax.faces.context.FacesContextimportjavax.faces.convert.Converterimportjavax.faces.model.SelectItemimportjavax.inject.Namedimportjavax.servlet.http.HttpSessionimportorg.primefaces.context.RequestContext/****@authoravbravo*/@Named@RequestScopedpublicclassJSFUtil{ publicstaticSelectItem[]getSelectItems(Listentities,booleanselectOne){intsize=selectOne?entities.size()+1:entities.size()SelectItem[]items=newSelectItem[size]inti=0
27
if(selectOne){items[0]=newSelectItem("","")i++}for(Objectx:entities){items[i++]=newSelectItem(x,x.toString())}returnitems}/**logout*/publicStringlogout(){HttpSessionsession=(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false)if(session!=null){session.invalidate()}return"/index"}publicstaticvoidaddErrorMessage(Exceptionex,StringdefaultMsg){Stringmsg=ex.getLocalizedMessage()if(msg!=null&&msg.length()>0){addErrorMessage(msg)}else{addErrorMessage(defaultMsg)}}publicstaticvoidaddErrorMessages(Listmessages){for(Stringmessage:messages){addErrorMessage(message)}}publicstaticvoidaddErrorMessage(Stringmsg){FacesMessagefacesMsg=newFacesMessage(FacesMessage.SEVERITY_ERROR,msg,msg)FacesContext.getCurrentInstance().addMessage(null,facesMsg)}publicstaticvoidtestMessage(Stringmsg){FacesMessagefacesMsg=newFacesMessage(FacesMessage.SEVERITY_ERROR,msg,msg)FacesContext.getCurrentInstance().addMessage(null,facesMsg)}
28
publicstaticvoidaddSuccessMessage(Stringmsg){FacesMessagefacesMsg=newFacesMessage(FacesMessage.SEVERITY_INFO,msg,msg)FacesContext.getCurrentInstance().addMessage("successInfo",facesMsg)}publicstaticvoidaddWarningMessage(Stringmsg){FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_WARN,msg,""))}publicstaticvoidaddFatalMessage(Stringmsg){FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_FATAL,msg,""))}publicstaticStringgetRequestParameter(Stringkey){returnFacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key)}publicstaticObjectgetObjectFromRequestParameter(StringrequestParameterName,Converterconverter,UIComponentcomponent){StringtheId=JSFUtil.getRequestParameter(requestParameterName)returnconverter.getAsObject(FacesContext.getCurrentInstance(),component,theId)}publicstaticvoidinfoDialog(Stringtitulo,Stringtexto){FacesMessagemessage=newFacesMessage(FacesMessage.SEVERITY_INFO,titulo,texto)RequestContext.getCurrentInstance().showMessageInDialog(message)}publicstaticvoidwarningDialog(Stringtitulo,Stringtexto){FacesMessagemessage=newFacesMessage(FacesMessage.SEVERITY_WARN,titulo,texto)RequestContext.getCurrentInstance().showMessageInDialog(message)}publicstaticvoidfatalDialog(Stringtitulo,Stringtexto){FacesMessagemessage=newFacesMessage(FacesMessage.SEVERITY_FATAL,titulo,texto)RequestContext.getCurrentInstance().showMessageInDialog(message)}publicstaticvoiderrorDialog(Stringtitulo,Stringtexto){FacesMessagemessage=newFacesMessage(FacesMessage.SEVERITY_ERROR,titulo,texto)RequestContext.getCurrentInstance().showMessageInDialog(message)
29
}publicstaticjava.sql.DateconverterDate(java.util.Datefecha){try{longlfecha=fecha.getTime()java.sql.Datedtfecha=newjava.sql.Date(lfecha)returndtfecha}catch(Exceptione){addErrorMessage("converterDate()"+e.getLocalizedMessage())}returnnull}publicstaticjava.util.DategetFechaActual(){java.util.Calendarca=java.util.Calendar.getInstance()java.sql.Datemydate=newjava.sql.Date(ca.getTimeInMillis())returnnewjava.sql.Date(mydate.getTime())}publicstaticIntegergetAnioActual(){java.util.Calendarca=java.util.Calendar.getInstance()java.sql.Datemydate=newjava.sql.Date(ca.getTimeInMillis())returnca.get(Calendar.YEAR)}publicstaticIntegergetMesActual(){java.util.Calendarca=java.util.Calendar.getInstance()java.sql.Datemydate=newjava.sql.Date(ca.getTimeInMillis())returnca.get(Calendar.MONTH)}publicstaticIntegergetMesDeUnaFecha(Datedate){Calendarcalendar=Calendar.getInstance()calendar.setTime(date)intanio=calendar.get(Calendar.YEAR)intmes=calendar.get(Calendar.MONTH)+1intdia=calendar.get(Calendar.DAY_OF_MONTH)returnmes}publicstaticIntegergetAnioDeUnaFecha(Datedate){Calendarcalendar=Calendar.getInstance()calendar.setTime(date)intanio=calendar.get(Calendar.YEAR)intmes=calendar.get(Calendar.MONTH)+1intdia=calendar.get(Calendar.DAY_OF_MONTH)
30
returnanio}publicstaticIntegergetDiaDeUnaFecha(Datedate){Calendarcalendar=Calendar.getInstance()calendar.setTime(date)intanio=calendar.get(Calendar.YEAR)intmes=calendar.get(Calendar.MONTH)+1intdia=calendar.get(Calendar.DAY_OF_MONTH)returndia}publicstaticIntegergetDiaActual(){java.util.Calendarca=java.util.Calendar.getInstance()java.sql.Datemydate=newjava.sql.Date(ca.getTimeInMillis())returnca.get(Calendar.DATE)}publicstaticbooleanisValidationFailed(){returnFacesContext.getCurrentInstance().isValidationFailed()}publicstaticbooleanisDummySelectItem(UIComponentcomponent,Stringvalue){for(UIComponentchildren:component.getChildren()){if(childreninstanceofUISelectItem){UISelectItemitem=(UISelectItem)childrenif(item.getItemValue()==null&&item.getItemLabel().equals(value)){returntrue}break}}returnfalse}publicstaticStringgetComponentMessages(StringclientComponent,StringdefaultMessage){FacesContextfc=FacesContext.getCurrentInstance()UIComponentcomponent=UIComponent.getCurrentComponent(fc).findComponent(clientComponent)if(componentinstanceofUIInput){UIInputinputComponent=(UIInput)componentif(inputComponent.isValid()){returndefaultMessage}else{Iteratoriter=fc.getMessages(inputComponent.getClientId())if(iter.hasNext()){returniter.next().getDetail()
31
}}}return""}publicstaticThrowablegetRootCause(Throwablecause){if(cause!=null){Throwablesource=cause.getCause()if(source!=null){returngetRootCause(source)}else{returncause}}returnnull}}
32
FACELETSFaceletsnospermitemanejarunsistemadeplantillasycomponentesdemanerafacil.
CREARPLANTILLAFACELETSCONdePRIMEFACESPrimefacesnosofreceelcomponentequenospermiteunadisposicinadecuadadeloscomponentes.Acontinuacinsemostrarunaformasencilladeintegrarfaceletsconparacrearunaplantilladinmicaparanuestraaplicacinweb.
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypes,seleccioneFaceletsTemplate
colocarelnombreFileName:template
33
ElIDEgeneraelarchivotemplates.xhtmlyenlacarpetaresourcesloscss
Eliminamoselcdigoquegenerayagregamoselcdigoparaimplementarellayoutdeprimefaces.Integramosfaceletsconelcomponentedeprimefaces.Teniendopresentequeutiliza
Sideseamosincluirmenenlapartesuperioryqueestossemuestranensobreotrasreasynosolosobrelapartesuperiorincluirelcssdondesemodifica.uilayoutnorthy.uilayoutunitcontent.uilayoutnorth{zindex:20!importantoverflow:visible!important}.uilayoutnorth.uilayoutunitcontent{overflow:visible!important}
Cambiar Por
FaceletsTemplate
Agregardentrodelel,lousamosparareordenarelcontenidoenPrimefaces.Indicandoloprimeroquedebecargarse.
35
Cdigocompletodetemplate.xhtml.uilayoutnorth{zindex:20!importantoverflow:visible!important}.uilayoutnorth.uilayoutunitcontent{overflow:visible!important}Header
36
FooterLeft
37
Eliminarlosarchivosindex.htmleindex.xhtml
Crearmenu.xhtmlCrearunapginaJavaServerFacesquecontendrlasopcionesdelMenseparadasdeltemplatequeluegolaincluiremosdentro.
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypes,seleccioneJSFPage
Seutilizaelcomponentedeprimefacesdebeestarincluidodentrodeun.Utilizaremosmenuitemparaindicarlasopcionesadesplegarenelmenu.
laruta/faces/pages/estatus/indicaquesedebecrearlacarpeta/page/estatusdentrodeWebPages.
38
Cdigocompletodemenu.xhtml
39
Editartemplate.xhtmleneltop,colocamosel,medianteelincludeincluimosenlapartesuperiordelaplantillaelmenquetenemosenmenu.xhtml
CrearlapginaIndex.xhtmlAhoracreamosunFaceletsTemplateClient
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypesseleccioneFaceletsTemplateClient
enFileName:indexPresionarelbotnBrowsedeTemplate:
40
seleccionamoselTemplatetemplate.xhtml
Segeneraelcdigodelapginaycolocamosencomentariotop,bottom,left.Utilizando,deestamaneraelreatop,bottom,leftsernreemplazadasporladefinicineneltemplate,ynosotroseditamoselreacenter,dondeescribimosloscomponentesjavaserverfacesquedeseamosmostrar.EnestecasoescribimosBIENVENIDOSASCRUMWEB
Ejecutamoselproyecto secargaenelbrowser,podemosobservarellayoutconelmenyelmensajedelapginaindex.xhtmlqueeslaprimeraencargarsealejecutarelproyecto.
41
CREARCDIBEANSESTATUSCONTROLLER.javaEstosCDIlosutilizamosinvocarlasdiversasoperacionessobrelosEntityyasociar
loscomponentesconlaspginasJavaServerFaces.
DesdemenFile,seleccioneNew enCategories,seleccionamosJavaServerFaces enFileTypes,seleccionamosJSFManagedBeans ClassName:EstatusController Package:com.avbravo.scrumweb.controller Scope:request
Agregamoslasanotaciones@Named,@RequestScoped.Nota:Recordarutilizarjavax.enterprise.context.RequestScoped.AgregamoselEJBinyectandolomediante@Inject@InjectEstatusFacadeestatusFacadeAgregamoselEntityEstatusestatus=newEstatus()creamoslosget/setdelentityestatusclicderechoInsertCode>Generatedset/getyseleccionamosestatus
Implementamoselmtodosave()dondeharemospersistenteslosentityenlabasededatos,enestemtodobuscaremosporlallaveprimariamedianteestatusFacade.find(),ysinoexisteinvocamosestatusFacade.create(),paraguardarlo.
Sideseamoslimpiarlavistaescribimosestatus=newEstatus(),demaneraquealactualizarselapginaxhtml,estamostrarlosatributoslimpios.JSFUtil.infoDialog(),mostrarelmensajeenundilogo.SiqueremosquesemuestreenelgrowlusamosJSFUtil.addSuccessMessage().Crearmtodosedit()ydelete(),crearatributoencontradoconlosmtodosget/set.Recordarcambiar
42
publicBooleanisEncontrado(){returnencontrado}porpublicBooleangetEncontrado(){returnencontrado}
43
CdigocompletodeCDIBeansEstatusController.javaimportcom.avbravo.scrumweb.Estatusimportcom.avbravo.scrumweb.ejb.EstatusFacadeimportcom.avbravo.scrumweb.generales.JSFUtilimportcom.avbravo.scrumweb.generales.ResourcesFilesimportjava.io.Serializableimportjavax.enterprise.context.RequestScopedimportjavax.inject.Injectimportjavax.inject.Named/****@authoravbravo*/@Named@RequestScopedpublicclassEstatusController{@InjectEstatusFacadeestatusFacadeEstatusestatus=newEstatus()privateBooleanencontrado=falseprivateListitemspublicEstatusgetEstatus(){returnestatus}publicvoidsetEstatus(Estatusestatus){this.estatus=estatus}publicBooleangetEncontrado(){returnencontrado}publicvoidsetEncontrado(Booleanencontrado){this.encontrado=encontrado}/***CreatesanewinstanceofEstatusController*/
44
publicEstatusController(){}publicStringsave(){try{if(estatusFacade.find(estatus.getIdestatus())!=null){JSFUtil.infoDialog("Mensaje","Existeunregistroconeseid")returnnull}estatusFacade.create(estatus)JSFUtil.addSuccessMessage("Guardado")estatus=newEstatus()}catch(Exceptione){JSFUtil.addErrorMessage(e.getLocalizedMessage())}returnnull}publicStringedit(){try{estatusFacade.edit(estatus)JSFUtil.addSuccessMessage("Guardado")}catch(Exceptione){JSFUtil.addErrorMessage(e.getLocalizedMessage())}returnnull}publicStringdelete(){try{estatusFacade.remove(estatus)JSFUtil.addSuccessMessage("Eliminado")encontrado=falseestatus=newEstatus()}catch(Exceptione){JSFUtil.addErrorMessage(e.getLocalizedMessage())}returnnull}//DevuelveellistparaunselectOneMenupublicListgetItems(){if(items==null){
45
items=estatusFacade.findAll()}returnitems}}
CrearlosFaceletsTemplateClientparainsertarEstatusAhoracreamosunFaceletsTemplateClient
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypes,seleccioneFaceletsTemplateClient EnFileName:estatusinsert Foldercolocamos/page/estatus/ Templateseleccionamostemplate.xhtml
SecreaelFaceletsclientestatusinsert.xhtmlenlacarpetapage/estatus
46
Delamismamaneraquehicimosconlapginaindex,colocamosencomentariotop,button,left,mediantecenterUnavezseleccionado,hacemosclicsobreeltextoyseleccionamosInsertCode
Luego,hacemosclicenJSFFormFromEntity
47
SeleccionarelEntity:com.avbravo.scrumweb.EstatusyelManagedBeanProperty:estatusController.estatus
Nota:EnTemplatesStyle:podemosseleccionarPrimefaces
Estogeneraraloscomponentesprimefacesdirectamente.GeneraelcdigoconloscomponentesJSFasociadoalosatributosdelentity
IndicamoseliddelpanelestoseutilizaparaidentificarelcomponenteporelidrespectivoColocamoslaetiquetay
Agregamoselcomponenteparamensajesquesemantendrnenlapgina.
CreamoslaseccinfooterenelpanelGridyagregarelbotonGuardar,parainvocarelmtodosave()delCDIyenlapropiedadupdateutilizamospanelygrowl,demaneraqueelguardarunregistroseactualiceelpanelysemuestrelosmensajesenelgrowl.Sinolocolocamosenelupdatelosmensajesnosemostraran,yaqueelpordefectotieneAjaxhabilitadoentrue.Vistafinaldelapginaestatusinsert.xhtml,conloscomponentesyelbotnGuardar.
49
Guardamoselarchivo,yvolvemosaejecutarlaaplicacinparamostrarloscambios.Tambinesimportanterecordarquesielproyectoestenejecucineldeploydelaaplicacinesautomticosinnecesidaddereiniciarelservidor.
IngresamoslosdatosyaldarclicenelbotonGuardarsealmacenanenlabasededatoslosatributosqueestanenelEntityyseenvaelmensajeenelgrowlyenmessages.
siingresamosunidestatusqueyaexistenosenviarelmensaje.
SinousaramoslavalidacinparadeterminarsiexisteunregistroconesallaveprimariaobtendremoselmensajeTransactionaborted,ynoseramuyexplicativoparaelusuario
50
Sideseamosusariconoenelbotn,agregamoselatributoicon="uiicondisk"a.
Enelsiguienteenlacepodemosencontrarlalistadeiconosjquerydisponiblesparaloscomponentesprimefaces,queusaremosmedianteicon="nombredeliconohttp://jqueryui.googlecode.com/svn/tags/1.6rc5/tests/static/icons.htmlcolocamoselcursorsobreeliconoysedespliegaelmensajeconelnombre.
Editar el entity Estatus.java Agregarel@NamedQueryfindByEstatusLikequenospermitirrealizarbsquedas
porcoincidenciasenelatributoestatus.@NamedQuery(name="Estatus.findByEstatusLike",query="SELECTeFROMEstatuseWHERElower(e.estatus)like:estatus"),SegmentodelcdigoEntidad.javadondeseagregael@NamedQuery@Entity@Table(name="estatus")@XmlRootElement@NamedQueries({@NamedQuery(name="Estatus.findAll",query="SELECTeFROMEstatuse"),@NamedQuery(name="Estatus.findByIdestatus",query="SELECTeFROMEstatuseWHEREe.idestatus=:idestatus"),@NamedQuery(name="Estatus.findByEstatus",query="SELECTeFROMEstatuseWHEREe.estatus=:estatus"),@NamedQuery(name="Estatus.findByEstatusLike",query="SELECTeFROMEstatuseWHERElower(e.estatus)like:estatus"),@NamedQuery(name="Estatus.findByEsinicial",query="SELECTeFROMEstatuseWHEREe.esinicial=:esinicial")})
51
http://jquery-ui.googlecode.com/svn/tags/1.6rc5/tests/static/icons.html
publicclassEstatusimplementsSerializable{privatestaticfinallongserialVersionUID=1L
EditarEstatusFacade.javaAgregarelmtodofindById,quenosdevolverunobjetodetipoEstatus.Elmtodofind,elcualbuscarelentityporlallaveprimaria.ElmtodofindByEsinicial()querecibeunparmetrocorrespondientealvalordelatributoesinicial(si/no).ElEntityEstatusfindByEsinicialesel@NamedQuery(name="Estatus.findByEsinicial",usaremosunQueryqueimplementalabsquedaydevolverunlist.ElmtodogetEstatusList()paraquedevuelvatodoslosentity,alinvocarEstatus.findAll.yelmtodoofindByEsinicial().agregarlosmtodosfindByEstatus(),findByIdEstatusList()yfindByEstatusLike()EditarEstatusFacade.javapublicEstatusfindById(Stringid){returnem.find(Estatus.class,id)}publicListgetEstatusList(){returnem.createNamedQuery("Estatus.findAll").getResultList()}publicListfindByEsinicial(Stringvalue){Queryquery=em.createNamedQuery("Estatus.findByEsinicial")returnquery.setParameter("esinicial",value).getResultList()}publicListfindByEstatus(Stringvalue){Queryquery=em.createNamedQuery("Estatus.findByEstatus")returnquery.setParameter("estatus",value).getResultList()}publicListfindByIdEstatusList(Stringvalue){Queryquery=em.createNamedQuery("Estatus.findByIdestatus")returnquery.setParameter("idestatus",value).getResultList()}publicListfindByEstatusLike(Stringvalue){Queryquery=em.createNamedQuery("Estatus.findByEstatusLike")value="%"+value.trim()+"%"
52
returnquery.setParameter("estatus",value).getResultList()}
ConvertidoresConviertenlosobjetoseneltipodedatosnecesario.PorejemplosiusamosunselectOneMenuconunalistadeobjetos,elconverterdevolverelobjetoseleccionado.
Crear EstatusConverter.java CrearEstatusConverter.java
DesdemenFile,seleccioneNew enCategories,seleccioneJavaServerFaces enFileTypes,seleccioneJSFManagedBeans ClassName:EstatusConverter Packagecom.avbravo.scrumweb.converter
importcom.javscaz.rigemjsf.Usuariosimportcom.javscaz.rigemjsf.ejb.UsuariosFacadeimportcom.javscaz.rigemjsf.generales.JSFUtilimportjava.util.logging.Levelimportjava.util.logging.Loggerimportjavax.inject.Injectimportjavax.faces.component.UIComponentimportjavax.faces.context.FacesContextimportjavax.faces.convert.Converterimportjavax.faces.convert.FacesConverter@FacesConverter(value="estatusConverter")publicclassEstatusConverterimplementsConverter{@InjectprivateEstatusFacadeejbFacade@OverridepublicObjectgetAsObject(FacesContextfacesContext,UIComponentcomponent,Stringvalue){if(value==null||value.length()==0||JSFUtil.isDummySelectItem(component,value)){returnnull}returnthis.ejbFacade.find(getKey(value))}
53
java.lang.StringgetKey(Stringvalue){java.lang.Stringkeykey=valuereturnkey}StringgetStringKey(java.lang.Stringvalue){StringBuffersb=newStringBuffer()sb.append(value)returnsb.toString()}@OverridepublicStringgetAsString(FacesContextfacesContext,UIComponentcomponent,Objectobject){if(object==null||(objectinstanceofString&&((String)object).length()==0)){returnnull}if(objectinstanceofEstatus){Estatuso=(Estatus)objectreturngetStringKey(o.getUsername())}else{Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,"object{0}isoftype{1}expectedtype:{2}",newObject[]{object,object.getClass().getName(),Estatus.class.getName()})returnnull}}}Nota:Silallaveprimariaesdetipointeger,utilizareltipodedatosjava.lang.Integerjava.lang.IntegergetKey(Stringvalue){java.lang.Integerkeykey=Integer.valueOf(value)returnkey}StringgetStringKey(java.lang.Integervalue){StringBuffersb=newStringBuffer()
54
sb.append(value)returnsb.toString()}
55