La técnica Ajax es muy útil para hacer aplicaciones donde solo se actualiza una parte de la página y no toda.
Cuando salió JSF no tenía esta característica, pero otros frameworks (como ICEfaces) proporcionaban el Ajax como manera natural. También se podía utilizar otros complementos al JSF para que pueda funcionar.. pero ya no era el JSF natural.
Con JSF 2.0, el Ajax ya es natural. Mostraremos un conjunto de ejemplos de Ajax con JSf 2.0.
En este post haremos un ejemplo de cómo un combo puede cambiar el valor de un texto. Primero lo haremos sin Ajax, y luego con Ajax.
El ManagedBean
Primero haremos un ManagedBean llamado FormBean. Tendrá una propiedad que contiene las opciones del combo, y luego un atributo donde tendrá el valor seleccionado del combo.
package jsf;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;
@ManagedBean(name = "FormBean")
@RequestScoped
public class FormBean {
private SelectItem[] opciones = new SelectItem[]{new SelectItem("01", "Opción 1"),
new SelectItem("02", "Opción 2"),
new SelectItem("03", "Opción 3")};
private String opcionActual;
public FormBean() {
}
public SelectItem[] getOpciones() {
return opciones;
}
public String getOpcionActual() {
return opcionActual;
}
public void setOpcionActual(String opcionActual) {
this.opcionActual = opcionActual;
}
}
El archivo .xhtml
Ahora, en nuestro .xhtml mostraremos el combo, ponemos un botón para ejecute el formulario y un outputText para que se muestre el valor seleccionado:
Al ejecutarlo, veremos que se muestra el combo, cambiamos el valor de este, hacemos clic en el botón y se actualiza el valor de abajo. Muy simple :). Pero el problema es que tenemos que hacer clic en el botón para actualizar el texto inferior. Lo ideal es que se actualiza solo cuando se haga el cambio en el combo, si necesidad de hacer submit. Ahí es donde entra Ajax.
Implementado Ajax en JSF 2.0
En JSF 2.0 es tan fácil implementar Ajax como escribir un tag.
Pongamos el tag <f:ajax /> dentro del combo a mostrar. Pero como queremos que cambie solo el valor del outputText, le indicamos el id del tag en el atributo render. Así quedaría el .xhtml final.
Cuando se trabaja con variables sesión en JSP/Servlets es fácil guardar estas variables y también accederlas... bueno, al menos para quien ha trabajado bastante con este tipo de variables de sesión: Desde un servlet se debería escribir
request.setAttribute("obj1",obj1);
... cuando se desea guardar una variable de sesión de alcance "request".Para uno de alcance "sesión" es una historia similar.
Y desde un JSP para acceder a esta variable de sesión, usando EL, deberíamos usar algo como esto:
Mostrando objeto: ${ob1}
Pero en JSF (en especial la versión 2.0), ya no se debería utilizar variables de sesión ya que JSF propone ManagedBeans que tengan alcance Scope, Request, Application, Custom y none. Pues bien, esto funcionaría así.
Un ManagedBean:
@ManagedBean(name="bean1")
@SessionScoped
public class Bean1 {
public Bean1() {
}
private String nombre;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Y para accederlo desde una página JSF, debería ser así:
Todo normal.. y si accedemos desde otra página, bastaría con escribir #{bean1.nombre}
Hasta ahí todo normal y muy bien.. pero que pasaría si tenemos otro managedBean y queremos acceder al primer managedBean?
Pues bien, se debería declarar una propiedad (con set/get) del tipo del primer ManagedBean, y agregarle la anotación @ManagedProperty("#{bean1}") (Donde bean1 es el nombre del otro managedbean. Y listo!! solo usar.
@ManagedBean(name = "bean2")
@RequestScoped
public class Bean2 {
@ManagedProperty("#{bean1}")
private Bean1 bean1;
/** Creates a new instance of Bean2 */
public Bean2() {
}
public String getSaludo() {
return "Hola " + bean1.getNombre();
}
public Bean1 getBean1() {
return bean1;
}
public void setBean1(Bean1 bean1) {
this.bean1 = bean1;
}
}
Sang Shin de javapassion.com ha dejado de trabajar para sun.com, y sus cursos tan buenos que ha publicado para la comunidad, serán ahora accedidos bajo un pago anual de $89. Yo creo que es lo justo para tan buen material elaborado por este Evangelista de Java.
El 8 de febrero se publicó la lista de los graduados de la 1ra sesión del CodeCamp Java EE 6. Ha sido un buen curso donde se ha aprendido más a profundidad sobre esta nueva tecnología.
Muchas gracias Sang Shin por tu trabajo a la comunidad.