Acceder a ManagedBean desde otro ManagedBean en JSF 2.0
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
... 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:
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:
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
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
El código fuente de este ejemplo se encuentra aquí: http://diesil-java.googlecode.com/files/ScopesJSF20.tar.gz
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í:
<?xml version='1.0' encoding='UTF-8' ?> <!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"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> Nombre:<h:inputText value="#{bean1.nombre}" /> <br/><h:commandButton value="Guardar" /> </h:form> </h:body> </html>
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; } }
El código fuente de este ejemplo se encuentra aquí: http://diesil-java.googlecode.com/files/ScopesJSF20.tar.gz
Gracias! justo lo que estaba buscando.
ردحذفthanks frien por el dato me sirvio de mucho para mi proyecto
ردحذفgracias, justo lo que estaba buscando
ردحذفgracias.
ردحذفHi y cuando se desea eliminar estos objetos de la session???
ردحذفTienes dos maneras, que hacen lo mismo:
ردحذفDesde un servlet:
HttpSession session = request.getSession();
session.invalidate();
Desde un ManagedBean:
FacesContext ctx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) ctx.getExternalContext().getSession(false);
session.invalidate();
Gracias amigo :) increible que sea tan simple...
ردحذفsi tengo ambos beans como @SessionScoped puedo hacer esto de la misma manera?
ردحذفya lo probe y si funciona de la misma manera
ردحذفMuchas gracias :)
Estaba buscando la aclaración sobre este concepto básico de DI, y este tutorial me ha sido de gran ayuda. Gracias.
ردحذف