- ¿Qué es un facelets? En Facelets se pueden introducir plantillas de etiquetas desde una biblioteca de etiquetas de dos formas:
- Directamente como un elemento xml calificado
- Indirectamente a través del
JSFCcomo atributo de un elemento no calificado arbitrariamente.
JSFC.El siguiente ejemplo muestra el uso directo de las etiquetas calificadas:
<!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">
<body>
<h:form>
<h:outputText value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
<h:inputText value="#{bean.property}" />
<h:commandButton value="OK" action="#{bean.doSomething}" />
</h:form>
</body>
</html>
JSFC, el mismo código también se puede expresar como el ejemplo dado a continuación:<!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">
<body>
<form jsfc="h:form">
<span jsfc="h:outputText" value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
<input type="text" jsfc="h:inputText" value="#{bean.property}" />
<input type="submit" jsfc="h:commandButton" value="OK" action="#{bean.doSomething}" />
</form>
</body>
</html>
- Uso de las siguientes etiquetas de facelets:
- c:ForEach
Attribute
The <c:forEach> tag has the following attributes −
Attribute Description Required Default items Information to loop over No None begin Element to start with (0 = first item, 1 = second item, ...) No 0 end Element to end with (0 = first item, 1 = second item, ...) No Last element step Process every step items No 1 var Name of the variable to expose the current item No None varStatus Name of the variable to expose the loop status No None - The <c:forTokens> tag has similar attributes as that of the <c:forEach> tag except one additional attribute delims which specifies sharacters to use as delimiters.
Attribute Description Required Default delims Characters to use as delimiters Yes None Example for <c:forEach>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> <html> <head> <title><c:forEach> Tag Example</title> </head> <body> <c:forEach var = "i" begin = "1" end = "5"> Item <c:out value = "${i}"/><p> </c:forEach> </body> </html>
The above code will generate the following result −
Item 1 Item 2 Item 3 Item 4 Item 5
- h:panelGrid
<h:panelGrid id = "panel" columns = "2" border = "1" cellpadding = "10" cellspacing = "1"> <f:facet name = "header"> <h:outputText value = "Login"/> </f:facet> <h:outputLabel value = "Username" /> <h:inputText /> <h:outputLabel value = "Password" /> <h:inputSecret /> <f:facet name = "footer"> <h:panelGroup style = "display:block; text-align:center"> <h:commandButton id = "submit" value = "Submit" /> </h:panelGroup> </f:facet> </h:panelGrid>
- h:selectOneMenu
Ejemplo
<!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"><h:head /><body><h:form> <h:selectOneMenu id="subscriptions" value="#{subscriptionController.subscriptions}"> <f:selectItem id="item1" itemLabel="News" itemValue="1" /> <f:selectItem id="item2" itemLabel="Sports" itemValue="2" /> <f:selectItem id="item3" itemLabel="Music" itemValue="3" /> <f:selectItem id="item4" itemLabel="Java" itemValue="4" /> <f:selectItem id="item5" itemLabel="Web" itemValue="5" /> </h:selectOneMenu></h:form></body></html> |
- Validación en JSF
El ciclo de vida de una petición JSF
En el ciclo de vida de
procesamiento de peticiones jsf se realizan todas las tareas de back-end
que de otro modo debería realizar el programador. Procesa los
parámetros de entrada y gestiona un conjunto de componentes del lado del
servidor y los sincroniza para que lo vea el usuario en el navegador.
Realiza la mayoría de las operaciones
del lado del servidor de una manera automática basada en eventos. Enlaza
directamente campos con propiedades de una clase java, de modo que
sincroniza beans del lado del servidor, con los componentes de UI que ve
el usuario. Es lo que se conoce como “gestión de estado” y es la piedra angular de JSF.
No se almacena el estado, esto es, una
transacción entre el cliente y el servidor, no almacena en memoria las
transacciones anteriores. Jsf mantiene una vista en el lado del servidor
que representa partes importantes del estado actual del cliente. Las
fases del ciclo de vida son:
- Crea o restaura la vista → Crea o restaura un árbol de componentes (vista) del lado del servidor, que representan los componentes de interfaz de usuario del cliente. Las vistas se crean y almacenan en un contenedor de vistas llamado “FacesContext”. El desarrollador no se tiene que preocupar por si los datos se mezclan al realizar múltiples “request” ya que cada petición irá en su propio hilo.
- Aplica los valores del “request” → Actualiza los componentes del lado del servidor con datos “frescos” que provienen del lado del cliente. Esto se hace a través de una invocación a “processDecodes()” en el árbol de componentes (UIViewRoot), lo que provocará que se llame de manera recursiva al método “processDecodes()” de cada uno de los componentes hijo y los métodos “decode()” de los componentes UI. Los componentes UI que tienen el atributo “value”, como los campos de texto, etc., implementarán el interfaz “ValueHolder”, los componentes de formulario que tienen valores editables por el usuario, implementan “EditableValueHolder” y finalmente aquellos componentes que ejecutan acciones, como los botones o los links, implementarán “ActionSource”.
- Ejecuta las Validaciones → Procesa las validaciones y realiza la conversión de datos en su caso. Para hacer esto invoca al método “processValidators()” de manera recursiva en el árbol de componentes (UIViewRoot). Cualquier componente que falle en la validación o en la conversión tendrá la propiedad “valid = false”
- Actualiza el modelo → Una vez que se pasan las validaciones y las conversiones, se realizan las actualizaciones de los objetos que modelan los datos en el lado del servidor (Managed Beans). El mecanismo es similar a los anteriores, se invoca al interfaz “processUpdates()” de manera recursiva en el árbol de componentes UIViewRoot
- Invoca a la lógica de aplicación → En esta fase se invoca a los “action method”, esto es, al algún código que hemos configurado para que realice las acciones necesarias con los datos. Se invoca al método “processApplication()” del UIViewRoot y se transmite eventos en cola a cada componente que implemente “ActionSource”.
- Devuelve la respuesta → Salva el estado y devuelve la respuesta al cliente para que los componentes sean representados. El mecanismo es similar al que hemos comentado anteriormente, se invocará en cascada a los métodos “encodeXX()” de cada componente. El lenguaje de “renderizado” puede ser cualquiera, html, xml, etc. Se almacena el estado de la vista para que pueda ser utilizado en las siguientes peticiones.
El atributo “immediate”
Imaginemos que tenemos el formulario “mensaje.xhtml” que vimos en el artículo anterior ( Introducción a Jsf
), y queremos incluir un botón “Salir”, en la página de envío de
mensajes, de modo que independientemente de lo que hayamos introducido
en el formulario, se nos redirija a una página “inicio.xhtml”. Si
añadimos en el formulario el botón de este modo:
Si lo dejamos simplemente así, tendremos
un error, ya que el formulario será enviado y se procesarán los campos
de entrada y las validaciones según el ciclo de vida que hemos visto
anteriormente.
Si añadimos el atributo “immediate” con el valor “true” en un componente UICommand,
como un botón, nos saltaremos las validaciones e iremos directamente a
la página “inicio.xhtml”. En general, “immediate” disparará los eventos
de acción inmediatamente antes de realizar la fase de validación y
evitará la actualización de datos en el modelo:
Se puede aplicar el atributo “immediate = true” a los componentes que implementen “EditableValueHolder”,
como ocurre con los campos de entrada, para que realicen la validación
de manera inmediata. El uso típico de este mecanismo se da cuando
queremos que unos campos del formulario se habiliten en función del
contenido que tenga otro campo. Para que esto funcione habrá que
configurar “listeners”.
Los “phase listeners” permiten
ejecutar código java, en distintos puntos de las fases que definen el
ciclo de vida. Por ejemplo, se puede mostrar un mensaje en función de
los valores que se están introduciendo en tiempo de ejecución. Y esto es
tan simple como crear clases Java que implementen el interfaz “PhaseListener” y registrar estas clases de manera programática o a través del archivo “faces-config.xml”.
Por otra parte el control de las excepciones se realiza a través de “ExceptionHandler” que manejará las excepciones que se puedan lanzar en el ciclo de vida Jsf.
Hasta aquí esta breve introducción sobre
el ciclo de vida. En los próximos artículos seguiremos profundizando
sobre el diseño da aplicaciones con Jsf y hablaremos sobre los facelets
- POJO
No hay comentarios:
Publicar un comentario