JavaServerFaces OCW
JavaServerFaces OCW
JavaServerFaces OCW
Tema 4: Implementación:
Frameworks
4.2. Java Server Faces (JSF)
A. Goñi, J. Iturrioz
Índice
• 1) Introducción
• 2) Arquitectura Modelo Vista Controlador (MVC)
• 3) Java Server Faces
• 3.1) Modelos
• 3.2) Vistas
• 3.3) Controlador y el fichero de configuración XML web.xml
• 3.4) El fichero XML de configuración faces-config.xml
• 3.5) Conversiones y validación de entrada en JSF
• 3.6) Scope de los beans gestionados
• 3.6) El ciclo de vida de una página JSF
• 3.7) Otras características concretas en JSF
2
1) Introducción
• JSF es: (JSF 1.0 de 2004, JSF 2.2 de 2013)
• un framework para construir interfaces gráficas de usuario
(en aplicaciones Web)
• la especificación estándar para la plataforma Java EE
• Como es sólo una especificación, se necesitan
implementaciones/extensiones
• Mojarra (implementación de Sun Microsystems / Oracle)
• MyFaces (implementación de Apache)
• RichFaces, PrimeFaces…(extensiones que ofrecen más
componentes. Por ejemplo: soporte para Ajax,…)
• La solución Java anterior para aplicaciones Web eran los
JSPs (1999) y los Servlets (1997)
3
1) Introducción
• JSP (Java Server Pages) es la solución Java equivalente a
PHP o a ASP (Microsoft)
Servidor Web
Página PHP
Procesar
PHP
Petición
Página
Resultado:
HTML y
JavaScript
Navegador Web
4
1) Introducción
• JSP (Java Server Pages) es la solución Java equivalente a
PHP o a ASP (Microsoft)
Servidor Web Pág. JSP/PHP/ASP (HTML + Scriptlets) + JavaScript
Página PHP
Componente en Servidor Web
para procesar JSP/PHP/ASP
Procesar
JSP/PHP/ASP
Para procesar JSPs se
necesita un servidor
Petición
Página web específico, como
por ejemplo un
Resultado:
servidor Apache
HTML y Tomcat.
JavaScript Para ejecutar JSFs
también.
Navegador Web
5
1) Introducción
• Problema: las páginas JSP deben indicar explícitamente:
• las páginas JSP a las que se navega
• la lógica del negocio que se invoca
6
1) Introducción
• Con JSF, no se escriben páginas en HTML + código sino en
XML (con etiquetas JSF)
y a=50%
x a=60%
b=30% b=30%
c=20% c=10%
a=80%
z b=10%
8 c=10%
3) JSF es un framework que se basa en
la arquitectura MVC
NIVEL/CAPA DE
NIVEL/CAPA DE LÓGICA DE NIVEL/CAPA
PRESENTACIÓN NEGOCIO DE DATOS
Contenedor J2EE
Faces
Acceso a
Servlet Managed .. Datos
Bean
(ADO)
faces-
config.xml Página
web.xml JSF
BASE DE
NAVEGADOR DATOS
WEB CLIENTE
CONTROLADOR VISTA MODELO
CONTROLADOR (métodos action)
9
3.1) El Modelo en JSF son los
Managed Bean (bean gestionados)
public LoginBean(){}
// ATRIBUTO: nombre El bean permite
public String getNombre() { return nombre; } obtener (get)
y establecer (set)
public void setNombre(String nuevoValor) {
los valores de
nombre = nuevoValor; } nombre y password
// ATRIBUTO: password
public String getPassword() { return password; }
public void setPassword(String nuevoValor) {
password = nuevoValor; }
} Falta el método “action” comprobar()
10
3.2) Las Vistas JSF son las páginas JSF (que
son páginas dinámicas con componentes JSF)
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets" Librerías de
xmlns:h="http://java.sun.com/jsf/html" ETIQUETAS JSF
xmlns:f="http://java.sun.com/jsf/core">
<f:view>
<h:head><title>Una simple aplicacion JavaServer Faces</title></head>
<h:body>
<h:form>
<h3>Por favor, introduzca su nombre y password.</h3>
<table>
<tr><td>Nombre:</td> Interacción con el BEAN “login”
<td> <h:inputText value="#{login.nombre}"/></td></tr>
<tr><td>Password:</td>
<td><h:inputSecret value="#{login.password}"/></td></tr>
</table>
Interacción con el CONTROLADOR. No llamada a una VISTA
<p>
<h:commandButton value="Aceptar" action="ok"/>
</p> Los componentes que comienzan por “h” crean formularios HTML(elementos gráficos
</h:form> como botones, campos de texto...). Los que comienzan por “f” sirven para manejo de
</h:body> eventos, conversiones de datos, validaciones,...
</f:view> </html> 11
3.3) El Controlador en JSF es un Servlet
(el Faces Servlet)
• El controlador es responsable de la navegación entre las vistas
• JSF nos proporciona uno que podemos utilizar
• Se declara en el fichero de configuración web.xml
<web-app> Declaración del CONTROLADOR utilizado
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servletclass>
<load-on-startup>1</load-on-startup>
</servlet> Patrón URL que permite
<servlet-mapping> distinguir si un fichero es
<servlet-name>Faces Servlet</servlet-name> JSF o no, y por tanto,
<url-pattern>/faces/*</url-pattern> procesarse como tal o no.
</servlet-mapping>
<welcome-file-list>
<welcome-file>faces/Login.xhtml</welcome-file>
</welcome-file-list>
</web-app> Nombre de la vista de inicio
12
3.4) faces-config.xml: Relación entre la referencia al Bean
en la vista y la clase que lo implementa
13
3.4) faces-config.xml: Relación “estática” entre la acción y la
vista a la que se navega o redirecciona
La navegación entre vistas se declara en el
fichero de configuración faces-config.xml
<navigation-rule>
<from-view-id>/Login.xhtml</from-view-id> Esa regla dice que:
cuando se está
<navigation-case>
visualizando la vista
<from-outcome>ok</from-outcome> Login.xhtml, si se
<to-view-id>/Hola.xhtml</to-view-id> lanza la acción “ok” el
</navigation-case> controlador cargará la
</navigation-rule> vista “Hola.xhtml”
La acción “ok” se lanzará cuando ocurra el
evento pulsar el botón “Aceptar” que se
encuentra definido en Login.xhtml:
<h:commandButton value="Aceptar" action="ok"/>
NOTA: se puede cambiar la vista a la que se redirecciona (Hola.xhtml)
sin necesidad de modificar la vista JSF (Login.xhtml), sólo cambiando
la configuración (el fichero faces-config.xml)
14
3.4) faces-config.xml: Relación “dinámica” entre la acción y la vista a
la que se navega o redirecciona, dependiendo de lo que devuelva el
modelo*
<h:commandButton value="Aceptar" action="#{login.comprobar}"/>
En este caso, la acción se lanza desde
una clase bean (*) de manera “dinámica”
<navigation-rule>
<from-view-id>/Login.xhtml</from-view-id> public class LoginBean {
<navigation-case> ...
<from-outcome>ok</from-outcome> public String comprobar() {
<to-view-id>/Hola.xhtml</to-view-id> if (...) return “login”;
</navigation-case> else return “error”;}
</navigation-rule> } (*) los métodos action de los bean
<navigation-rule>
<from-view-id>/Login.xhtml</from-view-id> son parte del CONTROLADOR y
<navigation-case> no del MODELO. En el JSF
<from-outcome>error</from-outcome> aparece exactamente el nombre
<to-view-id>/Error.xhtml</to-view-id> del método (comprobar)
</navigation-case> Contenido de faces-config.xml que define
</navigation-rule> la navegación, dependiendo de la acción
15
3.5) JSF ofrece además componentes para
validación de datos de entrada
<h:inputSecret id="pass" value="#{login.password}">
<f:validateLongRange minimum="1" maximum="500"/>
</h:inputSecret>
16
3.5) JSF ofrece además componentes para
conversión de datos de entrada
<h:inputText id="fecha" value="#{login.fecha}">
<f:convertDateTime pattern=“dd/MM/yyyy"/></h:inputText>
<h:message for="fecha" style="color:red" />
El componente f:convertDateTime asociado al h:inputText (identificado como
“fecha”) convierte el String de entrada en un objeto Java Date. Y si no puede,
muestra también el error.
17
3.6) Scope de los beans gestionados
18
3.6) Scope de un bean gestionado: request
Con scope “request” el controlador crea un nuevo bean por
cada petición HTTP desde el navegador
Nota: con scope “view” crearía un nuevo bean tras pulsar el botón 19
3.6) Scope de un bean gestionado: request
Se crearía un
¿Qué mostraría al hacer nuevo bean
click en el enlace, si que no
scope es “request”? recordaría los
valores
20
3.6) Scope de un bean gestionado: session
Con scope “session” el controlador crea un bean al
comenzar una sesión HTTP y lo usa mientras el navegador
no se cierre y la sesión no caduque
24
3.7) El ciclo de vida (CV) de una página JSF
h:form FacesContext
(1)
Date(“4/10/17”) 123
“Kepa” h:inputText h:inputSecret h:commandButton
fecha pass
f:convertDateTime,… f:validateLongRange, 1,500
• Evitar validaciones/conversiones
• Uso de Ajax para actualizar parcialmente código HTML de la
vista
• Uso de CSS y JavaScript
• Errores generados en los beans (modelo)
• Convertidores String-Objetos (omnifaces)
26
3.8) Evitar validaciones/conversiones
29
3.8) Uso de Ajax para actualizar parcialmente código
HTML de la vista
30
3.8) Uso de Ajax para actualizar parcialmente código
HTML de la vista
Código Ajax
en JSF
31
3.8) Uso de CSS
Resultado de aplicar el
CSS al HTML:
Contenido
del CSS:
32
3.8) Uso de JavaScript
Al pulsar el botón:
33
3.8) Uso de JavaScript
En el JSF Hola.xhtml
Ejecución:
Al cargarse Hola.xhtml 34
3.8) Errores generados en los beans (modelo)
36
3.8) Uso de PrimeFaces
No olvidar:
Añadir al JSF la librería de etiquetas p y usar <h:head> en vez de
<head>
La librería de etiquetas
http://primefaces.prime.com.tr/ui
es específica para Prime Faces 2.X
Usad: http://primefaces.org/ui
37
3.8) Uso de PrimeFaces
Si queréis que la fecha seleccionada se vea antes de
ejecutar un “action” de commandButton
Acción Ajax
39
3.8) Uso de PrimeFaces
Pero la acción Ajax permite más cosas como...
ejecutar un método “oyente” o “listener” cuando suceda el
evento (seleccionar fecha).
Método “listener”
40
3.8) Convertidores String-Objetos (omnifaces)
41
3.8) Convertidores String-Objetos (omnifaces)
Se trata de una clase singleton FacadeBean, que sólo puede tener una instancia
(constructor private), que es la que crea la instancia de FacadeImplementationWS
que devuelve con getBusinessLogic. FacadeImplementationWS no es singleton,
pero así sólo creamos una instancia de ella
42
3.8) Convertidores String-Objetos (omnifaces)
Lo que mostrará en el
selectOneMenu
45
3.8) Convertidores String-Objetos (omnifaces)
46
Problema solucionado: en el JSF no aparecen explícitamente llamadas
explícitas a las vistas (JSFs) y modelo (el bean)
...
<f:view>
<h:form> La vista JSF
Introducir número de socio:
<h:inputText
value="#{tomarPrestamoCopia.numSocio}" />
<br/> Y la signatura:
<h:inputText value="#{tomarPrestamoCopia.signatura}" />
<br/>
El bean (mod+contr.)
<h:commandButton action="#{tomarPrestamoCopia.getCopia}" package beans;
value="Tomar en Préstamo"></h:commandButton> public class TomarPrestamoCopia {
</h:form> public String getCopia() {
</f:view> ...return "No hay copias libres";
</h:body> <faces-config ... ...return "ok";}
</html> <managed-bean>
<managed-bean-name>tomarPrestamoCopia</managed-bean-name>
<managed-bean-class>beans.TomarPrestamoCopia</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean> ...
<navigation-rule> Configuración de
<display-name>TomarPrestamoCopia.xhtml</display-name> beans y navegación
<from-view-id>/TomarPrestamoCopia.xhtml</from-view-id>
<navigation-case> entre vistas, según
<from-outcome>ok</from-outcome> acciones
<to-view-id>/TomadaCopiaEnPrestamo.xhtml</to-view-id>...
47
Referencias
• http://www.tutorialspoint.com/jsf/index.htm
• http://www.coreservlets.com/JSF-Tutorial/
• https://javaee.github.io/javaserverfaces-spec/
• Las siguientes en castellano:
• http://www.jtech.ua.es/j2ee/publico/jsf-2012-
13/sesion01-apuntes.html
• https://www.apuntesdejava.com/p/tutorial-jsf-
22.html
48