Curso de Java Server Faces y Ajax
Curso de Java Server Faces y Ajax
Manualdelalumno
<JSF2.0> <Ajax>
Docente:CdricSimon
Versin1.0 [Link]
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 [Link]
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
[Link]
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 [Link] Ventajas de un enfoque especfico JSF Ajax.............................................................................................67 14.5.4 Uso del tag <f:ajax>..........................................................................................................................................68 [Link] Ejemplo sencillo.........................................................................................................................................68 [Link] renderer: Especificacin de los elementos de actualizacin en el cliente..................................................69 [Link] execute: Especificacin de los elementos a procesar en servidor..............................................................69 [Link] event: mencionar a cual evento de usuario debe disparar la llamada Ajax................................................70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina5/70
1 Introduccinalcurso
1.1 Objetivodeestecurso
EnestecursovamosaaprenderellenguajeJSFquenospermitircrearpginaswebdinmicas.
1.2 Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,[Link] contieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumnodeberade tomarnotaspersonalesparacompletasestemanual.
1.3 Ejerciciosprcticos
Paracaptarmejorlateora,seharnmuchosejerciciosconlosalumnos,paraprobarlateorayverificar laintegracindelamateria. Tambin,elalumnopodrcopiarsuscdigosenundisquetealfindelcursoparallevarse,confinde seguirlaprcticaensuhogar.
1.4 Requisitosparaatenderaestecurso
UnabuenconocimientodeloslenguajesJava,JSP,HTML,yJavascriptesrequeridaparaseguireste [Link] deempezarestecurso. Sielalumnotienedificultadesenunuotrocapitulo,eldebesentirselibredepedirexplicaciones adicionalesalprofesor. Perosiaparecequeelalumnonoposeelosrequisitosmnimosparaestecurso,porrespetoalosotros alumnosqueyaposeenestamateria,elalumnopodrasertrasladoparaotrocursoenelfuturo,cuando elcumplirconlosrequisitos.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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)[Link] 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,[Link] versin6.8oarriba. Aniveldeservidoresweb,servidorescomoApacheTomcat6,Jboss5,oGlassFish3soportanJSF2.0. EnelcursousaremosGlassFish3quevieneincluidoconNetBeans.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina7/70
2.3 Primeraaplicacin
PrimerovamosainstalarNetBeansycrearunnuevoproyecto.
AgregamoslalibreraJSF2.0alservidor.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina8/70
Iniciamoselservidorwebydesplegamoslaaplicacin. Miramoselresultadoen[Link]
PorelmomentosoloestamosmirandoaunapginaJSP,nadadeJSF.
2.4 PrimerapginaJSF
LaspginasJSFsonpginasJSPconunaslibrerasTaglibadicionales. Ademas,laspginasJSPnosellamandirectamente,[Link] alapginaJSF,bastaconagregar/faces/anteselnombredelapgina. [Link] Comolovemos,unapginaJSP(sincdigoJSF)puedeserllamadasinproblema. Laconfiguracindelreenvosepuedepersonalizar(porcarpetay/oporextensin)[Link]: <servlet>
<servlet-name>Faces Servlet</servlet-name> <servlet-class>[Link]</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
[Link]
CursodeJSP
Pagina9/70
Ahoraquetenemostodolisto,creamosnuestraprimerapginaJSF,usandolaopcinJSP:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib prefix="f" uri="[Link] <%@taglib prefix="h" uri="[Link] <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "[Link] <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 [Link]; import [Link]; @ManagedBean(name="Hello") @RequestScoped public class Hello { public Hello() { } public String getNombre(){ return "Cedric"; } }
[Link]:
<h1>Hello #{[Link]()} !!!</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" "[Link] <html xmlns="[Link] xmlns:f="[Link] xmlns:h="[Link] xmlns:ui="[Link] >
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina10/70
3 AplicacionesJSF
3.1 QuesunaaplicacinJavaServerFaces?
Ensumayorparte,[Link] aplicacintpicadeJavaServerFacesincluyelassiguientespiezas: Unconjuntodepginasweb,enlaqueloscomponentesdeinterfazdeusuariosonestablecidos. Unconjuntodebibliotecasdeetiquetasproporcionaretiquetasparaaadircomponentesde interfazdeusuarioalapginaweb. UnconjuntodeBackedBean,quesonJavaBeanscomponentesquedefinenlaspropiedadesy funcionesdeloscomponentesdelainterfazdeusuarioenunapgina. Opcionalmente,unoomsficherosdeconfiguracindelaaplicacinderecursos(comofaces [Link]),quedefinenlasnormasdenavegacindelapginayconfiguralosbeansyotros objetospersonalizados,talescomocomponentespersonalizados. Undescriptordedespliegue([Link]). Esposiblequeunconjuntodeobjetospersonalizadoscreadosporeldesarrolladordeaplicaciones. Estosobjetospuedenincluircomponentespersonalizados,validadores,convertidores,olos oyentes. Unconjuntodeetiquetaspersonalizadaspararepresentarlosobjetospersonalizadosenla pgina.
3.2 Modelodecomponentesdeinterfazdeusuario
JavaServerFacescomponentesdeinterfazdeusuariosonlosbloquesdeconstruccindevistade JavaServerFaces. JavaServerFacescomponentesdeinterfazdeusuariosonelementosconfigurables,reutilizablesque [Link], 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
[Link]
CursodeJSP
Pagina11/70
Lasclasesdecomponentessontotalmenteextensible,permitiendoalosescritoresdecomponentespara [Link] avanzadoqueveremosmstarde. Laclasebaseabstractaparatodosloscomponentesdeinterfazdeusuarioes [Link]. LasclasesdecomponentesdeinterfazdeusuarioamplianlaclaseUIComponentBase,(unasubclasede laclaseUIComponent),quedefineelestadopordefectoyelcomportamientodeuncomponentede [Link] latecnologaJavaServerFaces: UIColumn:RepresentaunasolacolumnadedatosenuncomponenteUIData. UICommand:Representauncontrolqueiniciaaccionescuandoseactiva. UIData:Representaunenlacededatosaunacoleccindedatosrepresentadosporunainstancia dataModel. UIForm:[Link] anlogoalaetiquetadeformularioenHTML. UIGraphic:Muestraunaimagen. UIInput:[Link]. UIMessage:Muestraunmensajedeerrortraducidos. UIMessages:Muestraunconjuntodemensajesdeerrortraducidos. UIOutcomeTarget:Muestraunhipervnculoenlaformadeunvnculoounbotn. UIOutput:Muestralasalidadedatosenunapgina. UIPanel:administraeldiseodesuscomponentesnio. UIParameter:Representalosparmetrosdesustitucin. UISelectBoolean:Permitealusuarioestablecerunvalorbooleanoenuncontroldeselecciny [Link]. UISelectItem:Representaunsoloelementoenunconjuntodeelementos. UISelectItems:Representatodounconjuntodeelementos. UISelectMany:[Link] claseesunasubclasedelaclaseUIInput. UISelectOne:[Link] esunasubclasedelaclaseUIInput. UIViewParameter:[Link] subclasedelaclaseUIInput. UIViewRoot:Representalarazdelrboldecomponentes. AdemsdeampliarUIComponentBase,lasclasesdecomponentetambinaplicarunaomsinterfaces decomportamiento,cadaunodeloscualesdefineciertocomportamientodeunconjuntodecomponentes cuyasclasesimplementanlainterfaz. Estasinterfacesdecomportamientosonlassiguientes: ActionSource:[Link] estdiseadoparautilizarseconcomponentesbasadosenlatecnologaJavaServerFaces1.1_01 yversionesanteriores. ActionSource2:ExtiendeActionSource,[Link] embargo,sepermitealoscomponentesautilizarelELunificadocuandosehacereferenciaalos mtodosparacontrolarloseventosdeaccin. EditableValueHolder:ExtiendeValueHolderyespecificalascaractersticasadicionalesparalos componentesmodificable,comolavalidacinyemitirloseventosdecambiodevalor. NamingContainer:losmandatosquecadacomponentederazenestecomponentetieneuna identificacinnica. StateHolder:Indicaqueuncomponentehaestadoquedebenguardarentrelassolicitudes.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
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
[Link]
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 [Link],[Link] aplicacinobtieneyestableceelobjetodedatosparauncomponentellamandoalaspropiedadesde objetoapropiadoparaesecomponente. Cuandouncomponenteestasociadoaunobjeto,laaplicacintienedospuntosdevistadelosdatosdel componente: Elpuntodevistadelmodelo,enelqueserepresentanlosdatoscomotiposdedatos,talescomo intolong. Lavistadepresentacin,enelqueserepresentanlosdatosdeunamaneraquepuedeserledoo [Link],[Link] cadenadetextoenelformatomm/dd/aaocomounconjuntodetrescadenasdetexto. LaimplementacindeJavaServerFacesconvierteautomticamentedatosdeloscomponentesentre estosdospuntosdevistacuandolapropiedaddebeanasociadosconelcomponentedeunodelostipos soportadosporlosdatosdelcomponente.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
CursodeJSP
Pagina14/70
Porejemplo,siuncomponentedeUISelectBooleanseasociaconunapropiedaddebeande [Link],laimplementacinJavaServerFacesseconvertirautomticamentelosdatosdel [Link],algunosdatosdeloscomponentesdebenestarvinculadas [Link],uncomponenteUISelectBooleandebeestar [Link]. Avecespuedequedeseeconvertirlosdatosdeuncomponenteauntipodistintodeuntipoestndar,o [Link],latecnologaJavaServerFacesle permiteregistrarlaaplicacinConverterencomponentesUIOutputycomponentescuyasclases [Link],laaplicacinConverter conviertelosdatosdelcomponenteentrelosdospuntosdevista. PuedeutilizarlosconvertidoresestndarsuministradosconlaimplementacinJavaServerFacesocrear [Link] severmsadelante.
3.5 Eventoyeloyentedemodelo
JavaServerFaces2.0definetrestiposdeeventos:loseventosdeaplicacin,loseventosdelsistemaylos datosdeeventosdemodelo. Eventosdeaplicacinestnvinculadosaunaaplicacinenparticularysongeneradosporun [Link] tecnologaJavaServerFaces. Unobjetodeeventoidentificaelcomponentequegenereleventoyalmacenainformacinsobreel [Link],unaaplicacindebeproporcionarunaimplementacindela [Link] componente,porejemplo,hacerclicenunbotn,[Link] JavaServerFacesparainvocarelmtododeescuchaqueprocesaelevento. JavaServerFacessoportadostiposdeeventosdeaplicacin:eventosdeaccinydevaloreventosde cambio. Uneventodeaccin(ActionEventclase)seproducecuandoelusuarioactivauncomponenteque [Link]. Uneventodecambiodevalor(ValueChangeEventclase)seproducecuandoelusuariocambiaelvalorde [Link] casilladeverificacin,[Link] tiposdecomponentesquepuedegenerarestetipodeeventossonlosUIInput,UISelectOne, UISelectMany,[Link] sedetectaronerroresdevalidacin. [Link] [Link] lugardeauncomponenteespecfico. Unmodelodedatosdeeventosseproducecuandoseseleccionaunanuevafiladeuncomponentede UIData. Lossucesosdelsistemaylosdatosdeeventosdemodelosontemasavanzadosquesemirarnmstarde.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
CursodeJSP
Pagina15/70
1.1
Validacin
LatecnologaJavaServerFacessoportaunmecanismoparalavalidacindelosdatoslocalesdelos componentesmodificables(comoloscamposdetexto).Estavalidacinseproduceantesdequeelmodelo dedatoscorrespondienteseactualizaparaquecoincidaconelvalorlocal. Aligualqueelmodelodeconversin,elmodelodevalidacindefineunconjuntodeclasesestndarpara [Link] ncleobibliotecatambindefineunconjuntodeetiquetasquecorrespondenalasimplementaciones estndardeValidator. Lamayoradelasetiquetastienenunconjuntodeatributosparaconfigurarlaspropiedadesdel validador,[Link] registrosdeautoreselvalidadorenuncomponenteporlaetiquetadeanidacindelvalidadordentrode laetiquetadelcomponente.
3.6 Modelodenavegacin
ElmodelodenavegacinJavaServerFaceshacequeseafcildedefinirydenavegacindelapgina paramanejarcualquierprocesamientoadicionalquesenecesitaparaelegirlasecuenciaenlaquese carganlaspginas. EnlatecnologaJavaServerFaces,lanavegacinesunconjuntodereglasparalaeleccindelapgina siguienteolavistaquesemostrardespusdeunaaccindeaplicacin,comocuandounbotno hipervnculosehaceclic. Estasnormassedeclaranenceroomsrecursosdeconfiguracindelaaplicacin,talescomo<faces [Link]>,[Link] navegacineselsiguiente: <navigationrule> <description> </description> <fromviewid></fromviewid> <navigationcase> <fromaction></fromaction> <fromoutcome></fromoutcome> <if></if> <toviewid></toviewid> </navigationcase> </navigationrule> EnJavaServerFaces2.0,[Link] navegacinimplcitasentranenjuegocuandolasnormasdenavegacinnoestndisponiblesenun archivodeconfiguracindelaaplicacinderecursos. 3.6.1
Configuracindereglasdenavegacin
[Link]
CursodeJSP
Pagina16/70
[Link] implementacindeJavaServerFaceseligelaregladenavegacinadecuadodeacuerdoalapginaque semuestraactualmente. Despusdelaregladenavegacinadecuadoesseleccionado,laeleccindequeparaaccederalapgina siguientedelapginaactualdependededosfactores: Elmtododeaccinqueseinvocacuandoelcomponentesehahechoclic Elresultadolgicoquesehacereferenciaporelcomponenteenlaetiqueta,ofuedevueltoporel mtododeaccin Elresultadopuedesercualquiercosaqueeldesarrolladordecide,perolatablaaquvanalgunos resultadosdeusocomnenaplicacionesweb.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina17/70
Comoseindicaenlaregladenavegacinejemplo,unelementoderegladenavegacinpuedecontener [Link],defineunconjuntodecriterios [Link],laaplicacinsevayaalapginadefinidaporela verIDdeelementocontenidoenlanavegacindelmismoelementodecaso. [Link] resultadodeelementodefineunresultadolgico,[Link] unaexpresinparareferirseaunmtododeaccinquedevuelveunacadena,queeselresultadolgico. Elmtodorealizaalgunalgicaparadeterminarelresultadoydevuelveelresultado. Loselementosdenavegacincasodequesecotejarnconlosresultadosyelmtododeexpresineneste orden: [Link] puedenserutilizadossielmtododeaccindevuelveresultadosdiferentesdependiendodel resultadodelatransformacinquerealiza. [Link] resultadoyaseadefinidoporelatributodeaccindelcomponentedeUICommandoelresultado devueltoporelmtodomencionadoporelcomponentedeUICommand. [Link] accinespecificadaporlaetiquetadelcomponente. Cuandosecomparacualquieradeestoscasos,elrboldecomponentesdefinidosporelaverelementode identificacinsernseleccionadosparalarepresentacin. UsodeNetBeansIDE,puedeconfigurarunaregladenavegacindelasiguientemanera: 1. DespusdeabrirsuproyectoenelIDENetBeans,expandaelnododelproyectoenelpanelde Proyectos. 2. AmpliarlasPginasWebyWebnodosINFdelnododelproyecto. 3. [Link]. 4. [Link],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
[Link]
CursodeJSP
Pagina18/70
3.6.2
Reglasdenavegacinimplcitas
Enelejemploanterior,elcontroladordenavegacinpordefectotratardelocalizarlapgina [Link].
3.7 BackedBeans
UnaaplicacintpicadeJavaServerFacesincluyeunoomsbeansdeapoyo,cadaunodeellosesun JavaServerFacesgestionadosdebeanqueestasociadoconloscomponentesdelainterfazdeusuario utilizadosenunadeterminadapgina. LosbeansGestionadosonJavaBeanscomponentesquesepuedenconfigurarmediantelainstalacinde beangestionado,[Link] 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
[Link]
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 [Link],unapropiedadpuedeserdetipofecha,silaaplicacintieneaccesoa unconvertidorquepuedeconvertireltipodefechaenunacadenayviceversa. Cuandounapropiedadseuneaunainstanciadelcomponente,eltipodelapropiedaddebeserelmismo [Link],siunUISelectBooleanestligadoalapropiedad,la propiedaddebeaceptarydevolverunobjetoUISelectBoolean. Delmismomodo,silapropiedadestenlazadoaunconvertidor,validador,oeloyenteejemplo,la propiedaddebeserdelconvertidorcaso,validador,oeloyentetipo. 3.7.2
ConfiguracindeunBean
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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,[Link] debesercapazderetrasarlaevaluacindelasexpresiones,hastalafaseapropiadadelciclodevidase [Link],suetiquetadeatributossiempreutilizalasintaxisdelaevaluacindiferida, quesedistingueporeldelimitador#().ElCiclodeVidadeunapginaJavaServerFacesdescribeelciclo devidaendetalle. Conelfindealmacenardatosenlosobjetosexternos,casitodoslosatributosdeetiquetasJavaServer Facesutilizarexpresionesdevalorvalor,quesonexpresionesquepermitentantoobteneryestablecer datossobrelosobjetosexternos. Porltimo,algunosatributosdeetiquetadecomponentedeaceptarexpresionesmtodoquelosmtodos dereferenciaparacontrolarloseventosdecomponentes,ovalidaroconvertirlosdatosdelos componentes. ParailustrarunaetiquetadeJavaServerFacesusandoelELunificado,supongamosqueunaetiqueta deunasolicituddereferenciaaunmtodopararealizarlavalidacindeentradadeusuario:
<h:inputText id="userNo" value="#{[Link]}" validator="#{[Link]}" />
[Link]
CursodeJSP
Pagina21/70
Otrousodelasexpresionesdevalorvinculanteesunainstanciadelcomponenteaunapropiedadde [Link]:
<inputText binding="#{[Link]}" />
ElCiclodeVidadeunapginaJavaServerFaces
ElciclodevidadeunapginaJavaServerFacesesalgosimilaraladeunapginaJSP:Elclienterealiza [Link],el ciclodevidadeJavaServerFacesdifieredelciclodevidadeJSPenquesedivideenvariasfasespara [Link] deserconvertidosyvalidados,eventosdeloscomponentessemanipulan,ylosdatosdeloscomponentes sepropagaalasjudasenunamaneraordenada. UnapginadeJavaServerFacesestambindiferentedeunapginaJSPenlaqueesrepresentadopor unrboldecomponentesdeinterfazdeusuario,[Link],la implementacinJavaServerFacesdebeconstruirelpuntodevistaalconsiderarelestadoguardadode [Link],laimplementacin JavaServerFacesrealizavariastareas,talescomolavalidacindelaentradadedatosdelos componentesdelavistaylaconversindelosdatosdeentradaalostiposespecificadosenelladodel servidor. LaimplementacindeJavaServerFacesrealizatodasestastareascomounaseriedepasosenla solicituddeJavaServerFacesciclodevidaderespuesta.
[Link]
CursodeJSP
Pagina22/70
unapginaquefuepreviamentecargadoenelnavegadorcomoresultadodelaejecucindeunasolicitud inicial. Cuandoelciclodevidaseencargadelapeticininicial,sloseejecutalarestauracindevistayhacer quelasfasesderespuesta,[Link] contrario,cuandoelciclodevidamanejaunadevolucindedatos,ejecutatodaslasfases. Normalmente,laprimerasolicitudparaunapginaJavaServerFacestratadeuncliente,como resultadodehacerclicenunhipervnculoenunapginaHTMLqueenlazaconlapginadeJavaServer Faces. ParahacerunarespuestaqueesotrapginaJavaServerFaces,laaplicacincreaunanuevavisinyla almacenaenlainstanciaFacesContext,querepresentaatodalainformacincontextualasociadaconel [Link] [Link],queobligaalaprestacin inmediatadelaopinindepasarporlarespuestaalafasedeprocesamientodelciclodevida,como indicanlasflechasetiquetadosRenderderespuestaeneldiagrama. Aveces,unaaplicacinpodranecesidaddereorientarlosrecursosadiferentesaplicacionesweb,como unservicioweb,[Link] situaciones,eldesarrolladordebesaltarselafasederenderizado(RenderFasederespuesta)llamando [Link],estavezconlas flechasdelaetiquetarespuestacompleta. LapropiedaddelacurrentPhaseIDFacesContext,querepresentalafasequeseencuentra,debeser actualizadatanprontocomoseaposibleporlaaplicacin. LasituacinmscomnesqueuncomponenteJavaServerFacespresentaunasolicituddelapginade [Link],laimplementacinJavaServerFacesmanejalasolicitudy automticamentepasaatravsdelasfasesdelciclodevidapararealizarcualquierconversin necesaria,validacionesyactualizacindelosmodelos,yparagenerarlarespuesta. Losdetallesdelciclodevidaseexplicaenestaseccinestndestinadosprincipalmentepara desarrolladoresquenecesitanconocerdichainformacincomocuandovalidaciones,conversiones,ylos [Link] autoresdepginasnotienenporquconocerlosdetallesdelciclodevida. 3.8.2
Fasederestauracindevista
CuandounasolicituddeunapginaJavaServerFacessehace,comocuandounenlaceounbotnse presiona,laimplementacinJavaServerFacescomienzalafasederestauracindevista. Duranteestafase,laimplementacinJavaServerFacesconstruyeelpuntodevistadelapgina,cables controladoresdeeventosylosvalidadoresdeloscomponentesenlavista,yguardalavistaenelejemplo FacesContext,[Link] etiquetasdecomponentesdelaaplicacin,loscontroladoresdeeventos,convertidoresyvalidadoresde teneraccesoalainstanciadeFacesContext. Silasolicituddelapginaesunasolicitudinicial,laimplementacinJavaServerFacescreaunavisin devacoenestaetapaylosavancesdelciclodevidaparahacerlafasederespuesta,duranteelcualla opinindevacosellenaconloscomponentesdereferenciadelasetiquetasenlapgina.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina23/70
Fasedeaplicacindevalores
Despusdequeelrboldecomponentesqueserestablezca,cadacomponenteenelrboldelosextractos desunuevovalordelosparmetrosdelapeticinmedianteelusodesudecodificar(processDecodes()) [Link],un [Link] mensajesemostrardurantelafasededarrespuesta,juntoconloserroresdevalidacinresultantede lafasedevalidacindelproceso. SilosmtodosdescifrarodetectoresdeeventosllamadorenderResponseFacesContextenlainstancia actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta. Silosacontecimientossehancoladuranteestafase,lasemisionesdeaplicacinJavaServerFaceslos acontecimientosalosoyentesinteresados. Sialgunoscomponentesdelapginatienensusatributosdeinmediatoestableceentrue,entoncesla validacin,laconversin,yloseventosrelacionadosconestoscomponentesserntratadosduranteesta fase. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara [Link]. Alfinaldeestafase,loscomponentessefijanasusnuevosvalores,ylosmensajesyeventossehan puestoencola. Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras decontextoyelmtododetransformacinparcialesaplicado. 3.8.4
Fasedevalidacionesdeproceso
Duranteestafase,laimplementacinJavaServerFacesprocesatodoslosvalidadoresregistradasenlos componentesenelrbol,mediantesuvalidacin((processValidators))[Link] componentedeatributosqueespecificanlasnormasparalavalidacinycomparaestasnormasparael valorlocalalmacenadoparaelcomponente. Sielvalorlocalnoesvlido,laimplementacinJavaServerFacesaadeunmensajedeerrorala instanciaFacesContext,yelciclodevidaavanzadirectamentealafasededarrespuestaparaquela [Link] valoresdefase,losmensajesdeestoserrorestambinsemuestran. SialgunavalidarmtodosodetectoresdeeventosllamadorenderResponseenelFacesContextactual,la implementacinJavaServerFacessaltaalafasededarrespuesta. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara [Link].
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina24/70
Fasedeactualizacindevaloresdemodelo
DespusdelaimplementacinJavaServerFacesdeterminaquelosdatossonvlidos,sepuederecorrer elrboldecomponentesyestablecerelservidorcorrespondientedelaspropiedadesdelobjetodeladoa [Link] [Link] puedenserconvertidosalostiposespecificadosporlaspropiedadesjudas,elciclodevidaavanza [Link] similaraloquesucedeconloserroresdevalidacin. SilosmtodosupdateModelsocualquieroyentesllamadorenderResponseFacesContextenlainstancia actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara [Link]. Silosacontecimientossehancoladuranteestafase,laimplementacinJavaServerFacesemisionesa oyentesinteresados. Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras [Link] JavaEE6Tutorial,VolumenII:Temasavanzados. 3.8.6
Fasedeinvocacindelaaplicacin
Duranteestafase,laimplementacinJavaServerFacesmanejacualquiersolicituddeeventosdenivel, talescomolapresentacindeunformularioounvnculoaotrapgina. Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara [Link]. Siseprocesaelpuntodevistafuereconstruidoapartirdeinformacindeestadodeunasolicitud anteriorysiuncomponentehadisparadounevento,estoseventossetransmitenalosoyentes interesados. Porltimo,lastransferenciasdeJavaServerFacesaplicacindecontrolparahacerquelafasede respuesta. 3.8.7
Fasedecreacindelarespuesta
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina25/70
Sisetratadeunasolicitudinicial,loscomponentesqueestnrepresentadosenlapginaseagregaal [Link],loscomponentesseaadenyaalrbolparaque nosenecesitaaadirms. Silasolicitudesunadevolucindedatosyloserroresfueronencontradosdurantelafasedesolicitudde aplicarlosvalores,lasvalidacionesdeprocesodefase,ofasedeactualizacindelosvaloresdelmodelo, [Link] etiquetas,losmensajesdeerrorenlacolasemuestranenlapgina. Despusdequeelcontenidodelavistaserepresenta,elestadodelarespuestaseguardaparaquelas [Link] restauracindevista.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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,[Link] entiendequelaexpresinseevalayelresultadoesdevueltoinmediatamentecuandolapginase [Link] expresionespuedenemplearsupropiomecanismoparaevaluarlaexpresinenalgnmomentoms tarde,duranteelciclodevidadelapgina,ocuandoseaapropiadohacerlo. Esasexpresionesqueseevalandeinmediatoelusode${}[Link] demaneradiferidautilizarel#{}sintaxis. Debidoasuciclodevidadevariasfases,latecnologaJavaServerFacesusaprincipalmenteexpresiones [Link],loseventosdecomponentessemanejan,losdatosson validados,[Link],unaaplicacin JavaServerFacesdebediferirlaevaluacindelasexpresiones,hastaelpuntoapropiadoenelciclode vida. 4.2.1
EvaluacinInmediata
LaimplementacindeJavaServerFacesevalalaexpresin,${[Link]},loconviertey pasaelvalordevueltoalcontroladordeetiqueta.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
CursodeJSP
Pagina27/70
Evaluacindiferida
Paraqueunasolicitudinicialdelapginaquecontieneunaetiqueta,laimplementacinJavaServer Facesevalalaexpresin#{[Link]}[Link] estafase,laexpresinslotieneaccesoalvalordelnombredelcliente,comosehaceenlaevaluacin inmediata. Paraunasolicituddedevolucindedatos,laimplementacinJavaServerFacesevalalaexpresinen lasdiferentesfasesdelciclodevida,durantelacualelvalorserecuperadelasolicitud,validados,y reproducidasenelbeandelcliente. Comosemuestraenesteejemplo,lasexpresionesdeevaluacindiferidapuedenserexpresionesdevalor [Link] valor(tantoinmediatoscomodiferidos)ylasexpresionesmtodoseexplicaenlasiguienteseccin.
4.3 Valoryelmtododeexpresiones
LaELsedefinendostiposdeexpresiones:[Link] [Link] serinvocadoypuededevolverunvalor.
4.4 Operadores
Ademsdel.y[],ellenguajedeexpresinunificadoproporcionalossiguientesoperadores,quepueden serutilizadosenexpresionesrvalueslo: Aritmtica:+,(binario),*,/ydiv,%yelmod,(unario) Lgicos:AND,&&,o,||,not,! Relacionales:==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,[Link] valores,ocontraBoolean,String,enterooflotante. Vaco:Eloperadordevacoesunaoperacindeprefijoquepuedeusarseparadeterminarsiun valoresnuloovaco. Condicional:A?B:[Link],dependiendodelresultadodelaevaluacindeA. Laprecedenciadelosoperadoresdemayoramenor,deizquierdaaderechaescomosigue: []. ()(Utilizadoparacambiarlaprioridaddelosoperadores) (Unario)not!empty
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
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 #([Link]) Descripcin Devuelveelvalordelapropiedaddelobjetoalmacenadoenlaclavede myBean,oelelementoalmacenadoenelvalordelaclave,simyBeanesde tipoMap #(myBean['value']) Igualque"[Link](#)". #(myArrayList[5]) Devuelveelquintoelementodeunalistaquesealmacenaenlaclavede myArrayList. #(myMap['foo']) Devuelveelobjetoalmacenadoenlaclavefoodelmapaalmacenadoen myMap. #(myMap[[Link]]) Devuelveelobjetoalmacenadoenlaclavequeesigualalvalordela [Link]. #(myMap['foo'].valor) Devuelveelvalordelapropiedaddelosobjetosalmacenadosenlaclavede foodemyMap. #(myMap['foo'].valor[5]) Devuelveelquintoelementodelalistaomatrizalmacenadaenlaclavede myMapclave. #()miCadena DevuelvelacadenadeobjetosalmacenadosenelmarcodelmiCadena clave. #()myInteger DevuelveelenteroobjetoalmacenadoenelmarcodelmyIntegerclave. #([Link]=='normal') Devuelvetruesielpapeldelapropiedaddelobjetoalmacenadoenlaclave [Link]. #((user.balance200) Sielvalordelapropiedaddeequilibriodelobjetoalmacenadoenelmarco delclavedeusuariomenos200igualacero,[Link] OTHfalsos Hola#()[Link]! Devuelvelacadena"Hola",seguidadelnombredelapropiedaddelobjeto [Link] Sean,esto"retornoHolaSean!" Ests#(([Link]> Devuelvelacadena"Ustedestcargado"silapropiedaddeequilibriodela 100)?"cargado":"no objetoalmacenadoenlaclavedeusuarioesmayorde100;devuelve"Usted cargado') nosecargan"deotramanera. #()[Link] Devuelveelmtodollamadomtododelobjetoalmacenadoenelmarcodel myBeanclave. #(20+3) Devuelve23.
CopyrightCdricSimon,2009 Versin1.0 Reproduccinprohibida
[Link]
CursodeJSP
Pagina29/70
5 JSTLLibrerasestndarTaglib
5.1 Introduccin
ExistenvariaslibrerasTaglibdisponibleparaJSPyJSF. FuntionalArea Core XMLprocessing I18Ncapableformatting Databaseaccess(SQL) Functions URI [Link] [Link] [Link] [Link] [Link] Prefix c x fmt sql fn Example <c:tagname ...> <x:tagname ...> <fmt:tagname ...> <sql:tagname ...> fn:functionName(...)
5.2 Core
[Link]<c:out>evaluacindela [Link]<%=exp%>.La utilizacinsehaceas: <c:outvalue="${[Link]}"default="N/A"/> [Link] [Link],podemosdefinirunavariablellamadaalmbito deaplicacindelclientemedianteelusode<c:set var="customer" value=${customer}" />yluegousar <c:remove var="customer" /> paraquitarlodembito. [Link],porejemplo,<c:catch var="myError" />.Elusodeestaetiquetapermiteelmanejouniformedeerrorquesedeclareenuna [Link] usodelaetiqueta <c:catch>esposibletenerbuencontroldeerroresdegrano,loquepermitequelos erroressemanejanporlapginaenlugardeiralapginadeerrornotodosloserroresquesetira [Link]<c:catch>etiqueta,esposibledisearmejor lasinteraccionesdelusuario,porqueelflujodelapginaesmsfcildeusar.
5.3 Iteracin
Laetiquetadeiteracinbsicaes<forEach>,queiterasobrelamayoradelascoleccionesyobjetos similares,unopensaraquepararecorrereniteracin.<forTokens>lepermiteiterarsobrefichasenun objetoString,quelepermiteespecificarlacadenaylosdelimitadores. [Link] iteracionesdeapoyoson<c:forEach>,<c:forToken>,y<x:forEach>.TambinhayetiquetasXMLque [Link] momento,peroporahora,vamosaseguirconlasaccionesfundamentales.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina30/70
5.4 AccionesdeURL
Ademsdelasaccionesderepeticin,[Link] incluyeapoyoparaloshipervnculos,lasimportacionesderecursos,[Link] etiqueta<c:url>[Link] deunaURLconunparmetroyluegousarlaenunenlace,puedesercomoeste:
<c:url=[Link] var="myUrl"> <c:param name="name" value="${[Link]}"/> </c:url> <a href='<c:out value="${myUrl}"/>'>Register</a>
5.5 Condicionales
JSTLescompatibleconunacondicionalsimple<if>etiquetajuntoconunacoleccindeetiquetas <choose>,<when>,y<otherwise>[Link] ltimostresetiquetaspermitenaplicaruntpicoif/elseif/elseifestructuray/olosdems. Utilizandoellenguajedeexpresinenlasaccionescondicionaltambinpuedeserunmecanismo [Link]<c:if>etiqueta,esposibleconstruirexpresiones
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina31/70
[Link],medianteelaccesoaunapropiedaddeobjetos,as:
<c:if test="${[Link] == 1}" Welcome back! </c:if>
5.6 FormatodetextoconcapacidadI18N
[Link] [Link] soportaraplicacionesinternacionalizadas. OtraimportantereafuncionaldelaJSTLessuenfoqueinternacional(I18N)[Link] utilizacindelasaccionesprevistasfacilitalainternacionalizacindeunasolicitudocontextobasede configuracin. EstasaccioneshacenusodelaResourceBundleJ2SEestndarseutilizaparamantenerlascadenasque [Link],dependiendodela [Link]<fmt:setLocale>etiquetapuedeserusadaparaespecificarunlugarcomoeste: <fmt:setLocalevalue="es_Es"/>,[Link] posiblespecificyunResourceBundle:<fmt:bundlebasename="ApplicationResource_fr"/>. Unavezquelaconfiguracinregionaloelpaqueteestestablecido,entonceslaetiqueta<fmt:message> [Link] cadenasdeestemodo:
<fmt:message key="welcome"> <fmt:param value="${visitCount}" /> <fmt:message/>
Tambinpuedeutilizar<fmt: solicitud.
requestEncoding />paraestablecerlacodificacindecaracteresdela
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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
[Link] consultasdebasededatos,fcildeaccederalosresultados,realizaractualizaciones,yelgrupodevarias operacionesenunatransaccin. Medianteestasetiquetashaceposibleelestablecimientodefuentesdedatos,consultalafuentededatos, tienenfcilaccesoalosconjuntosderesultados,yrealizarlasactualizaciones,ascomolas [Link](datasource).Elorigende datospuederealizarseenvariasformas:sepuedeconfiguraratravsdelparmetrodeconfiguracin [Link],puedeserunobjetoqueesproporcionadoporlalgicadelaaplicacin,opuedehaberun objetoproporcionadoporel<sql:setDataSource>[Link],siseutilizaunabasededatos MySQLconelcontroladorJDBC,puededefinirelorigendedatoscomo:
<sql:setDataSource var="datasource" driver="[Link]" 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="${[Link]}"> <tr> <td><c:out value="${[Link]}" /></td> <td><c:out value="${[Link]}" /></td> </tr> </c:forEach> </table>
[Link]
CursodeJSP
Pagina33/70
5.8 LamanipulacindeXML
[Link] clasificarenbsico(core),controldeflujo,[Link] basaenXPath,[Link] [Link] unacadenaliteralqueseevalaelmotordeXPath. [Link] incluyen<x:out>,<x:set>,y<x:parse>.LaprincipaldiferenciaentrelasetiquetasCoreylasetiquetas XMLesquelasetiquetasXMLapoyarlasexpresionesXPath,[Link] etiquetadeanalizarproporcionafuncionalidadparaanalizarundocumentoXMLenunaestructurade [Link],porejemplo,si tenemosunarchivoXMLqueidentificaaunlibro,sepuedeanalizar,yluegoaccederaesosdatos medianteunaexpresinXPatheimprimirlo:
<c:import url="[Link] var="xml"/> <x:parse source="${xml}" var="bookInfo"/> <x:out select="$bookInfo/title"/> <x:out select="$bookInfo/author"/>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina34/70
6 Formularios
6.1 Formulariosencillo
Paraponerenpracticaloanteriorvisto,vamosausarunformulariodeentradaalsitio. Lovamosaconstruirpocoapocoparallegaralcdigosiguiente: [Link]:
<h:head> <title>Entrada al sitio</title> <link rel="stylesheet" href="[Link]" /> <ui:include src="WEB-INF/include/[Link]"/> </h:head> <h:body> <ui:include src="WEB-INF/include/[Link]"/> <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="#{[Link]}" 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="#{[Link]}" /> <h:commandButton value="Entrar" action="#{[Link]}" actionListener="#{[Link]}" /> </h:panelGrid> </h:form> </h:body>
[Link]:
[Link]:
package curso; import [Link]; import [Link]; import [Link]; import [Link]; @ManagedBean(name = "Login") @RequestScoped public class Login { private String username; private String password; public void onLogin(ActionEvent e) { if ( && ) { throw new AbortProcessingException("Usuario invalido"); } // password=null; } public String submit() { String outcome = "none"; if ([Link]("dukes")) { outcome = "success"; } else { outcome = "admin"; }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
[Link](outcome); return outcome;
Pagina35/70
} public void setPassword(String password) { [Link] = password; } public void setUsername(String username) { [Link] = username; } public String getPassword() { return password; } public String getUsername() { return username; } }
[Link]:
<?xml version='1.0' encoding='UTF-8'?> <faces-config version="2.0" xmlns="[Link] xmlns:xsi="[Link] xsi:schemaLocation="[Link] [Link] <navigation-rule> <from-view-id>/[Link]</from-view-id> <navigation-case> <from-outcome>admin</from-outcome> <to-view-id>/[Link] </to-view-id> </navigation-case> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/[Link] </to-view-id> </navigation-case> </navigation-rule> </faces-config>
[Link].
6.2 Formulariomascomplejo
Vamosacrearunformularioparaagregarunusuario,condiferentestiposdecamposenelformulario.
user_add.xhtml
<h:head> <title>Agregar un usuario</title> <link rel="stylesheet" href="[Link]" /> </h:head> <h:body> <h1>Agregar un usuario</h1> <h:form> <h:panelGrid columns="3" > <h:outputLabel value="Nombre:"/> <h:inputText id="nombre" value="#{[Link]}" 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
[Link]
CursodeJSP
Pagina36/70
<h:outputLabel value="Apellido:"/> <h:inputText id="apellido" value="#{[Link]}" 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="#{[Link]}" 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="#{[Link]}" 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="#{[Link]}" 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="#{[Link]}" ></h:commandButton> </h:panelGroup> </h:panelGrid> </h:form> </h:body>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina37/70
7 HtmlDataTable
UnDataTablemuestraunatablaHTML<table>. LascolumnasseespecificanconloscomponentessecundariosUIColumn. ElHtmlDataTabletienevariosparametros: ID:[Link] mscercanodelospadres. Value:[Link] [Link]. Var:Esteeselnombredelavariablecreadaporlatabladedatosquerepresentaelelemento [Link]. Bgcolor:Esteatributoseutilizaparaestablecerelcolordefondodelatabla. Border:Sepuedeconfigurarelanchodelbordedelamesaalrededordelamesa. Cellpadding:Estoestableceelespacioentreelcontenidoylafronteradelaclula. Cellspacing:Seespecificalacantidaddeespacioparadejarentrelasclulas. First:Seutilizaparaespecificarelnmerodefiladelaprimerafiladelaquepresentamosesque [Link],estapropiedadseestableceen3,quemuestraseiniciar desdelatercerafiladelosdatossubyacentes. Rows:[Link] desdeelndiceespecificadoenla"primera"[Link],entonces todaslasfilasquesemostrarn. Width:[Link]%. Supongamosqueseestablecequeel50%,entoncesestatablasemuestraenelespaciodel50%de laanchuradelapantalla. Dir:[Link]"ltr"(de izquierdaaderecha)y"RTL"(dederechaaizquierda)[Link] continuacin,elcontenidosemostrarenelcentro. Frame:[Link] atributopuedetomaralgunosvaloresquesemuestranacontinuacin: [Link],Valorpredeterminado [Link] [Link] [Link] [Link] [Link] [Link] [Link] [Link] Rules:[Link] queseindicanacontinuacin: [Link]:Nohayreglasninguno,elvalorpordefecto [Link]:Entrelosgruposdelosgruposdefilas [Link]:Entrelasfilasdelasfilasslo [Link]:Entrecolumnasslo [Link]:Entretodaslastodaslasfilasycolumnas Summary:Puedeespecificarresumendelpropsitodelatabla. Rendered:[Link] predeterminadoes"true".Siseestableceenfalseentoncesseimpidelaprestacindeeste componentealapgina.
Versin1.0 Reproduccinprohibida
CopyrightCdricSimon,2009
[Link]
CursodeJSP
Pagina38/70
CaptionClass:listaseparadaporespaciosdelaclaseoclasesCSSqueseaplicaracualquier ttulogeneradoparaestatabla. CaptionStyle:EspecificaestiloCSSoestilosquedebenaplicarsecuandoserepresentaeste epgrafe. ColumnClasses:listaseparadaporcomasdelasclasesCSSqueseaplicaralascolumnasde estecuadro. FooterClass:EsteatributotienelistaseparadaporespaciosdeestiloCSSdelaclaseoclasesque seaplicaraaheadertergeneradoparaestatabla. HeaderClass:EsteatributotienelistaseparadaporespaciosdelaclasedeestiloCSSoclases queseaplicarseacualquierencabezadogeneradoparaestatabla. RowClasses:[Link] [Link],entonces [Link] [Link] [Link],denuevoenla tercerafila,[Link] filadelatabla. Lang:Estableceelidiomabasedelosatributosdeunelemento,esdecir,eltextoyellenguaje utilizadoenelmarcadogeneradoparaestecomponente. StyleClass:SeestableceelnombredelasclasesdeclassorCSSqueseaplicaenelmomentodela prestacindelelemento. Title:Elatributodelttuloseutilizaparaestablecereltextoparamostrarinformacinsobre [Link] 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="[Link]" /> </h:head> <h:body>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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="#{[Link]}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Last Name"/> </f:facet> <h:outputText value="#{[Link]}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Balance"/> </f:facet> <h:outputText value="#{[Link]}"> <f:convertNumber type="currency"/> </h:outputText> </h:column> </h:dataTable> </h:body> [Link]: package [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; @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) { [Link] = nombre; [Link] = apellido; [Link] = sexo; [Link] = fecnac; this.add1 = add1; [Link] = pasatiempo; [Link] = hermanos; [Link] = salario; } public String onSubmit(){ return "success"; } public void validateCCExpiry(FacesContext cntx, UIComponent cmp, Object val) { [Link]("Validando la entrada "+val); String messS = null; String[] fields = ((String) val).split("/", 3); if ([Link] != 2) { messS = "Se espera MM/AA!"; } else { int month = 0; int year = 0; try {
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
month = [Link](fields[0]); year = [Link](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 = [Link]([Link]) + 1; int thisYear = [Link]([Link]) - 2000; if (year < thisYear || year == thisYear && month < thisMonth) { messS = "Tarjeta vencida!"; } }
Pagina40/70
} if (messS != null) { FacesMessage mess = new FacesMessage(messS); [Link]([Link](cntx), mess); } } public String getNombre() { return nombre; } public void setNombre(String nombre) { [Link] = nombre; } public String getApellido() { return apellido; } public void setApellido(String apellido) { [Link] = apellido; } public String getSexo() { return sexo; } public void setSexo(String sexo) { [Link] = sexo; } public Date getFecnac() { return fecnac; } public void setFecnac(Date fecnac) { [Link] = fecnac; } public String getAdd1() { return add1; } public void setAdd1(String add1) { this.add1 = add1; } public String getPasatiempo() { return pasatiempo; } public void setPasatiempo(String pasatiempo) { [Link] = pasatiempo; } public void setSalario(Double salario) { [Link] = salario; } public void setHermanos(Byte hermanos) { [Link] = hermanos; } public Double getSalario() { return salario; } public Byte getHermanos() { return hermanos; } public void setTestInt(Integer testInt) { [Link] = testInt; } public Integer getTestInt() { return testInt; }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
} demo_table.xhtml <h:head> <title>Lista de usuarios</title> <link rel="stylesheet" href="[Link]" /> </h:head> <h:body> <h1>Lista de usuarios</h1> <h:dataTable value="#{[Link]}" 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="#{[Link]}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Apellido"/> </f:facet> <h:outputText value="#{[Link]}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Sexo"/> </f:facet> <h:outputText value="#{[Link]}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="Salario"/> </f:facet> <h:outputText value="#{[Link]}"> <f:convertNumber type="currency"/> </h:outputText> </h:column> </h:dataTable> </h:body> [Link] package [Link]; import import import import import [Link]; [Link]; [Link]; [Link]; [Link];
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){ [Link](a); } public void populateData(){ [Link](new Usuario("Cedric","Simon","M",new Date(),"Managua","demo",(byte)2,2500.80)); [Link](new Usuario("Juan","Palmado","M",new Date(),"Managua","demo",(byte)2,25.08)); [Link](new Usuario("Melanie","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); [Link](new Usuario("Melanie2","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); [Link](new Usuario("Melanie3","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); [Link](new Usuario("Melanie4","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05)); } }
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina42/70
8 Mensajedeerrorpersonalizados
8.1 Listademensajepersonalizados
[Link]:
<application> <resource-bundle> <base-name>[Link]</base-name> <var>ErrMsg</var> </resource-bundle> </application>
Ensrc/curso/[Link]:
test=Hola Mundo
Uso:#{[Link]} HolaMundo
8.2 Pginadeerrorpersonalizada:
[Link] :
<h:head> <title>Pagina de error</title> </h:head> <h:body> <h2>Un error fata ocurio!</h2> <a href="#{[Link]()}/faces/[Link]">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>
[Link]:
<error-page> <location>/[Link]</location> </error-page>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina43/70
9 Convertidores
9.1 Quesunconvertidor?
Unconvertidorseutilizaparadarformato"agradable"aunobjeto,textoquesemostrar. Porejemplo,sideseaparamostrarunafechaenJSPsepuedeutilizarunconvertidordeformatodela fechaaunformatomascomnparaelusuario,como"10/03/2005". [Link], [Link] entradanocoincideenelformato,puedelanzarunaexcepcinenelconvertidorquesemuestraal [Link].
9.2 Usodelosconvertidores
ElconvertidorepuedeserfijadodentrodeJSP,oustedpuederegistrarelconvertidormediante programacin. UstedpuederegistrarunconvertidorconJSPenunadelastresmaneras: Especifiqueelidentificadordeconvertidorconlapropiedadconverterdentrodelaetiqueta.
<h:outputText value="#{[Link]}" converter="myConverter">
Juntar<f:converter>dedentrodelaetiquetadelcomponente.
<h:outputText value="#{[Link]}"> <f:converter converterId="myConverter"/> </ h: outputText>
Juntarlaetiquetapersonalizadadelconvertidordentrodeunaetiquetadelcomponente.
<h:outputText value="#{[Link]}"> <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,[Link] paratodoslostiposbsicos:Long,byte,integer,short,Character,Double,Float,BigDecimal, BigIntegeryBoolean.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina44/70
ConvertidorDateTime
ElconvertidorDateTimeadmiteatributos,comoeltipoodatestyle,[Link] listaacontinuacinmuestralosatributosquepuedeutilizarconelconvertidordeDateTime. Nombredelatributo datestyle Descripcin Especificaelestilodeformatoparalaporcindela [Link] sondeshort,medium(pordefecto),[Link] esvlidosiseestableceeltipodeatributo. Especificaelestilodeformatoparalaporcinde [Link] sondeshort,medium(pordefecto),[Link] esvlidosiseestableceeltipodeatributo. [Link] establece,horadelmeridianodeGreenwich(GMT) seutilizar. Elidiomalocalautilizarparalavisualizacinde [Link] Elmodelodeformatodefechautilizadopara [Link] tipodepropiedad. Especificasisedebemostrarlafecha(date),hora (time)oambas(both).
timeStyle
timezone
locale pattern
type
9.3.2
ConvertidordeNmero
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina45/70
[Link] atributospermitencontrolardemaneraprecisacmosemuestraunnmero. Nombredelatributo CurrencyCode Descripcin Especificaunperododetresdgitosdelcdigode monedainternacionalcuandoelatributotipoesla [Link]. Especificaunsmboloespecfico,como"$",quese utilizacuandoeltipodeatributoesmoneda. UtiliceesteoCurrencyCode. Truesiunsmbolodeagrupacin,como","o"" [Link] true. Verdaderosislolaparteenteradelvalorde entradadebeserprocesado(todoslosdecimales serignorado).Elvalorpredeterminadoesfalso. Ellocalqueseutilizarparalavisualizacinde [Link] actual Unacantidadmnimadedecimalesquesevea. Mximanmerodedecimalesquesevea. Unacantidadmnimadedgitosenterospara mostrar. Mximanmerodedgitosenterosparamostrar. Elmodelodeformatodecimalparaconvertireste [Link]. Eltipodenmero,porelnmero(number,por defecto),lamoneda(currency),oporciento (percent).Usaresteoelpatrndeesteatributo.
CurrencySymbol
groupingUsed
integerOnly
locale
[Link]: <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="#{[Link]}"> <f:convertDateTime type="date" dateStyle="short" /> </h:outputText> <p> Mostrar slo el tiempo y el timeStyle es <i> full </i> </p> <h:outputText value="#{[Link]}"> <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="#{[Link]}"> <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
[Link]
CursodeJSP
<h:outputText value="#{[Link]}"> <f:convertDateTime type="both" dateStyle="short" /> </h:outputText> <p> Muestra una fecha con el patrn de <i> [Link] HH: mm </i> </p> <h:outputText value="#{[Link]}"> HH:mm" pattern="[Link] <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="#{[Link]}"> <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> [Link] </i> </p> <h:inputText value="#{[Link]}"> <f:convertDateTime pattern="[Link]" /> </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="#{[Link]}"> <f:convertNumber maxIntegerDigits="3" /> </h:outputText> <p> Tipo de pantalla es <i> moneda </i> y la CurrencySymbol es <i> $ </i> </p> <h:outputText value="#{[Link]}"> <f:convertNumber type="currency" currencySymbol="$"/> </h:outputText> <p> Tipo de pantalla es <i> por ciento </i> </p> <h:outputText value="#{[Link]}"> <f:convertNumber type="percent"/> </h:outputText> Mostrar <p> mximo de 4 dgitos de fraccin </p> <h:outputText value="#{[Link]}"> <f:convertNumber maxFractionDigits="4"/> </h:outputText> <p> Mostrar el nmero de patrones <i> # # # 0,00% </i> </p> <h:outputText value="#{[Link]}"> <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="#{[Link]}"> <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="#{[Link]}"> <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
[Link]
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
[Link]
CursodeJSP
char[] chars = [Link](); if ([Link] == 15) { spaces = amex; } convVal = ""; for (int k = 0; k < [Link]; k++) { convVal += chars[k]; if (spaces[kSpace] == k) { convVal += ' '; kSpace++; } } [Link]("[Link]: '" + 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="#{[Link]}" converter="CCNumberConverter"> </h:inputText> <h:commandButton value="Send" /> </h:form> </h:body>
Pagina48/70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina49/70
10Validadores
10.1UsoyCreacindelosvalidadores
Cmogarantizarqueelusuariodelaaplicacinnopuedecompraunnmeronegativodelibros?En realidad,[Link] comprobarlavalidezdeunnmerodetarjetadecrdito?Estassontareasparalosvalidadores. JSFcuentaconcuatrotiposdemecanismosdevalidacin: Integradaenloscomponentes Validacinaniveldeaplicacin Componentesdevalidacinpersonalizada ValidacinpormtodosdeBackedBeans
10.2Validadoresincluidos
JSFproporcionalossiguientestrescomponentesdevalidacin: F:validateDoubleRange:[Link] aplicablesalosvaloresquesepuedenconvertiraundoble. f:validateLength:Sevalidaquelalongituddelacadenadeentradaestdentrodeunrango determinado. F:validateLongRange:[Link] aplicablesalosvaloresquesepuedenconvertiraunlong. Parautilizarestoscomponentesdevalidacin,simplementeanidardentrodelah:inputquenecesita [Link],paracomprobarqueslocantidadespositivassepuedenintroducir:
<h:inputText id="quantity" value="#{[Link]}" 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 [Link],antesde aceptarunpedido,legustaracomprobarquesubanconotieneenlalistanegraelnmerodetarjetade crdito. Sideseahaceralgunasolicituddevalidacinaniveldeaplicacin,puedeinsertarsulgicaal principiodelmtodollamadaporelformularioyhacerquelaactualizacindebasesdedatosyel [Link],tambinpodra enviarunmensajeparaelusuario,comosemuestraenlaspocaslneassiguientes:
FacesContext ctxt = [Link](); FacesMessage mess = new FacesMessage(); [Link](FacesMessage.SEVERITY_ERROR); [Link]("Este es el mensaje de error principal"); [Link]("Este es el detalle"); [Link](null, mess);
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina50/70
Elmensajecreadodeestamaneraesunmensajeglobal,novinculadaaningncomponenteen particular,ysepuedevisualizarconelcomponenteJSFsiguiente:
<h:messages globalOnly="true" styleClass="error"/>
10.4Validadorespersonalizados
Enelcapitulosobrelosconvertidores,[Link] implementarunvalidadorpersonalizado,esunprocesocasiidntico: [Link]. [Link]. DentrodelaaplicacindeJSF,consulteelatributovalidatordelcomponente. Supongamosquedeseaasegurarsedequeelcrdito,fechadecaducidaddetarjetaproporcionadaporel usuarioduranteelpedidoestenelformatomm/aoyquelatarjetanohacaducado.
package [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; @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 ([Link] != 2) { messS = "Se espera MM/AA!"; } else { int month = 0; int year = 0; try { month = [Link](fields[0]); year = [Link](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 = [Link]([Link]) + 1; int thisYear = [Link]([Link]) - 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,[Link]@FacesValidator.
<validator> <validator-id>CCExpiryValidator</validator-id> <validator-class>[Link]</validator-class> </validator>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina51/70
Uso:
<h:form> <h:inputText id="ccexpiry" value="#{[Link]}" 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); [Link]([Link](cntx), mess); }
Ejemplo:
<h:inputText id="ccexpiry" value="#{[Link]}" rendered="true" requiredMessage="No puede estar vacio" validator="#{[Link]}"> </h:inputText> <h:message for="ccexpiry" errorClass="error" />
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina52/70
11Componentespersonalizados
11.1CreacindecomponentespersonalizadosparaJSP
Lafuncionalidaddeuncomponentesecentraenlaconversindelosometidoporunusuario(esdecir,los parmetrosHTTPdelapeticin)avaloresdeloscomponentes(atravsdelmtododedecodificacin duranteApplyRequestValues)ylaconversindevaloresdeloscomponentesdevueltaaHTML(a travsdelmtododecodificarduranteRenderResponse). CuandosediseauncomponenteJSF,sepuedeoptarporcambiarlacodificacinydecodificacindeuna [Link] procesadorparaelmismocomponente,[Link] continuacin,tienenelmismocomportamientoasociadoscondiferentesmanerasdeleerlosdatosdela solicituddeylaescrituraalarespuesta. Engeneral,teniendoencuentaqueJSFesdecdigoabierto,podraconsiderarlamodificacindeun componenteexistenteenlugardedesarrollarunnuevo,oquizs,graciasalaseparacindelos componentesylosrenderer,lamodificacindeunrendererexistentes. [Link],y [Link], sinembargo,ustedprobablementevaapreferirampliaruncomponenteyaexistenteo,porloporlo menos,laclaseUIComponentBase,queproporcionaimplementacionespordefectodetodoslosabstractos [Link],ustedslotienequedesarrollarcdigoparalosmtodos [Link]. Paracompletarelpanoramadeloqueustednecesitahacerparatenersucomponentepersonalizado,es [Link] [Link]. Enresumen,paradesarrollaruncomponentepersonalizado,tienequeiratravsdelospasossiguientes, aunquenonecesariamenteenesteorden: CrearunaclasedecomponentesquelassubclasesUIComponentporlaampliacindeuna existentecomponente. [Link]. CrearunaclasedeprocesadorquesubclasaRendereryreemplazalosmtodosdecodificaciny descodificacin. [Link]. CrearunaetiquetapersonalizadaquesubclasaUIComponentELTag. CrearunTLDparalaetiquetapersonalizada. Unaltimapalabraacercadeloscomponentesylosrenderers:amenosqueustedrealmentepiensaque ustedvaalareutilizarelmismocomponenteparadiferentesaplicaciones,teharslavidamuchoms fcilsimantieneselrendererdentrodelcomponente. Enprimerlugar,vamosaverloquesedebehacercuandoestnseparados,yacontinuacinveremos cmomantenerlosjuntos. Lemostraremoscmodesarrollaruncomponentequecombinalafuncionalidaddelostrescomponentes estndarnecesariosparaaceptarlaentradadeunusuario:unaetiquetaqueexplicaloqueseespera,el
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina53/70
campodetextoparaaceptarlaentrada,[Link] palabras,vamosamuestracmoreemplazarelcdigodeJSFsiguientes:
<h:outputText value="Nombre de Contacto"/> <h:inputText id = "nombre" required = "true" value = "# {[Link]}" requiredMessage = "El valor es necesario!" /> <h:message for="name" styleClass="error"/>
conestecomponentepersonalizado:
<curso:inputEntry label="Nombre de Contacto" required = "true" value = "#{[Link]}" errorStyleClass ="error" requiredMessage = "El valor es necesario!" />
ElComponente
[Link]. InputEntryComponenteslainicializacindeloscomponentes. [Link] propiedaddelcomponentesedefineenestearchivoeslaetiqueta(label).Estosedebeaqueesta ampliacinUIInput,queseencargadedefinirtodoloquetienequeverconelcampodeentrada. SeutilizaelmtodogetFamilyparaencontrartodoslosrenderersasociadosconestecomponente. Estamosplaneandocrearunsoloprocesador,perosiguesiendoapropiadaparadefinirunafamiliams bienqueheredandelafamiliadeUIInput,porquenosepodautilizarrenderizadoresUIInputcon InputEntryComponent. [Link], [Link] matrizylodevuelve,[Link], lodescomprime,[Link] sonsiempredelegadas.
package [Link]; import [Link]; import [Link]; import [Link]; @FacesComponent("[Link]") public class InputEntryComponent extends UIInput { private String label; public InputEntryComponent() { [Link]("[Link]"); } public String getLabel() { return label; } public void setLabel(String label) {
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
[Link] = label; } // Overridden methods public String getFamily() { return "[Link]"; } public void restoreState(FacesContext ctxt, Object state) { Object val[] = (Object[]) state; [Link](ctxt, val[0]); label = (String) val[1]; } public Object saveState(FacesContext ctxt) { Object val[] = new Object[2]; val[0] = [Link](ctxt); val[1] = label; return ((Object) val); } }
Pagina54/70
11.1.2
Renderer
[Link],sedefineunaclaseque [Link]. Primerovamosasobreescribirtresmtodos,decode,encodeBegin,ygetConvertedValue. LanicapropiedadqueseagregaaUIInputeslaetiqueta,queelusuariopuedemodificar. Porlotanto,sloesnecesarioparadecodificarelcampodeentrada. ElprocesodedecodificacinocurreenlafasedeApplyRequestValues(fase2). Elprocesodecodificacinrequieremstrabajoqueelprocesodedecodificacin,porquetiene paraenviaralarespuestaHTTPlostrescomponentesquesecombinanparaformar [Link](fase9). [Link] elmtododestartElement,escribelaetiquetaconunsimplemtododeescritura,escribeunasterisco, peroslosiserequiereelcomponente,ysecierraelelementodelaetiquetaconelmtodode endElement. Elresultadoesalgoascomo<label>Nombre
de contacto * </label>.
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina55/70
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
[Link]("label"); } private void encodeInput(ResponseWriter respWr, InputEntryComponent cmp) throws IOException { FacesContext ctxt = [Link](); [Link]("input", cmp); [Link]("type", "text", "type"); [Link]("id", [Link](ctxt), "id"); [Link]("name", [Link](ctxt), "name"); if ([Link]() != null) { [Link]("value", [Link]().toString(), "value"); } [Link]("input"); } private void encodeMessage(FacesContext ctxt, ResponseWriter respWr, InputEntryComponent cmp) throws IOException { Iterator it = [Link]([Link](ctxt)); // Notice: an if instead of a while if ([Link]()) { FacesMessage mess = (FacesMessage) [Link](); if (![Link]()) { String errorStyleClass = (String) [Link]().get("errorStyleClass"); [Link]("span", cmp); [Link]("class", errorStyleClass, "class"); [Link]([Link]()); [Link]("span"); } } } }
Pagina56/70
Pararegistrarelrenderer,usaunaanotacin@FacesRendereroinsertalaslneassiguientesenfaces [Link]:
<render-kit> <renderer> <component-family>[Link]</component-family> <renderer-type>[Link]</renderer-type> <renderer-class>[Link]</renderer-class> </renderer> </render-kit>
11.1.3
Tag
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
// Setters public void setErrorStyleClass(ValueExpression errorStyleClass) { [Link] = errorStyleClass; } public void setLabel(ValueExpression label) { [Link] = label; } public void setRequired(ValueExpression required) { [Link] = required; } public void setRequiredMessage(ValueExpression requiredMessage) { [Link] = requiredMessage; } public void setValue(ValueExpression value) { [Link] = value; } // Overridden methods public String getComponentType() { return "[Link]"; } public String getRendererType() { return "[Link]"; } protected void setProperties(UIComponent cmp) { [Link](cmp); if (errorStyleClass != null) { [Link]("errorStyleClass", errorStyleClass); } if (label != null) { [Link]("label", label); } if (required != null) { [Link]("required", required); } if (requiredMessage != null) { [Link]("requiredMessage", requiredMessage); } if (value != null) { [Link]("value", value); } } public void release() { [Link](); errorStyleClass = null; label = null; requiredMessage = null; value = null; required = null; }
Pagina57/70
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.1" xmlns="[Link] xmlns:xsi="[Link] xsi:schemaLocation="[Link] [Link] <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
[Link]
CursodeJSP
<name>inputEntry</name> <tag-class>[Link]</tag-class> <attribute> <name>id</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>value</name> <required>false</required> <deferred-value><type>[Link]</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>[Link]</type></deferred-value> </attribute> <attribute> <name>errorStyleClass</name> <required>false</required> <deferred-value><type>[Link]</type></deferred-value> </attribute> <attribute> <name>requiredMessage</name> <required>false</required> <deferred-value><type>[Link]</type></deferred-value> </attribute> </tag> </taglib>
Pagina58/70
Conesto,ustedestarpreparadoparautilizarelnuevohJSFcomponentedeinterfazdeusuario: [Link]: elementorazeneliniciodeeldocumentoJSP:<%@taglib prefix="curso" uri="WEB-INF/tlds/[Link]"%> Ladesventajadelnuevocomponenteencomparacincontenerdemaneraindependienteloslabel,input, ymessage,esquenoesposiblealinearloscamposdeentradavertical. Ahoraqueyaesthecho,ustedpuedepreguntar,"Porqucurso:inputEntrysloadmitenunatributo, mientrasqueh:inputTexttienecomo40?"[Link] msatributos,talescomoeltamaodelcampodeentrada,queh:inputTextpasaaHTML,peronuestro objetivoerasercapazdereemplazarconuncomponentenicodelostresloscamposenqueseutilicen. Msatributosdeloestrictamentenecesarioslogeneraramscdigosinaadirnadatil. 11.1.4
InlineRenderer
Esposibleincluirlafuncionalidadderendererdentrodelaclasedecomponentes,demodoqueel componenteserepresenta(render)[Link],amenosqueusted planeautilizarmsdeunprocesadorconelmismocomponente,esposiblequenosevaamolestar creandorentderersseparados. Parahacercurso:inputEntryconautorepresentacin,tienequehacerlosiguiente: [Link] [Link] borrarelarchivoderenderer. [Link]. [Link]. [Link].
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina59/70
Luego,remplazatodosloscmpyieCmpconthis. SenecesitaelmtodoencodeEndparareemplazarelmtodoenUIComponentBase,quearrojaun [Link],ustednonecesitahacernadaenencodeEnd,solamentetienesque escribirunmtododevaco:public void encodeEnd(FacesContext context) throws IOException { } Tengaencuentaqueslonecesitaestemtodocuandoseejecutauncomponenteensmismo,nocuando seutilizaunaclasedeprocesadorseparado. [Link],elmtododevuelvegetRendererType"[Link]".Sielmtodoconsiste enutilizarsusmtodosderepresentacininterna,[Link], [Link].
11.2ComponentespersonalizadosparaFacelets
ConlosFaceletsesmassencillalacreacindecomponentespersonalizados. NohaynecesidaddecrearunaclaseJava,solonecesitamosarchivosXHTML(yXML). HayquecrearunequivalentealTLDparafacelets(.xml),[Link] [Link]:
<context-param> <param-name>[Link]</param-name> <param-value>/WEB-INF/facelets/[Link]</param-value> </context-param>
[Link]:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "[Link] <facelet-taglib> <namespace>[Link] <tag> <tag-name>pie</tag-name> <source>../include/[Link]</source> </tag> </facelet-taglib>
[Link]:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[Link] <html xmlns="[Link] xmlns:h="[Link] xmlns:ui="[Link] <h:body> <ui:component> <h:panelGroup styleClass="footer"> <h:outputText value="Docente: Cedric Simon - "/>
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
<h:outputLink value="[Link] </h:panelGroup>. </ui:component> </h:body> </html>
Pagina60/70
custom_component.xhtml:
<h:form> <curso:inputEntry label="Nombre de Contacto" required = "true" value = "#{[Link]}" 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
[Link]
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
[Link],que tienenunaparteorientadaaAjax. Losmarcosdetrabajotepermitenusarcdigos/efectosconJavascript/Ajaxsinnecesidaddeentender todoelcdigoquevaatrs. Muyprobablementeestarsinteresadoenvariosmarcosdetrabajo,ytrabajarasconvariosalmismo tiempo,yaqueposiblementeningunotienetodoloquequieres. Ademas,elobjetivodeestecursoesqueseascapazdedesarrollartupropiomarcodetrabajoademasde usarlosterceros. Algunosmarcosdetrabajo'libres': Rico([Link] [Link]([Link] Mootools([Link] OAT([Link] ZeroKonfig([Link] ...
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
Pagina62/70
13AjaxconJava
13.1LlamadaAjaxconHTML
Coneljavascript'corriente',podemosmodificarlaformayelcontenidodeunapgina,perosin comunicarconfuentesexternas. Ajaxpermitecomunicarseconfuentesexternas,yaseaarchivosdetexto,pginasHTML,PHP,JSP, servlet,ocualquiertypodearchivoremoto. Parallamaraunapginaremotasinrefrescarlapginacorriente,hayquecrearunaconsultausando unafuncin,queesdiferentesiusasInternetExplorer(new ActiveXObject("[Link]"))uotro navegadorcomoFirefox(new XMLHttpRequest( )). Unavezlaconsultalista,seusaelmetodo'open'delaconsultacon3parmetros:elmodode transmisin(generalmentegetopost)[Link] 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
[Link]
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 ([Link]) { req = new XMLHttpRequest( ); } else if ([Link]) { req = new ActiveXObject("[Link]"); } [Link]("Get",url,true); [Link] = callback; [Link](null); } function callback( ) { if ([Link]==4) { if ([Link] == 200) { [Link]('texto').innerHTML = [Link]; } } }
Pagina63/70
nuevo_texto.txt:
<h2>Este es el texto desde el archivo en el servidor!</h2>
13.2LlamadaAjaxconJava
Ahorahemosllamadounapginadetexto'fijo'[Link],o lalistadeURLdelabasededatos,[Link]:permitellamaraun Servletopginajsp,ytraerelcontenidodelservlet. 13.2.1
ServletparaAjax
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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([Link]); if ([Link]) { req = new XMLHttpRequest( ); } else if ([Link]) { req = new ActiveXObject("[Link]"); } [Link]("Get",url,true); [Link] = callback; [Link](null); } function callback( ) { if ([Link]==4) { if ([Link] == 200) { [Link]('empList').innerHTML = [Link]; } } } function focusIn( ) { [Link]("no").focus( ); }
[Link]:
package [Link]; import import import import import import [Link]; [Link]; [Link]; [Link]; [Link]; [Link];
public class GetRandomNumber extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { [Link]("text/html;charset=UTF-8"); PrintWriter out = [Link](); try { String no=[Link]("no"); double rand = [Link](); String ajaxData ="El numero al hazar es "+rand+", multiplicado por "+no+" = "+ (rand*[Link](no)); [Link](response, ajaxData); } finally { [Link](); } } public void writeResponse(HttpServletResponse resp, String output) throws IOException { [Link]("text/plain"); [Link]("Cache-Control", "no-cache"); [Link]("Content", "text/html;charset=iso-8859-1"); [Link]().write(output); }
[Link]:
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
CursodeJSP
... <servlet> <servlet-name>GetRandomNumber</servlet-name> <servlet-class>[Link]</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
[Link]
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 [Link] [Link] ( "<script language=\"JavaScript\" src=\"" contextPath + + "/js/[Link]\"> </ script>");
14.3.1 14.3.2
Pros
Arquitecturaslida Usuariofinal/desarrolladordeaplicacioneslopuedeutilizarfcilmentesintratarconJS.
Contras
Puedeserunretoparaconstruirdesdeunpuntodevistatcnico(tienesqueserun/experto clienteAjax,ascomounServerside/expertoenJSF)
Versin1.0 Reproduccinprohibida
CopyrightCdricSimon,2009
[Link]
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? [Link] VentajasdeunenfoqueespecficoJSFAjax JSFespecfico Delladodelcliente: UstedpuedeactualizarloselementosJSF(h:outputText,h:inputText,h:selectOneMenu,etc). UstednotienequeescribirJavaScript Delladodelservidor LosbackedbeansestndisponibleenlasllamadasAjax Ustednotienequeescribirservletsyanalizarparmetros
CopyrightCdricSimon,2009
Versin1.0
Reproduccinprohibida
[Link]
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>
[Link]
CursodeJSP
Pagina69/70
Ejemplo:
<h:form prependId="false" id="form"> <h1>Ajax demo 1</h1> <h:commandButton action="#{[Link]}" 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@y@[Link],estossonms [Link]. Amenosqueutilice<h:formprependId="false"/>,elREALIDesFormID:elementId. [Link] execute:Especificacindeloselementosaprocesarenservidor ResumendeCdigo
<f:ajax render="" execute="" />
Idea UnidentificadorolistadeidentificadoresJSFseparadaporespacioquedebeserenviadaalservidor [Link],unh:inputText,queserprocesadonormalmente(setters,validacin, etc). Detalles Hay4valoresespeciales:@this@form,@none@all @[Link]:[Link]. @[Link]:formincluyendoaf:[Link]. @[Link] evalen. @[Link]. Ejemplo:
<h:form> <h:panelGrid columns="2"> Numero a multiplicar : <h:inputText id="a" size="5" value="#{AjaxDemo.a}"> </h:inputText> <h:commandButton action="#{[Link]}" value="Clic"> <f:ajax render="respuesta" execute="@form"></f:ajax> </h:commandButton> </h:panelGrid> <hr></hr> <h:outputText id="respuesta" value="#{[Link]}" /> </h:form>
[Link]
CursodeJSP
Pagina70/70
Idea [Link]"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="#{[Link]}" 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>
[Link]