Intro Java Server Faces
Intro Java Server Faces
Intro Java Server Faces
pagina=EclipseJSF
Pero adems JSF introduce el procesamiento de los formularios por etapas. Cuando el formulario es enviado, el controlador realiza el procesamiento de las acciones asociadas al formulario en diferentes etapas. Durante estas etapas:
1. Se obtienen los valores de la pgina 2. Se procesan los eventos 3. Se realizan las validaciones de los valores
4. Se procesan las acciones 5. Se realiza el render (dibujado) de la nueva vista de la pgina 6. Se realiza la navegacin, si es necesario, a otras pginas.
Lo ms interesante de este modelo, como veremos al comentar las acciones inmediatas, es que no se deben completar todas las fases, y el proceso se puede interrumpir antes de llegar a la etapa de navegacin, con lo que obtendramos la misma pgina, pero con una vista actualizada. Este mecanismo lo utilizaremos para completar datos en la pgina (rellenar combos en el formulario), para realizar validaciones de parmetros, para reaccionar frente a eventos en los elementos del formulario, etc.
Ahora que ya hemos dado un vistazo por encima a JSF, pongmosnos manos a la obra.
Descargando una implementacin de JSF En la pgina de http://javaserverfaces.dev.java.net podemos descargar una implementacin de la biblioteca JSF de Sun Microsystems.
Vamos a probar la versin jsf-1_1_02.zip, por lo que nos descargamos el fichero y lo descomprimimos a una carpeta.
En la pgina vemos que ya est disponible la versin 1.2 de JSF. Usaremos la versin 1.1 pues es la que soporta nuestro plugin de Eclipse, y adems porque est ms revisada.
Hemos elegido un nombre para la biblioteca sunJSF1.1, hemos indicado que cumple la especificacin JSF 1.1, aadimos las dos bibliotecas y marcamos la casilla is JSF implementation, luego pulsamos Finish.
Con ello ya hemos registrado la biblioteca JSF de Sun. Tambin vamos a aadir otros archivos jar organizados en dos bibliotecas adicionales: commons y jslt.
Le he puesto de nombre al proyecto EjemplCrisJSF. Como Runtime tengo el Tomcat 5.5, para que el Eclipse haga automticamente el despliegue en el Tomcat. Adems en Configuration he elegido Java Server Faces 1.1 y pulsamos en Next
Como vemos, se ha aadido la faceta de Eclipse para Java Server Faces 1. Pulsamos en Next.
Las propiedades del Web Module las dejamos por defecto. Pulsamos en Next.
En el cuadro de dilogo elegimos todas las bibliotecas .jar que estn en la carpeta lib de la implementacin. Adems le tenemos que poner un nombre, y pulsamos Finish.
Tambin vamos a copiar a la carpeta de biblioteca, que est en WebContent\WEBINF\lib un par de bibliotecas del Tomcat, en concreto las bibliotecas jstl.jar y estandar.jar que encontraremos en la carpeta del Tomcat webpps\jsp-samples\WEBINF\lib. Lo podramos haber hecho tambin siguiendo el mtodo usado para las bibliotecas de JSF, pero en este caso hemos optado por el mtodo simple.
Como vemos el plugin aade el fichero faces-config.xml al proyecto web, en la carpeta WEB-INF. Si pulsamos sobre el fichero se abre un editor visual para el fichero. Tambin vemos que el plugin ha modificado el fichero web.xml.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID"> <display-name>EjemploCrisJSF</display-name> <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> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
2. Una pgina de inicio JSP que pida usuario y contrasea y realice una accin en el formulario 3. Dar de alta el bean dentro del mdulo JSF
Para crear el bean vamos a crear una clase que luego llevaremos al WEB-INF\classes. Dentro de Eclipse lo hacemos creando la clase userLoggingBean en la carpeta src\formBeans, que hemos creado al efecto.
userLogingBean.java
package formBeans;
public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }
public String validarUsuario() { if (username.equals("usuario") && password.equals("sesamo")) return "ok"; else return "badUsername"; }
El texto de la pgina es
inicio.jsp
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-88591"> <title>Insert title here</title> </head> <body> <f:view> <h:form> Usuario: <h:inputText value="#{userLoginBean.username}" /> <br/> Contrasea: <h:inputSecret value="#{userLoginBean.password}" /> <br /> <h:commandButton action="#{userLoginBean.validarUsuario}" value="Iniciar"></h:commandButton>
</h:form> </f:view>
</body> </html>
El Eclipse se est quejando de que el formBean.userLogingBean no lo puede resolver. Hay que darlo de alta en los manager beans del plugin de Eclipse.
Para ello pulsamos sobre el fichero faces-config.xml y nos vamos a la pestaa Managed Beans que nos mostrar el plugin JSF
Ahora ya podemos darlo de alta. Pulsamos sobre request y luego el botn de Add
En cuanto que escribimos formBeans. (que es el paquete donde est nuestra clase) el plugin la encuentra. La seleccionamos y pulsamos OK.
Pulsamos Next
Pulsamos Finish
Probando la aplicacin
Para probar la aplicacin vamos a utilizar el servidor Tomcat integrado en Eclipse. Si no lo tienes configurado, es sencillo. Descomprime el Tomcat 5.5 en una carpeta, por ejemplo D:\apps\apache-tomcat-5.5.17, y luego abre el cuadro de dilogo de preferencias del Eclipse, seleccionando Windows\Preferences
Como vemos, slo hay que aadir el nombre, la carpeta donde est instalado y el JRE que va a utilizar.
Probamos la aplicacin. Para ello pulsamos en con el botn derecho sobre el archivo inicio.jsp, y elegimos Run as\Run on Server
y elegimos el nuevo servidor para la ejecucin quen nos aparece en el cuadro de dilogo que nos ofrece el Eclipse. Finalmente el resultado lo vemos con el navegador integrado en el Eclipse.
Ahora vamos a aadir interaccin a la pgina. Para ello editamos la funcin de validacin del bean, dejndola de este modo:
public String validarUsuario() { if (username.equals("test")) return "test"; else { username = "Reintentar"; return "error"; } }
testInicio.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-88591"> <title>Insert title here</title> </head> <body> Usuario: <c:out value="${userLoginBean.username}"></c:out>
</body> </html>
Es una pantalla de prueba muy sosa, pues lo nico que queremos ver es que la aplicacin navega. Ahora hay que aadir la regla de navegacin. Una regla de navegacin nos lleva desde una pgina jsp a otra al realizarse una determinada accin, y segn un cierto resultado de la accin. El resultado de la accin es la cadena que devuelve la accin al ejecutarse. Nuestra funcin de validacin del usuario devuelve la cadena OK si el usuario y la contrasea coinciden con los prefijados (la validacin ms sencilla posible).
El mtodo de navegacin es muy simple. Cuando el usuario pulsa el botn de inicio, se enva el formulario y el servlet de JSF llama a la funcin validarUsuaro del bean userLoginBean, que devuelve la cadena test si el usuario es test.
La regla de navegacin la vamos a aadir con el plugin de Eclipse para modificar el faces-config.xml, en la pestaa Navigation rule
En principio partimos de una rejilla en blanco, ya que no tenemos definidas reglas de navegacin. Arrastramos a la rejilla las dos pginas.
Aparecen los iconos de las pginas, y la barra de herramientas est oculta a la derecha de la cuadrcula, que se mostrar al pinchar sobre la etiqueta Palette. Pulsamos sobre el botn Link de la paleta de herramientas y pulsamos primero sobre el icono de la pgina de inicio y luego sobre el icono de la pgina de prueba de inicio.
Al aadir el enlace nos sale la flecha. Para modificar las propiedades del enlace pulsamos el botn Select de la paleta. Luego pinchamos en la lnea del enlace y con el botn derecho seleccionamos Show view\properties. Debajo nos aparece la ventana de propiedades del enlace. Aadimos el valor OK a la propiedad From-outcome y guardamos los cambios. Ahora nos aparece la etiqueta OK sobre la flecha del enlace.
Podemos ver cmo se ha modificado el fichero de configuracin faces-config.xml en la pestaa Source del plugin JSF. En nuestro caso nos queda el siguiente fichero de configuracin:
Faces-config.xml
<!DOCTYPE faces-config PUBLIC
<faces-config> <managed-bean> <description> Guarda la informacin de usuario y contrasea para el inicio de sesin y realiza la validacin.x</description> <managed-bean-name> userLoginBean</managed-bean-name> <managed-bean-class> formBeans.userLoginBean</managed-bean-class> <managed-bean-scope> request</managed-bean-scope> </managed-bean> <navigation-rule> <display-name> inicio</display-name> <from-view-id> /inicio.jsp</from-view-id> <navigation-case> <from-outcome> ok</from-outcome> <to-view-id> /testInicio.jsp</to-view-id> </navigation-case>
</navigation-rule>
</faces-config>
Vemos que la regla de navegacin nos lleva de la pgina de inicio a la principal si el resultado de la accin (no hemos especificado el nombre de la accin pero se puede hacer en la propiedad From-action) tiene el valor OK.
Probamos la aplicacin con la nueva regla, poniendo el usuario y contrasea correcto. Nos aparece la siguiente pgina tras pulsar el botn Inicio
Cambiamos en la pestaa Managed beans el tipo de mbito del bean userLoginBean de request a session y guardamos los cambios. Ejecutamos de nuevo la aplicacin y vemos el resultado:
principal.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-88591"> <title>Pgina principal</title> </head> <body> Bienvenido, <c:out value="${userLoginBean.username}" /> <f:view>
</h:form> </f:view>
</body> </html>
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
inicio de sesin y realiza la validacin.x</description> <managed-bean-name> userLoginBean</managed-bean-name> <managed-bean-class> formBeans.userLoginBean</managed-bean-class> <managed-bean-scope> session</managed-bean-scope> </managed-bean> <navigation-rule> <display-name> inicio</display-name> <from-view-id> /inicio.jsp</from-view-id> <navigation-case> <from-outcome> test</from-outcome> <to-view-id> /testInicio.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <display-name> inicio</display-name> <from-view-id> /inicio.jsp</from-view-id> <navigation-case>
</faces-config>
public String validarUsuario() { if (username.equals("usuario") && password.equals("sesamo")) return "ok"; else if (username.equals("test")) return "test"; else { username = "Reintentar"; return "badUsername"; } }
El formulario que se muestra tiene algo ms de cosmtica. Lo ms interesante es ver cmo accedemos a los valores de los beans entre los diferentes formularios.
Acciones inmediatas
Como hemos visto, el flujo de navegacin entre pginas JSF se produce al enviar el formulario. En nuestra pantalla de login, cuando el usuario pulsa el botn Iniciar, se produce la navegacin a la pgina principal o se muestra una pgina de error.
El mecanismo de navegacin por tanto se desencadena al enviar el formulario. En ocasiones necesitaremos modificar el formulario sin enviarlo, ya que puede que est incompleto. Algunos ejemplos sencillos de esta situacin seran:
Habilitar partes ocultas del formulario. Por ejemplo, habilitar una caja de texto para introducir un dominio, si se necesitase adems del nombre de usuario y contrasea. Modificar el formulario, por ejemplo modificando las opciones disponibles ya visibles. Realizar comprobaciones previas de alguno de los campos de texto introducidos. Por ejemplo, se podra comprobar si un cierto nmero de documento se ha introducido sin errores, ya que muchos documentos incluyen funciones de verificacin en su numeracin (el DNI espaol es un ejemplo).
Para verlo mejor con un ejemplo, vamos a aadir al formulario un campo dominio en el que el usuario podr elegir tres posibles dominios, miempresa.com, yahoo.com y msn.com. Este campo estar oculto y se mostrar al pulsar un botn de otro dominio
userLoginBean.java
package formBeans; import javax.faces.event.*;
public class userLoginBean { private String username; private String password; private boolean verDominioDeshabilitado = true; private String dominio;
return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; }
public String getDominio() { return dominio; } public void setDominio(String dominio) { this.dominio = dominio; } public boolean isVerDominioDeshabilitado() { return verDominioDeshabilitado; } public void setVerDominioDeshabilitado(boolean verDominioDeshabilitado) { this.verDominioDeshabilitado = verDominioDeshabilitado; }
public String validarUsuario() { if (username.equals("usuario") && password.equals("sesamo")) return "ok"; else if (username.equals("test")) return "test"; else { username = "Reintentar"; return "badUsername"; } } public void habilitarDominio(ActionEvent event) { verDominioDeshabilitado = false; } }
Inicio.jsp
<title>Insert title here</title> </head> <body> <f:view> <h:form> Usuario:
<h:inputText value="#{userLoginBean.username}" /> <br/> Contrasea: <h:inputSecret value="#{userLoginBean.password}" /> <br/> <h:inputText value="#{userLoginBean.dominio}" disabled="#{userLoginBean.verDominioDeshabilitado}" /> <h:commandButton actionListener="#{userLoginBean.habilitarDominio}" immediate="true" value="usar dominio..."/> <br> <h:commandButton action="#{userLoginBean.validarUsuario}" value="Iniciar" />
</h:form> </f:view>
</body> </html>
Como vemos, cuando se ejecuta nuestra pgina aparece el campo dominio (el que est debajo de la contrasea) deshabilitado, no se puede escribir en l. Si pulsamos el botn usar dominio se activa el campo y podremos escribir sobre l.
un conjunto de elementos de tipo selectItem, que los recoger de un bean, y los introduce en la etiqueta select que la contiene. Veamos esto con un ejemplo. Modificamos el bean formularioBusquedas.java:
formularioBusquedaBean.java
package formBeans; import javax.faces.model.*;
/** * @author cris * */ public class formularioBusquedaBean private String categoria; private String valor; {
/** * por ahora hacemos una lista constante * Luego se cambiar por una lista dinmica */ private SelectItem[] categorias = { new SelectItem("libros", "Libros"), new SelectItem("revistas", "Revistas"), new SelectItem("videos", "Videos") };
Principal.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<html> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<title>Pgina principal</title> </head> <body> <h2>Aplicacin de ejemplo JSF </h2><br> <h3>Cristbal Gonzlez Almirn</h3> Bienvenido, <c:out value="${userLoginBean.username}" /> <f:view> <h:form> <h:commandButton action="buscar" value="Buscar"></h:commandButton> <h:commandButton action="mostrar" value="Mostrar"></h:commandButton>
<br> Categoria: <h:selectOneMenu value="#{formularioBusquedaBean.categoria}"> <f:selectItems value="#{formularioBusquedaBean.categorias}" /> </h:selectOneMenu> <br> Este es el texto del formulario de bsqueda
</h:form> </f:view>
</body> </html>
Resumiendo
Segn lo visto en este tutorial, el framework de JSF nos permite:
Crear formularios web dinmicos, en los que el contenido del formulario se inserta automticamente en un bean. Controlar el flujo de la aplicacin de manera centralizada, mediante el uso de reglas de navegacin, que se evalan al enviar el formulario. Realizar clculos y modificar los elementos del formulario dinmicamente, antes de que el usuario envie el formulario.
Todo esto vemos que es sencillo ya que el entorno JSF nos proporciona un lenguaje de expresiones que facilita la comunicacin entre las pginas JSP y los beans, y un fichero de configuracin que gestiona de forma centralizada la definicin de beans y las reglas de navegacin.
Y lo siguiente
Una vez que dominamos la comunicacin entre el formulario y los bean, el control de la navegacin y las acciones inmediatas, lo siguiente por lo que podemos avanzar es:
Explorar el resto de las etiquetas que nos proporciona la biblioteca JSF, como son las Definir reglas de validacin, mediante las etiquetas de validacin que incluye JSF. Podemos utilizar controles JSF HTML ms complejos, como los que nos proporciona la biblioteca MyFaces, que incluye componentes avanzados, calendarios, etc. que nos simplificarn el desarrollo de vistosas pginas web. Y si somos ms atrevidos, podemos mezclas JSF con AJAX o con Struts. Pero eso ya es de nota.
Conclusin
El framework JSF nos permitir crear aplicaciones Web siguiendo el patrn MVC de tipo 2 (modelo vista controlador con servlet controlador nico), de manera sencilla y flexible. Podremos dotar de manera sencilla a nuestros formularios de capacidades dinmicas que facilitarn la usabilidad de nuestras pginas, dndole un aspecto ms profesional, sin complicar en exceso el cdigo de nuestra aplicacin. Adems, con el plugin de JSF para Eclipse, integraremos de manera rpida el desarrollo de aplicaciones Web con JSF dentro de nuestro entorno de desarrollo favorito.
En Autentia sabemos que es complicado poner en marcha un proyecto Web. Por ello, si necesitas que te orientemos en la creacin de un nuevo proyecto, o incluso si quieres que te lo pongamos en marcha en poco tiempo, aprovechando nuestra experiencia y tus recursos, no dudes en contactar con nosotros, y vers que tus desarrollos dejan de ser un problema para ser una herramienta de trabajo ms.