Documentos de Académico
Documentos de Profesional
Documentos de Cultura
JavaServer Faces es una tecnologa que fue diseada para simplificar la construccin de
interface de usuario para aplicaciones Web Java, uno de los puntos clave fue el apoyo de
las herramientas creadas para este tipo de aplicaciones, JSF tiene el apoyo de IDEs tales
como eclipse, Netbeans, myEclipse, Oracle web, entre muchos otros ms, adems cuenta
con un fuerte apoyo de servidores de aplicaciones java con el objetivo de soportar y
desplegar las aplicaciones creadas en JavaServer Faces.
Leccin 2
Managed Bean en JSF
Java Bean
Un Java Bean es una clase java que sigue las siguientes convenciones:
Tiene un constructor vaco
Tiene atributos privados y por cada atributo tenemos un mtodo get y un mtodo
set.
Partiendo del concepto de un java bean, los managed bean van a ser clases java que
tambin cumplen con las convenciones de los java beans, sin embargo al trabajar con
java server faces, vamos a configurarlos y declararlos de manera distinta.
Un managed bean es una clase java que sigue la nomenclatura de los JavaBeans
o Los managed Beans no estn obligados a extender de ninguna otra clase.
o Esto a diferencia de frameworks como Struts, si era necesario depender de
una clase llamada action o de una clase llamada actionForm dependiendo
del objetivo de la clase a procesar la peticin en el caso de los managed
bean esto ya no es necesario, esto tiene como ventajas que el framework de
JSF sea menos intrusivo que de Struts.
Aunque JSF no define una clasificacin para los Backing Beans, podemos definir las
siguientes:
o Un Backing Beans es lo mismo que un Managed Bean, debido a que es una
clase de Java del lado del servidor.
Beans de Modelo: Representan el modelo en el patrn MVC.
Beans de Control: Representan el control en el patrn MVC.
Beans de Soporte o Helpers: Contienen cdigo por ejemplo de
Convertidores.
Beans de Utilerias: Tareas genricas, como obtener el objeto HTTP
Request.
Como bean CDI (Contexts and Dependency Inyection), antes del nombre de la
clase:
o @Named
o Si utilizamos este concepto debemos agregar un archivo llamado beans.xml
en la carpeta web/WEB-INF
o Los beans CDI estn asociados a un contexto por ejemplo request, session,
etc.
o CDI especifica un mecanismo para inyectar beans, interceptar, filtrar u
observar ciertos eventos.
o CDI tambin utiliza el concepto de inversion of control, el cual lo podemos
entender como fabrica de beans para obtener de manera indirecta, algn
bean que necesitemos.
El concepto de inversion of control, permite crear aplicaciones con
bajo acoplamiento, el bean debe de implementar la interfaz
serializable.
En el archivo faces-config.xml:
o <managed-bean></managed-bean>
o Sin embargo en la versin 2.0 de JSF esto es opcional, es mas comn utilizar
anotaciones de Managed Bean.
<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">
<f:loadBundle basename="resources.application" var="msg"/>
<head> v
<title><h:outputText value="#{msg.welcomeTitle}" /></title>
</head>
<body>
<h3><h:outputText value="#{msg.welcomeHeading}" /></h3>
<p><h:outputText value="#{msg.welcomeMessage}" /></p>
</body>
</html>
resources/application.properties
# -- welcome --
<h:form>
<h:outputLabel for="nombre" value="Nombre:" />
<h:inputText id="nombre" value="#{candidato.nombre}" />
<h:message for="nombre" />
<br/>
<h:commandButton value="Enviar" />
</h:form>
</body>
</html>
Clase Candidato.java
package mx.com.cadillacs.beans.model;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
//estamos indiando el tipo de clase administrada por JSF
@RequestScoped
// El alcance de tipo request, se va a construir y destruir cada vez que hagamos una
peticion a nuestro navegador.
public class Candidato {
//Es requerido, un constructor vacio
public Candidato(){
}
//Cada atributo debe de ser privado y tener sus metodos get/set publicos.
private String nombre = "Escriba su nombre";
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Ejercicio 3: Vacante
vacante.xhtml
<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">
<head>
<title>saludo</title>
</head>
<body>
<h:form>
<h:outputLabel for="nombre" value="Nombre:" />
<h:inputText id="nombre" value="#{candidato.nombre}" />
<h:message for="nombre" />
<br/>
<h:commandButton action="#{vacanteForm.enviar}" value="Enviar" />
</h:form>
</body>
</html>
exito.xhtml
<head>
<title>exito</title>
</head>
<body>
<h:form>
Gracias #{candidato.nombre} por aplicar la vacante
<br/>
<h:commandLink action="vacante">Regresar</h:commandLink>
</h:form>
</body>
</html>
fallo.xhml
<head>
<title>Fallo</title>
</head>
<body>
<h:form>
Lo sentimos #{candidato.nombre}, ya se han cubierto las vacantes.
<br/>
<h:commandLink action="vacante">Regresar</h:commandLink>
</h:form>
</body>
</html>
VacanteForm.java
package mx.com.cadillacs.beans.backing;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import mx.com.cadillacs.beans.model.Candidato;
@ManagedBean
@RequestScoped
public class VacanteForm {
/*
* La Clase va a tener una dependencia con la propiedad de candidato
*/
@ManagedProperty(value = "#{candidato}")
private Candidato candidato;
public Candidato getCandidato() {
return candidato;
}
public void setCandidato(Candidato candidato) {
this.candidato = candidato;
}
//Metodo de flujo de control
public String enviar(){
if(this.candidato.getNombre().equals("Juan")){
return "exito"; //exito.xhtml
}else{
return "fallo"; //fallo.xhtml
}
}
}
Inyeccin de dependencias
En muchas ocasiones una pgina JSF puede utilizar varios managed bean de ah la
necesidad de relacionar distintos managed bean, la inyeccin de dependencias, es un
derivado de la inversin de control.
JSF soporta una inyeccin de dependencias simple.
La inyeccin se puede hacer de dos maneras:
Nota: para inyectar los beans, estos debern de haber sido declarados con anterioridad.
Nota: esta sintaxis ya es menos comn en la especificacin 2.0 debido a cmo podemos
observar, definir una anotacin he inyectar el contenido de un managed property dentro
de otro managed bean es mucho ms simple utilizando anotaciones.
Archivo faces-config.xml
En la especificacin de JSF 2.0 el archivo de faces-config se convierte en un archivo
opcional, sin embargo este archivo tiene grandes caractersticas, las cuales podemos
seguir utilizando sin ningn problema.
Uso y ventajas del archivo faces-config.xml
Configuracin centralizada, todos nuestros componentes los vamos a tener en un
solo archivo definidos y ah podemos entender la configuracin de nuestra
aplicacin JSF.
o Desventaja, difcil saber si una clase tiene definido una anotacin de
Managed Bean o no.
Reglas de navegacin, tambin en el archivo de faces-config, podemos definir
reglas de navegacin, es decir el flujo de nuestras pginas, en una aplicacin JSF.
Tambin podemos definir nuestros Managed Bean segn hemos especificado.
Podemos definir tambin la inyeccin de dependencias.
Definir configuraciones regionales.
Registrar validadores.
Registro de listeners
Etc
Nota: Este archivo en una aplicacin web debe de encontrarse dentro de la ruta de
WEB-INF/faces-config.cml
Con el uso de anotaciones, cada vez es menos indispensable utilizar este archivo.
view: UIViewRoot
Operadores EL
El lenguaje EL cuenta con operadores para evaluar expresiones:
Nota: no utilizarlos mucho, ya que esto rompe el patrn de diseo MVC, al agregar lgica
en nuestra vista.
El ciclo de vida de JSF comienza con la peticin de un usuario, el cual solicita un recurso
de nuestro servidor web, la primera fase dentro de este ciclo de vida (1) es el proceso de
restauracin o creacin de la vista, si es la primera vez que solicita esta vista, se va a
crear cada uno de estos componentes que representan las etiquetas de nuestra pgina
JSF y va a tener una clase correspondiente de Java que represente esta etiqueta en JSF,
todas estas etiquetas son administradas por un componente principal llamado
component tree o arbol de componentes en caso de que la peticin haya sido get
o sin parmetros, en este caso el framework no tiene nada ms que realizar y
simplemente regresa la respuesta hacia el cliente, en caso contrario y que necesitemos
procesar informacin, (2) el paso 2, es aplicar los valores de la peticin, en este paso los
parmetros enviados son mapeados con cada uno de los componentes java
correspondientes, esto nos permitir llenar la informacin que los usuarios estn
enviando a nuestra aplicacin java, (3) en este paso se realiza el procesamiento de
validaciones y conversiones, es decir en el paso 2 ya se asignaron los valores
correspondientes a nuestras clases java sin embargo en este punto todava no sabemos
si esos valores son los adecuados o si es necesario convertirlos a cierto tipo de datos, por
ello en este paso 3 si una validacin falla, el estado del componente se marca como
invalido y se pasa directamente al estado (6) esto sucede solamente en caso de que
hayamos encontrado algn error de conversin o de validacin sin embargo esto nos
garantiza que nuestra aplicacin java no va a continuar si es que tiene algn problema
de validacin o de correccin de datos. En caso de que no tengamos errores de validacin
de datos, pasamos al paso (4) el cual actualiza los valores de nuestras clases de modelo,
los valores de los componentes java ya una vez validados y convertidos en el paso 3 son
puestos en los objetos de modelo utilizando los mtodos seters respectivos, es decir que
hasta el paso 4 es donde realmente el framework nos garantiza que esos valores ya los
podemos utilizar para operar, por ejemplo si estamos enviando un dato de tipo fecha, en
este momento la fecha se puede convertir directamente a un tipo de dato Date y no
seguir manejndolo como un String ya que normalmente as es como suceda dentro del
Api de los servlets / JSP, cuando utilizbamos esas tecnologas nosotros ramos
responsables de hacer ese tipo de conversiones, en el caso de JSF mucho de ese trabajo
queda resuelto por el propio Framework, en el paso (5) ya que tenemos la informacin de
modelo, procedemos a invocar nuestra aplicacin o lo que es lo mismo los mtodos que
procesan las peticiones de nuestros usuarios , en este punto se ejecutan los mtodos
action que estn almacenados en los managed bean, los mtodos actionListener son
llamados antes que los mtodos de tipo action.
Una vez que hemos procesado los mtodos de nuestra aplicacin se genera una
respuesta respectiva hacia el cliente, con esto se concluye el ciclo de vida de nuestra
aplicacin de JSF, es posible crear clases JSF para la depuracin de las faces paso a paso
para ello debemos implementar la interface faces listener y se debe de registrar en el
archivo de faces-config.xml