Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Faces)
Introduccin
Actualmente la mayora de las
aplicaciones se distribuyen por Internet.
Casi todos los accesos clientes se hacen a
travs de Web.
Cada vez hay mas clientes especficos con
dispositivos y pantallas diferentes.
El modelo de programacin Web actual
est basado en documentos no basados
en pantallas de interaccin.
Aportaciones de JSF
Arquitectura
Elementos
Se necesita configurar un servlet de JSF
para enlazar con el contenedor Web.
Se basa en un fichero de configuracin,
por defecto faces-config.xml
Qu gestionamos en el faces-config?
Configurando JSF:
Descriptor web.xml
Parmetros de
Configuracin
El cerebro de la bestia:
Faces-config.xml
Java beans.
Registrar validadores propios.
Registrar conversores propios.
Configurar reglas de navegacin.
Registrar Renders.
Registrar componentes propios.
Configuracin de Beans
request.
Session.
application.
none.
Ejemplo de Declaracin de
Bean
<managed-bean>
<managed-bean-name>NA</managed-bean-name>
<managed-bean-class>model.ImageArea</managed
-bean-class>
<managed-bean-scope>application</managed-beanscope>
<managed-property>
<property-name>shape</property-name>
<value>poly</value>
</managed-property>
..
</managed-bean-name>
</managed-bean>
<managed-bean>
<managed-bean-name>usuario</managed-bean-name>
<managed-bean-class>es.uniovi.si.UsuarioBean</managed-beanclass>
<managed-property>
<property-name>nombre</property-name>
<value>invitado</value>
</managed-property>
Botones: UICommand
Realiza una accin al ser activado.
Propiedades bsicas:
UICommand
UInput
Formularios en JSF
Cuando apliquemos JSF, tenemos que
ceirnos a sus reglas y utilizar sus etiquetas
en lugar de las etiquetas estndar HTML.
stas implementan ms lgica por detrs
que nosotros no vemos pero que nos ahorra
trabajo.
Ejemplo de formulario en JSF:
<h:form>
<h:inputText value="#{usuario.login}"/>
<h:commandButton value="Login" action=?"/>
</h:form>
<h:form>
<h:inputText value="#{usuario.nombre}"/>
<h:commandButton value="Enviar"
action=entrada.jsf"/>
</h:form>
Adnde va mi request?
En JSF, TODAS las peticiones van a la propia
pgina. Entonces. Dnde est el truco?
El servlet mapping hace que el controlador
caputure TODAS las peticiones que
concuerden con la extensin *.jsf
Lo que debemos poner en el campo action
de un componente de comando (ntese que
no es a nivel de formulario) es la accin que
se desea disparar
Cmo se navega entonces? Estableciendo
el mapa de navegacin en el controlador.
Navegacin
Failure:
Logon:
No result:
Elementos de Navegacin
From-view-id
From-action
From-outcome
To-view-id
Ejemplo: Navegacin
<navigation-rule>
<from-view-id>/logonjsp</from-view-id>
<navigation-case>
<from-action>#{LogonForm.logon}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/storefrontjsp</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-rue>
<navigation-rule>
<from-view-id>/welcome.jsp</from-view-id>
<navigation-case>
<from-outcome>login</from-outcome>
<to-view-id>/entrada.jsf</to-view-id>
</navigation-case>
</navigation-rule>
Ms de beans...Bean con
Binding
<managed-bean>
<managed-bean-name>customer</managed-bean-name>
<managed-bean-class>CustomerBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>areaCode</property-name>
<value>#{initParam.defaultAreaCode}</value>
</managed-property>
.
</managed-bean>
Arrays y Listas de
Propiedades
<managed-bean>
.
<managed-property>
<property-name>books</property-name>
< list-entries >
<value-class>java.lang.String</value-class>
<value>Web Servers for Fun and Profit</value>
<value>#{myBooks. bookld [3]}</value>
<null-value/>
</ list-entries >
</managed-property>
</managed-bean>
Interactuando con el
modelo
Cmo hacemos que nuestras vistas
interacten con el modelo?
Sabemos como forzar a que JSF invoque un
mtodo get o set sobre un bean, luego
Implementando lgica en los accessors?
No, sera desnaturalizar el mtodo.
Alternativa: Navegacin dinmica
Navegacin dinmica
Navegacin dinmica
Para implementar navegacin dinmica,
debemos utilizar en el elemento de
comando que hace submit una expresin de
mtodo.
Ejemplo:
<h:commandButton label="Login"
action="#{loginController.verifyUser}"/>
Navegacin dinmica
Cmo se determina el destino tras ejecutar
un mtodo de bean?
Desde el bean:
if (...)
return "success";
else
return login-error";
Navegacin dinmica
<navigation-rule>
<navigation-case>
<from-action>#{loginController.verifyUser}
</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/consultaLibros.faces</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{loginController.verifyUser}
</from-action>
<from-outcome>login-error</from-outcome>
<to-view-id>/login.faces</to-view-id>
</navigation-case>
</navigation-rule>
Beans Asociados Ms
inyeccin de dependencias
<managed-bean>
<managed-bean-name>customer</managed-bean-name>
<managed-bean-class>com .mycompany.mybeans.CustomerBean</managed-beanclass>
<managed-bean-scope> request </managed-bean-scope>
<managed-property>
<property-name>mailingAddress</property-name>
<value>#{addressBean}</value>
</managed-property>
<managed-property>
<property-name>streetAddress</propertyname>
<value>#{addressBean}</value>
</managed-property>
<managed-property>
<property-name>custom erType</property-name>
<value>New</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>addressBean</managed-bean-name>
<managed-bean-class>com .mycompany.mybeans.AddressBean</managed-beanclass>
<managed-bean-scope> none </managed-bean-scope>
<managed-property>
<property-name>street</property-name>
<null-value/>
<managed-property>
</managed-bean>
Taller prctico
Modificar la versin anterior para aadir un
contador que, basndose en el contexto de
la aplicacin, cuente cuantos logins se
realizan en la aplicacin contando todos los
de los usuarios.
Desde donde lo hacemos? En qu clase lo
inyectamos?
Visualizar el resultado del contador en la
pgina final.
Componentes JSP
Objetos Implcitos
Componentes JSP
EL Objetos Implcitos
applicationScope
cookie
facesContext
header
headerValues
initParam.
param
paramValues
requestScope
sessionScope
view
Elementos Visuales
Los componentes han de tener un
constructor vaco para poder instanciarse.
Todo componente visual tiene una
representacin como objeto en el servidor
en una jerarqua nodal.
El renderizador se encargara de generar
su
representacin visual segn convenga.
Elementos Visuales
Propiedades del
UIComponent
Propiedades nodales
getParent.
getChildren.
getChildrenCount.
getViewNode
Nos permite acceder al nodo principal del rbol
Propiedades del
UIComponent
Nos permite acceder al FacesContext al
que pertenece el componente.
Todo componente pertenece a una familia
y un renderType, la conjuncin de ambos
determina el render a utilizar.
Casi cada componente UI va a tener una
etiqueta asociada.
Codificacin de datos
Encode:
EncodeBegin
EncodeChildren
EncodeEnd
Durante la fase de renderizacin los datos se pasan al lenguaje
de marcado.
En caso de no necesitar tener en cuenta los componentes hijo
solo implementaremos en encodeEnd.
UIView
Es el nodo raz de un rbol de
componentes visuales.
Nos permite poner el locale del rbol.
Hereda de UIBaseComponent.
Tiene asociado un RenderKit:
Libreras de etiquetas
Librera de Etiquetas
<c:include ...>
</f:subview>
Etiquetas Html
Propiedades usuales:
UIForm
Representa un form de entrada.
Engloba a todos los componentes que
muestran o recogen informacin.
<h:form>. ..</h:form>
UIData
Representa una tabla de informacin.
<h:dataTable..>...
Tiene UIColumns dentro.
Soporta estar enlazado con una coleccin
de objetos sobre la que itera.
El atributo value indica la coleccin sobre
la que iterar.
El atributo var indica la variable sobre la
que se va a ir guardando el objeto de
datos en cada iteracin.
UIData
Propiedades de UIData
columnClasses
footerClass
headerClass
rowClass
StyleClass
<h:column>
Ejemplo de uso
<h:dataTable value="#{gestionLibrosService.libros}"
var="libro">
<h:column>
<f:facet name="header">
<h:outputText value="Ttulo" />
</f:facet>
<h:outputText value="#{libro.titulo}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Autor" />
</f:facet>
<h:outputText value="#{libro.autor}"/>
...
</h:dataTable>
FaceContext
FaceContext
Fases Estndar
Restore View
Restore View
Restore View
Restore View
Se almacena el UIViewRoot en el
FacesContext.
Se determina el valuebinding para cada
atributo binding y se llama al setValue.
Al final de esta fase tenemos recuperado
el viewRoot que haba y si acaso se ha
creado uno nuevo.
Posibilidades de cambio de
Fase
Process Validations
Process Validations
Se procesan las validaciones llamando
a processValidators.
Cualquier fallo en la validacin mete un
mensaje de error en el FacesContext.
Invoke Application
Invoke Application
Si se alcanza esta fase se asume que la
actualizacin del modelo ha sido
completada.
Se llama al mtodo processApplication de
UIViewRoot.
Se llama a todos los eventos encolados
con
phaseId.INVOKE_APPLICATION.
Excepcionalmente se podra llegar a
cambiar el actionListener por defecto con
setActionListener
Render Response
Render Response
Backing beans
Son beans que no responden a entidades,
sino a agrupaciones que datos que por
motivos prcticos, nos puede interesar
procesar juntos, a nivel no de valores sino
de componentes.
Es imprescindible para validaciones en las
que se han de comprobar relaciones entre
componentes.
Ejemplo: Representacin de formularios
Backing beans
En la JSP:
<h:outputText binding="#{changeSessionForm.oldUser}"/>
Ms elementos UIInput...
Los elementos de formulario que muestran
elementos entre los que seleccionar
(combo, radio, listas, etc) comparten modo
de funcionamiento.
La entrada de datos debe ser una coleccin
de elementos SelectItem.
Ej:
UISelectBoolean
Etiqueta h:selectBooleanCheckbox
Representa un estado booleano
UISelectMany
selectManyListBox
selectManyMenu
UISelectOne
UISelectItems UISelectItem,
UISelectGroup
Carga de SelectItems.
En la jsp:
<h:selectOneMenu
binding="#{pruebaForm.propiedadDestino}">
<f:selectItems value="#{pruebaForm.opciones}"/>
</h:selectOneMenu>
Resource Bundles y
Mensajes
En cualquier aplicacin es conveniente evitar tener las
cadenas de texto hardcodeadas en el cdigo fuente de las
pantallas o pginas.
Los resource bundles sirven para seleccionar el mensaje de
error en funcin de la clave, buscndolo en los resource
bundle cargados. En el faces-config:
<application>
<resource-bundle>
<base-name>messages</base-name>
<var>msgs</var>
</resource-bundle>
</application>
El fichero
messages.properties:
welcome=Benvenido a mi pgina web!!!!
Taller prctico
Sobre piloto 7.0...
Creamos messages.properties.
Lo configuramos como fichero de recursos
con el prefijo msgs.
Extraer los mensajes de al menos una de
las vistas, por ejemplo, welcome.jsp.
Probar la aplicacin.
Resuelto en piloto 8.0
Internacionalizacin
messages.properties
Messages_en.properties
Messages_fr.properties
...
Taller prctico
<faces-config>
<application>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>de</supported-locale>
</locale-config>
</application>
</faces-config>
Taller prctico
Modificar la aplicacin para que el criterio
del idioma que estamos seleccionando al
hacer login cambie el locale de la
aplicacin.
Para verlo reflejado, internacionalizar
alguna de las pginas posteriores al proceso
de login.
Dnde recogemos el locale?
Resuelto en piloto 9.0
Conversores
public java.langObject
getAsObject(javax.faces.context.FacesContext context,
javax.faces.com ponent. UlComponent component,
java.lang.String value)
public java.Iang.String
getAsString(javax.faces.context. FacesContext context,
javax.faces.component. UlComponent component,
java.lang.Object value)
Conversores Existentes
BigDecimalConverter
BigIntegerConverter
ByteConverter
CharacterConverter
DateTimeConverter
DoubleConverter
FloatConverter
IntegerConverter
LongConverter
NumberConverter
ShortConverter
Conversor de Fecha
Conversor de nmero
Conversores estndar
Conversores estndar
Ejemplos:
<h:outputText value="#{payment.date}">
<f:convertDateTime/>
</h:outputText>
<h:outputText value="#{payment.amount}">
<f:convertNumber type="currency"/>
</h:outputText>
<h:inputText value="#{payment.amount}">
<f:convertNumber minFractionDigits="2"/>
</h:inputText>
Renderizado de errores
Cmo muestro los errores de
conversin/validacin?
Si quiero mostrarlos todos juntos:
<h:messages/>
Taller prctico
Basarse en el ejemplo anterior para aplicar
un conversor para la cantidad de productos
que se aaden al carrito y mostrar los
errores asociados al cambo justo debajo del
mismo.
Probarlo metiendo caracteres en el campo.
Funciona? Cmo sale el mensaje?
Resuelto en piloto 10.0.
Ejemplos:
Cdigo
mensaje
javax.faces.converter.Intege
rConverter. INTEGER
javax.faces.converter.Intege
rConverter.INTEGER_detail
javax.faces.converter.Double
Converter.DOUBLE
javax.faces.converter.Double
Converter.DOUBLE_detail
javax.faces.converter.Boolea
nConverter.BOOLEAN_detail
Validadores
JSF permite validar el contenido de
diferentes datos.
Podemos usar el atributo validator para
apuntar al mtodo de una bean que
realiza validacin.
Los validadores se pueden registrar en las
clases que implementan
EditableValueHolder.
En caso de no cumplirse la validacin han
de lanzar ValidatorException coteniendo
un FacesMassage con el error.
Validades predefinidos
Parmetros:
Validades predefinidos
Taller prctico
Modificar el piloto anterior para que adems
se requiera el campo cantidad.
Taller prctico
Resuelto en piloto11.0
Action events
Los disparan los elementos UICommand cuando el
botn o enlace asociado es activado.
Phase Events
Son disparados rutinariamente por el ciclo de vida
JSF.
El tipo ValueChangeEvent
Mtodo
Descripcin
UIComponent
getComponent()
Object getNewValue()
Object getOldValue()
PhaseId getPhaseId()
void setPhaseId(PhaseId)
Taller prctico
Taller prctico...
Modificar entrada.jsp para que cuando
cambie el combo del formulario, a su
derecha se muestre el valor del libro
seleccionado.
Para ello:
Action Events
Son disparados por los objetos UICommand
cuando se activa el componente
Se invocan durante la fase Invoke
Application
<h:commandLink actionListener="#{bean.linkActivated}">
...
</h:commandLink>
Actions:
Diseados para la lgica de negocio.
Deciden sobre la navegabilidad del sistema
Action listeners:
Orientados a ejecutar lgica de presentacin.
No pueden decidir qu mensaje se enva al controlador.
Enlace en la JSP:
<h:commandButton image="mountrushmore.jpg"
actionListener="#{rushmore.listen}"
action="#{rushmore.act}"/>
En el backing bean...
private String outcome;
private Rectangle washingtonRect = new Rectangle(70,30,40,40);
private Rectangle jeffersonRect = new Rectangle(115,45,40,40);
public void listen(ActionEvent e) {
FacesContext context = FacesContext.getCurrentInstance();
String clientId = e.getComponent().getClientId(context);
Map requestParams = context.getExternalContext().getRequestParameterMap();
int x = new Integer((String) requestParams.get(clientId + ".x")).intValue();
int y = new Integer((String) requestParams.get(clientId + ".y")).intValue();
outcome = null;
if (washingtonRect.contains(new Point(x,y)))
outcome = "washington";
...
Taller prctico.
f:actionListener
f:valueChangeListener
f:actionListener &
f:valueChangeListener
Diferencias en la aplicacin:
Versin con el atributo
No es una method
expression sino
una clase!
Clase ValueChangeListener
Clase ActionListener
Similar a la anterior:
Taller prctico
Crear una clase LibroCambiadoListener que
implemente la interfaz ValueChangeListener
Implementar su mtodo
processValueChange para que saque un
mensaje.
Asociarla a la etiqueta del combo de la
pgin entrada.jsp. Ojo! Hay que quitar el
atributo que la liga al otro listener, son dos
alternativas incompatibles!
Resuelto en piloto 16.0
Componentes inmediatos
Se disparan los
validadores y
conversores
Se procesan los
eventos
Componentes inmediatos
Componentes inmediatos
Problema:
El ciclo de vida sigue si rumbo normal tras la validacin y
procesado de eventos de los componentes inmediatos
Solucin:
Cortamos el flujo desde el listener y forzamos la renderizacin
de la respuesta (el atajo en el grfico anterior)
context.renderResponse();
Taller prctico
Comandos inmediatos?
En el servidor:
Problema:
Estamos definiendo mtodos que son
prcticamente iguales repetimos lgica- y que en
orientacin a objetos podra ser uno solo
parametrizado.
Solucin:
Envo de informacin desde la interfaz al usuario.
Mtodos:
f:param
f:setPropertyActionListener
f:attribute
<f:param.../>
Nos permite adjuntarle un parmetro a un
componente.
Se comporta diferentemente dependiendo
del tipo de componente:
<f:param...>
En el servidor:
<f:attribute...>
En el servidor
<f:setPropertyActionListener...
En el servidor...
Otras cosillas...
Conversores Propios
<converter>
<description>Converter for credit card numbers that
normalizes the input to a standard format</description>
<converter-id>CreditCardConverter</converter-id>
<converter-class> converters Cred itCardConverter
</converter-class>
</converter>
Render Propio
<render-kit>
<renderer>
<component-family>Area</component-family>
<renderer-type>DemoArea</rendere-type>
<renderer-class>renderers.AreaRenderer</renderer-class>
<attribute>
<attribute-name>onmouseout</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
<attribute>
<attribute-name>onmouseover</attribute-name>
<attribute-class>java.lang String</attribute-class>
</attribute>
<attribute>
<attribute-name>styleClass</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
</renderer>
Componente Propio
Podemos registrar componentes visuales propios
<component>
<component-type>DemoArea</component-type>
<component-class>components.AreaComponent</component-class>
<property>
<property-name>alt</property-name>
<property-class>java.lang.String</property-class>
</property>
<property>
<property-name>coords</property-.name>
<property-class>java.lang.String</property-class>
</property>
<property>
<property-name>shape</property-name>
<property-class>java.lang.String</property-class>
</property>
<component-extension>
<component-family>Area</component-family>
<renderer-type>DemoArea</renderer-type>
</component-extension>
</component>
UIGraphic
Muestra una imagen.
Propiedades de un, alt (texto alternativo,
normalmente mostrado al pasar el ratn por
encima) y dems relativas al uso comn en
html (en la renderizacin tpica Html).
<h:graphiclmage./>
UIOutput
Indica un dato de salida
Con el Renderizador de Html tenemos
outputLabel
Su atributo for apunta a un id de un campo de entrada
con el que se encuentra asociada la etiqueta
outputLink
Necesita una etiqueta verbatim que muestra el texto
que el usuario clickea para lanzar el link
UIOutput
outputFormat que muestra un mensaje
Permite la utilizacin de java.text.MessageFormat.
Value indica la frase a parametrizar normalmente de un
ResourceBoundle.
Tiene etiquetas de tipo <f:param value...> para indicar
los parmetros del mensaje.