com
Ing.CedricSimonTel:22680974Cel:88882387Email: c e d r i c @ s o l u c i o n j a v a . c o m Web:www.solucionjava.com
<Hibernate3>
Java Server Faces 2
con Hibernate 3
Manualdelalumno
<JSF2>
Curso de
Versin1.1
Docente:CdricSimon
CursodeJSF2conHibernate3 Pagina2/68
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 Crear una aplicacin en NetBeans............................................................................................................................7
2.4 Crear una aplicacin en Eclipse................................................................................................................................8
2.5 Primera pgina JSF...................................................................................................................................................9
2.6 Recuperando informaciones del cdigo Java.........................................................................................................11
3 Aplicaciones JSF.............................................................................................................................................................12
3.1 Qu es una aplicacin JavaServer Faces?............................................................................................................12
3.2 Modelo de componentes de interfaz de usuario.....................................................................................................12
3.3 Las clases de componentes de interfaz de usuario................................................................................................12
3.4 Conversin de Modelo.............................................................................................................................................15
3.5 Evento y el oyente de modelo..................................................................................................................................16
1.1 Validacin.................................................................................................................................................................17
3.6 Modelo de navegacin..............................................................................................................................................17
3.6.1 Configuracin de reglas de navegacin..............................................................................................................17
3.6.2 Reglas de navegacin implcitas.........................................................................................................................19
3.7 Backed Beans............................................................................................................................................................20
3.7.1 Crear una clase de backed bean...........................................................................................................................20
3.7.2 Configuracin de un Bean...................................................................................................................................21
3.8 Usando el EL unificada para referenciar Backed beans......................................................................................21
3.8.1 El Ciclo de Vida de una pgina JavaServer Faces..............................................................................................22
3.8.2 Fase de restauracin de vista...............................................................................................................................24
3.8.3 Fase de aplicacin de valores..............................................................................................................................24
3.8.4 Fase de validaciones de proceso..........................................................................................................................25
3.8.5 Fase de actualizacin de valores de modelo........................................................................................................25
3.8.6 Fase de invocacin de la aplicacin....................................................................................................................26
3.8.7 Fase de creacin de la respuesta..........................................................................................................................26
4 Formularios......................................................................................................................................................................27
4.1 Formulario sencillo..................................................................................................................................................27
4.2 Formulario mas complejo........................................................................................................................................28
5 HtmlDataTable.................................................................................................................................................................30
6 Mensaje de error personalizados.....................................................................................................................................35
6.1 Lista de mensaje personalizados.............................................................................................................................35
6.2 Pgina de error personalizada:...............................................................................................................................35
7 Convertidores...................................................................................................................................................................36
7.1 Qu es un convertidor?..........................................................................................................................................36
7.2 Uso de los convertidores..........................................................................................................................................36
7.3 Convertidores incluidos...........................................................................................................................................36
7.3.1 Convertidor DateTime.........................................................................................................................................37
7.3.2 Convertidor de Nmero.......................................................................................................................................37
7.4 Convertidores personalizados.................................................................................................................................39
8 Validadores.......................................................................................................................................................................42
8.1 Uso y Creacin de los validadores..........................................................................................................................42
8.2 Validadores incluidos...............................................................................................................................................42
8.3 Validacin a nivel de aplicacin..............................................................................................................................42
8.4 Validadores personalizados.....................................................................................................................................43
8.5 Validador en Backed Bean......................................................................................................................................44
9 Componentes personalizados...........................................................................................................................................45
9.1 Creacin de componentes personalizados para JSF.............................................................................................45
9.1.1 El Componente....................................................................................................................................................46
9.1.2 Renderer..............................................................................................................................................................47
9.1.3 Tag.......................................................................................................................................................................49
9.1.4 Inline Renderer ...................................................................................................................................................51
9.2 Componentes personalizados para Facelets..........................................................................................................52
10 Componentes JSF para Ajax.........................................................................................................................................54
10.1 Cmo JSF y Ajax pueden trabajar juntos?.......................................................................................................54
10.2 Utilizar el (Ajax) JavaScript en su pgina JSF....................................................................................................54
10.2.1 Pros....................................................................................................................................................................54
10.2.2 Contras..............................................................................................................................................................54
10.3 Poner su cdigo de Ajax JavaScript en los componentes JSF............................................................................54
10.3.1 Pros....................................................................................................................................................................54
10.3.2 Contras..............................................................................................................................................................54
10.4 Aprovechar la creciente coleccin de marcos de trabajo Ajax JSF..................................................................55
10.4.1 Pros....................................................................................................................................................................55
10.4.2 Contras..............................................................................................................................................................55
10.5 Utilizar el nuevo tag <f:ajax>................................................................................................................................55
10.5.1 Pros....................................................................................................................................................................55
10.5.2 Contras..............................................................................................................................................................55
10.5.3 Por qu el Ajax en JSF?...................................................................................................................................55
10.5.3.1 Ventajas de un enfoque especfico JSF Ajax.............................................................................................55
10.5.4 Uso del tag <f:ajax>..........................................................................................................................................56
10.5.4.1 Ejemplo sencillo.........................................................................................................................................56
10.5.4.2 renderer: Especificacin de los elementos de actualizacin en el cliente..................................................57
10.5.4.3 execute: Especificacin de los elementos a procesar en servidor..............................................................57
10.5.4.4 event: mencionar a cual evento de usuario debe disparar la llamada Ajax................................................58
11 Hibernate........................................................................................................................................................................59
11.1 Introduccin............................................................................................................................................................59
11.2 Instalacin...............................................................................................................................................................59
11.3 Configuracin.........................................................................................................................................................59
11.4 Utilizacin...............................................................................................................................................................59
11.4.1 EJB3 para la table city.......................................................................................................................................59
11.4.2 HibernateHelper................................................................................................................................................60
11.4.3 Prueba de uso de Hibernate desde Java.............................................................................................................61
1 Introduccinalcurso
1.1 Objetivodeestecurso
EnestecursovamosaaprenderellenguajeJSFquenospermitircrearpginaswebdinmicas.
1.2 Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Estemanual
contieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumnodeberade
tomarnotaspersonalesparacompletasestemanual.
1.3 Ejerciciosprcticos
Paracaptarmejorlateora,seharnmuchosejerciciosconlosalumnos,paraprobarlateorayverificar
laintegracindelamateria.
Tambin,elalumnopodrcopiarsuscdigosenundisquetealfindelcursoparallevarse,confinde
seguirlaprcticaensuhogar.
1.4 Requisitosparaatenderaestecurso
UnabuenconocimientodeloslenguajesJava,JSP,HTML,yJavascriptesrequeridaparaseguireste
curso.LacreacinyelmanejodeobjetosJavaascomoelJSPestnconsideradacmoasimiladoantes
deempezarestecurso.
Sielalumnotienedificultadesenunuotrocapitulo,eldebesentirselibredepedirexplicaciones
adicionalesalprofesor.
Perosiaparecequeelalumnonoposeelosrequisitosmnimosparaestecurso,porrespetoalosotros
alumnosqueyaposeenestamateria,elalumnopodrasertrasladoparaotrocursoenelfuturo,cuando
elcumplirconlosrequisitos.
1.5 Soportedespusdelcurso
Sitienespreguntassobrelamateriadelcursoentusejerciciosprcticos,puedesescribirtus
preguntasacedric@solucionjava.com.
Parainformacionessobreotroscursos,visitaelsitiowebwww.solucionjava.com.
2 IntroduccinaJavaServerFaces
2.1 QueesJSF?
JavaServerFaces(JSF)esuntecnologayframeworkparaaplicacionesJavabasadasenwebque
simplificaeldesarrollodeinterfacesdeusuarioenaplicacionesJavaEE.
JSFusaJavaServerPages(JSP)comolatecnologaquepermitehacereldesplieguedelaspginas,pero
tambinsepuedeacomodaraotrastecnologascomoXUL.
JSFincluye:
UnconjuntodeAPIspararepresentarcomponentesdeunainterfazdeusuarioyadministrarsu
estado,manejareventos,validarentrada,definirunesquemadenavegacindelaspginasydar
soporteparainternacionalizacinyaccesibilidad.
Unconjuntopordefectodecomponentesparalainterfazdeusuario.
DosbibliotecasdeetiquetaspersonalizadasparaJavaServerPagesquepermitenexpresaruna
interfazJavaServerFacesdentrodeunapginaJSP.
Unmodelodeeventosenelladodelservidor.
Administracindeestados.
Beansadministrados.
LaespecificacindeJSFfuedesarrolladaporlaJavaCommunityProcess
VersionesdeJSF:
JSF1.0(11032004)lanzamientoinicialdelasespecificacionesdeJSF.
JSF1.1(27052004)lanzamientoquesolucionabaerrores.Sincambiosenlasespecificaciones
nienelrenderkitdeHTML.
JSF1.2(11052006)lanzamientoconmejorasycorreccindeerrores.
JSF2.0(12082009)ltimolanzamiento.
LasprincipalesimplementacionesdeJSFson:
JSFReferenceImplementationdeSunMicrosystems.
MyFacesproyectodeApacheSoftwareFoundation.
RichFaces,deJboss.Traecomponentesadicionalesparacrearaplicacionesmsricas
ICEfacesContienediversoscomponentesparainterfacesdeusuariosmsenriquecidas,tales
comoeditoresdetextoenriquecidos,reproductoresdemultimedia,entreotros.
jQuery4jsfContienediversoscomponentessobrelabasedeunodelosmspopularesframework
javascriptjQuery.
2.2 Servidoryherramientasutilizados
JavaServerFaces2.0esunatecnologanueva,ynecesitalasltimasversionesdelasherramientasde
desarrolloyservidoreswebparapoderusarla.
Aniveldeherramientas,lasmsutilizadassonEclipseyNetBeans.EnelcursousaremosNetBeans
versin6.8oarriba.
Aniveldeservidoresweb,servidorescomoApacheTomcat6+,Jboss5+,oGlassFish3soportanJSF2.0.
2.3 CrearunaaplicacinenNetBeans
SerequiereNetBeans6.8oarriba.Escogedecrearunnuevoproyecto.
AgregamoslalibreraJSF2.0alservidor.
Iniciamoselservidorwebydesplegamoslaaplicacin.
Miramoselresultadoenhttp://localhost:8080/CursoJSFwar
PorelmomentosoloestamosmirandoaunapginaJSP,nadadeJSF.
2.4 CrearunaaplicacinenEclipse
SerequiereEclipse3.6SR1oarriba.ParautilizarJboss6,serequiereenplugindeJbossTools.
EscogemosdecrearunnuevoproyectoWebDinmico.
Creamosunapginaindex.jspdebajodeWebContent,einiciamoselservidorwebdesplegandola
aplicacin.
Miramoselresultadoenhttp://localhost:8080/CursoJSF20
2.5 PrimerapginaJSF
LaspginasJSFsonpginasJSPconunaslibrerasTaglibadicionales.
Ademas,laspginasJSPnosellamandirectamente,perosellamanatravsdelmotorJSF.Parallamar
alapginaJSF,bastaconagregar/faces/anteselnombredelapgina.
http://localhost:8080/CursoJSFwar/faces/index.jsp
Comolovemos,unapginaJSP(sincdigoJSF)puedeserllamadasinproblema.
Laconfiguracindelreenvosepuedepersonalizar(porcarpetay/oporextensin)enweb.xml:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
CuandocreamosunanuevapginaJSF,podemos
escogerentredostiposdesintaxis:FaceletsoJSP.
FaceletsusaunformatoXML(XHTML),yJSP
usa...elformatoJSP.
ElJSFusapginasJSPoXHTML,unarchivode
configuracinXML(facesconfig.xml),yJava
POJO's.
ApartirdeJSF2.0,elformatoXMLeselestndar.
Agregamoselarchivodeconfiguracin.
Ahoraquetenemostodolisto,creamosnuestraprimerapginaJSF,usandolaopcinJSP:
<%@page contentType="text/html" pageEncoding="UTF-
8"%>
<%@taglib prefix="f"
uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h"
uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8"/>
<title>Mi primera pagina JSP</title>
</head>
<body>
<h1><h:outputText value="Hola
alumno!"/></h1>
</body>
</html>
</f:view>
ElcdigoJSFenlapginaJSPsedebeencontrarentrelostags<f:view>y</f:view>.
Comopodemosver,seincluyenlasdoslibrerasTaglib,queseusanluego,conlasetiquetas<f:>y<h:>.
SiusamoselformatoXHTML,todoelcontenidoseconsideraJSF.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h1>Hello alumno !!!</h1>
</h:body>
</html>
Labiblioteca<h:>contieneequivalentesdelHTML,yaseaformularios,botones,cajasdetexto,
imgenes,etc...
EnelfuturousaremoslosFaceletsynomaselJSP.
2.6 RecuperandoinformacionesdelcdigoJava
VamosacrearunaclaseJava(JSFBackedBean)HelloyllamarladesdenuestrapginaJSF.
package curso.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name="Hello")
@RequestScoped
public class Hello {
private String nombre="No inicializado";
public Hello() {
}
public String getNombre(){
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Ymodificamoslapginaindex.xhtml:
<h1>Hello #{Hello.nombre} !!!</h1>
EnelfuturousaremoselformatoXHTML,ynoincluirlasetiquetas<xml>,<DOCTYPE>ni<html>,
quesernlossiguientes:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
3 AplicacionesJSF
3.1 QuesunaaplicacinJavaServerFaces?
Ensumayorparte,unaaplicacinJavaServerFacesescomocualquierotraaplicacinJavaWeb.Una
aplicacintpicadeJavaServerFacesincluyelassiguientespiezas:
Unconjuntodepginasweb,enlaqueloscomponentesdeinterfazdeusuariosonestablecidos.
Unconjuntodebibliotecasdeetiquetasproporcionaretiquetasparaaadircomponentesde
interfazdeusuarioalapginaweb.
UnconjuntodeBackedBean,quesonJavaBeanscomponentesquedefinenlaspropiedadesy
funcionesdeloscomponentesdelainterfazdeusuarioenunapgina.
Opcionalmente,unoomsficherosdeconfiguracindelaaplicacinderecursos(comofaces
config.xmlfile),quedefinenlasnormasdenavegacindelapginayconfiguralosbeansyotros
objetospersonalizados,talescomocomponentespersonalizados.
Undescriptordedespliegue(unarchivoweb.xml).
Esposiblequeunconjuntodeobjetospersonalizadoscreadosporeldesarrolladordeaplicaciones.
Estosobjetospuedenincluircomponentespersonalizados,validadores,convertidores,olos
oyentes.
Unconjuntodeetiquetaspersonalizadaspararepresentarlosobjetospersonalizadosenla
pgina.
3.2 Modelodecomponentesdeinterfazdeusuario
JavaServerFacescomponentesdeinterfazdeusuario(UI)sonlosbloquesdeconstruccindevistade
JavaServerFaces.
JavaServerFacescomponentesdeinterfazdeusuariosonelementosconfigurables,reutilizablesque
componenlainterfazdeusuariodeaplicacionesJavaServerFaces.Uncomponentepuedesersimple,
comounbotn,opuedensercompuestos,talescomounatabla,compuestademltiplescomponentes.
LatecnologaJavaServerFacesproporcionaunaricaarquitecturadecomponentesflexiblesqueincluye
losiguiente:
UnconjuntodeclasesUIComponentparaespecificarelestadoyelcomportamientodelos
componentesdelainterfazdeusuario
Unmodeloderepresentacinquedefineelmododehacerloscomponentesdevariasmaneras
Uneventodeescuchayelmodeloquedefinecmomanejarloseventosdeloscomponentes
Unmodelodeconversinquedefinecmoregistrarlosconvertidoresdedatosenuncomponente
Unmodelodevalidacinquedefinecmoregistrarvalidadoresenuncomponente
Estaseccindescribebrevementecadaunadeestaspiezasdelaarquitecturadecomponentes.
3.3 Lasclasesdecomponentesdeinterfazdeusuario
LatecnologaJavaServerFacesproporcionaunconjuntodeclasesdecomponentesdeinterfazdeusuario
ydecomportamientoasociadosalasinterfacesqueespecificantodaslasfuncionalidaddelos
componentesdeinterfazdeusuario,comocomponentedeparticipacindelestado,manteneruna
referenciaalosobjetos,yuneventodeconduccinymanejodelaprestacindeunconjuntode
componentesestndar.
Lasclasesdecomponentessontotalmenteextensible,permitiendoalosescritoresdecomponentespara
crearsuspropioscomponentespersonalizados.Creacindecomponentespersonalizadosesuntema
avanzadoqueveremosmstarde.
Laclasebaseabstractaparatodosloscomponentesdeinterfazdeusuarioes
javax.faces.component.UIComponent.
LasclasesdecomponentesdeinterfazdeusuarioamplianlaclaseUIComponentBase,(unasubclasede
laclaseUIComponent),quedefineelestadopordefectoyelcomportamientodeuncomponentede
interfazdeusuario.Elsiguienteconjuntodeclasesdecomponentesdeinterfazdeusuarioseincluyecon
latecnologaJavaServerFaces:
UIColumn:RepresentaunasolacolumnadedatosenuncomponenteUIData.
UICommand:Representauncontrolqueiniciaaccionescuandoseactiva.
UIData:Representaunenlacededatosaunacoleccindedatosrepresentadosporunainstancia
dataModel.
UIForm:Encapsulaungrupodecontrolesqueenviardatosalaaplicacin.Estecomponentees
anlogoalaetiquetadeformularioenHTML.
UIGraphic:Muestraunaimagen.
UIInput:Tomadeentradadedatosdeunusuario.EstaclaseesunasubclasedeUIOutput.
UIMessage:Muestraunmensajedeerrortraducidos.
UIMessages:Muestraunconjuntodemensajesdeerrortraducidos.
UIOutcomeTarget:Muestraunhipervnculoenlaformadeunvnculoounbotn.
UIOutput:Muestralasalidadedatosenunapgina.
UIPanel:administraeldiseodesuscomponentesnio.
UIParameter:Representalosparmetrosdesustitucin.
UISelectBoolean:Permitealusuarioestablecerunvalorbooleanoenuncontroldeselecciny
anulacindeella.EstaclaseesunasubclasedelaclaseUIInput.
UISelectItem:Representaunsoloelementoenunconjuntodeelementos.
UISelectItems:Representatodounconjuntodeelementos.
UISelectMany:Permitealusuarioseleccionarvarioselementosdeungrupodeelementos.Esta
claseesunasubclasedelaclaseUIInput.
UISelectOne:Permitealusuarioseleccionarunelementodeungrupodeelementos.Estaclase
esunasubclasedelaclaseUIInput.
UIViewParameter:Representalosparmetrosdeconsultaenunasolicitud.Estaclaseesuna
subclasedelaclaseUIInput.
UIViewRoot:Representalarazdelrboldecomponentes.
AdemsdeampliarUIComponentBase,lasclasesdecomponentetambinaplicarunaomsinterfaces
decomportamiento,cadaunodeloscualesdefineciertocomportamientodeunconjuntodecomponentes
cuyasclasesimplementanlainterfaz.
Estasinterfacesdecomportamientosonlassiguientes:
ActionSource:Indicaqueelcomponentepuededesencadenaruneventodeaccin.Estainterfaz
estdiseadoparautilizarseconcomponentesbasadosenlatecnologaJavaServerFaces1.1_01
yversionesanteriores.
ActionSource2:ExtiendeActionSource,yporlotantoproporcionalamismafuncionalidad.Sin
embargo,sepermitealoscomponentesautilizarelELunificadocuandosehacereferenciaalos
mtodosparacontrolarloseventosdeaccin.
EditableValueHolder:ExtiendeValueHolderyespecificalascaractersticasadicionalesparalos
componentesmodificable,comolavalidacinyemitirloseventosdecambiodevalor.
NamingContainer:losmandatosquecadacomponentederazenestecomponentetieneuna
identificacinnica.
StateHolder:Indicaqueuncomponentehaestadoquedebenguardarentrelassolicitudes.
ValueHolder:Indicaqueelcomponentemantieneunvalorlocal,ascomolaposibilidadde
accederalosdatosenelniveldemodelo.
SystemEventListenerHolder:MantieneunalistadecasosSystemEventListenerparacadatipo
deSystemEventdefinidoporesaclase.
ClientBehaviorHolder:aadelacapacidaddeunirloscasosClientBehaviorcomounasecuencia
decomandosreutilizables.
CadaetiquetapersonalizadadefinidaenelestndarHTMLhacerkitsecomponedelafuncionalidadde
loscomponentes(definidosenlaclaseUIComponent)ylaprestacindeatributos(definidosporlaclase
Renderer).
ListadeetiquetasUIComponent
column Representa una columna de A column of data in an HTML Una columna de una
datos en un componente table tabla
UIData
commandButton Enva un formulario para la An HTML <input type=type> Un botn
solicitud element, where the type value
can be submit, reset, or
image
commandLink Enlaces a otra pgina o An HTML <a href> element Un hipervnculo
ubicacin en una pgina
accin
outputText Muestra una lnea de texto Plain text Texto sin formato
panelGrid Muestra una tabla An HTML <table> element with Una tabla
<tr> and <td> elements
panelGroup Grupos de un conjunto de A HTML <div> or <span> Una fila de una
componentes en uno de los element tabla de
padres
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 No aparece
una lista de elementos en un
componente UISelectOne
selectItems Representa una lista de A list of HTML <option> No aparece
elementos en un componente elements
UISelectOne
selectManyCheckbox Muestra un conjunto de A set of HTML <input> Un conjunto de
casillas de verificacin de elements of type checkbox casillas de
que el usuario puede verificacin
seleccionar varios valores
selectManyListbox Permite al usuario An HTML <select> element Un cuadro de lista
seleccionar varios elementos
de un conjunto de elementos,
todos muestran a la vez
selectManyMenu Permite al usuario An HTML <select> element Un cuadro combinado
seleccionar varios elementos desplazable
de un conjunto de elementos
selectOneListbox Permite a un usuario para An HTML <select> element Un cuadro de lista
seleccionar un elemento de
un conjunto de elementos,
todos muestran a la vez
selectOneMenu Permite a un usuario para An HTML <select> element Un cuadro combinado
seleccionar un elemento de desplazable
un conjunto de elementos
selectOneRadio Permite a un usuario para An HTML <input type=radio> Un conjunto de
seleccionar un elemento de element botones de radio
un conjunto de elementos
3.4 ConversindeModelo
UnaaplicacinJavaServerFaces,opcionalmente,sepuedeasociarconuncomponentedeservidorde
datosdeobjetossecundarios.EsteobjetoesuncomponenteJavaBeans,llamadoBackedBean.Una
aplicacinobtieneyestableceelobjetodedatosparauncomponentellamandoalaspropiedadesde
objetoapropiadoparaesecomponente.
Cuandouncomponenteestasociadoaunobjeto,laaplicacintienedospuntosdevistadelosdatosdel
componente:
Elpuntodevistadelmodelo,enelqueserepresentanlosdatoscomotiposdedatos,talescomo
intolong.
Lavistadepresentacin,enelqueserepresentanlosdatosdeunamaneraquepuedeserledoo
modificadoporelusuario.Porejemplo,unjava.util.Datepuedeserrepresentadacomouna
cadenadetextoenelformatomm/dd/aaocomounconjuntodetrescadenasdetexto.
LaimplementacindeJavaServerFacesconvierteautomticamentedatosdeloscomponentesentre
estosdospuntosdevistacuandolapropiedaddebeanasociadosconelcomponentedeunodelostipos
soportadosporlosdatosdelcomponente.
Porejemplo,siuncomponentedeUISelectBooleanseasociaconunapropiedaddebeande
java.lang.Booleantipo,laimplementacinJavaServerFacesseconvertirautomticamentelosdatosdel
componentedelacadenaenBoolean.Adems,algunosdatosdeloscomponentesdebenestarvinculadas
alaspropiedadesdeuntipoparticular.Porejemplo,uncomponenteUISelectBooleandebeestar
enlazadoaunapropiedaddetipobooleanojava.lang.Boolean.
Avecespuedequedeseeconvertirlosdatosdeuncomponenteauntipodistintodeuntipoestndar,o
puedequedeseeconvertirelformatodelosdatos.Parafacilitaresto,latecnologaJavaServerFacesle
permiteregistrarlaaplicacinConverterencomponentesUIOutputycomponentescuyasclases
UIOutputsubclase.SiseregistralaaplicacinConverterenuncomponente,laaplicacinConverter
conviertelosdatosdelcomponenteentrelosdospuntosdevista.
PuedeutilizarlosconvertidoresestndarsuministradosconlaimplementacinJavaServerFacesocrear
supropioconvertidorpersonalizado.Lacreacindeconvertidorpersonalizadoesuntemaavanzadoque
severmsadelante.
3.5 Eventoyeloyentedemodelo
JavaServerFaces2.0definetrestiposdeeventos:loseventosdeaplicacin,loseventosdelsistemaylos
datosdeeventosdemodelo.
Eventosdeaplicacinestnvinculadosaunaaplicacinenparticularysongeneradosporun
UIComponent.Ellosrepresentanelestndardeeventosdisponiblesenversionesanterioresdela
tecnologaJavaServerFaces.
Unobjetodeeventoidentificaelcomponentequegenereleventoyalmacenainformacinsobreel
evento.Parasernotificadodeunevento,unaaplicacindebeproporcionarunaimplementacindela
clasedeescuchaydeberegistrarloenelcomponentequegeneraelevento.Cuandoelusuarioactivaun
componente,porejemplo,hacerclicenunbotn,sedisparaunevento.Estohacequelaimplementacin
JavaServerFacesparainvocarelmtododeescuchaqueprocesaelevento.
JavaServerFacessoportadostiposdeeventosdeaplicacin:eventosdeaccinyeventosdecambiode
valor.
Uneventodeaccin(ActionEventclase)seproducecuandoelusuarioactivauncomponenteque
implementeActionSource.Estoscomponentesincluyenbotonesyloshipervnculos.
Uneventodecambiodevalor(ValueChangeEventclase)seproducecuandoelusuariocambiaelvalorde
uncomponenterepresentadaporUIInputounodesussubclases.Unejemploeslaseleccindeuna
casilladeverificacin,unaaccinqueresultaenelvalordelcomponenteestcambiandoatrue.Los
tiposdecomponentesquepuedegenerarestetipodeeventossonlosUIInput,UISelectOne,
UISelectMany,yloscomponentesdeUISelectBoolean.Valoreventosdecambiosondespedidosslosino
sedetectaronerroresdevalidacin.
LossucesosdelsistemasongeneradosporunobjetoenlugardeunUIComponent.Quesegeneran
durantelaejecucindeunaaplicacinentiempospredefinidos.Sonaplicablesatodalaaplicacinen
lugardeauncomponenteespecfico.
Unmodelodedatosdeeventosseproducecuandoseseleccionaunanuevafiladeuncomponentede
UIData.
Lossucesosdelsistemaylosdatosdeeventosdemodelosontemasavanzadosquesemirarnmstarde.
1.1 Validacin
LatecnologaJavaServerFacessoportaunmecanismoparalavalidacindelosdatoslocalesdelos
componentesmodificables(comoloscamposdetexto).Estavalidacinseproduceantesdequeelmodelo
dedatoscorrespondienteseactualizaparaquecoincidaconelvalorlocal.
Aligualqueelmodelodeconversin,elmodelodevalidacindefineunconjuntodeclasesestndarpara
larealizacindecomprobacionesdevalidacindedatoscomunes.LaetiquetadeJavaServerFaces
ncleobibliotecatambindefineunconjuntodeetiquetasquecorrespondenalasimplementaciones
estndardeValidator.
Lamayoradelasetiquetastienenunconjuntodeatributosparaconfigurarlaspropiedadesdel
validador,talescomolosvaloresmximoymnimopermitidosparalosdatosdelcomponente.Los
registrosdeautoreselvalidadorenuncomponenteporlaetiquetadeanidacindelvalidadordentrode
laetiquetadelcomponente.
3.6 Modelodenavegacin
ElmodelodenavegacinJavaServerFaceshacequeseafcildemanejarcualquierprocesamiento
adicionalquesenecesitaparaelegirlasecuenciaenlaquesecarganlaspginas.
EnlatecnologaJavaServerFaces,lanavegacinesunconjuntodereglasparalaeleccindelapgina
siguienteolavistaquesemostrardespusdeunaaccindeaplicacin,comocuandounbotno
hipervnculosehaceclic.
Estasnormassedeclaranenceroomsrecursosdeconfiguracindelaaplicacin,talescomo<faces
config.xml>,utilizandounconjuntodeelementosXML.Laestructurapordefectodeunareglade
navegacineselsiguiente:
<navigationrule>
<description>
</description>
<fromviewid></fromviewid>
<navigationcase>
<fromaction></fromaction>
<fromoutcome></fromoutcome>
<if></if>
<toviewid></toviewid>
</navigationcase>
</navigationrule>
EnJavaServerFaces2.0,lanavegacinpuedeserimplcitoodefinidosporelusuario.Lasreglasde
navegacinimplcitasentranenjuegocuandolasnormasdenavegacinnoestndisponiblesenun
archivodeconfiguracindelaaplicacinderecursos.
3.6.1 Configuracindereglasdenavegacin
Comoseexplicaenelmodelodenavegacin,lanavegacinesunconjuntodereglasparalaeleccindela
siguientepginaquesemuestradespusdeunbotnouncomponentedehipervnculosehaceclic.
Lasreglasdenavegacinsedefinenenelexpedientedesolicitudderecursosdeconfiguracin.
Cadaregladenavegacinespecificacmonavegardeunapginaaunconjuntodeotraspginas.La
implementacindeJavaServerFaceseligelaregladenavegacinadecuadodeacuerdoalapginaque
semuestraactualmente.
Despusdelaregladenavegacinadecuadoesseleccionado,laeleccindequeparaaccederalapgina
siguientedelapginaactualdependededosfactores:
Elmtododeaccinqueseinvocacuandoelcomponentesehahechoclic
Elresultadolgicoquesehacereferenciaporelcomponenteenlaetiqueta,ofuedevueltoporel
mtododeaccin
Elresultadopuedesercualquiercosaqueeldesarrolladordecide,perolatablaaquvanalgunos
resultadosdeusocomnenaplicacionesweb.
Final Loquesignificacomnmente
success Todohafuncionado.Iralapginasiguiente.
failure Algoestmal.Iraunapginadeerror.
logon Elusuariodebeiniciarsesinprimero.Iralapginadeiniciodesesin.
noresults Labsquedanoencontraronnada.Iralapginadebsquedadenuevo.
Normalmente,elmtododeaccinrealizaunprocesamientodelosdatosdelformulariodelapgina
actual.
Porejemplo,elmtodopodracomprobarsielnombredeusuarioylacontraseaintroducidaenel
formulariodecoincidirconelnombredeusuarioycontraseaenelarchivo.Sicoinciden,elmtodo
devuelveelxitodelosresultados.Delocontrario,devuelvelafaltaderesultados.
Comodemuestraesteejemplo,tantoelmtodoutilizadoparaprocesarlaaccinylosresultados
devueltossonnecesariasparadeterminarlapginapropiadeacceso.
Heaquunaregladenavegacinquepodranserutilizadosconelejemploqueacabamosdedescribir:
<navigation-rule>
<from-view-id>/logon.jsp</from-view-id>
<navigation-case>
<from-action>#{LogonForm.logon}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/storefront.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{LogonForm.logon}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/logon.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Estaregladenavegacindefinelasposiblesmanerasdenavegardelogon.jsp.Cadaelementode
navegacincaso,defineunarutadenavegacinposibledelogon.jsp.Lanavegacinprimercasosedice
quesiLogonForm.logondevuelveunresultadodexito,entoncesstorefront.jspsetendracceso.La
navegacinsegundocasosedicequelogon.jspsevuelvenarepresentar,sivuelveLogonForm.logon
fracaso.
Laconfiguracindeunaaplicacin,elflujodelapginaconstadeunconjuntodereglasdenavegacin.
Cadareglasedefineporelelementoderegladenavegacinenelarchivofacesconfig.xml.
Cadaelementoderegladenavegacincorrespondeaunidentificadordelcomponentearbreodefinido
porelfacultativodevistadeelementodeidentificacin.EstosignificaquecadaEstadodefinetodaslas
posiblesmanerasdenavegardeunapginaespecialenlaaplicacin.
Sinohayningnelementodelavistadeid,lasreglasdenavegacinsedefineenelelementodereglade
navegacinseaplicanatodaslaspginasdelaaplicacin.LaconcordanciadepatronesviewIDde
elementotambinpermitecomodn.Porejemplo,estedevistaIDdeelementodicequelareglade
navegacinseaplicaatodaslaspginaseneldirectoriodelibros:
<from-view-id>/libros/*</ from-view-id>
Comoseindicaenlaregladenavegacinejemplo,unelementoderegladenavegacinpuedecontener
ceroomselementosdenavegacincaso.Elelementodenavegacincaso,defineunconjuntodecriterios
decoincidencia.Cuandosecumplenestoscriterios,laaplicacinsevayaalapginadefinidaporela
verIDdeelementocontenidoenlanavegacindelmismoelementodecaso.
Loscriteriossondefinidosporlanavegacinopcionalderesultadosydeelementosdeaccin.El
resultadodeelementodefineunresultadolgico,comoelxito.Elelementodelaaccinmtodoutiliza
unaexpresinparareferirseaunmtododeaccinquedevuelveunacadena,queeselresultadolgico.
Elmtodorealizaalgunalgicaparadeterminarelresultadoydevuelveelresultado.
Loselementosdenavegacincasodequesecotejarnconlosresultadosyelmtododeexpresineneste
orden:
Loscasosqueespecificalavezunresultadodevalorydevalordelaaccin.Amboselementos
puedenserutilizadossielmtododeaccindevuelveresultadosdiferentesdependiendodel
resultadodelatransformacinquerealiza.
Loscasosqueespecificaslounvalorderesultado.Elelementoderesultadodebecoincidirconel
resultadoyaseadefinidoporelatributodeaccindelcomponentedeUICommandoelresultado
devueltoporelmtodomencionadoporelcomponentedeUICommand.
Especificandoloscasosslounadevalordelaaccin.Estevalordebecoincidirconlaexpresin
accinespecificadaporlaetiquetadelcomponente.
Cuandosecomparacualquieradeestoscasos,elrboldecomponentesdefinidosporelaverelementode
identificacinsernseleccionadosparalarepresentacin.
3.6.2 Reglasdenavegacinimplcitas
ApartirdeJavaServerFaces2.0,lasreglasdenavegacinimplcitaestndisponiblesparaaplicaciones
deFacelets.Lasreglasdenavegacinimplcitaentrarenjuegosinohayreglasdenavegacinse
configuranenlosarchivosdeconfiguracinderecursosdeaplicacin.
Cuandoseagregauncomponentedeinterfazdeusuariocomouncomandoyasignaunapginacomoel
valordesupropiedadlaaccin,elcontroladordenavegacinpordefectotratandecombinarunapgina
adecuadadentrodelaaplicacin.
Enelejemploanterior,elcontroladordenavegacinpordefectotratardelocalizarlapgina
response.xhtmlynavegarhacial.
3.7 BackedBeans
UnaaplicacintpicadeJavaServerFacesincluyeunoomsbeansdeapoyo,cadaunodeellosesun
JavaServerFacesgestionadosdebeanqueestasociadoconloscomponentesdelainterfazdeusuario
utilizadosenunadeterminadapgina.
LosbeansGestionadosonJavaBeanscomponentesquesepuedenconfigurarmediantelainstalacinde
beangestionado,quesedescribeenConfiguracindeBeans.Estaseccinpresentalosconceptosbsicos
sobrelacreacin,configuracinyusodesemillasdeapoyoenunaaplicacin.
3.7.1 Crearunaclasedebackedbean
Ademsdedefinirunconstructorsinargumento,comotodosloscomponentesJavaBeansdebehacer,
unaclasedebackedbeantambindefineunconjuntodepropiedadesdeloscomponentesdeinterfazde
usuarioy,posiblemente,unconjuntodemtodosquerealizanfuncionesdeuncomponente.
Cadaunadelaspropiedadesdeloscomponentessepuedenenlazaraunadelassiguientes:
Elvalordeuncomponente
Unainstanciadecomponente
Unejemplodelconvertidor
Unejemplodeescucha
Unejemplodevalidador
Lasfuncionesmscomunesquelosmtodosdebackedbeanrealizarsonlassiguientes:
Validarlosdatosdeuncomponente
Manejodeuneventodisparadoporuncomponentede
Realizacindetratamientoparadeterminarlasiguientepginaparaquelasolicituddebe
navegar
ComocontodosloscomponentesJavaBeans,unapropiedadconstadeuncampodedatosprivadosyun
conjuntodemtodosdeacceso,comolomuestraestecdigo:
Cuandounapropiedaddebeanestligadaalvalordeuncomponente,puedesercualquieradelostipos
bsicosprimitivosynumricoocualquiertipodeobjetodeJavaparaquelaaplicacintengaaccesoaun
convertidorapropiado.Porejemplo,unapropiedadpuedeserdetipofecha,silaaplicacintieneaccesoa
unconvertidorquepuedeconvertireltipodefechaenunacadenayviceversa.
Cuandounapropiedadseuneaunainstanciadelcomponente,eltipodelapropiedaddebeserelmismo
queelobjetodecomponentes.Porejemplo,siunUISelectBooleanestligadoalapropiedad,la
propiedaddebeaceptarydevolverunobjetoUISelectBoolean.
Delmismomodo,silapropiedadestenlazadoaunconvertidor,validador,oeloyenteejemplo,la
propiedaddebeserdelconvertidorcaso,validador,oeloyentetipo.
3.7.2 ConfiguracindeunBean
LatecnologaJavaServerFacessoportaunsofisticadoestablecimientoadministradoporlacreacinde
bean,quepermitealosarquitectosdeaplicacionesparahacerlosiguiente:
Configurarbeanssimpleyrbolesmscomplejodebeans
Inicializarelbeanconlosvalores
Ponerlosbeansenunmbitoparticular(mbitosdisponibles:request,view,session,application)
ExponelosbeansalaELunificadaparaquelosautoresdepginassepuedeaccederaellos
Elsiguienteejemplomuestraunejemplodearchivofacesconfig.xml:
<managed-bean>
<managed-bean-name> UserNumberBean </ managed-bean-name>
<managed-bean-class>
guessNumber.UserNumberBean
</ managed-bean-class>
<managed-bean-scope> sesin </ managed-bean-scope>
<managed-property>
<property-name> mnimos </ propiedad name>
<property-class> largo </ propiedad de clase>
<valor> 0 </ value>
</ managed-property>
<managed-property>
<property-name> <mximo / property-name>
<property-class> largo </ propiedad de clase>
<valor> 10 </ value>
</ managed-property>
</ managed-bean>
LaimplementacindeJavaServerFacesprocesala<managedbeanscope>elementoenelmomentode
iniciodelaaplicacin.Cuandounbeanesllamadolaprimeravezdelapgina,secreaunainstancia.
Unautordelapginapuedeaccederalaspropiedadesdebeandelasetiquetasdecomponentesenla
pginautilizandoelELunificada,comosemuestraaqu:
<h:outputText value="#{UserNumberBean.minimum}"/>
Tambinesposibleaprovecharlafuncindeanotacionesparaelbeanlogradoevitarlaconfiguracinde
beangestionadoenarchivodeconfiguracinderecursosdeaplicacin.
Ejemplo:
@ManagedBean(name = "Login")
@RequestScoped
public class Login {...}
3.8 UsandoelELunificadaparareferenciarBackedbeans
Paraobligaralosvaloresdelainterfazdeusuariodeloscomponentesypropiedadesdelosobjetosal
apoyodebeanoderespaldoparahacerreferenciaalosmtodosdebeandeetiquetasdecomponentesde
interfazdeusuario,losautoresdepginasutilizarellenguajedeexpresinunificada(EL)sintaxis
definidaporJSP2.1.
Lassiguientessonalgunasdelascaractersticasqueofreceestelenguaje:
Evaluacindiferidadelasexpresiones
Lacapacidaddeusarunaexpresindevalortantoparaleeryescribirdatos
Expresindemtodos
Estascaractersticassonespecialmenteimportantesparaapoyarelmodelodeinterfazdeusuario
sofisticadocomponentequeofrecelatecnologaJavaServerFaces.
EvaluacindiferidadelasexpresionesesimportanteporqueelciclodevidadeJavaServerFacesest
divididoenfasesdistintas,demaneraqueelmanejodeeventosdecomponentes,laconversindedatosy
validacin,ylapropagacindedatosalosobjetosexternos,serealizanenformaordenada.Laaplicacin
debesercapazderetrasarlaevaluacindelasexpresiones,hastalafaseapropiadadelciclodevidase
haalcanzado.Porlotanto,suetiquetadeatributossiempreutilizalasintaxisdelaevaluacindiferida,
quesedistingueporeldelimitador#{}.
Conelfindealmacenardatosenlosobjetosexternos,casitodoslosatributosdeetiquetasJavaServer
Facesutilizarexpresionesdevalorvalor,quesonexpresionesquepermitentantoobteneryestablecer
datossobrelosobjetosexternos.
Porltimo,algunosatributosdeetiquetadecomponentedeaceptarexpresionesmtodoquelosmtodos
dereferenciaparacontrolarloseventosdecomponentes,ovalidaroconvertirlosdatosdelos
componentes.
ParailustrarunaetiquetadeJavaServerFacesusandoelELunificado,supongamosqueunaetiqueta
deunasolicituddereferenciaaunmtodopararealizarlavalidacindeentradadeusuario:
<h:inputText id="userNo"
value="#{UserNumberBean.userNumber}"
validator="#{UserNumberBean.validate}" />
EstaetiquetaseuneelvalordelcomponenteuserNoparaelbeandelapropiedad
UserNumberBean.userNumberutilizandounaexpresinvalue.Seutilizaunmtododeexpresinpara
hacerreferenciaalmtododeUserNumberBean.validate,querealizalavalidacindevalorlocaldel
componente.Elvalorlocalesloqueelusuarioentraenelcampocorrespondienteaestaetiqueta.Este
mtodoseinvocacuandoseevalalaexpresin,queesdurantelafasedevalidacindelprocesodelciclo
devida.
CasitodoslosatributosdeetiquetasJavaServerFacesaceptarexpresionesdevalor.Ademsdelas
propiedadesreferencias,expresionesdevalorpuedetambinlistasdereferencias,mapas,paneles,
objetosimplcita,ylospaquetesderecursos.
Otrousodelasexpresionesdevalorvinculanteesunainstanciadelcomponenteaunapropiedadde
backedbean.Unautordelapginahacereferenciaalapropiedaddelatributo:
<inputText binding="#{UserNumberBean.userNoComponent}" />
Esasetiquetasdecomponentesquelasexpresionesmtododeusosonlasetiquetasylasetiquetasde
componentesUIInputcomponenteUICommand.
3.8.1 ElCiclodeVidadeunapginaJavaServerFaces
ElciclodevidadeunapginaJavaServerFacesesalgosimilaraladeunapginaJSP:Elclienterealiza
unasolicitudHTTPdelapginayelservidorrespondeconlapginatraducidaaHTML.Sinembargo,el
ciclodevidadeJavaServerFacesdifieredelciclodevidadeJSPenquesedivideenvariasfasespara
apoyarelmodelodeinterfazdeusuariosofisticadocomponente.Estemodelorequierequeloselementos
deserconvertidosyvalidados,eventosdeloscomponentessemanipulan,ylosdatosdeloscomponentes
sepropagaalasjudasenunamaneraordenada.
UnapginadeJavaServerFacesestambindiferentedeunapginaJSPenlaqueesrepresentadopor
unrboldecomponentesdeinterfazdeusuario,denominadopuntodevista.Duranteelciclodevida,la
implementacinJavaServerFacesdebeconstruirelpuntodevistaalconsiderarelestadoguardadode
unapresentacinanteriordelapgina.Cuandoelclienteenvaunapgina,laimplementacin
JavaServerFacesrealizavariastareas,talescomolavalidacindelaentradadedatosdelos
componentesdelavistaylaconversindelosdatosdeentradaalostiposespecificadosenelladodel
servidor.
LaimplementacindeJavaServerFacesrealizatodasestastareascomounaseriedepasosenla
solicituddeJavaServerFacesciclodevidaderespuesta.
DiagramadeflujodelasolicituddeFacesyrespuestadeFaces,incluyendoeleventodevalidacinyel
procesamiento,manejodeerrores,elmodelodeactualizacin,lainvocacindelaaplicacin.
Elciclodevidamanejaambostiposdesolicitudes:Lassolicitudesinicialesydevolucionesdedatos.
Cuandounusuariohaceunasolicitudinicialdeunapgina,loellaestsolicitandolapginapor
primeravez.Cuandounusuarioejecutaunadevolucindedatos,seleenvaelformularioquefiguraen
unapginaquefuepreviamentecargadoenelnavegadorcomoresultadodelaejecucindeunasolicitud
inicial.
Cuandoelciclodevidaseencargadelapeticininicial,sloseejecutalarestauracindevistayhacer
quelasfasesderespuesta,porquenohayningunaentradadelusuariooaccionesparaelproceso.Porel
contrario,cuandoelciclodevidamanejaunadevolucindedatos,ejecutatodaslasfases.
Normalmente,laprimerasolicitudparaunapginaJavaServerFacestratadeuncliente,como
resultadodehacerclicenunhipervnculoenunapginaHTMLqueenlazaconlapginadeJavaServer
Faces.
ParahacerunarespuestaqueesotrapginaJavaServerFaces,laaplicacincreaunanuevavisinyla
almacenaenlainstanciaFacesContext,querepresentaatodalainformacincontextualasociadaconel
procesamientodeunasolicitudentranteycrearunarespuesta.Laaplicacinseadquierereferenciasa
objetosquenecesitalaopininysolicitaFacesContext.renderResponse,queobligaalaprestacin
inmediatadelaopinindepasarporlarespuestaalafasedeprocesamientodelciclodevida,como
indicanlasflechasetiquetadosRenderderespuestaeneldiagrama.
Aveces,unaaplicacinpodranecesidaddereorientarlosrecursosadiferentesaplicacionesweb,como
unservicioweb,ogenerarunarespuestaquenocontienecomponentesJavaServerFaces.Enestas
situaciones,eldesarrolladordebesaltarselafasederenderizado(RenderFasederespuesta)llamando
FacesContext.responseComplete.Estasituacintambinsemuestraeneldiagrama,estavezconlas
flechasdelaetiquetarespuestacompleta.
LapropiedaddelacurrentPhaseIDFacesContext,querepresentalafasequeseencuentra,debeser
actualizadatanprontocomoseaposibleporlaaplicacin.
LasituacinmscomnesqueuncomponenteJavaServerFacespresentaunasolicituddelapginade
otroJavaServerFaces.Enestecaso,laimplementacinJavaServerFacesmanejalasolicitudy
automticamentepasaatravsdelasfasesdelciclodevidapararealizarcualquierconversin
necesaria,validacionesyactualizacindelosmodelos,yparagenerarlarespuesta.
Losdetallesdelciclodevidaseexplicaenestaseccinestndestinadosprincipalmentepara
desarrolladoresquenecesitanconocerdichainformacincomocuandovalidaciones,conversiones,ylos
eventossongeneralmentetramitadasyloquepuedenhacerparacambiarcmoycundoselesda.Los
autoresdepginasnotienenporquconocerlosdetallesdelciclodevida.
3.8.2 Fasederestauracindevista
CuandounasolicituddeunapginaJavaServerFacessehace,comocuandounenlaceounbotnse
presiona,laimplementacinJavaServerFacescomienzalafasederestauracindevista.
Duranteestafase,laimplementacinJavaServerFacesconstruyeelpuntodevistadelapgina,
controladoresdeeventosylosvalidadoresdeloscomponentesenlavista,yguardalavistaenelejemplo
FacesContext,quecontienetodalainformacinnecesariaparaprocesarunasolicitudnica.Todaslas
etiquetasdecomponentesdelaaplicacin,loscontroladoresdeeventos,convertidoresyvalidadoresde
teneraccesoalainstanciadeFacesContext.
Silasolicituddelapginaesunasolicitudinicial,laimplementacinJavaServerFacescreaunavisin
devacoenestaetapaylosavancesdelciclodevidaparahacerlafasederespuesta,duranteelcualse
llenaconloscomponentesdereferenciadelasetiquetasenlapgina.
Silasolicituddelapginaesunadevolucindedatos,unavistacorrespondienteaestapginayaexiste.
Duranteestafase,laimplementacinJavaServerFacesrestauralavistamedianteelusodela
informacindeestadoguardadaenelclienteoelservidor.
3.8.3 Fasedeaplicacindevalores
Despusdequeelrboldecomponentesqueserestablezca,cadacomponenteenelrboldelosextractos
desunuevovalordelosparmetrosdelapeticinmedianteelusodesudecodificar(processDecodes())
mtodo.Elvalorsealmacenalocalmenteenelcomponente.Silaconversindelvalordefalla,un
mensajedeerrorqueestasociadoconelcomponentesegenerayenlacolaenFacesContext.Este
mensajesemostrardurantelafasededarrespuesta,juntoconloserroresdevalidacinresultantede
lafasedevalidacindelproceso.
SilosmtodosdescifrarodetectoresdeeventosllamadorenderResponseFacesContextenlainstancia
actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta.
Silosacontecimientossehancoladuranteestafase,lasemisionesdeaplicacinJavaServerFaceslos
acontecimientosalosoyentesinteresados.
Sialgunoscomponentesdelapginatienensusatributosdeinmediatoestableceentrue,entoncesla
validacin,laconversin,yloseventosrelacionadosconestoscomponentesserntratadosduranteesta
fase.
Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar
unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara
FacesContext.responseComplete.
Alfinaldeestafase,loscomponentessefijanasusnuevosvalores,ylosmensajesyeventossehan
puestoencola.
Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras
decontextoyelmtododetransformacinparcialesaplicado.
3.8.4 Fasedevalidacionesdeproceso
Duranteestafase,laimplementacinJavaServerFacesprocesatodoslosvalidadoresregistradasenlos
componentesenelrbol,mediantesuvalidacin((processValidators))mtodo.Seexaminael
componentedeatributosqueespecificanlasnormasparalavalidacinycomparaestasnormasparael
valorlocalalmacenadoparaelcomponente.
Sielvalorlocalnoesvlido,laimplementacinJavaServerFacesaadeunmensajedeerrorala
instanciaFacesContext,yelciclodevidaavanzadirectamentealafasededarrespuestaparaquela
pginaserepresentaconelmensajedeerror.Sihuboerroresdeconversindelasolicituddeaplicarlos
valoresdefase,losmensajesdeestoserrorestambinsemuestran.
SialgunavalidarmtodosodetectoresdeeventosllamadorenderResponseenelFacesContextactual,la
implementacinJavaServerFacessaltaalafasededarrespuesta.
Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar
unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara
FacesContext.responseComplete.
Silosacontecimientossehancoladuranteestafase,laimplementacinJavaServerFacesemisionesa
oyentesinteresados.
Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras
decontextoyelmtododetransformacinparcialesaplicado.Procesamientoparcialestcubiertoen
JavaEE6Tutorial,VolumenII:Temasavanzados.
3.8.5 Fasedeactualizacindevaloresdemodelo
DespusdelaimplementacinJavaServerFacesdeterminaquelosdatossonvlidos,sepuederecorrer
elrboldecomponentesyestablecerelservidorcorrespondientedelaspropiedadesdelobjetodeladoa
losvaloreslocalesdeloscomponentes.LaimplementacindeJavaServerFacesactualizarslolas
propiedadesjudasapuntadoporuncomponentedevalordeatributodeentrada.Silosdatoslocalesno
puedenserconvertidosalostiposespecificadosporlaspropiedadesjudas,elciclodevidaavanza
directamentealafasededarrespuestaparaquelapginaesreemitidaconerroresmostrados.Estoes
similaraloquesucedeconloserroresdevalidacin.
SilosmtodosupdateModelsocualquieroyentesllamadorenderResponseFacesContextenlainstancia
actual,laimplementacinJavaServerFacessaltaalafasededarrespuesta.
Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar
unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara
FacesContext.responseComplete.
Silosacontecimientossehancoladuranteestafase,laimplementacinJavaServerFacesemisionesa
oyentesinteresados.
Silapeticinactualseidentificacomounapeticinparcial,elcontextoparcialserecuperadelascaras
decontextoyelmtododetransformacinparcialesaplicado.
3.8.6 Fasedeinvocacindelaaplicacin
Duranteestafase,laimplementacinJavaServerFacesmanejacualquiersolicituddeeventosdenivel,
talescomolapresentacindeunformularioounvnculoaotrapgina.
Enestepunto,silasolicitudtienequereorientarlosrecursosadiferentesaplicacioneswebodegenerar
unarespuestaquenocontienecomponentesJavaServerFaces,puedellamara
FacesContext.responseComplete.
Siseprocesaelpuntodevistafuereconstruidoapartirdeinformacindeestadodeunasolicitud
anteriorysiuncomponentehadisparadounevento,estoseventossetransmitenalosoyentes
interesados.
Porltimo,lastransferenciasdeJavaServerFacesaplicacindecontrolparahacerquelafasede
respuesta.
3.8.7 Fasedecreacindelarespuesta
Duranteestafase,JavaServerFacesconstruyeelpuntodevistaydelegalaautoridadparael
renderizadodelaspginas.Porejemplo,paraelcontenedordeJSPsilaaplicacineslautilizacinde
pginasJSP.
Sisetratadeunasolicitudinicial,loscomponentesqueestnrepresentadosenlapginaseagregaal
rboldecomponentes.Siestonoesunasolicitudinicial,loscomponentesseaadenyaalrbolparaque
nosenecesitaaadirms.
Silasolicitudesunadevolucindedatosyloserroresfueronencontradosdurantelafasedesolicitudde
aplicarlosvalores,lasvalidacionesdeprocesodefase,ofasedeactualizacindelosvaloresdelmodelo,
lapginaoriginalserepresentaenestafase.Silaspginascontienenmensajesolosmensajesdelas
etiquetas,losmensajesdeerrorenlacolasemuestranenlapgina.
Despusdequeelcontenidodelavistaserepresenta,elestadodelarespuestaseguardaparaquelas
solicitudesposterioressepuedeaccederal.Elestadoguardadoseestadisposicindelafasede
restauracindevista.
4 Formularios
4.1 Formulariosencillo
Paraponerenpracticaloanteriorvisto,vamosausarunformulariodeentradaalsitio.
Lovamosaconstruirpocoapocoparallegaralcdigosiguiente:
login.xhtml:
<h:head>
<title>Entrada al sitio</title>
<link rel="stylesheet" href="curso.css" />
<ui:include src="WEB-INF/include/head.xhtml"/>
</h:head>
<h:body>
<ui:include src="WEB-INF/include/menu.xhtml"/>
<h1><h:outputText value="Hello World!"/></h1>
<h:graphicImage alt="GIF" url="/images/Duke_Blocks.gif" width="100px" />
<h:form>
<h:panelGrid columns="3">
<h:outputText value="Usuario" />
<h:inputText id="username" value="#{Login.username}" required="true"
validatorMessage="Minimo 2 caracteres!"
requiredMessage="Value is required!" >
<f:validateLength minimum="2" />
</h:inputText>
<h:message for="username" styleClass="error"/>
<h:outputText value="Clave" />
<h:inputText value="#{Login.password}" />
<h:commandButton value="Entrar" action="#{Login.submit}"
actionListener="#{Login.onLogin}" />
</h:panelGrid>
</h:form>
</h:body>
curso.css:
root {
display: block;
}
.logo{
font-size: 20px;
color: teal;
}
Login.java:
package curso;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
@ManagedBean(name = "Login")
@RequestScoped
public class Login {
private String username;
private String password;
public void onLogin(ActionEvent e) {
if (!username.equalsIgnoreCase("dukes") && !username.equalsIgnoreCase("admin")) {
throw new AbortProcessingException("Usuario invalido");
}
// password=null;
}
public String submit() {
String outcome = "none";
if (username.equalsIgnoreCase("dukes")) {
outcome = "success";
} else {
outcome = "admin";
facesconfig.xml:
<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-
facesconfig_2_0.xsd">
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-outcome>admin</from-outcome>
<to-view-id>/admin.xhtml </to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/index2.xhtml </to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
Hayquecrearlaspginasindex2.xhtmlyadmin.xhtmltambien.
4.2 Formulariomascomplejo
Vamosacrearunformularioparaagregarunusuario,condiferentestiposdecamposenelformulario.
user_add.xhtml
<h:head>
<title>Agregar un usuario</title>
<link rel="stylesheet" href="curso.css" />
</h:head>
<h:body>
<h1>Agregar un usuario</h1>
<h:form>
<h:panelGrid columns="3" >
<h:outputLabel value="Nombre:"/>
<h:inputText id="nombre" value="#{Usuario.nombre}" size="20" maxlength="30"
required="true" validatorMessage="Minimo 2 caracteres!"
requiredMessage="El nombre no puede estar vacio" >
<f:validateLength minimum="2" />
</h:inputText>
<h:message for="nombre" styleClass="error"/>
5 HtmlDataTable
UnDataTablemuestraunatablaHTML<table>.
LascolumnasseespecificanconloscomponentessecundariosUIColumn.
ElHtmlDataTabletienevariosparametros:
ID:Seutilizaparaidentificarelcomponentedelatabla.Estedebesernicoenelcomponente
mscercanodelospadres.
Value:Representaelvalordelcomponente.Representaelvalorsobreelquelaiteracinsedebe
hacer.Puedeserunamatrizocualquierobjetoiterador.
Var:Esteeselnombredelavariablecreadaporlatabladedatosquerepresentaelelemento
actualenelvalor.Esteatributopermiteexponerlosdatosenlasfilasdelatabla.
Bgcolor:Esteatributoseutilizaparaestablecerelcolordefondodelatabla.
Border:Sepuedeconfigurarelanchodelbordedelamesaalrededordelamesa.
Cellpadding:Estoestableceelespacioentreelcontenidoylafronteradelaclula.
Cellspacing:Seespecificalacantidaddeespacioparadejarentrelasclulas.
First:Seutilizaparaespecificarelnmerodefiladelaprimerafiladelaquepresentamosesque
seinicieenadelante.Supongamos,estapropiedadseestableceen3,quemuestraseiniciar
desdelatercerafiladelosdatossubyacentes.
Rows:Esteatributoespecificaelnmerodefilasamostrar.Viendoestesepondrenmarcha
desdeelndiceespecificadoenla"primera"atributo.Siseestableceesteatributoacero,entonces
todaslasfilasquesemostrarn.
Width:Estoseutilizaparaestablecerelanchodetodalatabla.Suvalorseespecificaen%.
Supongamosqueseestablecequeel50%,entoncesestatablasemuestraenelespaciodel50%de
laanchuradelapantalla.
Dir:Esteatributoindicaladireccindeltextoquesemostrarenlacelda.Senecesita"ltr"(de
izquierdaaderecha)y"RTL"(dederechaaizquierda)valores.Sinoseespecificaesteatributoa
continuacin,elcontenidosemostrarenelcentro.
Frame:Esteatributoquespecifyesladosdelaestructuraentornoaestamesaservisible.Este
atributopuedetomaralgunosvaloresquesemuestranacontinuacin:
1.noneNingunadelaspartes,Valorpredeterminado
2.topladosloporencimade
3.belowdeladoelfondoslo
4.hsidespartessuperioreinferiorslo
5.vsidesladosderechoeizquierdoslo
6.LHSladoizquierdoslo
7.RHSladoderechoslo
8.boxTodaslaspartescuadrodecuatro
9.borderTodaslaspartesfronteracuatro
Rules:Esteatributoseutilizaparadibujarlneasentrelasclulas.Puedetomaralgunosvalores
queseindicanacontinuacin:
1.none:Nohayreglasninguno,elvalorpordefecto
2.group:Entrelosgruposdelosgruposdefilas
3.rows:Entrelasfilasdelasfilasslo
4.cols:Entrecolumnasslo
5.all:Entretodaslastodaslasfilasycolumnas
Summary:Puedeespecificarresumendelpropsitodelatabla.
Rendered:Senecesitavalue.ThisbooleanIndicasiestecomponentedebeserprestado.Suvalor
predeterminadoes"true".Siseestableceenfalseentoncesseimpidelaprestacindeeste
componentealapgina.
CaptionClass:listaseparadaporespaciosdelaclaseoclasesCSSqueseaplicaracualquier
ttulogeneradoparaestatabla.
CaptionStyle:EspecificaestiloCSSoestilosquedebenaplicarsecuandoserepresentaeste
epgrafe.
ColumnClasses:listaseparadaporcomasdelasclasesCSSqueseaplicaralascolumnasde
estecuadro.
FooterClass:EsteatributotienelistaseparadaporespaciosdeestiloCSSdelaclaseoclasesque
seaplicaraaheadertergeneradoparaestatabla.
HeaderClass:EsteatributotienelistaseparadaporespaciosdelaclasedeestiloCSSoclases
queseaplicarseacualquierencabezadogeneradoparaestatabla.
RowClasses:EsunalistadeclasesCSSaplicadosalasfilasdelasclasestable.Thesedebenestar
separadasporcomas.SiqueremosaplicarlaclasedeCSSparafilasindividuales,entonces
podemosespecificarlistaseparadaporespaciosdeclasesCSS.Clasesdeestiloseaplicanalas
filasenelmismoordenquesedefinidos.SitenemosdosclasesCSScontinuacindeprimera
categoraseaplicaalaprimerafilaylasegundaseaplicaalasegunda.Entonces,denuevoenla
tercerafila,elCSSseaplicaprimeroyassucesivamente.Esteprocesocontinahastalaltima
filadelatabla.
Lang:Estableceelidiomabasedelosatributosdeunelemento,esdecir,eltextoyellenguaje
utilizadoenelmarcadogeneradoparaestecomponente.
StyleClass:SeestableceelnombredelasclasesdeclassorCSSqueseaplicaenelmomentodela
prestacindelelemento.
Title:Elatributodelttuloseutilizaparaestablecereltextoparamostrarinformacinsobre
herramientasparaelcomponent.Tooltipprestadosdescribeunelementocuandoserepresenta
paraelcliente.
Binding:Esunvalordelaexpresindeuninqueesutilizadoparaconectarcomponentesauna
propiedadenunbackedbean.
OnClick:SeestableceelcdigoJavaScriptaejecutarcuandosehaceclicenlosbotonesdelratn
sobreesteelemento.
Ondblclick:SeestableceelcdigoJavaScriptqueseejecutacuandoelbotndelpunteroesdoble
clicsobreesteelemento.
Onkeydown:SeestableceelcdigoJavaScriptqueseejecutacuandosepresionaunateclahacia
abajosobreesteelemento.
Onkeypress:SeestableceelcdigoJavaScriptqueseejecutacuandosepulsaunateclay
publicadosobreesteelemento.
Onkeyup:SeestableceelcdigoJavaScriptqueseejecutacuandosesueltaunateclasobreeste
elemento.
Onmousedown:SeestableceelcdigoJavaScriptqueseejecutacuandoelbotnespulsadoel
punterosobreesteelemento.
Onmousemove:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnse
muevedentrodeesteelemento.
Onmouseout:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsealejade
esteelemento.
Onmouseover:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsemueve
sobreesteelemento.
Onmouseup:SeestableceelcdigoJavaScriptaejecutarcuandounbotonesdelratnsesuelta
sobreesteelemento.
Ejemplo:
user_details.xhtml
<h:head>
<title>Detalles del usuario</title>
<link rel="stylesheet" href="curso.css" />
</h:head>
<h:body>
Usuario.java:
package curso.beans;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
@ManagedBean(name="Usuario")
@RequestScoped
public class Usuario {
private String nombre;
private String apellido;
private String sexo;
private Date fecnac=new Date();
private String add1;
private String pasatiempo;
private Byte hermanos;
private Double salario=1550.25564;
private Integer testInt=12900;
public Usuario() {
}
public Usuario(String nombre, String apellido, String sexo, Date fecnac, String add1, String
pasatiempo, Byte hermanos, Double salario) {
this.nombre = nombre;
this.apellido = apellido;
this.sexo = sexo;
this.fecnac = fecnac;
this.add1 = add1;
this.pasatiempo = pasatiempo;
this.hermanos = hermanos;
this.salario = salario;
}
public String onSubmit(){
return "success";
}
public void validateCCExpiry(FacesContext cntx, UIComponent cmp, Object val) {
System.out.println("Validando la entrada "+val);
String messS = null;
String[] fields = ((String) val).split("/", 3);
if (fields.length != 2) {
messS = "Se espera MM/AA!";
} else {
int month = 0;
int year = 0;
try {
demo_table.xhtml
<h:head>
<title>Lista de usuarios</title>
<link rel="stylesheet" href="curso.css" />
</h:head>
<h:body>
<h1>Lista de usuarios</h1>
<h:dataTable value="#{DemoTable.data}" var="user" border="1" cellspacing="2"
columnClasses="col1,col2,col1,col2" rowClasses="row1,row2"
headerClass="header">
<h:column>
<f:facet name="header">
<h:outputText value="Nombre"/>
</f:facet>
<h:outputText value="#{user.nombre}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Apellido"/>
</f:facet>
<h:outputText value="#{user.apellido}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Sexo"/>
</f:facet>
<h:outputText value="#{user.sexo}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Salario"/>
</f:facet>
<h:outputText value="#{user.salario}">
<f:convertNumber type="currency"/>
</h:outputText>
</h:column>
</h:dataTable>
</h:body>
DemoTable.java
package curso.beans;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
@ManagedBean(name="DemoTable")
@ApplicationScoped
public class DemoTable {
List<Usuario> data = new ArrayList();
public DemoTable() {
populateData();
}
public List getData(){
return data;
}
public void setData(Usuario a){
data.add(a);
}
public void populateData(){
data.add(new Usuario("Cedric","Simon","M",new Date(),"Managua","demo",(byte)2,2500.80));
data.add(new Usuario("Juan","Palmado","M",new Date(),"Managua","demo",(byte)2,25.08));
data.add(new Usuario("Melanie","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05));
data.add(new Usuario("Melanie2","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05));
data.add(new Usuario("Melanie3","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05));
data.add(new Usuario("Melanie4","Castro","F",new Date(),"Managua","demo",(byte)2,1205.05));
}
}
6 Mensajedeerrorpersonalizados
6.1 Listademensajepersonalizados
Enfacescontext.xml:
<application>
<resource-bundle>
<base-name>curso.ApplicationMessages</base-name>
<var>ErrMsg</var>
</resource-bundle>
</application>
Ensrc/curso/creararchivoApplicationMessages.properties:
test=Hola Mundo
Uso:#{ErrMsg.test} HolaMundo
6.2 Pginadeerrorpersonalizada:
error.xhtml :
<h:head>
<title>Pagina de error</title>
</h:head>
<h:body>
<h2>Un error fata ocurio!</h2>
Configurarenweb.xml:
<error-page>
<location>/error.xhtml</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.xhtml</location>
</error-page>
7 Convertidores
7.1 Quesunconvertidor?
Unconvertidorseutilizaparadarformato"agradable"aunobjeto,textoquesemostrar.
Porejemplo,sideseaparamostrarunafechaenJSPsepuedeutilizarunconvertidordeformatodela
fechaaunformatomascomnparaelusuario,como"10/03/2005".
Perohayotraformadeusarunconvertidor.Silosutilizaencombinacinconuncontroldeentrada,
laentradadelusuariodebeestarenelformatoespecificadoporelconvertidor.Sielformatodela
entradanocoincideenelformato,puedelanzarunaexcepcinenelconvertidorquesemuestraal
usuario.Elobjetoasociadonoseactualizahastaquesecorrigeelerror.
7.2 Usodelosconvertidores
ElconvertidorepuedeserfijadodentrodeJSP,oustedpuederegistrarelconvertidormediante
programacin.
UstedpuederegistrarunconvertidorconJSPenunadelastresmaneras:
Especifiqueelidentificadordeconvertidorconlapropiedadconverterdentrodelaetiqueta.
<h:outputText value="#{myBean.date}" converter="myConverter">
Juntar<f:converter>dedentrodelaetiquetadelcomponente.
<h:outputText value="#{myBean.date}">
<f:converter converterId="myConverter"/>
</ h: outputText>
Juntarlaetiquetapersonalizadadelconvertidordentrodeunaetiquetadelcomponente.
<h:outputText value="#{myBean.date}">
<laliluna:myConverter />
</ h: outputText>
LossiguientesJSFEtiquetasapoyaconvertidores.
<h:outputText>
<h:outputFormat>
<h:outputLink>
<h:outputLabel>
<h:inputText>
<h:inputTextarea>
<h:inputHidden>
<h:inputSecret>
<h:selectBooleanCheckbox>
<h:selectManyListbox>
<h:selectMaynyMenu>
<h:selectOneRadio>
<h:selectOneListbox>
<h:selectOneMenu>
7.3 Convertidoresincluidos
Sinoseespecificaunconvertidor,JSFescogerunoparausted.Elmarcohaconvertidoresestndar
paratodoslostiposbsicos:Long,byte,integer,short,Character,Double,Float,BigDecimal,
BigIntegeryBoolean.
Porejemplo,sielcomponenteseasociaconunapropiedaddetipoboolean,JSFelijaelconvertidorde
Boolean.Lostiposprimitivosseconviertenautomticamenteasushomlogosdeobjeto.
Ademstieneconvertidorespredefinidosparafechasunmeros.
7.3.1 ConvertidorDateTime
ParatodoslostiposbsicosdeJavaJSFusarautomticamentelosconvertidores.Perosideseadar
formatoaunafechaobjetodeJSFproporcionaunaetiquetaconvertidor<f:convertDateTime>.
Estaetiquetadebeseranidadasdentrodeuntagcomponentequeapoyalosconvertidores.
<h:outputText value="#{myBean.date}">
<f:convertDateTime type="date" dateStyle="medium"/>
</h:outputText>
ElconvertidorDateTimeadmiteatributos,comoeltipoodatestyle,paraconfigurarelconvertidor.El
listaacontinuacinmuestralosatributosquepuedeutilizarconelconvertidordeDateTime.
Nombredelatributo Descripcin
datestyle Especificaelestilodeformatoparalaporcindela
fechadelacadena.Lasopcionesvlidas
sondeshort,medium(pordefecto),longyfull.Slo
esvlidosiseestableceeltipodeatributo.
timeStyle Especificaelestilodeformatoparalaporcinde
tiempodelacadena.Lasopcionesvlidas
sondeshort,medium(pordefecto),longyfull.Slo
esvlidosiseestableceeltipodeatributo.
timezone Especificalazonahorariaparalafecha.Sinose
establece,horadelmeridianodeGreenwich(GMT)
seutilizar.
locale Elidiomalocalautilizarparalavisualizacinde
estafecha.Reemplazalalocalizacinactual
pattern Elmodelodeformatodefechautilizadopara
convertirestafecha.Utiliceesteoel
tipodepropiedad.
type Especificasisedebemostrarlafecha(date),hora
(time)oambas(both).
7.3.2 ConvertidordeNmero
Estesegundoconvertidorsepuedepersonalizarmedianteelusodeatributosadicionales,esel
convertidordeNmero.
Elestilparamostrarnmerosenlosformatosdebasequetrabajaparalaconfiguracinregionaldel
usuario.
<h:outputText value="#{myBean.date}">
<f:convertNumber type="number" maxIntegerDigits="3"/>
</ h: outputText>
LalistaacontinuacinmuestraelatributoquesepuedeutilizarconelconvertidordeNmero.Estos
atributospermitencontrolardemaneraprecisacmosemuestraunnmero.
Nombredelatributo Descripcin
CurrencyCode Especificaunperododetresdgitosdelcdigode
monedainternacionalcuandoelatributotipoesla
moneda.UtiliceesteoCurrencySymbol.
CurrencySymbol Especificaunsmboloespecfico,como"$",quese
utilizacuandoeltipodeatributoesmoneda.
UtiliceesteoCurrencyCode.
groupingUsed Truesiunsmbolodeagrupacin,como","o""
debeserutilizado.Elvalorpredeterminadoes
true.
integerOnly Verdaderosislolaparteenteradelvalorde
entradadebeserprocesado(todoslosdecimales
serignorado).Elvalorpredeterminadoesfalso.
locale Ellocalqueseutilizarparalavisualizacinde
estenmero.Reemplazaelusuariolocalizacin
actual
minFractionDigits Unacantidadmnimadedecimalesquesevea.
maxFractionDigits Mximanmerodedecimalesquesevea.
minIntegerDigits Unacantidadmnimadedgitosenterospara
mostrar.
maxIntegerDigits Mximanmerodedgitosenterosparamostrar.
pattern Elmodelodeformatodecimalparaconvertireste
nmero.Utiliceesteotipodeatributo.
tipo Eltipodenmero,porelnmero(number,por
defecto),lamoneda(currency),oporciento
(percent).Usaresteoelpatrndeesteatributo.
Ejemplo:
converters.xhtml:
<h:head>
<title>Convertidores JSF</title>
</h:head>
<h:body>
<h4>Convertidores</h4>
<p> Pantalla de fecha y hora, la datestyle es <i> full </i> y la configuracin regional es
<i> ru </i> </p>
<h:outputText value="#{Usuario.fecnac}">
<f:convertDateTime type="both" dateStyle="full" locale="ru" />
</h:outputText>
<p> Mostrar tanto, la fecha y la hora y el datestyle es <i> short </i> </p>
<p> Muestra una fecha con el patrn de <i> dd.mm.aaaa HH: mm </i> </p>
<h:outputText value="#{Usuario.fecnac}">
HH:mm" pattern="dd.MM.yyyy <f:convertDateTime />
</h:outputText>
<h:form id="datetime1">
<p> entrada de una fecha y el datestyle es <i> short </i> </p>
<h:inputText value="#{Usuario.fecnac}">
<f:convertDateTime type="date" dateStyle="short" />
</h:inputText>
<h:commandButton value="Send" />
</h:form>
<h:form id="datetime2">
<p> de entrada de una fecha que coincide con este patrn <i> dd.mm.aaaa </i> </p>
<h:inputText value="#{Usuario.fecnac}">
<f:convertDateTime pattern="dd.MM.yyyy" />
</h:inputText>
<h:commandButton value="Send" />
</h:form>
<p> Tipo de pantalla es <i> moneda </i> y la CurrencySymbol es <i> $ </i> </p>
<h:outputText value="#{Usuario.testInt}">
<f:convertNumber type="currency" currencySymbol="$"/>
</h:outputText>
<h:form id="number1">
<p> entrada de un nmero, pero slo los dgitos entero ser procesado </p>
<h:inputText value="#{Usuario.testInt}">
<f:convertNumber integerOnly="true"/>
</h:inputText>
<h:commandButton value="Send" />
</h:form>
<h:form id="number2">
<p> entrada de un nmero coincida con el patrn <i> ##0,00 </i> </p>
<h:inputText value="#{Usuario.testInt}">
<f:convertNumber pattern="##0,00"/>
</h:inputText>
<h:commandButton value="Send" />
</h:form>
</h:body>
7.4 Convertidorespersonalizados
Aveces,losconvertidoresestndarnosonsuficientes.
Porejemplo,ustedpuedenecesitarguardarenunabasededatoslosnmerosdetarjetadecrditosin
guionesoespacios.Parausarconvertidorpersonalizado,ustednecesitaparacrearunaimplementacin
delainterfazquejavax.faces.Converter,ysobreescibirsusmtodosgetAsObjectygetAsString.
Debeimplementarlasdosdireccionesdelconvertidor.DurantealApplyRequestValues(fase2),el
servletJSFutilizaelgetAsObjectmtodoparaconvertirlacadenadeentradaalmodelodeobjetosde
datos.DuranteRenderResponse(fase9),elservletJSFutilizaelmtodogetAsStringparahacerla
conversinenladireccinopuesta,demaneraqueunacadenapuedeserincluidoenlarespuestaHTML.
Unavezfinalizadoelconversor,tienequeregistrarseconlaaplicacin.Sepuederegistrarenfaces
config.xmlousandolanotacin@FacesConverter.
<converter>
<converter-id>CCNumberConverter</converter-id>
<converter-class>curso.converters.CCNumberConverter</converter-class>
</converter>
Parainvocarelconvertidor,ustednecesitajuntarcomounapropiedaddef:convertidoroasignarala
propiedadConverterdelcomponentedeentrada.
Ejemplo:
Vamosacrearunconvertidorquevaalimpiarunnmerodetarjetadecrditodecualquiercarcterno
numrico.
package curso.converters;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.component.UIComponent;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
@FacesConverter(value="CCNumberConverter")
System.out.println("CCNumberConverter.getAsObject: '"
+ val + "' -> '" + convVal + "'");
}
return convVal;
}
// 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;
System.out.println("CCNumberConverter.getAsString: '"
+ sVal + "' -> '" + convVal + "'");
}
return convVal;
}
converters_perso.xhtml:
<h:head>
<title>Convertidor Personalizado</title>
</h:head>
<h:body>
<h4>Convertidor Personalizado </h4>
<h:form id="number2">
<p> entrada de un nmero de tarjeta</p>
<h:inputText value="#{Usuario.pasatiempo}" converter="CCNumberConverter">
</h:inputText>
<h:commandButton value="Send" />
</h:form>
</h:body>
8 Validadores
8.1 UsoyCreacindelosvalidadores
Cmogarantizarqueelusuariodelaaplicacinnopuedecompraunnmeronegativodelibros?En
realidad,laaplicacintambindeberechazarcualquierintentodecompradecerolibros.Yquhayde
comprobarlavalidezdeunnmerodetarjetadecrdito?Estassontareasparalosvalidadores.
JSFcuentaconcuatrotiposdemecanismosdevalidacin:
Integradaenloscomponentes
Validacinaniveldeaplicacin
Componentesdevalidacinpersonalizada
ValidacinpormtodosdeBackedBeans
8.2 Validadoresincluidos
JSFproporcionalossiguientestrescomponentesdevalidacin:
F:validateDoubleRange:Sevalidaqueunaentradanumricaestdentrodeunrangodeterminado.Es
aplicablesalosvaloresquesepuedenconvertiraundoble.
f:validateLength:Sevalidaquelalongituddelacadenadeentradaestdentrodeunrango
determinado.
F:validateLongRange:Sevalidaqueunaentradanumricaestdentrodeunrangodeterminado.Es
aplicablesalosvaloresquesepuedenconvertiraunlong.
Parautilizarestoscomponentesdevalidacin,simplementeanidardentrodelah:inputquenecesita
validacin.Porejemplo,paracomprobarqueslocantidadespositivassepuedenintroducir:
8.3 Validacinaniveldeaplicacin
Lavalidacinaniveldeaplicacintienesentidosiesnecesarioparavalidarlalgicadeaplicacin,a
diferenciadelavalidacindelacorreccinformaldeloscamposindividuales.Porejemplo,antesde
aceptarunpedido,legustaracomprobarquesubanconotieneenlalistanegraelnmerodetarjetade
crdito.
Sideseahaceralgunasolicituddevalidacinaniveldeaplicacin,puedeinsertarsulgicaal
principiodelmtodollamadaporelformularioyhacerquelaactualizacindebasesdedatosyel
resultadomtododependedelresultadodevalidacin.Encasodeerrordevalidacin,tambinpodra
enviarunmensajeparaelusuario,comosemuestraenlaspocaslneassiguientes:
Elmensajecreadodeestamaneraesunmensajeglobal,novinculadaaningncomponenteen
particular,ysepuedevisualizarconelcomponenteJSFsiguiente:
<h:messages globalOnly="true" styleClass="error"/>
8.4 Validadorespersonalizados
Enelcapitulosobrelosconvertidores,seexplicocmoimplementarunconvertidorpersonalizado.Para
implementarunvalidadorpersonalizado,esunprocesocasiidntico:
Crearunaaplicacindelainterfazquejavax.faces.validator.Validatoryreemplazaelmtodovalidar.
Registrarelvalidadorenfacesconfig.xmlousalanotacinDocletenlaclase.
DentrodelaaplicacindeJSF,consulteelatributovalidatordelcomponente.
Supongamosquedeseaasegurarsedequeelcrdito,fechadecaducidaddetarjetaproporcionadaporel
usuarioduranteelpedidoestenelformatomm/aoyquelatarjetanohacaducado.
package curso.validators;
import javax.faces.validator.Validator;
import javax.faces.context.FacesContext;
import javax.faces.component.UIComponent;
import javax.faces.application.FacesMessage;
import javax.faces.validator.ValidatorException;
import java.util.GregorianCalendar;
import java.util.Calendar;
import javax.faces.validator.FacesValidator;
@FacesValidator("CCExpiryValidator")
public class CCExpiryValidator implements Validator {
public CCExpiryValidator() {
}
Pararegistrarelvalidador,esnecesarioagregarloafacesconfig.xmlousarlaanotacin@FacesValidator.
<validator>
<validator-id>CCExpiryValidator</validator-id>
<validator-class>curso.validators.CCExpiryValidator</validator-class>
</validator>
Uso:
<h:form>
<h:inputText id="ccexpiry" value="#{Usuario.apellido}" rendered="true"
requiredMessage="No puede estar vacio">
<f:validator validatorId="CCExpiryValidator" />
</h:inputText>
<h:message for="ccexpiry" errorClass="error" />
<f:verbatim><br/></f:verbatim>
<h:commandButton value="Probar"></h:commandButton>
</h:form>
8.5 ValidadorenBackedBean
Enlugardecrearunanuevaclasecomosedescribeenlaseccinanterior,puedeagregarunmtodoaun
backedbean.
Enestecaso,puedeshacerlosiguiente:
Copiarelmtododevalidacindentrodelaclase
Copiadelasimportaciones
SustituyalalneaquelanzalaValidatorExceptioncon:
if (messS != null) {
FacesMessage mess = new FacesMessage(messS);
cntx.addMessage(cmp.getClientId(cntx), mess);
}
Ejemplo:
<h:inputText id="ccexpiry" value="#{Usuario.apellido}" rendered="true" requiredMessage="No puede
estar vacio" validator="#{Usuario.validateCCExpiry}">
</h:inputText>
<h:message for="ccexpiry" errorClass="error" />
9 Componentespersonalizados
9.1 CreacindecomponentespersonalizadosparaJSF
Lafuncionalidaddeuncomponentesecentraenlaconversindelosometidoporunusuario(esdecir,los
parmetrosHTTPdelapeticin)avaloresdeloscomponentes(atravsdelmtododedecodificacin
duranteApplyRequestValues)ylaconversindevaloresdeloscomponentesdevueltaaHTML(a
travsdelmtododecodificarduranteRenderResponse).
CuandosediseauncomponenteJSF,sepuedeoptarporcambiarlacodificacinydecodificacindeuna
claseseparadadeprocesamiento.Laventajadeesteenfoqueesquesepuededesarrollarmsdeun
procesadorparaelmismocomponente,cadaunoconunarepresentacindiferenteenHTML.Usteda
continuacin,tienenelmismocomportamientoasociadoscondiferentesmanerasdeleerlosdatosdela
solicituddeylaescrituraalarespuesta.
Engeneral,teniendoencuentaqueJSFesdecdigoabierto,podraconsiderarlamodificacindeun
componenteexistenteenlugardedesarrollarunnuevo,oquizs,graciasalaseparacindelos
componentesylosrenderer,lamodificacindeunrendererexistentes.
LaclaserazdetodosloscomponentesJSFeslaclaseabstractajavax.faces.component.UIComponent,y
delaclaserazdetodoslosrenderersesjavax.faces.render.Renderer.Paradesarrollaruncomponente,
sinembargo,ustedprobablementevaapreferirampliaruncomponenteyaexistenteo,porloporlo
menos,laclaseUIComponentBase,queproporcionaimplementacionespordefectodetodoslosabstractos
losmtodosdeUIComponent.Deestaforma,ustedslotienequedesarrollarcdigoparalosmtodos
quesenecesidaddereemplazar.Lomismoocurreconelprocesador.
Paracompletarelpanoramadeloqueustednecesitahacerparatenersucomponentepersonalizado,es
crearunaetiquetapersonalizadaparausarloconJSP.Laclaserazdetodaslasclasesdeetiqueta
javax.faces.webapp.UIComponentELTag.
Enresumen,paradesarrollaruncomponentepersonalizado,tienequeiratravsdelospasossiguientes,
aunquenonecesariamenteenesteorden:
CrearunaclasedecomponentesquelassubclasesUIComponentporlaampliacindeuna
existentecomponente.
Registrarelcomponenteenfacesconfig.xml.
CrearunaclasedeprocesadorquesubclasaRendereryreemplazalosmtodosdecodificaciny
descodificacin.
Registrarelrenderirerenfacesconfig.xml.
CrearunaetiquetapersonalizadaquesubclasaUIComponentELTag.
CrearunTLDparalaetiquetapersonalizada.
Unaltimapalabraacercadeloscomponentesylosrenderers:amenosqueustedrealmentepiensaque
ustedvaalareutilizarelmismocomponenteparadiferentesaplicaciones,teharslavidamuchoms
fcilsimantieneselrendererdentrodelcomponente.
Enprimerlugar,vamosaverloquesedebehacercuandoestnseparados,yacontinuacinveremos
cmomantenerlosjuntos.
Lemostraremoscmodesarrollaruncomponentequecombinalafuncionalidaddelostrescomponentes
estndarnecesariosparaaceptarlaentradadeunusuario:unaetiquetaqueexplicaloqueseespera,el
campodetextoparaaceptarlaentrada,yunmensajeparainformardeerroresdeentrada.Enotras
palabras,vamosamuestracmoreemplazarelcdigodeJSFsiguientes:
conestecomponentepersonalizado:
TambinlemostraremoscmoestenuevocomponenteinputEntryimprimeunasteriscoalladode
laetiquetasiesnecesario="true".
9.1.1 ElComponente
Elcomponenteesenrealidadlapartemsfcil.Vamosatravsdelosmtodosdeunoporuno.
InputEntryComponenteslainicializacindeloscomponentes.
Sunicatareaesregistrarconelcomponentedelacadenaqueidentificaelrenderer.Lanica
propiedaddelcomponentesedefineenestearchivoeslaetiqueta(label).Estosedebeaqueesta
ampliacinUIInput,queseencargadedefinirtodoloquetienequeverconelcampodeentrada.
SeutilizaelmtodogetFamilyparaencontrartodoslosrenderersasociadosconestecomponente.
Estamosplaneandocrearunsoloprocesador,perosiguesiendoapropiadaparadefinirunafamiliams
bienqueheredandelafamiliadeUIInput,porquenosepodautilizarrenderizadoresUIInputcon
InputEntryComponent.
ElestadodelcomponenteconsisteenelestadodeUIInputmslapropiedaddelaetiqueta.Porlotanto,
definirsuestadocomounarreglodedosobjetos.ElmetodoSaveStateformauna
matrizylodevuelve,paraqueJSFpuedesalvarlo.ElmtodorestoreStaterecibeelEstado,
lodescomprime,yloalmacenalocalmente.ObservecmolasoperacionesquetienenqueverconUIInput
sonsiempredelegadas.
package curso.components;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
@FacesComponent("curso.inputEntry")
public class InputEntryComponent extends UIInput {
public InputEntryComponent() {
this.setRendererType("curso.inputEntry");
}
Ahoraquetieneelcomponente,ustedtienequeregistrarlo.Paraello,medianteelusodeunanotacin
@FacesComponent olainsercindelasiguienteslneasenfacesconfig.xml:
<component>
<component-type>curso.inputEntry</component-type>
<component-class>curso.components.InputEntryComponent</component-class>
</component>
9.1.2 Renderer
Elrendereresunpocomscomplicadoqueelcomponente.Paraimplementarlo,sedefineunaclaseque
extiendejavax.faces.render.Renderer.
Primerovamosasobreescribirtresmtodos,decode,encodeBegin,ygetConvertedValue.
LanicapropiedadqueseagregaaUIInputeslaetiqueta,queelusuariopuedemodificar.
Porlotanto,sloesnecesarioparadecodificarelcampodeentrada.
ElprocesodedecodificacinocurreenlafasedeApplyRequestValues(fase2).
Elprocesodecodificacinrequieremstrabajoqueelprocesodedecodificacin,porquetiene
paraenviaralarespuestaHTTPlostrescomponentesquesecombinanparaformar
InputEntryComponent.EstotienelugarduranteRenderResponse(fase9).
Tenemosquecrearunmtodoparacodificarlaetiqueta.SeabreelelementoHTMLconlaetiqueta
elmtododestartElement,escribelaetiquetaconunsimplemtododeescritura,escribeunasterisco,
peroslosiserequiereelcomponente,ysecierraelelementodelaetiquetaconelmtodode
endElement.
Creamosotromtodoparacodificarelcampodeentrada.SeabreelelementodeentradaHTML
input,aadelosatributosconelmtodowriteAttribute,ycierraelelemento.Lostres
parmetrosdewriteAttributesonelnombreyelvalordelatributoHTMLyelnombrede
lapropiedaddelcomponente.
Elresultadoesalgocomoelsiguienteelemento:
<input type="text" id="form:nameEntry" name="form:nameEntry" value="" />
encodeMessageesunmtodoparacodificarelmensajedeerror.Seobtienelalistadetodoslosmensajes
delacolaparaelcomponente,peroslomuestraelprimero.Siusteddeseamostraratodosellos,slo
tienequesustituirlapalabraclaveifconunwhile.
Paramostrarelmensaje,elmtodoabreelelementoSPANHTML,agregaelatributodeclasepara
mostrarelmensajeconelestilocorrecto,muestraelmensaje,ysecierraelelemento.Elresultadoes
algocomolosiguienteelemento:<span class="error">Un valor es necesario!</span>
package curso.renderers;
import curso.components.InputEntryComponent;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.render.FacesRenderer;
import javax.faces.render.Renderer;
@FacesRenderer(rendererType="curso.inputEntry", componentFamily="curso.inputEntry")
public class InputEntryRenderer extends Renderer {
Pararegistrarelrenderer,usaunaanotacin@FacesRendereroinsertalaslneassiguientesenfaces
config.xml:
<render-kit>
<renderer>
<component-family>curso.inputEntry</component-family>
<renderer-type>curso.inputEntry</renderer-type>
<renderer-class>curso.renderers.InputEntryRenderer</renderer-class>
</renderer>
</render-kit>
9.1.3 Tag
Elcomponentepersonalizadosehizo,peroparausarloconJSPesnecesariodefinirlaetiqueta
personalizadacorrespondiente.Secreaigualqueunaaccinpersonalizadaperoextendiendolaclase
UIComponentELTagenestecaso.
Sedefineunapropiedadparacadaatributoconelapoyodelaetiqueta,peronopara
elatributoid.LaraznesqueUIComponentELTagyalodefine.
Tengaencuentaqueslotienenmtodossetter,sinlosgetterscorrespondiente.Estoesporquenuncase
necesitaelmtodosget.ElmtodoSetPropertiescopialosvaloresdeatributodelaetiquetaal
componente,yelmtododeliberacinlimpialoqueyanoesnecesario.
package curso.tags;
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.webapp.UIComponentELTag;
// Setters
public void setErrorStyleClass(ValueExpression errorStyleClass) {
this.errorStyleClass = errorStyleClass;
}
AntesdepoderutilizarlaetiquetapersonalizadaenJSPannecesidaddecrearunTLDaponerenla
carpetaWEBINF/tlds/.
curso.tld:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-
jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>curso</short-name>
<uri>/WEB-INF/tlds/curso</uri>
<tag>
<display-name>inputEntry</display-name>
Conesto,ustedestarpreparadoparautilizarelnuevohJSFcomponentedeinterfazdeusuario:
inputEntry.Sloesnecesarioagregarlasiguientedeclaracindeespaciodenombrescursoalajsp:
elementorazeneliniciodeeldocumentoJSP:<%@taglib prefix="curso" uri="WEB-INF/tlds/curso.tld"%>
Ladesventajadelnuevocomponenteencomparacincontenerdemaneraindependienteloslabel,input,
ymessage,esquenoesposiblealinearloscamposdeentradavertical.
Ahoraqueyaesthecho,ustedpuedepreguntar,"Porqucurso:inputEntrysloadmitenunatributo,
mientrasqueh:inputTexttienecomo40?"Esoesunbuenpunto.Podramoshaberaadido
msatributos,talescomoeltamaodelcampodeentrada,queh:inputTextpasaaHTML,peronuestro
objetivoerasercapazdereemplazarconuncomponentenicodelostresloscamposenqueseutilicen.
Msatributosdeloestrictamentenecesarioslogeneraramscdigosinaadirnadatil.
9.1.4 InlineRenderer
Esposibleincluirlafuncionalidadderendererdentrodelaclasedecomponentes,demodoqueel
componenteserepresenta(render)porsmismo.Comohemosmencionadoantes,amenosqueusted
planeautilizarmsdeunprocesadorconelmismocomponente,esposiblequenosevaamolestar
creandorentderersseparados.
Parahacercurso:inputEntryconautorepresentacin,tienequehacerlosiguiente:
1.MuevalosmtodosdeInputEntryRenderer.javaaInputEntryComponent.java.Usted
necesidadhaceralgunoscambioscosmticosquevamosaexplicarenunmomento.Despuessepuede
borrarelarchivoderenderer.
2.AgregueelmtodoencodeEndaInputEntryComponent.java.
3.ReturnnullenelmtododegetRendererTypedeInputEntryTag.java.
4.Eliminarelregistrodelprocesadordefacesconfig.xml.
LaclaseUIInput,queseextiendeparacrearelcomponente,hospedalostresmtodosdecode,
encodeBegin,ygetConvertedValuequeutilizenelrendererporseparado,perosinelparmetro
UIComponent.Tienemuchosentido,porqueelobjetocomponenteesdirectamenteaccesiblesconla
palabraclavethis.
Cuandosequitaelparmetrodecmpdelostresmtodos,tambindebereliminarestalneade
decodificaryencodeBegin,porquesehaconvertidoenintil:
InputEntryComponent ieCmp = (InputEntryComponent)cmp;
Luego,remplazatodosloscmpyieCmpconthis.
SenecesitaelmtodoencodeEndparareemplazarelmtodoenUIComponentBase,quearrojaun
NullPointerException.Dehecho,ustednonecesitahacernadaenencodeEnd,solamentetienesque
escribirunmtododevaco:public void encodeEnd(FacesContext context) throws IOException { }
Tengaencuentaqueslonecesitaestemtodocuandoseejecutauncomponenteensmismo,nocuando
seutilizaunaclasedeprocesadorseparado.
EnInputEntryTag.java,elmtododevuelvegetRendererType"curso.inputEntry".Sielmtodoconsiste
enutilizarsusmtodosderepresentacininterna,getRendererTypetienequevolvernull.Porltimo,
eliminarlaslneasdelelementoderenderkitdefacesconfig.xmlsiestnpresente.
9.2 ComponentespersonalizadosparaFacelets
ConlosFaceletsesmassencillalacreacindecomponentespersonalizados.
NohaynecesidaddecrearunaclaseJava,solonecesitamosarchivosXHTML(yXML).
HayquecrearunequivalentealTLDparafacelets(.xml),ydeclararloenweb.xml
Ejemplodeinclusinenweb.xml:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/facelets/curso.xml</param-value>
</context-param>
Ejemplodedescriptorcurso.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://localhost</namespace>
<tag>
<tag-name>pie</tag-name>
<source>../include/footer.xhtml</source>
</tag>
</facelet-taglib>
Paginafooter.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:body>
<ui:component>
<h:panelGroup styleClass="footer">
<h:outputText value="Docente: Cedric Simon - "/>
LapginaaincluiresunapginaJSFXHTML,yelcomponentequequeremosincluirseencuentra
entre<ui:component>y</ui:component>.
Losparametrosserecuperancon#{nombreDelParametro}.Seacceptancomoparametrostambien
objetosJSFometodos.
Ejemplomascomplejo,equivalenteaInputEntry:
input_entry.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body>
<ui:component>
<h:outputText value="Nombre de Contacto"/>
<c:if test="#{required}">*</c:if>:
<h:inputText id = "nombre" required = "#{required}" value = "#{value}"
requiredMessage = "El valor es necesario!" />
<h:message for="nombre" styleClass="error"/>
</ui:component>
</h:body>
</html>
custom_component.xhtml:
<h:form>
<curso:inputEntry label="Nombre de Contacto" required = "true"
value = "#{Usuario.nombre}"
errorStyleClass ="error" requiredMessage = "El valor es necesario!"
/>
<f:verbatim><br/></f:verbatim>
<h:commandButton value="Probar" type="submit"></h:commandButton>
</h:form>
box_doble.xhtml:
<h:panelGrid border="1" columns="2">
<ui:insert name="izquierdo"/>
<ui:insert name="derecho"/>
</h:panelGrid>
Usodebox_doble:
<curso:box_doble>
<ui:define name="derecho">Derecho</ui:define>
<ui:define name="izquierdo">Izquierdo</ui:define>
</curso:box_doble>
10ComponentesJSFparaAjax
10.1CmoJSFyAjaxpuedentrabajarjuntos?
Utilizarel(Ajax)JavaScriptensupginaJSF
PonersucdigodeAjaxJavaScriptenloscomponentesJSF
AprovecharlacrecientecoleccindemarcosdetrabajoAjaxJSF
Utilizarelnuevotag<f:ajax>
10.2Utilizarel(Ajax)JavaScriptensupginaJSF
Elmsprctico/formafcildeinyectaralgodefuncionalidadWeb2.0ensuinterfazdeusuarioJSF,
PuedesagregartuspropiosJS,oextenderlosmarcosdetrabajoAjaxexistentescomo:
Dojo
JQuery
Prototype
Scriptaculous
OAT
10.2.1 Pros
Tcnicamentesencillo
Fcilparacosassimples/pequeas
10.2.2 Contras
TrabajoconJavaScriptmsavanzadopuedeserunretoparalosprogramadoresJava(usted
tienequepasarcdigo(javascript)alladodelcliente).
Puedeserdifcildepurarlaaplicacin(busqueerrorestantoenelservidoryelcliente)
10.3PonersucdigodeAjaxJavaScriptenlos
componentesJSF
MedianteelusodelatecnologaJSFdecomponentesesposibleescribirsuspropioscomponentesque
generanelJavaScriptnecesarioenelcliente.
EstoesfactibleporqueJSFpuedegenerarcualquiertipodetextoenelcliente
/ / Javascript Render personalizado para llamar a JSSlider.js
writer.Write ( "<script language=\"JavaScript\" src=\"" contextPath + + "/js/JSSlider.js\"> </
script>");
10.3.1 Pros
Arquitecturaslida
Usuariofinal/desarrolladordeaplicacioneslopuedeutilizarfcilmentesintratarconJS.
10.3.2 Contras
Puedeserunretoparaconstruirdesdeunpuntodevistatcnico(tienesqueserunexperto
clienteAjax,ascomounexpertoenJSF)
Difcilesdedepurareneldesarrollodecomponentes
10.4Aprovecharlacrecientecoleccindemarcosde
trabajoAjaxJSF
AhorapuedendescargardiversasbibliotecasdecomponentesJSF
Instalacinfcilyrpida
SoporteIDEtambinestdisponibleparamuchos(Eclipse,NetBeans,Exadel,JDeveloper...)
Algunosejemplos:JBossRichFaces(Ajax4JSF),ICEfaces,ADFFaces(Trinidad)RichClient
10.4.1 Pros
Aprendizajemsfcil
NotienesquelidiarconlascomplejidadesdelJavaScript
Puedenelegirentreunacrecientecoleccindelasbibliotecas
10.4.2 Contras
Sitodofunciona,excelente!
Todavapuedeserdifcildedepurarenelcliente(estoesporqueelcdigodeclientese
representadesdeelcliente,yustedtienepocooningncontrolsobreeste)
10.5Utilizarelnuevotag<f:ajax>
JSF2.0traeunanuevalibreraparaAjax.
10.5.1 Pros
IncluidaenJSF2.0
NotienesquelidiarconlascomplejidadesdelJavaScript
10.5.2 Contras
Existenlimitacionesalusodeh:outputTextconAjax
Tecnologamuynueva(>menosfuentesparaaprendizajeautodidacto,depuracin),soloJSF2.0
Todavapuedeserdifcildedepurarenelcliente(estoesporqueelcdigodeclientese
representadesdeelcliente,yustedtienepocooningncontrolsobreeste)
10.5.3 PorquelAjaxenJSF?
PorquunabibliotecadeJSFAjaxespecfico?
HaytoneladasdelasbibliotecasAjaxya(jQuery,DWR,GWT,etc.)Porquinventarunanuevapara
JSF?
10.5.3.1 VentajasdeunenfoqueespecficoJSFAjax
JSFespecfico
Delladodelcliente:
UstedpuedeactualizarloselementosJSF(h:outputText,h:inputText,h:selectOneMenu,etc).
UstednotienequeescribirJavaScript
Delladodelservidor
LosbackedbeansestndisponibleenlasllamadasAjax
Ustednotienequeescribirservletsyanalizarparmetros
10.5.4 Usodeltag<f:ajax>
Descripcingeneral:
<h:commandButton action="">
<f:ajax render="id1 id2" execute="id3 id4"
event="blah" onevent="javaScriptHandler"/>
</h:commandButton>
Render:especificarloselementosaactualizarenelcliente
Execute:especificarelementosparaprocesarenelservidor
Event:especificarloseventosdeusuarioqueinicianlallamadaAjax
onEvent:especificarlosscriptssecundarios(JavaScript)ainiciarlallamadaAjax
Backedbeanutilizadoenlosejemplosabajo:
package curso.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean(name = "AjaxDemo")
@SessionScoped
public class AjaxDemo {
private Integer a = 0;
private int b=0;
private String respuesta;
public AjaxDemo() {
}
public void onClick() {
a += 10;
}
public void execute() {
double rand = Math.random();
respuesta = "El numero al hazar es " + rand + ", multiplicado por " + a + " = " + (rand * a);
}
public Integer getA() {
return a;
}
public void setA(Integer a) {
this.a = a;
}
public String getRespuesta() {
return respuesta;
}
public void setRespuesta(String respuesta) {
this.respuesta = respuesta;
}
public int getB() {
b+=10;
return b;
}
public void setB(int b) {
this.b = b;
}
}
10.5.4.1 Ejemplosencillo
Cdigo:
<h:commandButton action="">
<f:ajax render="id1"/>
</h:commandButton>
/h:commandButton
<h:outputText id="id1"/>
Interpretacin:
Cuandosepulsaelbotn,vayaalservidor,ejecutelaaccin,calcularelvalordelelementodeJSF,cuyo
ides"id1",enviaresevaloralcliente,yluegosustituireseelementoenelDOMconelnuevovalor.
Ejemplo:
<h:form prependId="false" id="form">
<h1>Ajax demo 1</h1>
<h:commandButton action="#{AjaxDemo.onClick}" value="Agrega 10 a A">
<f:ajax render="id1" />
</h:commandButton>
<br/>
<h3>Valor de A:
<h:outputText id="id1" value="#{AjaxDemo.a}" />
</h3>
</h:form>
10.5.4.2 renderer:Especificacindeloselementosdeactualizacinenelcliente
ResumendeCdigo
<f:ajax render="formId:elementId" />
Idea
IdolistaseparadaporespaciosdelasidentificacionesdeloselementosdeJSFcuyosvaloresseparados
porespaciosdebenserdevueltosdesdeelservidorysesustituyeenDOM
Detalles
Haycuatrovaloresespeciales:@este@formulario,ninguno@y@todos.Sinembargo,estossonms
frecuentementeutilizadosparalaejecucindeatributosquelahacenatributo.Verseccindelexecute.
Amenosqueutilice<h:formprependId="false"/>,elREALIDesFormID:elementId.
10.5.4.3 execute:Especificacindeloselementosaprocesarenservidor
ResumendeCdigo
<f:ajax render="" execute="" />
Idea
UnidentificadorolistadeidentificadoresJSFseparadaporespacioquedebeserenviadaalservidor
parasuejecucin.Proejemplo,unh:inputText,queserprocesadonormalmente(setters,validacin,
etc).
Detalles
Hay4valoresespeciales:@this@form,@none@all
@this.Elelementoqueencierraf:ajax.Predeterminado.
@form.Elh:formincluyendoaf:ajax.Muyconvenientesiustedtienevarioscamposparaenviar.
@none.Nadadeloenviado.tilsielelementoquecambialosvaloresdehacercadavezquese
evalen.
@all.TodosloselementosdelainterfazdeusuarioJSFenlapgina.
Ejemplo:
<h:form>
<h:panelGrid columns="2">
Numero a multiplicar :
<h:inputText id="a" size="5" value="#{AjaxDemo.a}">
</h:inputText>
<h:commandButton action="#{AjaxDemo.execute}" value="Clic">
<f:ajax render="respuesta" execute="@form"></f:ajax>
</h:commandButton>
</h:panelGrid>
<hr></hr>
<h:outputText id="respuesta" value="#{AjaxDemo.respuesta}" />
</h:form>
10.5.4.4 event:mencionaracualeventodeusuariodebedispararlallamadaAjax
ResumendeCdigo
<f:ajax Render="" event="" />
Idea
NombredeleventoJuJavaScriptpararesponder.Noincluya"on",porloqueesmouseover,keyup,Blur,
etc...
Detalles
Pordefecto
Sieleventonoespecificado,pordefectoutilizado.
Altoniveldeeventos
JSFaade2Extras:accionyvalueChange.
Ajustef:ajaxentornoaelementos
<f:ajaxrender="">unmontndecomponentes</f:Ajax>aadeelcomportamientoAjaxenelevento
pordefectoparacadacomponenteenvolvi.
Accionespordefecto:
action:h:CommandButton,h:commandLink
Tengaencuentaquela"accin"espartedeJSF,ynounnombredeJavascriptnativoevento.
Significaqueelbotnhasidoinvocadaencualquierforma(haciendoclicenl,ENTER,sitiene
elfoco,elteclado,accesodirecto,etc).
valueChange:h:inputText,h:inputSecret,h:inputTextarea,todoslosbotonesdeopcin,casillade
verificacin,yloselementosdemen(h:selectOneMenu,etc),
Unavezms,esteeventoesaadidoporJSFynoesunnombreJavascriptnativoevento.
Diferentesnavegadoresmanejanun"cambio"demaneradiferente,porloqueesteunificael
comportamiento.
Tambintengaencuentaquees"valueChange"no",valuechange".Losacontecimientosnativas
JavaScriptsonminsculas(mouseover,keyup,etc)
Ejemplo:
<h:form prependId="false">
<h1>Ajax Event</h1>
<h:commandButton action="#{AjaxDemo.onClick}" value="Agrega 10 a B">
<f:ajax render="id1" event="mouseover" />
</h:commandButton>
<br/>
<h3>Valor de B:
<h:outputText id="id1" value="#{AjaxDemo.b}" />
</h3>
</h:form>
11Hibernate
11.1Introduccin
Hibernateesunmarcodetrabajoparapersistenciadedatos(enJava).
HibernatepermitemanejarlapersistenciadelosdatosenJava,haciendoabstraccindelabasede
datos.HibernateseencargardedarlosdatosalcdigoJava,yseencargardemantenerlabasede
datosalda,siseutilizaunabasededatos.EsunaimplementacindeJPA.
11.2Instalacin
HibernatevienepreinstaladoenlosservidoresJbossyGlassfish.
11.3Configuracin
ParapoderusarHibernate,serequiereconfigurarunarchivollamadohibernate.cfg.xmlquese
encuentraenWEBINF/clases(enlarazdelasclasesJava).
AquvaunejemplodeconfiguracinparaconectarseconunabasededatosMySQL:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-
3.0.dtd">
<hibernate-configuration>
<session-factory name="curso">
<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/curso</property>
<property name="hibernate.connection.username">curso</property>
<property name="hibernate.connection.password">123</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- thread is the short name for
org.hibernate.context.ThreadLocalSessionContext
and let Hibernate bind the session automatically to the thread
-->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.autocommit">true</property>
</session-factory>
</hibernate-configuration>
11.4Utilizacin
ParautilizarHibernatenecesitamoscrearunEntityEJB3yreferenciarloenelarchivodeconfiguracin
deHibernate.
Existenherramientasparacrearlasclasesapartirdelabasededatos.
11.4.1 EJB3paralatablecity
City.java:
package curso.hibernate;
import java.io.Serializable;
import javax.persistence.*;
import java.util.Set;
@Entity
@Table(name="city")
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="NO_CITY")
private int noCity;
@Column(name="CITY_NAME")
private String cityName;
@Column(name="REGION")
private String region;
public City() {
}
public int getNoCity() {
return this.noCity;
}
public void setNoCity(int noCity) {
this.noCity = noCity;
}
public String getCityName() {
return this.cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getRegion() {
return this.region;
}
public void setRegion(String region) {
this.region = region;
}
public Set<Patient> getPatients1() {
return this.patients1;
}
public void setPatients1(Set<Patient> patients1) {
this.patients1 = patients1;
}
public Set<Patient> getPatients2() {
return this.patients2;
}
public void setPatients2(Set<Patient> patients2) {
this.patients2 = patients2;
}
}
Luegoagregamosunalneaenhibernate.cfg.xml:
...
<session-factory name="curso">
...
<mapping class="curso.hibernate.City" />
</session-factory>
...
11.4.2 HibernateHelper
PararecuperarymanejarlasesindeHibernate,senecesitaunaclase,comoporejemplolaclase
HibernateHelper.
HibernateHelper.java:
package curso.hibernate;
11.4.3 PruebadeusodeHibernatedesdeJava
VamosaconectarnosdesdeJavayutilizarHibernatepararecuperardatosenlabasededatos.
TestExample.java:
package curso.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
11.5HibernateQueryLanguage
Hibernateutilizaunlenguajedeconsultapotente(HQL)quesepareceaSQL.Sinembargo,comparado
conSQL,HQLescompletamenteorientadoaobjetosycomprendenocionescomoherencia,polimorfismo
yasociacin.
ParaobtenermsinformacinsobreelusodelHQL,veren
http://docs.jboss.org/hibernate/core/3.6/reference/esES/html/queryhql.html
11.6HibernateconJSF
ParausarHibernateconJSF,vamosacrearunobjetoDAOparaaccederalaclaseCity.Luego
podremosmanejarelobjetodesdeJSF.
11.6.1 ClaseDAO
Generico.java:
package dao;
/**
*
* @author JavAdicto
CityDao.java:
package dao;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import curso.hibernate.City;
import curso.hibernate.HibernateHelper;
}
@Override
public void borrar(Object obj) {
session.beginTransaction();
session.delete(obj);
session.getTransaction().commit();
}
@Override
public void borrarPorId(Class<?> clase, Serializable id) {
session.beginTransaction();
Object obj = buscarPorId(clase, id);
session.delete(obj);
session.getTransaction().commit();
}
@Override
public Object buscarPorId(Class<?> clase, Serializable id) {
Object instance = null;
try
{
session.beginTransaction();
instance = session.get(clase, id);
session.getTransaction().commit();
}
catch( RuntimeException e )
{
e.printStackTrace();
11.6.2 AccesodesdeJSF
CityList1.java:
package curso.beans;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import curso.hibernate.City;
import dao.CityDao;
@ManagedBean(name="cityList1")
@ViewScoped
public class CityList1 {
<h:head></h:head>
<body>
<h:form>
<h:dataTable id="dt1" value="#{cityList1.all}"
var="item" bgcolor="#F1F1F1" border="10" cellpadding="5" cellspacing="3" rows="4" width="50%"
dir="ltr" frame="hsides"
rules="all" summary="Es un codigo JSF para crear un dataTable." >
<h:column >
<f:facet name="header">
<h:outputText value="Cuidad" />
</f:facet>
<h:commandLink value="#{item.cityName}" action="#{cityList1.initCity}" >
<f:setPropertyActionListener value="#{item}"
target="#{cityDetails.city}"></f:setPropertyActionListener>
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Region"/>
</f:facet>
<h:outputText value="#{item.region}"></h:outputText>
</h:column>
</h:dataTable><br />
</h:form>
</body>
</html>
CityDetails.java:
package curso.beans;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import curso.hibernate.City;
import dao.CityDao;
@ManagedBean(name="cityDetails")
@RequestScoped
public class CityDetails {
private City city;
private String cityName;
private int noCity;
private CityDao dao;
public CityDetails() {
dao=new CityDao();
}
public void onSubmit(ActionEvent e) {
System.out.println("submiting !!!");
if (cityName.equalsIgnoreCase("")) {
throw new AbortProcessingException("Cuidad invalida");
}
}
public String submit(){
System.out.println("Updating !!! noCity="+noCity);
city=(City) dao.find(City.class, noCity);
CityDetails.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<h:body>
<h:form >
<h:inputHidden value="#{cityDetails.noCity}" id="noCity"/>
<h1>Detalle de la cuidad de <h:outputText value="#{cityDetails.cityName}" /></h1>
<h:panelGrid bgcolor="yellow" columns="1">
<h:column><h:inputText value="#{cityDetails.cityName}" autocomplete="off" id="cityName"
required="true" validatorMessage="Minimo 2 caracteres!"
requiredMessage="La cuidad no puede estar vacia" >
<f:validateLength minimum="2" /></h:inputText>
</h:column>
<h:column><h:commandButton value="Enviar" action="#{cityDetails.submit}"
actionListener="#{cityDetails.onSubmit}" /> </h:column>
</h:panelGrid>
</h:form>
</h:body>
</html>
Agregarafacesconfig.xml:
<navigation-rule>
<from-view-id>/cityDetails.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/city_list.xhtml</to-view-id>
</navigation-case>
</navigation-rule>