2010-11-25 22 views
7

Tengo esta configuración en mi aplicación web. 2 frijoles:JSF - Obtenga la instancia de SessionScoped Bean

1 ° Frijol - Comprueba el inicio de sesión;

@ManagedBean(name="login") 
@SessionScoped 
public class Login { 
    private String nickname; 
    private String password; 
    private boolean isLogged; 

    public String getNickname() { return nickname; } 
    public void setNickname(String newValue) { nickname=newValue; } 

    public String getPassword() { return password; } 
    public void setPassword(String newValue) { password=newValue; } 

    public void checkLogin() { 
     ... i check on db the nickname and the password ... 

     if(USER EXIST) { 
      isLogged=true; 
     } else { 
      isLogged=false; 
     } 

     return true; 
    } 
} 

2 ° de la haba - Manejo de parámetros de usuario:

@ManagedBean(name="user") 
@SessionScoped 
public class User { 
    private String name; 
    private String surname; 
    private String mail; 

    public User() { 
     String[] record=null; 
     Database mydb=Configuration.getDatabase(); 
     mydb.connetti(); 
     ArrayList<String[]> db_result=null; 
     db_result=mydb.selectQuery("SELECT name, surname, mail, domicilio FROM users WHERE nickname='???????'"); 

     int i = 0; 
     while (i<db_result.size()) { 
      record=(String[]) db_result.get(i); 
      i++; 
     } 
    } 

    ... getter and setter methods... 
} 

Como se puede ver, me gustaría saber cómo conseguir el apodo enchufar previamente en mi grano de login, de modo que pueda hacer la consulta en mi DB.

De hecho, necesito obtener la instancia del inicio de sesión actual del bean: ¿cómo puedo obtenerlo? Debería usar tantos como session.getBean("login") :)

esperanza a esta pregunta es clara :)

Respuesta

10

Uso @ManagedProperty para inyectarlo y utilizar @PostConstruct para acceder a ella después de la construcción del frijol (porque en un constructor lo normal sería todavía null).

@ManagedBean 
@SessionScoped 
public class User { 

    @ManagedProperty(value="#{login}") 
    private Login login; 

    @PostConstruct 
    public void init() { 
     // Put original constructor code here. 
    } 

    // Add/generate getters/setters and other boilerplate. 
} 

Dicho esto, este no es el enfoque correcto. Te gustaría hacerlo al revés. Inyecte User en Login por @ManagedProperty(value="#{user}") y haga el trabajo durante el método de envío de acciones.

También le gustaría poner la contraseña en la cláusula WHERE también. No hay absolutamente ninguna necesidad de transportar toda la tabla de usuarios a la memoria de Java y determinarla uno por uno. Simplemente deje que DB haga el trabajo y verifique si devuelve cero o una fila.

+0

@Gaim: tenía el código original en el que le gustaría acceder a 'frijol login' en el constructor del frijol. Todavía sería 'nulo' en ese punto. Por cierto, el nombre del método no necesariamente debe ser 'init()', puede elegir lo que quiera, siempre y cuando haya '@ PostConstruct' en él. – BalusC

+0

No estoy seguro, pero creo que falta la configuración requerida para el inicio de sesión: en mis aplicaciones se requiere – Gaim

+0

@Gaim: no es más que obvio que necesito un getter/setter para esto. Es un frijol He editado el ejemplo del código para que quede más claro para los ignorantes. – BalusC

8

tratar también usando el siguiente código:

ExternalContext tmpEC; 
    Map sMap; 
    tmpEC = FacesContext.getCurrentInstance().getExternalContext(); 
    sMap = tmpEC.getSessionMap(); 
    login loginBean = (login) sMap.get("login"); 
Cuestiones relacionadas