Curso de Java Server Faces y Ajax
Curso de Java Server Faces y Ajax
Manualdelalumno
<JSF2.0> <Ajax>
Docente:CdricSimon
Versin1.0 www.detodoprogramacion.com
CursodeJSP
Pagina2/70
ndice
ndice....................................................................................................................................................................................2 1 Introduccin al curso.........................................................................................................................................................5 1.1 Objetivo de este curso................................................................................................................................................5 1.2 Manual del alumno.....................................................................................................................................................5 1.3 Ejercicios prcticos....................................................................................................................................................5 1.4 Requisitos para atender a este curso........................................................................................................................5 1.5 Soporte despus del curso..........................................................................................................................................5 2 Introduccin a Java Server Faces.....................................................................................................................................6 2.1 Que es JSF?...............................................................................................................................................................6 2.2 Servidor y herramientas utilizados...........................................................................................................................6 2.3 Primera aplicacin.....................................................................................................................................................7 2.4 Primera pgina JSF...................................................................................................................................................8 2.5 Recuperando informaciones del cdigo Java...........................................................................................................9 3 Aplicaciones JSF.............................................................................................................................................................10 3.1 Qu es una aplicacin JavaServer Faces?............................................................................................................10 3.2 Modelo de componentes de interfaz de usuario.....................................................................................................10 3.3 Las clases de componentes de interfaz de usuario................................................................................................10 3.4 Conversin de Modelo.............................................................................................................................................13 3.5 Evento y el oyente de modelo..................................................................................................................................14 1.1 Validacin.................................................................................................................................................................15 3.6 Modelo de navegacin..............................................................................................................................................15 3.6.1 Configuracin de reglas de navegacin..............................................................................................................15 3.6.2 Reglas de navegacin implcitas.........................................................................................................................18 3.7 Backed Beans............................................................................................................................................................18 3.7.1 Crear una clase de bean de respaldo....................................................................................................................18 3.7.2 Configuracin de un Bean...................................................................................................................................19 3.8 Usando el EL unificada para referenciar Backed beans......................................................................................20 3.8.1 El Ciclo de Vida de una pgina JavaServer Faces..............................................................................................21 3.8.2 Fase de restauracin de vista...............................................................................................................................22 3.8.3 Fase de aplicacin de valores..............................................................................................................................23 3.8.4 Fase de validaciones de proceso..........................................................................................................................23 3.8.5 Fase de actualizacin de valores de modelo........................................................................................................24 3.8.6 Fase de invocacin de la aplicacin....................................................................................................................24 3.8.7 Fase de creacin de la respuesta..........................................................................................................................24 4 Expresiones EL................................................................................................................................................................26 4.1 Informacin general sobre EL................................................................................................................................26 4.2 Evaluacin inmediata y diferida.............................................................................................................................26 4.2.1 Evaluacin Inmediata..........................................................................................................................................26 4.2.2 Evaluacin diferida.............................................................................................................................................27 4.3 Valor y el mtodo de expresiones............................................................................................................................27 4.4 Operadores................................................................................................................................................................27 4.5 Palabras reservadas.................................................................................................................................................28 4.6 Ejemplos de uso de EL.............................................................................................................................................28 www.detodoprogramacion.com
CursodeJSP
Pagina3/70
5 JSTL - Libreras estndar Taglib....................................................................................................................................29 5.1 Introduccin..............................................................................................................................................................29 5.2 Core...........................................................................................................................................................................29 5.3 Iteracin....................................................................................................................................................................29 5.4 Acciones de URL......................................................................................................................................................30 5.5 Condicionales............................................................................................................................................................30 5.6 Formato de texto con capacidad I18N....................................................................................................................31 5.7 Acceso a bases de datos............................................................................................................................................32 5.8 La manipulacin de XML........................................................................................................................................33 6 Formularios......................................................................................................................................................................34 6.1 Formulario sencillo..................................................................................................................................................34 6.2 Formulario mas complejo........................................................................................................................................35 7 HtmlDataTable.................................................................................................................................................................37 8 Mensaje de error personalizados.....................................................................................................................................42 8.1 Lista de mensaje personalizados.............................................................................................................................42 8.2 Pgina de error personalizada:...............................................................................................................................42 9 Convertidores...................................................................................................................................................................43 9.1 Qu es un convertidor?..........................................................................................................................................43 9.2 Uso de los convertidores..........................................................................................................................................43 9.3 Convertidores incluidos...........................................................................................................................................43 9.3.1 Convertidor DateTime.........................................................................................................................................44 9.3.2 Convertidor de Nmero.......................................................................................................................................44 9.4 Convertidores personalizados.................................................................................................................................46 10 Validadores.....................................................................................................................................................................49 10.1 Uso y Creacin de los validadores........................................................................................................................49 10.2 Validadores incluidos.............................................................................................................................................49 10.3 Validacin a nivel de aplicacin............................................................................................................................49 10.4 Validadores personalizados...................................................................................................................................50 10.5 Validador en Backed Bean....................................................................................................................................51 11 Componentes personalizados.........................................................................................................................................52 11.1 Creacin de componentes personalizados para JSP...........................................................................................52 11.1.1 El Componente..................................................................................................................................................53 11.1.2 Renderer............................................................................................................................................................54 11.1.3 Tag.....................................................................................................................................................................56 11.1.4 Inline Renderer .................................................................................................................................................58 11.2 Componentes personalizados para Facelets........................................................................................................59 12 Introduccin a Ajax.......................................................................................................................................................61 12.1 Definicin y uso.......................................................................................................................................................61 12.2 Marcos de trabajo..................................................................................................................................................61 13 Ajax con Java.................................................................................................................................................................62 13.1 Llamada Ajax con HTML.....................................................................................................................................62 13.2 Llamada Ajax con Java.........................................................................................................................................63 13.2.1 Servlet para Ajax...............................................................................................................................................63
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina4/70
13.3 Ajax y seguridad.....................................................................................................................................................65 14 Componentes JSF para Ajax........................................................................................................................................66 14.1 Cmo JSF y Ajax pueden trabajar juntos?.......................................................................................................66 14.2 Utilizar el (Ajax) JavaScript en su pgina JSF....................................................................................................66 14.2.1 Pros....................................................................................................................................................................66 14.2.2 Contras..............................................................................................................................................................66 14.3 Poner su cdigo de Ajax JavaScript en los componentes JSF............................................................................66 14.3.1 Pros....................................................................................................................................................................66 14.3.2 Contras..............................................................................................................................................................66 14.4 Aprovechar la creciente coleccin de marcos de trabajo Ajax JSF..................................................................67 14.4.1 Pros....................................................................................................................................................................67 14.4.2 Contras..............................................................................................................................................................67 14.5 Utilizar el nuevo tag <f:ajax>................................................................................................................................67 14.5.1 Pros....................................................................................................................................................................67 14.5.2 Contras..............................................................................................................................................................67 14.5.3 Por qu el Ajax en JSF?...................................................................................................................................67 14.5.3.1 Ventajas de un enfoque especfico JSF Ajax.............................................................................................67 14.5.4 Uso del tag <f:ajax>..........................................................................................................................................68 14.5.4.1 Ejemplo sencillo.........................................................................................................................................68 14.5.4.2 renderer: Especificacin de los elementos de actualizacin en el cliente..................................................69 14.5.4.3 execute: Especificacin de los elementos a procesar en servidor..............................................................69 14.5.4.4 event: mencionar a cual evento de usuario debe disparar la llamada Ajax................................................70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina5/70
1 Introduccinalcurso
1.1 Objetivodeestecurso
EnestecursovamosaaprenderellenguajeJSFquenospermitircrearpginaswebdinmicas.
1.2 Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Estemanual contieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumnodeberade tomarnotaspersonalesparacompletasestemanual.
1.3 Ejerciciosprcticos
Paracaptarmejorlateora,seharnmuchosejerciciosconlosalumnos,paraprobarlateorayverificar laintegracindelamateria. Tambin,elalumnopodrcopiarsuscdigosenundisquetealfindelcursoparallevarse,confinde seguirlaprcticaensuhogar.
1.4 Requisitosparaatenderaestecurso
UnabuenconocimientodeloslenguajesJava,JSP,HTML,yJavascriptesrequeridaparaseguireste curso.LacreacinyelmanejodeobjetosJavaascomoelJSPestnconsideradacmoasimiladoantes deempezarestecurso. Sielalumnotienedificultadesenunuotrocapitulo,eldebesentirselibredepedirexplicaciones adicionalesalprofesor. Perosiaparecequeelalumnonoposeelosrequisitosmnimosparaestecurso,porrespetoalosotros alumnosqueyaposeenestamateria,elalumnopodrasertrasladoparaotrocursoenelfuturo,cuando elcumplirconlosrequisitos.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina6/70
2 IntroduccinaJavaServerFaces
2.1 QueesJSF?
JavaServerFaces(JSF)esuntecnologayframeworkparaaplicacionesJavabasadasenwebque simplificaeldesarrollodeinterfacesdeusuarioenaplicacionesJavaEE. JSFusaJavaServerPages(JSP)comolatecnologaquepermitehacereldesplieguedelaspginas,pero tambinsepuedeacomodaraotrastecnologascomoXUL. JSFincluye: UnconjuntodeAPIspararepresentarcomponentesdeunainterfazdeusuarioyadministrarsu estado,manejareventos,validarentrada,definirunesquemadenavegacindelaspginasydar soporteparainternacionalizacinyaccesibilidad. Unconjuntopordefectodecomponentesparalainterfazdeusuario. DosbibliotecasdeetiquetaspersonalizadasparaJavaServerPagesquepermitenexpresaruna interfazJavaServerFacesdentrodeunapginaJSP. Unmodelodeeventosenelladodelservidor. Administracindeestados. Beansadministrados. LaespecificacindeJSFfuedesarrolladaporlaJavaCommunityProcess VersionesdeJSF: JSF1.0(11032004)lanzamientoinicialdelasespecificacionesdeJSF. JSF1.1(27052004)lanzamientoquesolucionabaerrores.Sincambiosenlasespecificaciones nienelrenderkitdeHTML. JSF1.2(11052006)lanzamientoconmejorasycorreccindeerrores. JSF2.0(12082009)ltimolanzamiento. LasprincipalesimplementacionesdeJSFson: JSFReferenceImplementationdeSunMicrosystems. MyFacesproyectodeApacheSoftwareFoundation. RichFaces ICEfacesContienediversoscomponentesparainterfacesdeusuariosmsenriquecidas,tales comoeditoresdetextoenriquecidos,reproductoresdemultimedia,entreotros. jQuery4jsfContienediversoscomponentessobrelabasedeunodelosmspopularesframework javascriptjQuery.
2.2 Servidoryherramientasutilizados
JavaServerFaces2.0esunatecnologanueva,ynecesitalasltimasversionesdelasherramientasde desarrolloyservidoreswebparapoderusarla. Aniveldeherramientas,lasmsutilizadassonEclipseyNetBeans.EnelcursousaremosNetBeans versin6.8oarriba. Aniveldeservidoresweb,servidorescomoApacheTomcat6,Jboss5,oGlassFish3soportanJSF2.0. EnelcursousaremosGlassFish3quevieneincluidoconNetBeans.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina7/70
2.3 Primeraaplicacin
PrimerovamosainstalarNetBeansycrearunnuevoproyecto.
AgregamoslalibreraJSF2.0alservidor.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina8/70
Iniciamoselservidorwebydesplegamoslaaplicacin. Miramoselresultadoenhttp://localhost:8080/CursoJSFwar
PorelmomentosoloestamosmirandoaunapginaJSP,nadadeJSF.
2.4 PrimerapginaJSF
LaspginasJSFsonpginasJSPconunaslibrerasTaglibadicionales. Ademas,laspginasJSPnosellamandirectamente,perosellamanatravsdelmotorJSF.Parallamar alapginaJSF,bastaconagregar/faces/anteselnombredelapgina. http://localhost:8080/CursoJSFwar/faces/index.jsp Comolovemos,unapginaJSP(sincdigoJSF)puedeserllamadasinproblema. Laconfiguracindelreenvosepuedepersonalizar(porcarpetay/oporextensin)enweb.xml: <servlet>
<servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina9/70
Ahoraquetenemostodolisto,creamosnuestraprimerapginaJSF,usandolaopcinJSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <f:view> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>Mi primera pagina JSP</title> </head> <body> <h1><h:outputText value="Hola alumno!"/></h1> </body> </html> </f:view>
2.5 RecuperandoinformacionesdelcdigoJava
VamosacrearunaclaseJava(JSFBackedBean)HelloyllamarladesdenuestrapginaJSF.
package curso; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean(name="Hello") @RequestScoped public class Hello { public Hello() { } public String getNombre(){ return "Cedric"; } }
Ymodificamoslapginaindex.xhtml:
<h1>Hello #{Hello.getNombre()} !!!</h1>
EnelfuturousaremoselformatoXHTML,ynoincluirlasetiquetas<xml>,<DOCTYPE>ni<html>, quesernlossiguientes:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" >
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina10/70
3 AplicacionesJSF
3.1 QuesunaaplicacinJavaServerFaces?
Ensumayorparte,unaaplicacinJavaServerFacesescomocualquierotraaplicacinJavaWeb.Una aplicacintpicadeJavaServerFacesincluyelassiguientespiezas: Unconjuntodepginasweb,enlaqueloscomponentesdeinterfazdeusuariosonestablecidos. Unconjuntodebibliotecasdeetiquetasproporcionaretiquetasparaaadircomponentesde interfazdeusuarioalapginaweb. UnconjuntodeBackedBean,quesonJavaBeanscomponentesquedefinenlaspropiedadesy funcionesdeloscomponentesdelainterfazdeusuarioenunapgina. Opcionalmente,unoomsficherosdeconfiguracindelaaplicacinderecursos(comofaces config.xmlfile),quedefinenlasnormasdenavegacindelapginayconfiguralosbeansyotros objetospersonalizados,talescomocomponentespersonalizados. Undescriptordedespliegue(unarchivoweb.xml). Esposiblequeunconjuntodeobjetospersonalizadoscreadosporeldesarrolladordeaplicaciones. Estosobjetospuedenincluircomponentespersonalizados,validadores,convertidores,olos oyentes. Unconjuntodeetiquetaspersonalizadaspararepresentarlosobjetospersonalizadosenla pgina.
3.2 Modelodecomponentesdeinterfazdeusuario
JavaServerFacescomponentesdeinterfazdeusuariosonlosbloquesdeconstruccindevistade JavaServerFaces. JavaServerFacescomponentesdeinterfazdeusuariosonelementosconfigurables,reutilizablesque componenlainterfazdeusuariodeaplicacionesJavaServerFaces.Uncomponentepuedesersimple, comounbotn,opuedensercompuestos,talescomounatabla,compuestademltiplescomponentes. LatecnologaJavaServerFacesproporcionaunaricaarquitecturadecomponentesflexiblesqueincluye losiguiente: UnconjuntodeclasesUIComponentparaespecificarelestadoyelcomportamientodelos componentesdelainterfazdeusuario Unmodeloderepresentacinquedefineelmododehacerloscomponentesdevariasmaneras Uneventodeescuchayelmodeloquedefinecmomanejarloseventosdeloscomponentes Unmodelodeconversinquedefinecmoregistrarlosconvertidoresdedatosenuncomponente Unmodelodevalidacinquedefinecmoregistrarvalidadoresenuncomponente Estaseccindescribebrevementecadaunadeestaspiezasdelaarquitecturadecomponentes.
3.3 Lasclasesdecomponentesdeinterfazdeusuario
LatecnologaJavaServerFacesproporcionaunconjuntodeclasesdecomponentesdeinterfazdeusuario ydecomportamientoasociadosalasinterfacesqueespecificantodaslasfuncionalidaddelos componentesdeinterfazdeusuario,comocomponentedeparticipacindelestado,manteneruna referenciaalosobjetos,yuneventodeconduccinymanejodelaprestacindeunconjuntode componentesestndar.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina11/70
Lasclasesdecomponentessontotalmenteextensible,permitiendoalosescritoresdecomponentespara crearsuspropioscomponentespersonalizados.Creacindecomponentespersonalizadosesuntema avanzadoqueveremosmstarde. Laclasebaseabstractaparatodosloscomponentesdeinterfazdeusuarioes javax.faces.component.UIComponent. LasclasesdecomponentesdeinterfazdeusuarioamplianlaclaseUIComponentBase,(unasubclasede laclaseUIComponent),quedefineelestadopordefectoyelcomportamientodeuncomponentede interfazdeusuario.Elsiguienteconjuntodeclasesdecomponentesdeinterfazdeusuarioseincluyecon latecnologaJavaServerFaces: UIColumn:RepresentaunasolacolumnadedatosenuncomponenteUIData. UICommand:Representauncontrolqueiniciaaccionescuandoseactiva. UIData:Representaunenlacededatosaunacoleccindedatosrepresentadosporunainstancia dataModel. UIForm:Encapsulaungrupodecontrolesqueenviardatosalaaplicacin.Estecomponentees anlogoalaetiquetadeformularioenHTML. UIGraphic:Muestraunaimagen. UIInput:Tomadeentradadedatosdeunusuario.EstaclaseesunasubclasedeUIOutput. UIMessage:Muestraunmensajedeerrortraducidos. UIMessages:Muestraunconjuntodemensajesdeerrortraducidos. UIOutcomeTarget:Muestraunhipervnculoenlaformadeunvnculoounbotn. UIOutput:Muestralasalidadedatosenunapgina. UIPanel:administraeldiseodesuscomponentesnio. UIParameter:Representalosparmetrosdesustitucin. UISelectBoolean:Permitealusuarioestablecerunvalorbooleanoenuncontroldeselecciny anulacindeella.EstaclaseesunasubclasedelaclaseUIInput. UISelectItem:Representaunsoloelementoenunconjuntodeelementos. UISelectItems:Representatodounconjuntodeelementos. UISelectMany:Permitealusuarioseleccionarvarioselementosdeungrupodeelementos.Esta claseesunasubclasedelaclaseUIInput. UISelectOne:Permitealusuarioseleccionarunelementodeungrupodeelementos.Estaclase esunasubclasedelaclaseUIInput. UIViewParameter:Representalosparmetrosdeconsultaenunasolicitud.Estaclaseesuna subclasedelaclaseUIInput. UIViewRoot:Representalarazdelrboldecomponentes. AdemsdeampliarUIComponentBase,lasclasesdecomponentetambinaplicarunaomsinterfaces decomportamiento,cadaunodeloscualesdefineciertocomportamientodeunconjuntodecomponentes cuyasclasesimplementanlainterfaz. Estasinterfacesdecomportamientosonlassiguientes: ActionSource:Indicaqueelcomponentepuededesencadenaruneventodeaccin.Estainterfaz estdiseadoparautilizarseconcomponentesbasadosenlatecnologaJavaServerFaces1.1_01 yversionesanteriores. ActionSource2:ExtiendeActionSource,yporlotantoproporcionalamismafuncionalidad.Sin embargo,sepermitealoscomponentesautilizarelELunificadocuandosehacereferenciaalos mtodosparacontrolarloseventosdeaccin. EditableValueHolder:ExtiendeValueHolderyespecificalascaractersticasadicionalesparalos componentesmodificable,comolavalidacinyemitirloseventosdecambiodevalor. NamingContainer:losmandatosquecadacomponentederazenestecomponentetieneuna identificacinnica. StateHolder:Indicaqueuncomponentehaestadoquedebenguardarentrelassolicitudes.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina12/70
commandButton
An HTML <input type=type> Un botn element, where the type value can be submit, reset, or image An HTML <a href> element Un hipervnculo
commandLink
Enlaces a otra pgina o ubicacin en una pgina Representa un contenedor de datos Representa una forma de entrada (etiquetas internas de la forma recibir los datos que se presentar con el formulario) Muestra una imagen Permite a un autor de la pgina incluir una variable oculta en una pgina
dataTable
form
graphicImage inputHidden
inputSecret
Permite al usuario An HTML <input type=password> Un campo de texto, que muestra una fila introducir una cadena sin la element de estrellas en cadena aparece en claro en lugar de la cadena el campo real que haya entrado Permite al usuario introducir una cadena Permite a un usuario introducir una cadena de varias lneas Muestra un mensaje localizado Muestra los mensajes localizados Muestra un mensaje localizado Muestra un componente anidado como una etiqueta para un campo de entrada especificado Enlaces a otra pgina o ubicacin en una pgina sin An HTML <input type=text> element An HTML <textarea> element Un campo de texto Un campo de texto de varias lineas Una cadena de texto Una cadena de texto Texto sin formato Texto sin formato
inputText inputTextarea
An HTML <span> tag if styles are used A set of HTML <span> tags if styles are used Plain text An HTML <label> element
outputLink
Un hipervnculo
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
que se genere un evento de accin outputText panelGrid panelGroup Muestra una lnea de texto Muestra una tabla Grupos de un conjunto de componentes en uno de los padres Plain text An HTML <table> element with <tr> and <td> elements A HTML <div> or <span> element
Pagina13/70
selectBooleanCheck Permite a un usuario cambiar An HTML <input type=checkbox> Una casilla de box el valor de una opcin element. verificacin boleana selectItem Representa un elemento en An HTML <option> element una lista de elementos en un componente UISelectOne Representa una lista de elementos en un componente UISelectOne A list of HTML <option> elements A set of HTML <input> elements of type checkbox No aparece
selectItems
No aparece
selectManyCheckbox Muestra un conjunto de casillas de verificacin de que el usuario puede seleccionar varios valores selectManyListbox
Permite al usuario An HTML <select> element seleccionar varios elementos de un conjunto de elementos, todos muestran a la vez Permite al usuario An HTML <select> element seleccionar varios elementos de un conjunto de elementos Permite a un usuario para seleccionar un elemento de un conjunto de elementos, todos muestran a la vez Permite a un usuario para seleccionar un elemento de un conjunto de elementos Permite a un usuario para seleccionar un elemento de un conjunto de elementos An HTML <select> element
selectManyMenu
selectOneListbox
selectOneMenu
selectOneRadio
3.4 ConversindeModelo
UnaaplicacinJavaServerFaces,opcionalmente,sepuedeasociarconuncomponentedeservidorde datosdeobjetossecundarios.EsteobjetoesuncomponenteJavaBeans,comoungranoderespaldo.Una aplicacinobtieneyestableceelobjetodedatosparauncomponentellamandoalaspropiedadesde objetoapropiadoparaesecomponente. Cuandouncomponenteestasociadoaunobjeto,laaplicacintienedospuntosdevistadelosdatosdel componente: Elpuntodevistadelmodelo,enelqueserepresentanlosdatoscomotiposdedatos,talescomo intolong. Lavistadepresentacin,enelqueserepresentanlosdatosdeunamaneraquepuedeserledoo modificadoporelusuario.Porejemplo,unjava.util.Datepuedeserrepresentadacomouna cadenadetextoenelformatomm/dd/aaocomounconjuntodetrescadenasdetexto. LaimplementacindeJavaServerFacesconvierteautomticamentedatosdeloscomponentesentre estosdospuntosdevistacuandolapropiedaddebeanasociadosconelcomponentedeunodelostipos soportadosporlosdatosdelcomponente.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina14/70
Porejemplo,siuncomponentedeUISelectBooleanseasociaconunapropiedaddebeande java.lang.Booleantipo,laimplementacinJavaServerFacesseconvertirautomticamentelosdatosdel componentedelacadenaenBoolean.Adems,algunosdatosdeloscomponentesdebenestarvinculadas alaspropiedadesdeuntipoparticular.Porejemplo,uncomponenteUISelectBooleandebeestar enlazadoaunapropiedaddetipobooleanojava.lang.Boolean. Avecespuedequedeseeconvertirlosdatosdeuncomponenteauntipodistintodeuntipoestndar,o puedequedeseeconvertirelformatodelosdatos.Parafacilitaresto,latecnologaJavaServerFacesle permiteregistrarlaaplicacinConverterencomponentesUIOutputycomponentescuyasclases UIOutputsubclase.SiseregistralaaplicacinConverterenuncomponente,laaplicacinConverter conviertelosdatosdelcomponenteentrelosdospuntosdevista. PuedeutilizarlosconvertidoresestndarsuministradosconlaimplementacinJavaServerFacesocrear supropioconvertidorpersonalizado.Lacreacindeconvertidorpersonalizadoesuntemaavanzadoque severmsadelante.
3.5 Eventoyeloyentedemodelo
JavaServerFaces2.0definetrestiposdeeventos:loseventosdeaplicacin,loseventosdelsistemaylos datosdeeventosdemodelo. Eventosdeaplicacinestnvinculadosaunaaplicacinenparticularysongeneradosporun UIComponent.Ellosrepresentanelestndardeeventosdisponiblesenversionesanterioresdela tecnologaJavaServerFaces. Unobjetodeeventoidentificaelcomponentequegenereleventoyalmacenainformacinsobreel evento.Parasernotificadodeunevento,unaaplicacindebeproporcionarunaimplementacindela clasedeescuchaydeberegistrarloenelcomponentequegeneraelevento.Cuandoelusuarioactivaun componente,porejemplo,hacerclicenunbotn,sedisparaunevento.Estohacequelaimplementacin JavaServerFacesparainvocarelmtododeescuchaqueprocesaelevento. JavaServerFacessoportadostiposdeeventosdeaplicacin:eventosdeaccinydevaloreventosde cambio. Uneventodeaccin(ActionEventclase)seproducecuandoelusuarioactivauncomponenteque implementeActionSource.Estoscomponentesincluyenbotonesyloshipervnculos. Uneventodecambiodevalor(ValueChangeEventclase)seproducecuandoelusuariocambiaelvalorde uncomponenterepresentadaporUIInputounodesussubclases.Unejemploeslaseleccindeuna casilladeverificacin,unaaccinqueresultaenelvalordelcomponenteestcambiandoatrue.Los tiposdecomponentesquepuedegenerarestetipodeeventossonlosUIInput,UISelectOne, UISelectMany,yloscomponentesdeUISelectBoolean.Valoreventosdecambiosondespedidosslosino sedetectaronerroresdevalidacin. LossucesosdelsistemasongeneradosporunobjetoenlugardeunUIComponent.Quesegeneran durantelaejecucindeunaaplicacinentiempospredefinidos.Sonaplicablesatodalaaplicacinen lugardeauncomponenteespecfico. Unmodelodedatosdeeventosseproducecuandoseseleccionaunanuevafiladeuncomponentede UIData. Lossucesosdelsistemaylosdatosdeeventosdemodelosontemasavanzadosquesemirarnmstarde.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina15/70
1.1
Validacin
LatecnologaJavaServerFacessoportaunmecanismoparalavalidacindelosdatoslocalesdelos componentesmodificables(comoloscamposdetexto).Estavalidacinseproduceantesdequeelmodelo dedatoscorrespondienteseactualizaparaquecoincidaconelvalorlocal. Aligualqueelmodelodeconversin,elmodelodevalidacindefineunconjuntodeclasesestndarpara larealizacindecomprobacionesdevalidacindedatoscomunes.LaetiquetadeJavaServerFaces ncleobibliotecatambindefineunconjuntodeetiquetasquecorrespondenalasimplementaciones estndardeValidator. Lamayoradelasetiquetastienenunconjuntodeatributosparaconfigurarlaspropiedadesdel validador,talescomolosvaloresmximoymnimopermitidosparalosdatosdelcomponente.Los registrosdeautoreselvalidadorenuncomponenteporlaetiquetadeanidacindelvalidadordentrode laetiquetadelcomponente.
3.6 Modelodenavegacin
ElmodelodenavegacinJavaServerFaceshacequeseafcildedefinirydenavegacindelapgina paramanejarcualquierprocesamientoadicionalquesenecesitaparaelegirlasecuenciaenlaquese carganlaspginas. EnlatecnologaJavaServerFaces,lanavegacinesunconjuntodereglasparalaeleccindelapgina siguienteolavistaquesemostrardespusdeunaaccindeaplicacin,comocuandounbotno hipervnculosehaceclic. Estasnormassedeclaranenceroomsrecursosdeconfiguracindelaaplicacin,talescomo<faces config.xml>,utilizandounconjuntodeelementosXML.Laestructurapordefectodeunareglade navegacineselsiguiente: <navigationrule> <description> </description> <fromviewid></fromviewid> <navigationcase> <fromaction></fromaction> <fromoutcome></fromoutcome> <if></if> <toviewid></toviewid> </navigationcase> </navigationrule> EnJavaServerFaces2.0,lanavegacinpuedeserimplcitoodefinidosporelusuario.Lasreglasde navegacinimplcitasentranenjuegocuandolasnormasdenavegacinnoestndisponiblesenun archivodeconfiguracindelaaplicacinderecursos. 3.6.1
Configuracindereglasdenavegacin
www.detodoprogramacion.com
CursodeJSP
Pagina16/70
Cadaregladenavegacinespecificacmonavegardeunapginaaunconjuntodeotraspginas.La implementacindeJavaServerFaceseligelaregladenavegacinadecuadodeacuerdoalapginaque semuestraactualmente. Despusdelaregladenavegacinadecuadoesseleccionado,laeleccindequeparaaccederalapgina siguientedelapginaactualdependededosfactores: Elmtododeaccinqueseinvocacuandoelcomponentesehahechoclic Elresultadolgicoquesehacereferenciaporelcomponenteenlaetiqueta,ofuedevueltoporel mtododeaccin Elresultadopuedesercualquiercosaqueeldesarrolladordecide,perolatablaaquvanalgunos resultadosdeusocomnenaplicacionesweb.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina17/70
Comoseindicaenlaregladenavegacinejemplo,unelementoderegladenavegacinpuedecontener ceroomselementosdenavegacincaso.Elelementodenavegacincaso,defineunconjuntodecriterios decoincidencia.Cuandosecumplenestoscriterios,laaplicacinsevayaalapginadefinidaporela verIDdeelementocontenidoenlanavegacindelmismoelementodecaso. Loscriteriossondefinidosporlanavegacinopcionalderesultadosydeelementosdeaccin.El resultadodeelementodefineunresultadolgico,comoelxito.Elelementodelaaccinmtodoutiliza unaexpresinparareferirseaunmtododeaccinquedevuelveunacadena,queeselresultadolgico. Elmtodorealizaalgunalgicaparadeterminarelresultadoydevuelveelresultado. Loselementosdenavegacincasodequesecotejarnconlosresultadosyelmtododeexpresineneste orden: Loscasosqueespecificalavezunresultadodevalorydevalordelaaccin.Amboselementos puedenserutilizadossielmtododeaccindevuelveresultadosdiferentesdependiendodel resultadodelatransformacinquerealiza. Loscasosqueespecificaslounvalorderesultado.Elelementoderesultadodebecoincidirconel resultadoyaseadefinidoporelatributodeaccindelcomponentedeUICommandoelresultado devueltoporelmtodomencionadoporelcomponentedeUICommand. Especificandoloscasosslounadevalordelaaccin.Estevalordebecoincidirconlaexpresin accinespecificadaporlaetiquetadelcomponente. Cuandosecomparacualquieradeestoscasos,elrboldecomponentesdefinidosporelaverelementode identificacinsernseleccionadosparalarepresentacin. UsodeNetBeansIDE,puedeconfigurarunaregladenavegacindelasiguientemanera: 1. DespusdeabrirsuproyectoenelIDENetBeans,expandaelnododelproyectoenelpanelde Proyectos. 2. AmpliarlasPginasWebyWebnodosINFdelnododelproyecto. 3. Hagadobleclicenfacesconfig.xml. 4. Despusdefacesconfig.xmlseabreenelpaneldeleditor,hagaclicenelpaneldeleditor. 5. SeleccioneJavaServerFaces,AddNavegacinartculo. 6. EnelcuadrodedilogoAgregarnavegacinartculo: Introduzcaobusquelapginaquerepresentaelpuntodevistadepartidadeestaregla denavegacin. HagaclicenAgregar. 7. Hagaclicdenuevoenelpaneldeleditor. 8. SeleccioneJavaServerFaces,UIAadirNavegacinasunto. 9. EnelcuadroAgregarnavegacinasuntodedilogo: DesdeelmenVer,seleccionelapginaquerepresentaelpuntodevistadepartidapara laregladenavegacin(enelpaso6a). (opcional)Enelcampodeaccin,escribaelmtododeaccinseinvocacuandoel componentequeseactivalanavegacinactiva.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina18/70
3.6.2
Reglasdenavegacinimplcitas
Enelejemploanterior,elcontroladordenavegacinpordefectotratardelocalizarlapgina response.xhtmlynavegarhacial.
3.7 BackedBeans
UnaaplicacintpicadeJavaServerFacesincluyeunoomsbeansdeapoyo,cadaunodeellosesun JavaServerFacesgestionadosdebeanqueestasociadoconloscomponentesdelainterfazdeusuario utilizadosenunadeterminadapgina. LosbeansGestionadosonJavaBeanscomponentesquesepuedenconfigurarmediantelainstalacinde beangestionado,quesedescribeenConfiguracindeBeans.Estaseccinpresentalosconceptosbsicos sobrelacreacin,configuracinyusodesemillasdeapoyoenunaaplicacin. 3.7.1
Crearunaclasedebeanderespaldo
Ademsdedefinirunconstructorsinargumento,comotodosloscomponentesJavaBeansdebehacer, unaclasedebeanderespaldotambindefineunconjuntodepropiedadesdeloscomponentesdeinterfaz deusuarioy,posiblemente,unconjuntodemtodosquerealizanfuncionesdeuncomponente. Cadaunadelaspropiedadesdeloscomponentessepuedenenlazaraunadelassiguientes: Elvalordeuncomponente Unainstanciadecomponente Unejemplodelconvertidor Unejemplodeescucha Unejemplodevalidador Lasfuncionesmscomunesquelosmtodosdebackedbeanrealizarsonlassiguientes: Validarlosdatosdeuncomponente Manejodeuneventodisparadoporuncomponentede Realizacindetratamientoparadeterminarlasiguientepginaparaquelasolicituddebe navegar ComocontodosloscomponentesJavaBeans,unapropiedadconstadeuncampodedatosprivadosyun conjuntodemtodosdeacceso,comolomuestraestecdigo:
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
UserNumber Integer = null; ... setUserNumber public void (Integer user_number) ( = userNumber user_number; ) getUserNumber public Integer () ( userNumber retorno; ) public String getResponse () ( ... )
Pagina19/70
Cuandounapropiedaddebeanestligadaalvalordeuncomponente,puedesercualquieradelostipos bsicosprimitivosynumricoocualquiertipodeobjetodeJavaparaquelaaplicacintengaaccesoaun convertidorapropiado.Porejemplo,unapropiedadpuedeserdetipofecha,silaaplicacintieneaccesoa unconvertidorquepuedeconvertireltipodefechaenunacadenayviceversa. Cuandounapropiedadseuneaunainstanciadelcomponente,eltipodelapropiedaddebeserelmismo queelobjetodecomponentes.Porejemplo,siunUISelectBooleanestligadoalapropiedad,la propiedaddebeaceptarydevolverunobjetoUISelectBoolean. Delmismomodo,silapropiedadestenlazadoaunconvertidor,validador,oeloyenteejemplo,la propiedaddebeserdelconvertidorcaso,validador,oeloyentetipo. 3.7.2
ConfiguracindeunBean
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina20/70
3.8 UsandoelELunificadaparareferenciarBackedbeans
Paraobligaralosvaloresdelainterfazdeusuariodeloscomponentesypropiedadesdelosobjetosal apoyodebeanoderespaldoparahacerreferenciaalosmtodosdebeandeetiquetasdecomponentesde interfazdeusuario,losautoresdepginasutilizarellenguajedeexpresinunificada(EL)sintaxis definidaporJSP2.1. Lassiguientessonalgunasdelascaractersticasqueofreceestelenguaje: Evaluacindiferidadelasexpresiones Lacapacidaddeusarunaexpresindevalortantoparaleeryescribirdatos Expresindemtodos Estascaractersticassonespecialmenteimportantesparaapoyarelmodelodeinterfazdeusuario sofisticadocomponentequeofrecelatecnologaJavaServerFaces. EvaluacindiferidadelasexpresionesesimportanteporqueelciclodevidadeJavaServerFacesest divididoenfasesdistintas,demaneraqueelmanejodeeventosdecomponentes,laconversindedatosy validacin,ylapropagacindedatosalosobjetosexternos,serealizanenformaordenada.Laaplicacin debesercapazderetrasarlaevaluacindelasexpresiones,hastalafaseapropiadadelciclodevidase haalcanzado.Porlotanto,suetiquetadeatributossiempreutilizalasintaxisdelaevaluacindiferida, quesedistingueporeldelimitador#().ElCiclodeVidadeunapginaJavaServerFacesdescribeelciclo devidaendetalle. Conelfindealmacenardatosenlosobjetosexternos,casitodoslosatributosdeetiquetasJavaServer Facesutilizarexpresionesdevalorvalor,quesonexpresionesquepermitentantoobteneryestablecer datossobrelosobjetosexternos. Porltimo,algunosatributosdeetiquetadecomponentedeaceptarexpresionesmtodoquelosmtodos dereferenciaparacontrolarloseventosdecomponentes,ovalidaroconvertirlosdatosdelos componentes. ParailustrarunaetiquetadeJavaServerFacesusandoelELunificado,supongamosqueunaetiqueta deunasolicituddereferenciaaunmtodopararealizarlavalidacindeentradadeusuario:
<h:inputText id="userNo" value="#{UserNumberBean.userNumber}" validator="#{UserNumberBean.validate}" />
www.detodoprogramacion.com
CursodeJSP
Pagina21/70
Otrousodelasexpresionesdevalorvinculanteesunainstanciadelcomponenteaunapropiedadde backedbean.Unautordelapginahacereferenciaalapropiedaddelatributo:
<inputText binding="#{UserNumberBean.userNoComponent}" />
ElCiclodeVidadeunapginaJavaServerFaces
ElciclodevidadeunapginaJavaServerFacesesalgosimilaraladeunapginaJSP:Elclienterealiza unasolicitudHTTPdelapginayelservidorrespondeconlapginatraducidaaHTML.Sinembargo,el ciclodevidadeJavaServerFacesdifieredelciclodevidadeJSPenquesedivideenvariasfasespara apoyarelmodelodeinterfazdeusuariosofisticadocomponente.Estemodelorequierequeloselementos deserconvertidosyvalidados,eventosdeloscomponentessemanipulan,ylosdatosdeloscomponentes sepropagaalasjudasenunamaneraordenada. UnapginadeJavaServerFacesestambindiferentedeunapginaJSPenlaqueesrepresentadopor unrboldecomponentesdeinterfazdeusuario,denominadopuntodevista.Duranteelciclodevida,la implementacinJavaServerFacesdebeconstruirelpuntodevistaalconsiderarelestadoguardadode unapresentacinanteriordelapgina.Cuandoelclienteenvaunapgina,laimplementacin JavaServerFacesrealizavariastareas,talescomolavalidacindelaentradadedatosdelos componentesdelavistaylaconversindelosdatosdeentradaalostiposespecificadosenelladodel servidor. LaimplementacindeJavaServerFacesrealizatodasestastareascomounaseriedepasosenla solicituddeJavaServerFacesciclodevidaderespuesta.
www.detodoprogramacion.com
CursodeJSP
Pagina22/70
unapginaquefuepreviamentecargadoenelnavegadorcomoresultadodelaejecucindeunasolicitud inicial. Cuandoelciclodevidaseencargadelapeticininicial,sloseejecutalarestauracindevistayhacer quelasfasesderespuesta,porquenohayningunaentradadelusuariooaccionesparaelproceso.Porel contrario,cuandoelciclodevidamanejaunadevolucindedatos,ejecutatodaslasfases. Normalmente,laprimerasolicitudparaunapginaJavaServerFacestratadeuncliente,como resultadodehacerclicenunhipervnculoenunapginaHTMLqueenlazaconlapginadeJavaServer Faces. ParahacerunarespuestaqueesotrapginaJavaServerFaces,laaplicacincreaunanuevavisinyla almacenaenlainstanciaFacesContext,querepresentaatodalainformacincontextualasociadaconel procesamientodeunasolicitudentranteycrearunarespuesta.Laaplicacinseadquierereferenciasa objetosquenecesitalaopininysolicitaFacesContext.renderResponse,queobligaalaprestacin inmediatadelaopinindepasarporlarespuestaalafasedeprocesamientodelciclodevida,como indicanlasflechasetiquetadosRenderderespuestaeneldiagrama. Aveces,unaaplicacinpodranecesidaddereorientarlosrecursosadiferentesaplicacionesweb,como unservicioweb,ogenerarunarespuestaquenocontienecomponentesJavaServerFaces.Enestas situaciones,eldesarrolladordebesaltarselafasederenderizado(RenderFasederespuesta)llamando FacesContext.responseComplete.Estasituacintambinsemuestraeneldiagrama,estavezconlas flechasdelaetiquetarespuestacompleta. LapropiedaddelacurrentPhaseIDFacesContext,querepresentalafasequeseencuentra,debeser actualizadatanprontocomoseaposibleporlaaplicacin. LasituacinmscomnesqueuncomponenteJavaServerFacespresentaunasolicituddelapginade otroJavaServerFaces.Enestecaso,laimplementacinJavaServerFacesmanejalasolicitudy automticamentepasaatravsdelasfasesdelciclodevidapararealizarcualquierconversin necesaria,validacionesyactualizacindelosmodelos,yparagenerarlarespuesta. Losdetallesdelciclodevidaseexplicaenestaseccinestndestinadosprincipalmentepara desarrolladoresquenecesitanconocerdichainformacincomocuandovalidaciones,conversiones,ylos eventossongeneralmentetramitadasyloquepuedenhacerparacambiarcmoycundoselesda.Los autoresdepginasnotienenporquconocerlosdetallesdelciclodevida. 3.8.2
Fasederestauracindevista
CuandounasolicituddeunapginaJavaServerFacessehace,comocuandounenlaceounbotnse presiona,laimplementacinJavaServerFacescomienzalafasederestauracindevista. Duranteestafase,laimplementacinJavaServerFacesconstruyeelpuntodevistadelapgina,cables controladoresdeeventosylosvalidadoresdeloscomponentesenlavista,yguardalavistaenelejemplo FacesContext,quecontienetodalainformacinnecesariaparaprocesarunasolicitudnica.Todaslas etiquetasdecomponentesdelaaplicacin,loscontroladoresdeeventos,convertidoresyvalidadoresde teneraccesoalainstanciadeFacesContext. Silasolicituddelapginaesunasolicitudinicial,laimplementacinJavaServerFacescreaunavisin devacoenestaetapaylosavancesdelciclodevidaparahacerlafasederespuesta,duranteelcualla opinindevacosellenaconloscomponentesdereferenciadelasetiquetasenlapgina.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina23/70
Fasedeaplicacindevalores
Despusdequeelrboldecomponentesqueserestablezca,cadacomponenteenelrboldelosextractos desunuevovalordelosparmetrosdelapeticinmedianteelusodesudecodificar(processDecodes()) mtodo.Elvalorsealmacenalocalmenteenelcomponente.Silaconversindelvalordefalla,un mensajedeerrorqueestasociadoconelcomponentesegenerayenlacolaenFacesContext.Este mensajesemostrardurantelafasededarrespuesta,juntoconloserroresdevalidacinresultantede lafasedevalidacindelproceso. SilosmtodosdescifrarodetectoresdeeventosllamadorenderResponseFacesContextenlainstancia actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta. Silosacontecimientossehancoladuranteestafase,lasemisionesdeaplicacinJavaServerFaceslos acontecimientosalosoyentesinteresados. Sialgunoscomponentesdelapginatienensusatributosdeinmediatoestableceentrue,entoncesla validacin,laconversin,yloseventosrelacionadosconestoscomponentesserntratadosduranteesta fase. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara FacesContext.responseComplete. Alfinaldeestafase,loscomponentessefijanasusnuevosvalores,ylosmensajesyeventossehan puestoencola. Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras decontextoyelmtododetransformacinparcialesaplicado. 3.8.4
Fasedevalidacionesdeproceso
Duranteestafase,laimplementacinJavaServerFacesprocesatodoslosvalidadoresregistradasenlos componentesenelrbol,mediantesuvalidacin((processValidators))mtodo.Seexaminael componentedeatributosqueespecificanlasnormasparalavalidacinycomparaestasnormasparael valorlocalalmacenadoparaelcomponente. Sielvalorlocalnoesvlido,laimplementacinJavaServerFacesaadeunmensajedeerrorala instanciaFacesContext,yelciclodevidaavanzadirectamentealafasededarrespuestaparaquela pginaserepresentaconelmensajedeerror.Sihuboerroresdeconversindelasolicituddeaplicarlos valoresdefase,losmensajesdeestoserrorestambinsemuestran. SialgunavalidarmtodosodetectoresdeeventosllamadorenderResponseenelFacesContextactual,la implementacinJavaServerFacessaltaalafasededarrespuesta. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara FacesContext.responseComplete.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina24/70
Fasedeactualizacindevaloresdemodelo
DespusdelaimplementacinJavaServerFacesdeterminaquelosdatossonvlidos,sepuederecorrer elrboldecomponentesyestablecerelservidorcorrespondientedelaspropiedadesdelobjetodeladoa losvaloreslocalesdeloscomponentes.LaimplementacindeJavaServerFacesactualizarslolas propiedadesjudasapuntadoporuncomponentedevalordeatributodeentrada.Silosdatoslocalesno puedenserconvertidosalostiposespecificadosporlaspropiedadesjudas,elciclodevidaavanza directamentealafasededarrespuestaparaquelapginaesreemitidaconerroresmostrados.Estoes similaraloquesucedeconloserroresdevalidacin. SilosmtodosupdateModelsocualquieroyentesllamadorenderResponseFacesContextenlainstancia actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara FacesContext.responseComplete. Silosacontecimientossehancoladuranteestafase,laimplementacinJavaServerFacesemisionesa oyentesinteresados. Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras decontextoyelmtododetransformacinparcialesaplicado.Procesamientoparcialestcubiertoen JavaEE6Tutorial,VolumenII:Temasavanzados. 3.8.6
Fasedeinvocacindelaaplicacin
Duranteestafase,laimplementacinJavaServerFacesmanejacualquiersolicituddeeventosdenivel, talescomolapresentacindeunformularioounvnculoaotrapgina. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara FacesContext.responseComplete. Siseprocesaelpuntodevistafuereconstruidoapartirdeinformacindeestadodeunasolicitud anteriorysiuncomponentehadisparadounevento,estoseventossetransmitenalosoyentes interesados. Porltimo,lastransferenciasdeJavaServerFacesaplicacindecontrolparahacerquelafasede respuesta. 3.8.7
Fasedecreacindelarespuesta
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina25/70
Sisetratadeunasolicitudinicial,loscomponentesqueestnrepresentadosenlapginaseagregaal rboldecomponentes.Siestonoesunasolicitudinicial,loscomponentesseaadenyaalrbolparaque nosenecesitaaadirms. Silasolicitudesunadevolucindedatosyloserroresfueronencontradosdurantelafasedesolicitudde aplicarlosvalores,lasvalidacionesdeprocesodefase,ofasedeactualizacindelosvaloresdelmodelo, lapginaoriginalserepresentaenestafase.Silaspginascontienenmensajesolosmensajesdelas etiquetas,losmensajesdeerrorenlacolasemuestranenlapgina. Despusdequeelcontenidodelavistaserepresenta,elestadodelarespuestaseguardaparaquelas solicitudesposterioressepuedeaccederal.Elestadoguardadoseestadisposicindelafasede restauracindevista.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina26/70
4 ExpresionesEL
4.1 InformacingeneralsobreEL
Ellenguajedeexpresinunificadapermitealosautoresdepginasutilizarexpresionessencillaspara accederalosdatosdeformadinmicaapartirdecomponentesJavaBeans. LatecnologaJavaServerFacesutilizaELparalassiguientesfunciones: Evaluacindiferidaeinmediatadelasexpresiones Lacapacidaddeestablecer,ascomoobtenerdatos Lacapacidaddeinvocarlosmtodos Enresumen,ellenguajedeexpresinunificadaproporcionaunamaneradeutilizarexpresionessencillas parallevaracabolassiguientestareas: LeerdemaneradinmicalosdatosdeaplicacionesalmacenadosenJavaBeans,diversas estructurasdedatos,yobjetosimplcita Escribirdemaneradinmicalosdatos,talescomolaentradadelusuarioenlosformularios,alos componentesdeJavaBeans Invocacindemtodosarbitrariosestticaypblica Realizaroperacionesaritmticasdemaneradinmica
Evaluacininmediataydiferida 4.2
ELapoyalaevaluacin,tantoinmediatosydiferidosdelasexpresiones.Laevaluacininmediatase entiendequelaexpresinseevalayelresultadoesdevueltoinmediatamentecuandolapginase representaporprimeravez.Evaluacindiferidasignificaquelatecnologaqueutilizaellenguajede expresionespuedenemplearsupropiomecanismoparaevaluarlaexpresinenalgnmomentoms tarde,duranteelciclodevidadelapgina,ocuandoseaapropiadohacerlo. Esasexpresionesqueseevalandeinmediatoelusode${}sintaxis.Expresionescuyaevaluacinsehace demaneradiferidautilizarel#{}sintaxis. Debidoasuciclodevidadevariasfases,latecnologaJavaServerFacesusaprincipalmenteexpresiones deevaluacindiferida.Duranteelciclodevida,loseventosdecomponentessemanejan,losdatosson validados,yotrastareasqueserealizanenunordendeterminado.Porlotanto,unaaplicacin JavaServerFacesdebediferirlaevaluacindelasexpresiones,hastaelpuntoapropiadoenelciclode vida. 4.2.1
EvaluacinInmediata
LaimplementacindeJavaServerFacesevalalaexpresin,${sessionScope.cart.total},loconviertey pasaelvalordevueltoalcontroladordeetiqueta.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina27/70
Evaluacindiferida
Paraqueunasolicitudinicialdelapginaquecontieneunaetiqueta,laimplementacinJavaServer Facesevalalaexpresin#{customer.name}durantelafasedeRebderresponsedelciclodevida.Durante estafase,laexpresinslotieneaccesoalvalordelnombredelcliente,comosehaceenlaevaluacin inmediata. Paraunasolicituddedevolucindedatos,laimplementacinJavaServerFacesevalalaexpresinen lasdiferentesfasesdelciclodevida,durantelacualelvalorserecuperadelasolicitud,validados,y reproducidasenelbeandelcliente. Comosemuestraenesteejemplo,lasexpresionesdeevaluacindiferidapuedenserexpresionesdevalor quesepuedeutilizarparaleeryescribirdatos.Tambinpuedenserexpresionesmtodo.Expresionesde valor(tantoinmediatoscomodiferidos)ylasexpresionesmtodoseexplicaenlasiguienteseccin.
4.3 Valoryelmtododeexpresiones
LaELsedefinendostiposdeexpresiones:expresionesdevaloryexpresionesmtodo.Expresionesde valorpuedeproducirunvaloroestablecerunvalor.Expresionesmtodosllamaametodosquepueden serinvocadoypuededevolverunvalor.
4.4 Operadores
Ademsdel.y[],ellenguajedeexpresinunificadoproporcionalossiguientesoperadores,quepueden serutilizadosenexpresionesrvalueslo: Aritmtica:+,(binario),*,/ydiv,%yelmod,(unario) Lgicos:AND,&&,o,||,not,! Relacionales:==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le.Sepuedenhacercomparacionesconotros valores,ocontraBoolean,String,enterooflotante. Vaco:Eloperadordevacoesunaoperacindeprefijoquepuedeusarseparadeterminarsiun valoresnuloovaco. Condicional:A?B:C.EvaluarBoC,dependiendodelresultadodelaevaluacindeA. Laprecedenciadelosoperadoresdemayoramenor,deizquierdaaderechaescomosigue: []. ()(Utilizadoparacambiarlaprioridaddelosoperadores) (Unario)not!empty
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina28/70
4.5 Palabrasreservadas
Laspalabrassiguientesestnreservadasparaellenguajedeexpresinunificadaynodebeutilizarse comoidentificadores. and ne ge instanceof or lt true empty not gt false div eq le null mod
4.6 EjemplosdeusodeEL
Ejemplo #(myBean.value) Descripcin Devuelveelvalordelapropiedaddelobjetoalmacenadoenlaclavede myBean,oelelementoalmacenadoenelvalordelaclave,simyBeanesde tipoMap #(myBean['value']) Igualque"myBean.value(#)". #(myArrayList[5]) Devuelveelquintoelementodeunalistaquesealmacenaenlaclavede myArrayList. #(myMap['foo']) Devuelveelobjetoalmacenadoenlaclavefoodelmapaalmacenadoen myMap. #(myMap[foo.bar]) Devuelveelobjetoalmacenadoenlaclavequeesigualalvalordela expresinfoo.bardelmapaalmacenadoenmyMap. #(myMap['foo'].valor) Devuelveelvalordelapropiedaddelosobjetosalmacenadosenlaclavede foodemyMap. #(myMap['foo'].valor[5]) Devuelveelquintoelementodelalistaomatrizalmacenadaenlaclavede myMapclave. #()miCadena DevuelvelacadenadeobjetosalmacenadosenelmarcodelmiCadena clave. #()myInteger DevuelveelenteroobjetoalmacenadoenelmarcodelmyIntegerclave. #(user.role=='normal') Devuelvetruesielpapeldelapropiedaddelobjetoalmacenadoenlaclave deelusuarioesigualalanormalidad.Devuelvefalseencasocontrario. #((user.balance200) Sielvalordelapropiedaddeequilibriodelobjetoalmacenadoenelmarco delclavedeusuariomenos200igualacero,devuelvetrue.Devoluciones OTHfalsos Hola#()user.name! Devuelvelacadena"Hola",seguidadelnombredelapropiedaddelobjeto almacenadosenlaclavedeusuario.Asquesielnombredelusuarioes Sean,esto"retornoHolaSean!" Ests#((user.balance> Devuelvelacadena"Ustedestcargado"silapropiedaddeequilibriodela 100)?"cargado":"no objetoalmacenadoenlaclavedeusuarioesmayorde100;devuelve"Usted cargado') nosecargan"deotramanera. #()myBean.methodName Devuelveelmtodollamadomtododelobjetoalmacenadoenelmarcodel myBeanclave. #(20+3) Devuelve23.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina29/70
5 JSTLLibrerasestndarTaglib
5.1 Introduccin
ExistenvariaslibrerasTaglibdisponibleparaJSPyJSF. FuntionalArea Core XMLprocessing I18Ncapableformatting Databaseaccess(SQL) Functions URI http://java.sun.com/jsp/jstl/core http://java.sun.com/jsp/jstl/xml http://java.sun.com/jsp/jstl/fmt http://java.sun.com/jsp/jstl/sql http://java.sun.com/jsp/jstl/functions Prefix c x fmt sql fn Example <c:tagname ...> <x:tagname ...> <fmt:tagname ...> <sql:tagname ...> fn:functionName(...)
5.2 Core
ELseutilizaenlabibliotecadeetiquetasCore.Laetiquetadelosproductos<c:out>evaluacindela expresinELparaelJspWriteractual.EstoessimilarenfuncionalidadaJSP<%=exp%>.La utilizacinsehaceas: <c:outvalue="${customer.name}"default="N/A"/> Tambinesposibleestableceryeliminarlasvariablesdembito.Elmbitodeaplicacin predeterminadoqueseutilizaeslapgina.Porejemplo,podemosdefinirunavariablellamadaalmbito deaplicacindelclientemedianteelusode<c:set var="customer" value=${customer}" />yluegousar <c:remove var="customer" /> paraquitarlodembito. ConlaJSTLahorapodemosusarunaetiquetaparaatraparjava.lang.Throwable,porejemplo,<c:catch var="myError" />.Elusodeestaetiquetapermiteelmanejouniformedeerrorquesedeclareenuna pgina.EstaetiquetanosepretendesustituirelactualmecanismodeerrordepginaJSP.Medianteel usodelaetiqueta <c:catch>esposibletenerbuencontroldeerroresdegrano,loquepermitequelos erroressemanejanporlapginaenlugardeiralapginadeerrornotodosloserroresquesetira realmentenecesitaparairalapginadeerror.Alutilizarel<c:catch>etiqueta,esposibledisearmejor lasinteraccionesdelusuario,porqueelflujodelapginaesmsfcildeusar.
5.3 Iteracin
Laetiquetadeiteracinbsicaes<forEach>,queiterasobrelamayoradelascoleccionesyobjetos similares,unopensaraquepararecorrereniteracin.<forTokens>lepermiteiterarsobrefichasenun objetoString,quelepermiteespecificarlacadenaylosdelimitadores. ProbablementelascaractersticasmstilesdelaJSTLsonlasaccionesdeiteracin.Lasaccionesque iteracionesdeapoyoson<c:forEach>,<c:forToken>,y<x:forEach>.TambinhayetiquetasXMLque imitanlasetiquetasbsicasparalasiteraciones.HablaremosdelaetiquetadeaccinXMLenun momento,peroporahora,vamosaseguirconlasaccionesfundamentales.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina30/70
5.4 AccionesdeURL
Ademsdelasaccionesderepeticin,labibliotecatambinofreceaccionesrelacionadasconURL.Esto incluyeapoyoparaloshipervnculos,lasimportacionesderecursos,yredireccionamientos.Usodela etiqueta<c:url>manejalareescrituradeURLylacodificacinautomtica.Sinosfijamosenelejemplo deunaURLconunparmetroyluegousarlaenunenlace,puedesercomoeste:
<c:url=http://mysite.com/register var="myUrl"> <c:param name="name" value="${param.name}"/> </c:url> <a href='<c:out value="${myUrl}"/>'>Register</a>
5.5 Condicionales
JSTLescompatibleconunacondicionalsimple<if>etiquetajuntoconunacoleccindeetiquetas <choose>,<when>,y<otherwise>queelapoyodeloscondicionalesmutuamenteexcluyentes.Estos ltimostresetiquetaspermitenaplicaruntpicoif/elseif/elseifestructuray/olosdems. Utilizandoellenguajedeexpresinenlasaccionescondicionaltambinpuedeserunmecanismo poderosoparasimplificarelcdigoJSP.Alutilizarel<c:if>etiqueta,esposibleconstruirexpresiones
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina31/70
condicionalessimples.Porejemplo,medianteelaccesoaunapropiedaddeobjetos,as:
<c:if test="${user.visitCount == 1}" Welcome back! </c:if>
5.6 FormatodetextoconcapacidadI18N
ElformatodedatosesunadelastareasclaveenmuchaspginasJSP.JSTLintroduceetiquetaspara apoyarelformatodedatosyanlisis.Estasetiquetassebasanenlamaquinariaconvenientepara soportaraplicacionesinternacionalizadas. OtraimportantereafuncionaldelaJSTLessuenfoqueinternacional(I18N)yelapoyodeformato.La utilizacindelasaccionesprevistasfacilitalainternacionalizacindeunasolicitudocontextobasede configuracin. EstasaccioneshacenusodelaResourceBundleJ2SEestndarseutilizaparamantenerlascadenasque estntraducidos.LasetiquetasJSTLutilizarelResourceBundleapropiado,dependiendodela configuracinregional.La<fmt:setLocale>etiquetapuedeserusadaparaespecificarunlugarcomoeste: <fmt:setLocalevalue="es_Es"/>,dondeelvaloresigualqueellenguajeyelcdigodepas.Tambines posiblespecificyunResourceBundle:<fmt:bundlebasename="ApplicationResource_fr"/>. Unavezquelaconfiguracinregionaloelpaqueteestestablecido,entonceslaetiqueta<fmt:message> usarautomticamenteelResourceBundlecorrecta.Paramtricodesustitucinsepuederealizarenlas cadenasdeestemodo:
<fmt:message key="welcome"> <fmt:param value="${visitCount}" /> <fmt:message/>
Tambinpuedeutilizar<fmt: solicitud.
requestEncoding />paraestablecerlacodificacindecaracteresdela
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina32/70
value="12.3" pattern=".00"/>seralasalida"12,30". <fmt:timeZone>, <fmt:setTimeZone>, y
Parademostrar:<fmt:formatNumber
Fechasyhorariossemanejanutilizandola<fmt:formatDate>,
<fmt:parseDate>.
5.7 Accesoabasesdedatos
LasbasesdedatosrelacionalesdefcilaccesomediantelasaccionesdeSQL.Ustedpuederealizar consultasdebasededatos,fcildeaccederalosresultados,realizaractualizaciones,yelgrupodevarias operacionesenunatransaccin. Medianteestasetiquetashaceposibleelestablecimientodefuentesdedatos,consultalafuentededatos, tienenfcilaccesoalosconjuntosderesultados,yrealizarlasactualizaciones,ascomolas transacciones.TodaslasetiquetasdeSQLactuanconunafuentededatos(datasource).Elorigende datospuederealizarseenvariasformas:sepuedeconfiguraratravsdelparmetrodeconfiguracin sql.datasource,puedeserunobjetoqueesproporcionadoporlalgicadelaaplicacin,opuedehaberun objetoproporcionadoporel<sql:setDataSource>accin.Porejemplo,siseutilizaunabasededatos MySQLconelcontroladorJDBC,puededefinirelorigendedatoscomo:
<sql:setDataSource var="datasource" driver="org.gjt.mm.mysql.driver" url="jdbc:mysql://localhost/db" />
Siponemosunamuestradetodojuntoparaejecutarunaconsultaydespusmostrarelresultado,que podraparecersea:
<sql:query var="customer" datasource="${datasource}" SELECT * FROM customers WHERE state = 'CO' ORDER BY city </sql:query> <table> <c:forEach var="row" items="${customers.row}"> <tr> <td><c:out value="${row.custName}" /></td> <td><c:out value="${row.address}" /></td> </tr> </c:forEach> </table>
www.detodoprogramacion.com
CursodeJSP
Pagina33/70
5.8 LamanipulacindeXML
LaltimaseriedeaccionesaconsiderareslasaccionesdeXML.LasaccionesdeXMLsepueden clasificarenbsico(core),controldeflujo,ytransformar.ElconjuntodeaccionesXMLenelJSTLse basaenXPath,queseutilizacomolenguajedeexpresinlocaldelasaccionesdeXML.Seleccioneel atributoseutilizaparaespecificarlaexpresinXPathparatodaslasaccionesdeXMLdeJSTL.Estaes unacadenaliteralqueseevalaelmotordeXPath. LasaccionesfundamentalesXMLsonsimilaresalasprevistasenlasaccionescore.Lasacciones incluyen<x:out>,<x:set>,y<x:parse>.LaprincipaldiferenciaentrelasetiquetasCoreylasetiquetas XMLesquelasetiquetasXMLapoyarlasexpresionesXPath,mientrasquelasetiquetasCoreno.La etiquetadeanalizarproporcionafuncionalidadparaanalizarundocumentoXMLenunaestructurade datos.EstaestructuradedatospuedenserprocesadosporelmotordeXPath.As,porejemplo,si tenemosunarchivoXMLqueidentificaaunlibro,sepuedeanalizar,yluegoaccederaesosdatos medianteunaexpresinXPatheimprimirlo:
<c:import url="http://oreilly.com/book?id=1234" var="xml"/> <x:parse source="${xml}" var="bookInfo"/> <x:out select="$bookInfo/title"/> <x:out select="$bookInfo/author"/>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina34/70
6 Formularios
6.1 Formulariosencillo
Paraponerenpracticaloanteriorvisto,vamosausarunformulariodeentradaalsitio. Lovamosaconstruirpocoapocoparallegaralcdigosiguiente: login.xhtml:
<h:head> <title>Entrada al sitio</title> <link rel="stylesheet" href="curso.css" /> <ui:include src="WEB-INF/include/head.xhtml"/> </h:head> <h:body> <ui:include src="WEB-INF/include/menu.xhtml"/> <h1><h:outputText value="Hello World!"/></h1> <h:graphicImage alt="GIF" url="/images/Duke_Blocks.gif" width="100px" /> <h:form> <h:panelGrid columns="3"> <h:outputText value="Usuario" /> <h:inputText id="username" value="#{Login.username}" required="true" validatorMessage="Minimo 2 caracteres!" requiredMessage="Value is required!" > <f:validateLength minimum="2" /> </h:inputText> <h:message for="username" styleClass="error"/> <h:outputText value="Clave" /> <h:inputText value="#{Login.password}" /> <h:commandButton value="Entrar" action="#{Login.submit}" actionListener="#{Login.onLogin}" /> </h:panelGrid> </h:form> </h:body>
curso.css:
Login.java:
package curso; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; @ManagedBean(name = "Login") @RequestScoped public class Login { private String username; private String password; public void onLogin(ActionEvent e) { if (!username.equalsIgnoreCase("dukes") && !username.equalsIgnoreCase("admin")) { throw new AbortProcessingException("Usuario invalido"); } // password=null; } public String submit() { String outcome = "none"; if (username.equalsIgnoreCase("dukes")) { outcome = "success"; } else { outcome = "admin"; }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
System.out.println(outcome); return outcome;
Pagina35/70
} public void setPassword(String password) { this.password = password; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public String getUsername() { return username; } }
facesconfig.xml:
<?xml version='1.0' encoding='UTF-8'?> <faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webfacesconfig_2_0.xsd"> <navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-outcome>admin</from-outcome> <to-view-id>/admin.xhtml </to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/index2.xhtml </to-view-id> </navigation-case> </navigation-rule> </faces-config>
Hayquecrearlaspginasindex2.xhtmlyadmin.xhtmltambien.
6.2 Formulariomascomplejo
Vamosacrearunformularioparaagregarunusuario,condiferentestiposdecamposenelformulario.
user_add.xhtml
<h:head> <title>Agregar un usuario</title> <link rel="stylesheet" href="curso.css" /> </h:head> <h:body> <h1>Agregar un usuario</h1> <h:form> <h:panelGrid columns="3" > <h:outputLabel value="Nombre:"/> <h:inputText id="nombre" value="#{Usuario.nombre}" size="20" maxlength="30" required="true" validatorMessage="Minimo 2 caracteres!" requiredMessage="El nombre no puede estar vacio" > <f:validateLength minimum="2" /> </h:inputText> <h:message for="nombre" styleClass="error"/>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina36/70
<h:outputLabel value="Apellido:"/> <h:inputText id="apellido" value="#{Usuario.apellido}" size="20" maxlength="30" required="true" validatorMessage="Minimo 2 caracteres!" requiredMessage="El apellido no puede estar vacio" > <f:validateLength minimum="2" /></h:inputText> <h:message for="apellido" styleClass="error"/> <h:panelGroup style="text-align:right;"><h:outputLabel value="Domicilio:"/></h:panelGroup> <h:inputTextarea id="add1" value="#{Usuario.add1}" cols="50" rows="3" ></h:inputTextarea> <f:verbatim /> <h:outputLabel value="Sexo:"/> <h:selectOneListbox title="Selecciona el sexo del usuario" value="#{Usuario.sexo}" size="1"> <f:selectItem itemValue="M" itemLabel="Masculino"/> <f:selectItem itemValue="F" itemLabel="Feminino"/> </h:selectOneListbox> <f:verbatim /> <h:outputLabel value="Cuantos herman@s"/> <h:inputText id="hermanos" value="#{Usuario.hermanos}" size="1" maxlength="2" required="true" validatorMessage="Valor aceptados: de 0 a 25." requiredMessage="Este campo no puede estar vacio" converterMessage="Se espera un numero entero aqui." > <f:validateLongRange minimum="0" maximum="25" /> </h:inputText> <h:message for="hermanos" styleClass="error"/> <h:outputLabel value="Salario"/> <h:inputText id="salario" value="#{Usuario.salario}" size="10" maxlength="12" required="true" validatorMessage="Valor aceptados: de 0 a 250000." requiredMessage="Este campo no puede estar vacio" converterMessage="Formato incorrecto." > <f:convertNumber maxFractionDigits="2" maxIntegerDigits="6" type="currency" currencySymbol="C$" locale="es" pattern=""/> <f:validateDoubleRange minimum="0" maximum="2500" /> </h:inputText> <h:message for="salario" styleClass="error"/> <h:panelGroup> <h:commandButton value="Agregar el usuario" action="#{Usuario.onSubmit}" ></h:commandButton> </h:panelGroup> </h:panelGrid> </h:form> </h:body>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina37/70
7 HtmlDataTable
UnDataTablemuestraunatablaHTML<table>. LascolumnasseespecificanconloscomponentessecundariosUIColumn. ElHtmlDataTabletienevariosparametros: ID:Seutilizaparaidentificarelcomponentedelatabla.Estedebesernicoenelcomponente mscercanodelospadres. Value:Representaelvalordelcomponente.Representaelvalorsobreelquelaiteracinsedebe hacer.Puedeserunamatrizocualquierobjetoiterador. Var:Esteeselnombredelavariablecreadaporlatabladedatosquerepresentaelelemento actualenelvalor.Esteatributopermiteexponerlosdatosenlasfilasdelatabla. Bgcolor:Esteatributoseutilizaparaestablecerelcolordefondodelatabla. Border:Sepuedeconfigurarelanchodelbordedelamesaalrededordelamesa. Cellpadding:Estoestableceelespacioentreelcontenidoylafronteradelaclula. Cellspacing:Seespecificalacantidaddeespacioparadejarentrelasclulas. First:Seutilizaparaespecificarelnmerodefiladelaprimerafiladelaquepresentamosesque seinicieenadelante.Supongamos,estapropiedadseestableceen3,quemuestraseiniciar desdelatercerafiladelosdatossubyacentes. Rows:Esteatributoespecificaelnmerodefilasamostrar.Viendoestesepondrenmarcha desdeelndiceespecificadoenla"primera"atributo.Siseestableceesteatributoacero,entonces todaslasfilasquesemostrarn. Width:Estoseutilizaparaestablecerelanchodetodalatabla.Suvalorseespecificaen%. Supongamosqueseestablecequeel50%,entoncesestatablasemuestraenelespaciodel50%de laanchuradelapantalla. Dir:Esteatributoindicaladireccindeltextoquesemostrarenlacelda.Senecesita"ltr"(de izquierdaaderecha)y"RTL"(dederechaaizquierda)valores.Sinoseespecificaesteatributoa continuacin,elcontenidosemostrarenelcentro. Frame:Esteatributoquespecifyesladosdelaestructuraentornoaestamesaservisible.Este atributopuedetomaralgunosvaloresquesemuestranacontinuacin: 1.noneNingunadelaspartes,Valorpredeterminado 2.topladosloporencimade 3.belowdeladoelfondoslo 4.hsidespartessuperioreinferiorslo 5.vsidesladosderechoeizquierdoslo 6.LHSladoizquierdoslo 7.RHSladoderechoslo 8.boxTodaslaspartescuadrodecuatro 9.borderTodaslaspartesfronteracuatro Rules:Esteatributoseutilizaparadibujarlneasentrelasclulas.Puedetomaralgunosvalores queseindicanacontinuacin: 1.none:Nohayreglasninguno,elvalorpordefecto 2.group:Entrelosgruposdelosgruposdefilas 3.rows:Entrelasfilasdelasfilasslo 4.cols:Entrecolumnasslo 5.all:Entretodaslastodaslasfilasycolumnas Summary:Puedeespecificarresumendelpropsitodelatabla. Rendered:Senecesitavalue.ThisbooleanIndicasiestecomponentedebeserprestado.Suvalor predeterminadoes"true".Siseestableceenfalseentoncesseimpidelaprestacindeeste componentealapgina.
Versin1.0 Reproduccinprohibida
CopyrightCdricSimon,2009
www.detodoprogramacion.com
CursodeJSP
Pagina38/70
CaptionClass:listaseparadaporespaciosdelaclaseoclasesCSSqueseaplicaracualquier ttulogeneradoparaestatabla. CaptionStyle:EspecificaestiloCSSoestilosquedebenaplicarsecuandoserepresentaeste epgrafe. ColumnClasses:listaseparadaporcomasdelasclasesCSSqueseaplicaralascolumnasde estecuadro. FooterClass:EsteatributotienelistaseparadaporespaciosdeestiloCSSdelaclaseoclasesque seaplicaraaheadertergeneradoparaestatabla. HeaderClass:EsteatributotienelistaseparadaporespaciosdelaclasedeestiloCSSoclases queseaplicarseacualquierencabezadogeneradoparaestatabla. RowClasses:EsunalistadeclasesCSSaplicadosalasfilasdelasclasestable.Thesedebenestar separadasporcomas.SiqueremosaplicarlaclasedeCSSparafilasindividuales,entonces podemosespecificarlistaseparadaporespaciosdeclasesCSS.Clasesdeestiloseaplicanalas filasenelmismoordenquesedefinidos.SitenemosdosclasesCSScontinuacindeprimera categoraseaplicaalaprimerafilaylasegundaseaplicaalasegunda.Entonces,denuevoenla tercerafila,elCSSseaplicaprimeroyassucesivamente.Esteprocesocontinahastalaltima filadelatabla. Lang:Estableceelidiomabasedelosatributosdeunelemento,esdecir,eltextoyellenguaje utilizadoenelmarcadogeneradoparaestecomponente. StyleClass:SeestableceelnombredelasclasesdeclassorCSSqueseaplicaenelmomentodela prestacindelelemento. Title:Elatributodelttuloseutilizaparaestablecereltextoparamostrarinformacinsobre herramientasparaelcomponent.Tooltipprestadosdescribeunelementocuandoserepresenta paraelcliente. Binding:Esunvalordelaexpresindeuninqueesutilizadoparaconectarcomponentesauna propiedadenunbeanderespaldo. OnClick:SeestableceelcdigoJavaScriptaejecutarcuandosehaceclicenlosbotonesdelratn sobreesteelemento. Ondblclick:SeestableceelcdigoJavaScriptqueseejecutacuandoelbotndelpunteroesdoble clicsobreesteelemento. Onkeydown:SeestableceelcdigoJavaScriptqueseejecutacuandosepresionaunateclahacia abajosobreesteelemento. Onkeypress:SeestableceelcdigoJavaScriptqueseejecutacuandosepulsaunateclay publicadosobreesteelemento. Onkeyup:SeestableceelcdigoJavaScriptqueseejecutacuandosesueltaunateclasobreeste elemento. Onmousedown:SeestableceelcdigoJavaScriptqueseejecutacuandoelbotnespulsadoel punterosobreesteelemento. Onmousemove:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnse muevedentrodeesteelemento. Onmouseout:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsealejade esteelemento. Onmouseover:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsemueve sobreesteelemento. Onmouseup:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsesuelta sobreesteelemento.
Ejemplo: user_details.xhtml
<h:head> <title>Detalles del usuario</title> <link rel="stylesheet" href="curso.css" /> </h:head> <h:body>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
<h1>Detalles del usuario</h1> <h:dataTable value="#{Usuario}" var="user" border="1" cellspacing="2"> <h:column> <f:facet name="header"> <h:outputText value="First Name"/> </f:facet> <h:outputText value="#{user.nombre}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Last Name"/> </f:facet> <h:outputText value="#{user.apellido}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Balance"/> </f:facet> <h:outputText value="#{user.salario}"> <f:convertNumber type="currency"/> </h:outputText> </h:column> </h:dataTable> </h:body> Usuario.java: package curso.beans; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; @ManagedBean(name="Usuario") @RequestScoped public class Usuario { private String nombre; private String apellido; private String sexo; private Date fecnac=new Date(); private String add1; private String pasatiempo; private Byte hermanos; private Double salario=1550.25564; private Integer testInt=12900; public Usuario() { }
Pagina39/70
public Usuario(String nombre, String apellido, String sexo, Date fecnac, String add1, String pasatiempo, Byte hermanos, Double salario) { this.nombre = nombre; this.apellido = apellido; this.sexo = sexo; this.fecnac = fecnac; this.add1 = add1; this.pasatiempo = pasatiempo; this.hermanos = hermanos; this.salario = salario; } public String onSubmit(){ return "success"; } public void validateCCExpiry(FacesContext cntx, UIComponent cmp, Object val) { System.out.println("Validando la entrada "+val); String messS = null; String[] fields = ((String) val).split("/", 3); if (fields.length != 2) { messS = "Se espera MM/AA!"; } else { int month = 0; int year = 0; try {
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
month = Integer.parseInt(fields[0]); year = Integer.parseInt(fields[1]); } catch (NumberFormatException e) { } if (month <= 0 || month > 12) { messS = "Mes " + fields[0] + " invalido!"; } else if (year < 0 || year > 99) { messS = "A&ntild:o " + fields[1] + " invalido!"; } else { GregorianCalendar cal = new GregorianCalendar(); int thisMonth = cal.get(Calendar.MONTH) + 1; int thisYear = cal.get(Calendar.YEAR) - 2000; if (year < thisYear || year == thisYear && month < thisMonth) { messS = "Tarjeta vencida!"; } }
Pagina40/70
} if (messS != null) { FacesMessage mess = new FacesMessage(messS); cntx.addMessage(cmp.getClientId(cntx), mess); } } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellido() { return apellido; } public void setApellido(String apellido) { this.apellido = apellido; } public String getSexo() { return sexo; } public void setSexo(String sexo) { this.sexo = sexo; } public Date getFecnac() { return fecnac; } public void setFecnac(Date fecnac) { this.fecnac = fecnac; } public String getAdd1() { return add1; } public void setAdd1(String add1) { this.add1 = add1; } public String getPasatiempo() { return pasatiempo; } public void setPasatiempo(String pasatiempo) { this.pasatiempo = pasatiempo; } public void setSalario(Double salario) { this.salario = salario; } public void setHermanos(Byte hermanos) { this.hermanos = hermanos; } public Double getSalario() { return salario; } public Byte getHermanos() { return hermanos; } public void setTestInt(Integer testInt) { this.testInt = testInt; } public Integer getTestInt() { return testInt; }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
} demo_table.xhtml <h:head> <title>Lista de usuarios</title> <link rel="stylesheet" href="curso.css" /> </h:head> <h:body> <h1>Lista de usuarios</h1> <h:dataTable value="#{DemoTable.data}" var="user" border="1" cellspacing="2" columnClasses="col1,col2,col1,col2" rowClasses="row1,row2" headerClass="header"> <h:column> <f:facet name="header"> <h:outputText value="Nombre"/> </f:facet> <h:outputText value="#{user.nombre}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Apellido"/> </f:facet> <h:outputText value="#{user.apellido}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Sexo"/> </f:facet> <h:outputText value="#{user.sexo}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Salario"/> </f:facet> <h:outputText value="#{user.salario}"> <f:convertNumber type="currency"/> </h:outputText> </h:column> </h:dataTable> </h:body> DemoTable.java package curso.beans; import import import import import java.util.ArrayList; java.util.Date; java.util.List; javax.faces.bean.ApplicationScoped; javax.faces.bean.ManagedBean;
Pagina41/70
@ManagedBean(name="DemoTable") @ApplicationScoped public class DemoTable { List<Usuario> data = new ArrayList(); public DemoTable() { populateData(); } public List getData(){ return data; } public void setData(Usuario a){ data.add(a); } public void populateData(){ data.add(new Usuario("Cedric","Simon","M",new Date(),"Managua","demo",(byte)2,2500.80)); data.add(new Usuario("Juan","Palmado","M",new Date(),"Managua","demo",(byte)2,25.08)); data.add(new Usuario("Melanie","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); data.add(new Usuario("Melanie2","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); data.add(new Usuario("Melanie3","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); data.add(new Usuario("Melanie4","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); } }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina42/70
8 Mensajedeerrorpersonalizados
8.1 Listademensajepersonalizados
Enfacescontext.xml:
<application> <resource-bundle> <base-name>curso.ApplicationMessages</base-name> <var>ErrMsg</var> </resource-bundle> </application>
Ensrc/curso/creararchivoApplicationMessages.properties:
test=Hola Mundo
Uso:#{ErrMsg.test} HolaMundo
8.2 Pginadeerrorpersonalizada:
error.xhtml :
<h:head> <title>Pagina de error</title> </h:head> <h:body> <h2>Un error fata ocurio!</h2> <a href="#{request.getContextPath()}/faces/login.xhtml">Favor prueba de nuevo.</a> <p><h:link outcome="success" value="Favor prueba de nuevo."></h:link></p> <p><h:link outcome="index" value="Favor prueba de nuevo."></h:link></p> </h:body>
Configurarenweb.xml:
<error-page> <location>/error.xhtml</location> </error-page>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina43/70
9 Convertidores
9.1 Quesunconvertidor?
Unconvertidorseutilizaparadarformato"agradable"aunobjeto,textoquesemostrar. Porejemplo,sideseaparamostrarunafechaenJSPsepuedeutilizarunconvertidordeformatodela fechaaunformatomascomnparaelusuario,como"10/03/2005". Perohayotraformadeusarunconvertidor.Silosutilizaencombinacinconuncontroldeentrada, laentradadelusuariodebeestarenelformatoespecificadoporelconvertidor.Sielformatodela entradanocoincideenelformato,puedelanzarunaexcepcinenelconvertidorquesemuestraal usuario.Elobjetoasociadonoseactualizahastaquesecorrigeelerror.
9.2 Usodelosconvertidores
ElconvertidorepuedeserfijadodentrodeJSP,oustedpuederegistrarelconvertidormediante programacin. UstedpuederegistrarunconvertidorconJSPenunadelastresmaneras: Especifiqueelidentificadordeconvertidorconlapropiedadconverterdentrodelaetiqueta.
<h:outputText value="#{myBean.date}" converter="myConverter">
Juntar<f:converter>dedentrodelaetiquetadelcomponente.
<h:outputText value="#{myBean.date}"> <f:converter converterId="myConverter"/> </ h: outputText>
Juntarlaetiquetapersonalizadadelconvertidordentrodeunaetiquetadelcomponente.
<h:outputText value="#{myBean.date}"> <laliluna:myConverter /> </ h: outputText>
LossiguientesJSFEtiquetasapoyaconvertidores.
<h:outputText> <h:outputFormat> <h:outputLink> <h:outputLabel> <h:inputText> <h:inputTextarea> <h:inputHidden> <h:inputSecret> <h:selectBooleanCheckbox> <h:selectManyListbox> <h:selectMaynyMenu> <h:selectOneRadio> <h:selectOneListbox> <h:selectOneMenu>
9.3 Convertidoresincluidos
Sinoseespecificaunconvertidor,JSFescogerunoparausted.Elmarcohaconvertidoresestndar paratodoslostiposbsicos:Long,byte,integer,short,Character,Double,Float,BigDecimal, BigIntegeryBoolean.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina44/70
ConvertidorDateTime
ElconvertidorDateTimeadmiteatributos,comoeltipoodatestyle,paraconfigurarelconvertidor.El listaacontinuacinmuestralosatributosquepuedeutilizarconelconvertidordeDateTime. Nombredelatributo datestyle Descripcin Especificaelestilodeformatoparalaporcindela fechadelacadena.Lasopcionesvlidas sondeshort,medium(pordefecto),longyfull.Slo esvlidosiseestableceeltipodeatributo. Especificaelestilodeformatoparalaporcinde tiempodelacadena.Lasopcionesvlidas sondeshort,medium(pordefecto),longyfull.Slo esvlidosiseestableceeltipodeatributo. Especificalazonahorariaparalafecha.Sinose establece,horadelmeridianodeGreenwich(GMT) seutilizar. Elidiomalocalautilizarparalavisualizacinde estafecha.Reemplazalalocalizacinactual Elmodelodeformatodefechautilizadopara convertirestafecha.Utiliceesteoel tipodepropiedad. Especificasisedebemostrarlafecha(date),hora (time)oambas(both).
timeStyle
timezone
locale pattern
type
9.3.2
ConvertidordeNmero
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina45/70
LalistaacontinuacinmuestraelatributoquesepuedeutilizarconelconvertidordeNmero.Estos atributospermitencontrolardemaneraprecisacmosemuestraunnmero. Nombredelatributo CurrencyCode Descripcin Especificaunperododetresdgitosdelcdigode monedainternacionalcuandoelatributotipoesla moneda.UtiliceesteoCurrencySymbol. Especificaunsmboloespecfico,como"$",quese utilizacuandoeltipodeatributoesmoneda. UtiliceesteoCurrencyCode. Truesiunsmbolodeagrupacin,como","o"" debeserutilizado.Elvalorpredeterminadoes true. Verdaderosislolaparteenteradelvalorde entradadebeserprocesado(todoslosdecimales serignorado).Elvalorpredeterminadoesfalso. Ellocalqueseutilizarparalavisualizacinde estenmero.Reemplazaelusuariolocalizacin actual Unacantidadmnimadedecimalesquesevea. Mximanmerodedecimalesquesevea. Unacantidadmnimadedgitosenterospara mostrar. Mximanmerodedgitosenterosparamostrar. Elmodelodeformatodecimalparaconvertireste nmero.Utiliceesteotipodeatributo. Eltipodenmero,porelnmero(number,por defecto),lamoneda(currency),oporciento (percent).Usaresteoelpatrndeesteatributo.
CurrencySymbol
groupingUsed
integerOnly
locale
converters.xhtml: <h:head> <title>Convertidores JSF</title> </h:head> <h:body> <h4>Convertidores</h4> <p> Mostrar slo la fecha y la datestyle es <i> short </i> </p> <h:outputText value="#{Usuario.fecnac}"> <f:convertDateTime type="date" dateStyle="short" /> </h:outputText> <p> Mostrar slo el tiempo y el timeStyle es <i> full </i> </p> <h:outputText value="#{Usuario.fecnac}"> <f:convertDateTime type="time" timeStyle="full" /> </h:outputText> <p> Pantalla de fecha y hora, la datestyle es <i> full </i> y la configuracin regional es <i> ru </i> </p> <h:outputText value="#{Usuario.fecnac}"> <f:convertDateTime type="both" dateStyle="full" locale="ru" /> </h:outputText> <p> Mostrar tanto, la fecha y la hora y el datestyle es <i> short </i> </p>
Ejemplo:
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
<h:outputText value="#{Usuario.fecnac}"> <f:convertDateTime type="both" dateStyle="short" /> </h:outputText> <p> Muestra una fecha con el patrn de <i> dd.mm.aaaa HH: mm </i> </p> <h:outputText value="#{Usuario.fecnac}"> HH:mm" pattern="dd.MM.yyyy <f:convertDateTime /> </h:outputText>
Pagina46/70
<h:form id="datetime1"> <p> entrada de una fecha y el datestyle es <i> short </i> </p> <h:inputText value="#{Usuario.fecnac}"> <f:convertDateTime type="date" dateStyle="short" /> </h:inputText> <h:commandButton value="Send" /> </h:form> <h:form id="datetime2"> <p> de entrada de una fecha que coincide con este patrn <i> dd.mm.aaaa </i> </p> <h:inputText value="#{Usuario.fecnac}"> <f:convertDateTime pattern="dd.MM.yyyy" /> </h:inputText> <h:commandButton value="Send" /> </h:form> <h4> convertidor Nmero </h4> <p> mxima de pantalla <i> 3 dgitos entero </i> </p> <h:outputText value="#{Usuario.testInt}"> <f:convertNumber maxIntegerDigits="3" /> </h:outputText> <p> Tipo de pantalla es <i> moneda </i> y la CurrencySymbol es <i> $ </i> </p> <h:outputText value="#{Usuario.testInt}"> <f:convertNumber type="currency" currencySymbol="$"/> </h:outputText> <p> Tipo de pantalla es <i> por ciento </i> </p> <h:outputText value="#{Usuario.testInt}"> <f:convertNumber type="percent"/> </h:outputText> Mostrar <p> mximo de 4 dgitos de fraccin </p> <h:outputText value="#{Usuario.salario}"> <f:convertNumber maxFractionDigits="4"/> </h:outputText> <p> Mostrar el nmero de patrones <i> # # # 0,00% </i> </p> <h:outputText value="#{Usuario.salario}"> <f:convertNumber pattern="###0.00%"/> </h:outputText> <h:form id="number1"> <p> entrada de un nmero, pero slo los dgitos entero ser procesado </p> <h:inputText value="#{Usuario.testInt}"> <f:convertNumber integerOnly="true"/> </h:inputText> <h:commandButton value="Send" /> </h:form> <h:form id="number2"> <p> entrada de un nmero coincida con el patrn <i> ##0,00 </i> </p> <h:inputText value="#{Usuario.testInt}"> <f:convertNumber pattern="##0,00"/> </h:inputText> <h:commandButton value="Send" /> </h:form> </h:body>
9.4 Convertidorespersonalizados
Aveces,losconvertidoresestndarnosonsuficientes.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina47/70
} // getAsString inserts into the object string spaces to make it readable // default: nnnn nnnn nnnn nnnn, Amex: nnnn nnnnnn nnnnn public String getAsString(FacesContext ctx, UIComponent cmp, Object val) throws ConverterException { String convVal = null; if (val != null) { int[] spaces = {3, 7, 11, 99}; int[] amex = {3, 9, 99}; String sVal = null; try { sVal = (String) val; // The val object should be a String! } catch (ClassCastException e) { throw new ConverterException("CCNumberConverter: Conversion Error"); } int kSpace = 0;
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
char[] chars = sVal.toCharArray(); if (chars.length == 15) { spaces = amex; } convVal = ""; for (int k = 0; k < chars.length; k++) { convVal += chars[k]; if (spaces[kSpace] == k) { convVal += ' '; kSpace++; } } System.out.println("CCNumberConverter.getAsString: '" + sVal + "' -> '" + convVal + "'"); } return convVal; } converters_perso.xhtml: <h:head> <title>Convertidor Personalizado</title> </h:head> <h:body> <h4>Convertidor Personalizado </h4> <h:form id="number2"> <p> entrada de un nmero de tarjeta</p> <h:inputText value="#{Usuario.pasatiempo}" converter="CCNumberConverter"> </h:inputText> <h:commandButton value="Send" /> </h:form> </h:body>
Pagina48/70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina49/70
10Validadores
10.1UsoyCreacindelosvalidadores
Cmogarantizarqueelusuariodelaaplicacinnopuedecompraunnmeronegativodelibros?En realidad,laaplicacintambindeberechazarcualquierintentodecompradecerolibros.Yquhayde comprobarlavalidezdeunnmerodetarjetadecrdito?Estassontareasparalosvalidadores. JSFcuentaconcuatrotiposdemecanismosdevalidacin: Integradaenloscomponentes Validacinaniveldeaplicacin Componentesdevalidacinpersonalizada ValidacinpormtodosdeBackedBeans
10.2Validadoresincluidos
JSFproporcionalossiguientestrescomponentesdevalidacin: F:validateDoubleRange:Sevalidaqueunaentradanumricaestdentrodeunrangodeterminado.Es aplicablesalosvaloresquesepuedenconvertiraundoble. f:validateLength:Sevalidaquelalongituddelacadenadeentradaestdentrodeunrango determinado. F:validateLongRange:Sevalidaqueunaentradanumricaestdentrodeunrangodeterminado.Es aplicablesalosvaloresquesepuedenconvertiraunlong. Parautilizarestoscomponentesdevalidacin,simplementeanidardentrodelah:inputquenecesita validacin.Porejemplo,paracomprobarqueslocantidadespositivassepuedenintroducir:
<h:inputText id="quantity" value="#{item.quantity}" size="2" required="true" requiredMessage="Cuantos? Ninguno?" converterMessage="Un entero por favor!" validatorMessage="Minimo uno!"> <f:validateLongRange minimum="1"/> </h:inputText>
10.3Validacinaniveldeaplicacin
Lavalidacinaniveldeaplicacintienesentidosiesnecesarioparavalidarlalgicadeaplicacin,a diferenciadelavalidacindelacorreccinformaldeloscamposindividuales.Porejemplo,antesde aceptarunpedido,legustaracomprobarquesubanconotieneenlalistanegraelnmerodetarjetade crdito. Sideseahaceralgunasolicituddevalidacinaniveldeaplicacin,puedeinsertarsulgicaal principiodelmtodollamadaporelformularioyhacerquelaactualizacindebasesdedatosyel resultadomtododependedelresultadodevalidacin.Encasodeerrordevalidacin,tambinpodra enviarunmensajeparaelusuario,comosemuestraenlaspocaslneassiguientes:
FacesContext ctxt = FacesContext.getCurrentInstance(); FacesMessage mess = new FacesMessage(); mess.setSeverity(FacesMessage.SEVERITY_ERROR); mess.setSummary("Este es el mensaje de error principal"); mess.setDetail("Este es el detalle"); ctxt.addMessage(null, mess);
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina50/70
Elmensajecreadodeestamaneraesunmensajeglobal,novinculadaaningncomponenteen particular,ysepuedevisualizarconelcomponenteJSFsiguiente:
<h:messages globalOnly="true" styleClass="error"/>
10.4Validadorespersonalizados
Enelcapitulosobrelosconvertidores,seexplicocmoimplementarunconvertidorpersonalizado.Para implementarunvalidadorpersonalizado,esunprocesocasiidntico: Crearunaaplicacindelainterfazquejavax.faces.validator.Validatoryreemplazaelmtodovalidar. Registrarelvalidadorenfacesconfig.xmlousalanotacinDocletenlaclase. DentrodelaaplicacindeJSF,consulteelatributovalidatordelcomponente. Supongamosquedeseaasegurarsedequeelcrdito,fechadecaducidaddetarjetaproporcionadaporel usuarioduranteelpedidoestenelformatomm/aoyquelatarjetanohacaducado.
package curso.validators; import javax.faces.validator.Validator; import javax.faces.context.FacesContext; import javax.faces.component.UIComponent; import javax.faces.application.FacesMessage; import javax.faces.validator.ValidatorException; import java.util.GregorianCalendar; import java.util.Calendar; import javax.faces.validator.FacesValidator; @FacesValidator("CCExpiryValidator") public class CCExpiryValidator implements Validator { public CCExpiryValidator() { } public void validate(FacesContext cntx, UIComponent cmp, Object val) { String messS = null; String[] fields = ((String) val).split("/", 3); if (fields.length != 2) { messS = "Se espera MM/AA!"; } else { int month = 0; int year = 0; try { month = Integer.parseInt(fields[0]); year = Integer.parseInt(fields[1]); } catch (NumberFormatException e) { } if (month <= 0 || month > 12) { messS = "Mes " + fields[0] + " invalido!"; } else if (year < 0 || year > 99) { messS = "A&ntild:o " + fields[1] + " invalido!"; } else { GregorianCalendar cal = new GregorianCalendar(); int thisMonth = cal.get(Calendar.MONTH) + 1; int thisYear = cal.get(Calendar.YEAR) - 2000; if (year < thisYear || year == thisYear && month < thisMonth) { messS = "Tarjeta vencida!"; } } } if (messS != null) { FacesMessage mess = new FacesMessage( FacesMessage.SEVERITY_ERROR, messS, messS); throw new ValidatorException(mess); } }
Pararegistrarelvalidador,esnecesarioagregarloafacesconfig.xmlousarlaanotacin@FacesValidator.
<validator> <validator-id>CCExpiryValidator</validator-id> <validator-class>curso.validators.CCExpiryValidator</validator-class> </validator>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina51/70
Uso:
<h:form> <h:inputText id="ccexpiry" value="#{Usuario.apellido}" rendered="true" requiredMessage="No puede estar vacio"> <f:validator validatorId="CCExpiryValidator" /> </h:inputText> <h:message for="ccexpiry" errorClass="error" /> <f:verbatim><br/></f:verbatim> <h:commandButton value="Probar"></h:commandButton>
</h:form>
10.5ValidadorenBackedBean
Enlugardecrearunanuevaclasecomosedescribeenlaseccinanterior,puedeagregarunmtodoaun backedbean. Enestecaso,puedeshacerlosiguiente: Copiarelmtododevalidacindentrodelaclase Copiadelasimportaciones SustituyalalneaquelanzalaValidatorExceptioncon:
if (messS != null) { FacesMessage mess = new FacesMessage(messS); cntx.addMessage(cmp.getClientId(cntx), mess); }
Ejemplo:
<h:inputText id="ccexpiry" value="#{Usuario.apellido}" rendered="true" requiredMessage="No puede estar vacio" validator="#{Usuario.validateCCExpiry}"> </h:inputText> <h:message for="ccexpiry" errorClass="error" />
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina52/70
11Componentespersonalizados
11.1CreacindecomponentespersonalizadosparaJSP
Lafuncionalidaddeuncomponentesecentraenlaconversindelosometidoporunusuario(esdecir,los parmetrosHTTPdelapeticin)avaloresdeloscomponentes(atravsdelmtododedecodificacin duranteApplyRequestValues)ylaconversindevaloresdeloscomponentesdevueltaaHTML(a travsdelmtododecodificarduranteRenderResponse). CuandosediseauncomponenteJSF,sepuedeoptarporcambiarlacodificacinydecodificacindeuna claseseparadadeprocesamiento.Laventajadeesteenfoqueesquesepuededesarrollarmsdeun procesadorparaelmismocomponente,cadaunoconunarepresentacindiferenteenHTML.Usteda continuacin,tienenelmismocomportamientoasociadoscondiferentesmanerasdeleerlosdatosdela solicituddeylaescrituraalarespuesta. Engeneral,teniendoencuentaqueJSFesdecdigoabierto,podraconsiderarlamodificacindeun componenteexistenteenlugardedesarrollarunnuevo,oquizs,graciasalaseparacindelos componentesylosrenderer,lamodificacindeunrendererexistentes. LaclaserazdetodosloscomponentesJSFeslaclaseabstractajavax.faces.component.UIComponent,y delaclaserazdetodoslosrenderersesjavax.faces.render.Renderer.Paradesarrollaruncomponente, sinembargo,ustedprobablementevaapreferirampliaruncomponenteyaexistenteo,porloporlo menos,laclaseUIComponentBase,queproporcionaimplementacionespordefectodetodoslosabstractos losmtodosdeUIComponent.Deestaforma,ustedslotienequedesarrollarcdigoparalosmtodos quesenecesidaddereemplazar.Lomismoocurreconelprocesador. Paracompletarelpanoramadeloqueustednecesitahacerparatenersucomponentepersonalizado,es crearunaetiquetapersonalizadaparausarloconJSP.Laclaserazdetodaslasclasesdeetiqueta javax.faces.webapp.UIComponentELTag. Enresumen,paradesarrollaruncomponentepersonalizado,tienequeiratravsdelospasossiguientes, aunquenonecesariamenteenesteorden: CrearunaclasedecomponentesquelassubclasesUIComponentporlaampliacindeuna existentecomponente. Registrarelcomponenteenfacesconfig.xml. CrearunaclasedeprocesadorquesubclasaRendereryreemplazalosmtodosdecodificaciny descodificacin. Registrarelrenderirerenfacesconfig.xml. CrearunaetiquetapersonalizadaquesubclasaUIComponentELTag. CrearunTLDparalaetiquetapersonalizada. Unaltimapalabraacercadeloscomponentesylosrenderers:amenosqueustedrealmentepiensaque ustedvaalareutilizarelmismocomponenteparadiferentesaplicaciones,teharslavidamuchoms fcilsimantieneselrendererdentrodelcomponente. Enprimerlugar,vamosaverloquesedebehacercuandoestnseparados,yacontinuacinveremos cmomantenerlosjuntos. Lemostraremoscmodesarrollaruncomponentequecombinalafuncionalidaddelostrescomponentes estndarnecesariosparaaceptarlaentradadeunusuario:unaetiquetaqueexplicaloqueseespera,el
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina53/70
campodetextoparaaceptarlaentrada,yunmensajeparainformardeerroresdeentrada.Enotras palabras,vamosamuestracmoreemplazarelcdigodeJSFsiguientes:
<h:outputText value="Nombre de Contacto"/> <h:inputText id = "nombre" required = "true" value = "# {Usuario.nombre}" requiredMessage = "El valor es necesario!" /> <h:message for="name" styleClass="error"/>
conestecomponentepersonalizado:
<curso:inputEntry label="Nombre de Contacto" required = "true" value = "#{Usuario.nombre}" errorStyleClass ="error" requiredMessage = "El valor es necesario!" />
ElComponente
Elcomponenteesenrealidadlapartemsfcil.Vamosatravsdelosmtodosdeunoporuno. InputEntryComponenteslainicializacindeloscomponentes. Sunicatareaesregistrarconelcomponentedelacadenaqueidentificaelrenderer.Lanica propiedaddelcomponentesedefineenestearchivoeslaetiqueta(label).Estosedebeaqueesta ampliacinUIInput,queseencargadedefinirtodoloquetienequeverconelcampodeentrada. SeutilizaelmtodogetFamilyparaencontrartodoslosrenderersasociadosconestecomponente. Estamosplaneandocrearunsoloprocesador,perosiguesiendoapropiadaparadefinirunafamiliams bienqueheredandelafamiliadeUIInput,porquenosepodautilizarrenderizadoresUIInputcon InputEntryComponent. ElestadodelcomponenteconsisteenelestadodeUIInputmslapropiedaddelaetiqueta.Porlotanto, definirsuestadocomounarreglodedosobjetos.ElmetodoSaveStateformauna matrizylodevuelve,paraqueJSFpuedesalvarlo.ElmtodorestoreStaterecibeelEstado, lodescomprime,yloalmacenalocalmente.ObservecmolasoperacionesquetienenqueverconUIInput sonsiempredelegadas.
package curso.components; import javax.faces.component.FacesComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; @FacesComponent("curso.inputEntry") public class InputEntryComponent extends UIInput { private String label; public InputEntryComponent() { this.setRendererType("curso.inputEntry"); } public String getLabel() { return label; } public void setLabel(String label) {
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
this.label = label; } // Overridden methods public String getFamily() { return "curso.inputEntry"; } public void restoreState(FacesContext ctxt, Object state) { Object val[] = (Object[]) state; super.restoreState(ctxt, val[0]); label = (String) val[1]; } public Object saveState(FacesContext ctxt) { Object val[] = new Object[2]; val[0] = super.saveState(ctxt); val[1] = label; return ((Object) val); } }
Pagina54/70
11.1.2
Renderer
Elrendereresunpocomscomplicadoqueelcomponente.Paraimplementarlo,sedefineunaclaseque extiendejavax.faces.render.Renderer. Primerovamosasobreescribirtresmtodos,decode,encodeBegin,ygetConvertedValue. LanicapropiedadqueseagregaaUIInputeslaetiqueta,queelusuariopuedemodificar. Porlotanto,sloesnecesarioparadecodificarelcampodeentrada. ElprocesodedecodificacinocurreenlafasedeApplyRequestValues(fase2). Elprocesodecodificacinrequieremstrabajoqueelprocesodedecodificacin,porquetiene paraenviaralarespuestaHTTPlostrescomponentesquesecombinanparaformar InputEntryComponent.EstotienelugarduranteRenderResponse(fase9). Tenemosquecrearunmtodoparacodificarlaetiqueta.SeabreelelementoHTMLconlaetiqueta elmtododestartElement,escribelaetiquetaconunsimplemtododeescritura,escribeunasterisco, peroslosiserequiereelcomponente,ysecierraelelementodelaetiquetaconelmtodode endElement. Elresultadoesalgoascomo<label>Nombre
de contacto * </label>.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina55/70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
respWr.endElement("label"); } private void encodeInput(ResponseWriter respWr, InputEntryComponent cmp) throws IOException { FacesContext ctxt = FacesContext.getCurrentInstance(); respWr.startElement("input", cmp); respWr.writeAttribute("type", "text", "type"); respWr.writeAttribute("id", cmp.getClientId(ctxt), "id"); respWr.writeAttribute("name", cmp.getClientId(ctxt), "name"); if (cmp.getValue() != null) { respWr.writeAttribute("value", cmp.getValue().toString(), "value"); } respWr.endElement("input"); } private void encodeMessage(FacesContext ctxt, ResponseWriter respWr, InputEntryComponent cmp) throws IOException { Iterator it = ctxt.getMessages(cmp.getClientId(ctxt)); // Notice: an if instead of a while if (it.hasNext()) { FacesMessage mess = (FacesMessage) it.next(); if (!cmp.isValid()) { String errorStyleClass = (String) cmp.getAttributes().get("errorStyleClass"); respWr.startElement("span", cmp); respWr.writeAttribute("class", errorStyleClass, "class"); respWr.write(mess.getDetail()); respWr.endElement("span"); } } } }
Pagina56/70
Pararegistrarelrenderer,usaunaanotacin@FacesRendereroinsertalaslneassiguientesenfaces config.xml:
<render-kit> <renderer> <component-family>curso.inputEntry</component-family> <renderer-type>curso.inputEntry</renderer-type> <renderer-class>curso.renderers.InputEntryRenderer</renderer-class> </renderer> </render-kit>
11.1.3
Tag
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
// Setters public void setErrorStyleClass(ValueExpression errorStyleClass) { this.errorStyleClass = errorStyleClass; } public void setLabel(ValueExpression label) { this.label = label; } public void setRequired(ValueExpression required) { this.required = required; } public void setRequiredMessage(ValueExpression requiredMessage) { this.requiredMessage = requiredMessage; } public void setValue(ValueExpression value) { this.value = value; } // Overridden methods public String getComponentType() { return "curso.inputEntry"; } public String getRendererType() { return "curso.inputEntry"; } protected void setProperties(UIComponent cmp) { super.setProperties(cmp); if (errorStyleClass != null) { cmp.setValueExpression("errorStyleClass", errorStyleClass); } if (label != null) { cmp.setValueExpression("label", label); } if (required != null) { cmp.setValueExpression("required", required); } if (requiredMessage != null) { cmp.setValueExpression("requiredMessage", requiredMessage); } if (value != null) { cmp.setValueExpression("value", value); } } public void release() { super.release(); errorStyleClass = null; label = null; requiredMessage = null; value = null; required = null; }
Pagina57/70
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webjsptaglibrary_2_1.xsd"> <tlib-version>1.0</tlib-version> <short-name>curso</short-name> <uri>/WEB-INF/tlds/curso</uri> <tag> <display-name>inputEntry</display-name>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
<name>inputEntry</name> <tag-class>curso.tags.InputEntryTag</tag-class> <attribute> <name>id</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>value</name> <required>false</required> <deferred-value><type>java.lang.Object</type></deferred-value> </attribute> <attribute> <name>required</name> <required>false</required> <deferred-value><type>boolean</type></deferred-value> </attribute> <attribute> <name>label</name> <required>false</required> <deferred-value><type>java.lang.String</type></deferred-value> </attribute> <attribute> <name>errorStyleClass</name> <required>false</required> <deferred-value><type>java.lang.String</type></deferred-value> </attribute> <attribute> <name>requiredMessage</name> <required>false</required> <deferred-value><type>java.lang.String</type></deferred-value> </attribute> </tag> </taglib>
Pagina58/70
Conesto,ustedestarpreparadoparautilizarelnuevohJSFcomponentedeinterfazdeusuario: inputEntry.Sloesnecesarioagregarlasiguientedeclaracindeespaciodenombrescursoalajsp: elementorazeneliniciodeeldocumentoJSP:<%@taglib prefix="curso" uri="WEB-INF/tlds/curso.tld"%> Ladesventajadelnuevocomponenteencomparacincontenerdemaneraindependienteloslabel,input, ymessage,esquenoesposiblealinearloscamposdeentradavertical. Ahoraqueyaesthecho,ustedpuedepreguntar,"Porqucurso:inputEntrysloadmitenunatributo, mientrasqueh:inputTexttienecomo40?"Esoesunbuenpunto.Podramoshaberaadido msatributos,talescomoeltamaodelcampodeentrada,queh:inputTextpasaaHTML,peronuestro objetivoerasercapazdereemplazarconuncomponentenicodelostresloscamposenqueseutilicen. Msatributosdeloestrictamentenecesarioslogeneraramscdigosinaadirnadatil. 11.1.4
InlineRenderer
Esposibleincluirlafuncionalidadderendererdentrodelaclasedecomponentes,demodoqueel componenteserepresenta(render)porsmismo.Comohemosmencionadoantes,amenosqueusted planeautilizarmsdeunprocesadorconelmismocomponente,esposiblequenosevaamolestar creandorentderersseparados. Parahacercurso:inputEntryconautorepresentacin,tienequehacerlosiguiente: 1.MuevalosmtodosdeInputEntryRenderer.javaaInputEntryComponent.java.Usted necesidadhaceralgunoscambioscosmticosquevamosaexplicarenunmomento.Despuessepuede borrarelarchivoderenderer. 2.AgregueelmtodoencodeEndaInputEntryComponent.java. 3.ReturnnullenelmtododegetRendererTypedeInputEntryTag.java. 4.Eliminarelregistrodelprocesadordefacesconfig.xml.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina59/70
Luego,remplazatodosloscmpyieCmpconthis. SenecesitaelmtodoencodeEndparareemplazarelmtodoenUIComponentBase,quearrojaun NullPointerException.Dehecho,ustednonecesitahacernadaenencodeEnd,solamentetienesque escribirunmtododevaco:public void encodeEnd(FacesContext context) throws IOException { } Tengaencuentaqueslonecesitaestemtodocuandoseejecutauncomponenteensmismo,nocuando seutilizaunaclasedeprocesadorseparado. EnInputEntryTag.java,elmtododevuelvegetRendererType"curso.inputEntry".Sielmtodoconsiste enutilizarsusmtodosderepresentacininterna,getRendererTypetienequevolvernull.Porltimo, eliminarlaslneasdelelementoderenderkitdefacesconfig.xmlsiestnpresente.
11.2ComponentespersonalizadosparaFacelets
ConlosFaceletsesmassencillalacreacindecomponentespersonalizados. NohaynecesidaddecrearunaclaseJava,solonecesitamosarchivosXHTML(yXML). HayquecrearunequivalentealTLDparafacelets(.xml),ydeclararloenweb.xml Ejemplodeinclusinenweb.xml:
<context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/facelets/curso.xml</param-value> </context-param>
Ejemplodedescriptorcurso.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> <facelet-taglib> <namespace>http://localhost</namespace> <tag> <tag-name>pie</tag-name> <source>../include/footer.xhtml</source> </tag> </facelet-taglib>
Paginafooter.xhtml:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:body> <ui:component> <h:panelGroup styleClass="footer"> <h:outputText value="Docente: Cedric Simon - "/>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
<h:outputLink value="mailto:[email protected]">[email protected]</h:outputLink> </h:panelGroup>. </ui:component> </h:body> </html>
Pagina60/70
custom_component.xhtml:
<h:form> <curso:inputEntry label="Nombre de Contacto" required = "true" value = "#{Usuario.nombre}" errorStyleClass ="error" requiredMessage = "El valor es necesario!" /> <f:verbatim><br/></f:verbatim> <h:commandButton value="Probar" type="submit"></h:commandButton> </h:form>
box_doble.xhtml:
Usodebox_doble:
<curso:box_doble> <ui:define name="derecho">Derecho</ui:define> <ui:define name="izquierdo">Izquierdo</ui:define> </curso:box_doble>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina61/70
12Introduccin a Ajax
12.1Definicinyuso
Ajax significa Asynchronous Javascript and XML. Basicamente, la tecnologa Ajax permite comunicar con sistemas remotos y/o refrescar partes de una pgina si necesidad de recargar la pgina. Algunos ejemplos del uso de Ajax: Lista con seleccin automtica de valor. Aplicaciones de chat 'Drag and drop' Validaciones extensas de formulario Mens dinmicos Personalizacin de pgina ...
12.2Marcosdetrabajo
ExistenmuchosmarcosdetrabajoparaAjax.LamayorasonmarcosdetrabajoparaJavascript,que tienenunaparteorientadaaAjax. Losmarcosdetrabajotepermitenusarcdigos/efectosconJavascript/Ajaxsinnecesidaddeentender todoelcdigoquevaatrs. Muyprobablementeestarsinteresadoenvariosmarcosdetrabajo,ytrabajarasconvariosalmismo tiempo,yaqueposiblementeningunotienetodoloquequieres. Ademas,elobjetivodeestecursoesqueseascapazdedesarrollartupropiomarcodetrabajoademasde usarlosterceros. Algunosmarcosdetrabajo'libres': Rico(http://openrico.org/) Script.aculo.us(http://script.aculo.us/) Mootools(http://demos.mootools.net/) OAT(http://oat.openlinksw.com/) ZeroKonfig(http://www.zkoss.org/) ...
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina62/70
13AjaxconJava
13.1LlamadaAjaxconHTML
Coneljavascript'corriente',podemosmodificarlaformayelcontenidodeunapgina,perosin comunicarconfuentesexternas. Ajaxpermitecomunicarseconfuentesexternas,yaseaarchivosdetexto,pginasHTML,PHP,JSP, servlet,ocualquiertypodearchivoremoto. Parallamaraunapginaremotasinrefrescarlapginacorriente,hayquecrearunaconsultausando unafuncin,queesdiferentesiusasInternetExplorer(new ActiveXObject("Microsoft.XMLHTTP"))uotro navegadorcomoFirefox(new XMLHttpRequest( )). Unavezlaconsultalista,seusaelmetodo'open'delaconsultacon3parmetros:elmodode transmisin(generalmentegetopost)yelURLdelobjetoallamar.Opcionalsepuedemencionarsila llamadaesasncrona(pordefectoloes),yunusuarioyunaclaveparalacuenta. ApesardequeAjaxsignificaAsyncronousJavascriptandXML,esposiblehacerllamadassincrnicay usandotextoenvezdeXML. Unavezlallamadainiciada,seesperalarespuestausando'onreadystatechange'. Elestado'readyStatus'delallamadapuedetenerlosvaloressiguientes: 0Noiniciado 1Cargando 2Cargado 3Interactivo 4Completo Elestado'status'delallamadapuedetenerlosvaloressiguientes:
200 201 204 205 206 400 401 403 404 405 406 407 OK Created No Content Reset Content Partial Content Bad Request Unauthorized Forbidden Not Found Method Not Allowed Not Acceptable Proxy Authentication Required 408 411 413 414 415 500 501 502 503 504 505
Request Timeout Length Required Requested Entity Too Large Requested URL Too Long Unsupported Media Type Internal Server Error Not Implemented Bad Gateway Service Unavailable Gateway Timeout HTTP Version Not Supported
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
</head> <body> <button onclick="getText();">Clic aqui</button> <div id="texto"> Este es mi bloque de texto inicial </div> </body> </html> ajax_html.js: var req; function getText() { var url = "nuevo_texto.txt"; if (window.XMLHttpRequest) { req = new XMLHttpRequest( ); } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); } req.open("Get",url,true); req.onreadystatechange = callback; req.send(null); } function callback( ) { if (req.readyState==4) { if (req.status == 200) { document.getElementById('texto').innerHTML = req.responseText; } } }
Pagina63/70
nuevo_texto.txt:
<h2>Este es el texto desde el archivo en el servidor!</h2>
13.2LlamadaAjaxconJava
Ahorahemosllamadounapginadetexto'fijo'enelservidor.MuyfcilmentesepodrasacarelURL,o lalistadeURLdelabasededatos,porejemplo.PeroelAjaxpermitemstodava:permitellamaraun Servletopginajsp,ytraerelcontenidodelservlet. 13.2.1
ServletparaAjax
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina64/70
<h2> Solo pone el numero que se va a multiplicar por el numero al hazar</h2> <table align="left"> <tr> <td>Numero de paciente : <input type="text" id="no" name="no" size="5" onchange="if (check_only_digitsNoDot(this)) {buscaPaciente(this);}"> </td> </tr> </table> </body> </html>
ajax_java.js
var req; function buscaPaciente(campo ) { var url = "GetRandomNumber?no=" + escape(campo.value); if (window.XMLHttpRequest) { req = new XMLHttpRequest( ); } else if (window.ActiveXObject) { req = new ActiveXObject("Microsoft.XMLHTTP"); } req.open("Get",url,true); req.onreadystatechange = callback; req.send(null); } function callback( ) { if (req.readyState==4) { if (req.status == 200) { document.getElementById('empList').innerHTML = req.responseText; } } } function focusIn( ) { document.getElementById("no").focus( ); }
GetRandomNumber.java:
package curso.servlet; import import import import import import java.io.IOException; java.io.PrintWriter; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;
public class GetRandomNumber extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String no=request.getParameter("no"); double rand = Math.random(); String ajaxData ="El numero al hazar es "+rand+", multiplicado por "+no+" = "+ (rand*Integer.parseInt(no)); this.writeResponse(response, ajaxData); } finally { out.close(); } } public void writeResponse(HttpServletResponse resp, String output) throws IOException { resp.setContentType("text/plain"); resp.setHeader("Cache-Control", "no-cache"); resp.setHeader("Content", "text/html;charset=iso-8859-1"); resp.getWriter().write(output); }
web.xml:
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
... <servlet> <servlet-name>GetRandomNumber</servlet-name> <servlet-class>curso.servlet.GetRandomNumber</servlet-class> </servlet> <servlet-mapping> <servlet-name>GetRandomNumber</servlet-name> <url-pattern>/GetRandomNumber</url-pattern> </servlet-mapping>
Pagina65/70
13.3Ajaxyseguridad
ComoelAjaxpermite(enciertoscasos)hacerllamadasdirectasalabasededatosoarecursos'seguros', debentenerenmenteelaspectorelacionadoalaseguridadconAjax. ComolasllamadasAjaxsehacendesdeelnavegador,porunaconsultaHTML,esposiblerecuperarla sesindelusuarioyentoncesvalidarsieltieneaccesoaesterecurso(ono).
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina66/70
14ComponentesJSFparaAjax
14.1CmoJSFyAjaxpuedentrabajarjuntos?
Utilizarel(Ajax)JavaScriptensupginaJSF PonersucdigodeAjaxJavaScriptenloscomponentesJSF AprovecharlacrecientecoleccindemarcosdetrabajoAjaxJSF Utilizarelnuevotag<f:ajax>
14.2Utilizarel(Ajax)JavaScriptensupginaJSF
Elmsprctico/formafcildeinyectaralgodefuncionalidadWeb2.0ensuinterfazdeusuarioJSF, PuedesagregartuspropiosJS,oextenderlosmarcosdetrabajoAjaxexistentescomo: Dojo JQuery Prototype Scriptaculous OAT 14.2.1 14.2.2
Pros
Tcnicamentesencillo Fcilparacosassimples/pequeas
Contras
TrabajoconJavaScriptmsavanzadopuedeserunretoparalosprogramadoresJava(usted tienequepasarcdigo(javascript)alladodelcliente). Puedeserdifcildepurarlaaplicacin(busqueerrorestantoenelservidoryelcliente)
14.3PonersucdigodeAjaxJavaScriptenlos componentesJSF
MedianteelusodelatecnologaJSFdecomponentesesposibleescribirsuspropioscomponentesque generanelJavaScriptnecesarioenelcliente. EstoesfactibleporqueJSFpuedegenerarcualquiertipodetextoenelcliente
/ / Javascript Render personalizado para llamar a JSSlider.js writer.Write ( "<script language=\"JavaScript\" src=\"" contextPath + + "/js/JSSlider.js\"> </ script>");
14.3.1 14.3.2
Pros
Arquitecturaslida Usuariofinal/desarrolladordeaplicacioneslopuedeutilizarfcilmentesintratarconJS.
Contras
Puedeserunretoparaconstruirdesdeunpuntodevistatcnico(tienesqueserun/experto clienteAjax,ascomounServerside/expertoenJSF)
Versin1.0 Reproduccinprohibida
CopyrightCdricSimon,2009
www.detodoprogramacion.com
CursodeJSP
Pagina67/70
Difcilesdedepurareneldesarrollodecomponentes
14.4Aprovecharlacrecientecoleccindemarcosde trabajoAjaxJSF
AhorapuedendescargardiversasbibliotecasdecomponentesJSF Instalacinfcilyrpida SoporteIDEtambinestdisponibleparamuchos(Eclipse,NetBeans,Exadel,JDeveloper...) Algunosejemplos:JBossRichFaces(Ajax4JSF),ICEfaces,ADFFaces(Trinidad)RichClient 14.4.1 14.4.2
Pros
Aprendizajemsfcil NotienesquelidiarconlascomplejidadesdelJavaScript Puedenelegirentreunacrecientecoleccindelasbibliotecas
Contras
Sitodofunciona,excelente! Todavapuedeserdifcildedepurarenelcliente(estoesporqueelcdigodeclientese representadesdeelcliente,yustedtienepocooningncontrolsobreeste)
14.5Utilizarelnuevotag<f:ajax>
JSF2.0traeunanuevalibreraparaAjax. 14.5.1 14.5.2
Pros
IncluidaenJSF2.0 NotienesquelidiarconlascomplejidadesdelJavaScript
Contras
Existenlimitacionesalusodeh:outputTextconAjax Tecnologamuynueva(>menosfuentesparaaprendizajeautodidacto,depuracin),soloJSF2.0 Todavapuedeserdifcildedepurarenelcliente(estoesporqueelcdigodeclientese representadesdeelcliente,yustedtienepocooningncontrolsobreeste)
14.5.3
PorquelAjaxenJSF?
PorquunabibliotecadeJSFAjaxespecfico? HaytoneladasdelasbibliotecasAjaxya(jQuery,DWR,GWT,etc.)Porquinventarunanuevapara JSF? 14.5.3.1 VentajasdeunenfoqueespecficoJSFAjax JSFespecfico Delladodelcliente: UstedpuedeactualizarloselementosJSF(h:outputText,h:inputText,h:selectOneMenu,etc). UstednotienequeescribirJavaScript Delladodelservidor LosbackedbeansestndisponibleenlasllamadasAjax Ustednotienequeescribirservletsyanalizarparmetros
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
www.detodoprogramacion.com
CursodeJSP
Pagina68/70
14.5.4
Usodeltag<f:ajax>
Descripcingeneral:
<h:commandButton action=""> <f:ajax render="id1 id2" execute="id3 id4" event="blah" onevent="javaScriptHandler"/> </h:commandButton>
www.detodoprogramacion.com
CursodeJSP
Pagina69/70
Ejemplo:
<h:form prependId="false" id="form"> <h1>Ajax demo 1</h1> <h:commandButton action="#{AjaxDemo.onClick}" value="Agrega 10 a A"> <f:ajax render="id1" /> </h:commandButton> <br/> <h3>Valor de A: <h:outputText id="id1" value="#{AjaxDemo.a}" /> </h3> </h:form>
Idea IdolistaseparadaporespaciosdelasidentificacionesdeloselementosdeJSFcuyosvaloresseparados porespaciosdebenserdevueltosdesdeelservidorysesustituyeenDOM Detalles Haycuatrovaloresespeciales:@este@formulario,ninguno@[email protected],estossonms frecuentementeutilizadosparalaejecucindeatributosquelahacenatributo.Verseccindelexecute. Amenosqueutilice<h:formprependId="false"/>,elREALIDesFormID:elementId. 14.5.4.3 execute:Especificacindeloselementosaprocesarenservidor ResumendeCdigo
<f:ajax render="" execute="" />
Idea UnidentificadorolistadeidentificadoresJSFseparadaporespacioquedebeserenviadaalservidor parasuejecucin.Proejemplo,unh:inputText,queserprocesadonormalmente(setters,validacin, etc). Detalles Hay4valoresespeciales:@this@form,@none@all @this.Elelementoqueencierraf:ajax.Predeterminado. @form.Elh:formincluyendoaf:ajax.Muyconvenientesiustedtienevarioscamposparaenviar. @none.Nadadeloenviado.tilsielelementoquecambialosvaloresdehacercadavezquese evalen. @all.TodosloselementosdelainterfazdeusuarioJSFenlapgina. Ejemplo:
<h:form> <h:panelGrid columns="2"> Numero a multiplicar : <h:inputText id="a" size="5" value="#{AjaxDemo.a}"> </h:inputText> <h:commandButton action="#{AjaxDemo.execute}" value="Clic"> <f:ajax render="respuesta" execute="@form"></f:ajax> </h:commandButton> </h:panelGrid> <hr></hr> <h:outputText id="respuesta" value="#{AjaxDemo.respuesta}" /> </h:form>
www.detodoprogramacion.com
CursodeJSP
Pagina70/70
Idea NombredeleventoJuJavaScriptpararesponder.Noincluya"on",porloqueesmouseover,keyup,Blur, etc... Detalles Pordefecto Sieleventonoespecificado,pordefectoutilizado. Altoniveldeeventos JSFaade2Extras:accionyvalueChange. Ajustef:ajaxentornoaelementos <f:ajaxrender="">unmontndecomponentes</f:Ajax>aadeelcomportamientoAjaxenelevento pordefectoparacadacomponenteenvolvi. Accionespordefecto: action:h:CommandButton,h:commandLink Tengaencuentaquela"accin"espartedeJSF,ynounnombredeJavascriptnativoevento. Significaqueelbotnhasidoinvocadaencualquierforma(haciendoclicenl,ENTER,sitiene elfoco,elteclado,accesodirecto,etc). valueChange:h:inputText,h:inputSecret,h:inputTextarea,todoslosbotonesdeopcin,casillade verificacin,yloselementosdemen(h:selectOneMenu,etc), Unavezms,esteeventoesaadidoporJSFynoesunnombreJavascriptnativoevento. Diferentesnavegadoresmanejanun"cambio"demaneradiferente,porloqueesteunificael comportamiento. Tambintengaencuentaquees"valueChange"no",valuechange".Losacontecimientosnativas JavaScriptsonminsculas(mouseover,keyup,etc) Ejemplo:
<h:form prependId="false"> <h1>Ajax Event</h1> <h:commandButton action="#{AjaxDemo.onClick}" value="Agrega 10 a B"> <f:ajax render="id1" event="mouseover" /> </h:commandButton> <br/> <h3>Valor de B: <h:outputText id="id1" value="#{AjaxDemo.b}" /> </h3> </h:form>
www.detodoprogramacion.com