2010-11-25 25 views
7

J'ai cette configuration sur mon application Web. 2 haricots:JSF - Récupère l'instance Bean SessionScoped

1 ° Bean - Il vérifie la connexion;

@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 ° Bean - Gérer paramètres utilisateur:

@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... 
} 

Comme vous pouvez le voir, je voudrais savoir comment obtenir le surnom setted précédemment sur mon login haricots, donc je peux faire la requête sur ma DB.

En fait, j'ai besoin d'obtenir l'instance du login de session en cours: comment puis-je l'obtenir? Je devrais utiliser somethings comme session.getBean("login") :)

Hope this question est claire :)

Répondre

10

Utilisez @ManagedProperty pour injecter et utiliser @PostConstruct pour y accéder après la construction de haricots (parce que dans un constructeur normal, il serait encore 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. 
} 

Cela dit, ce n'est pas la bonne approche. Vous aimeriez le faire dans l'autre sens. Injectez User dans Login par @ManagedProperty(value="#{user}") et effectuez le travail pendant la méthode d'action de soumission.

Vous souhaitez également mettre le mot de passe dans la clause WHERE. Il n'y a absolument pas besoin de transporter toute la table des utilisateurs dans la mémoire de Java et de la déterminer une par une. Laissez simplement la DB faire le travail et vérifiez si elle renvoie zéro ou une ligne.

+0

@Gaim: il avait le code d'origine où il aimerait accéder 'haricot login' dans le constructeur de la fève. Ce serait encore «nul» à ce moment-là. Au fait, le nom de la méthode ne doit pas forcément être 'init()', vous pouvez choisir ce que vous voulez, tant qu'il y a '@ PostConstruct'. – BalusC

+0

Je ne suis pas sûr, mais je pense qu'il manque setter requis pour la connexion - dans mes applications, il est nécessaire – Gaim

+0

@Gaim: il n'est rien de plus évident que d'avoir besoin d'un getter/setter pour cela. C'est un haricot. J'ai modifié l'exemple de code afin qu'il soit plus clair pour les ignorants. – BalusC

8

Essayez également d'utiliser le code suivant:

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