2010-11-25 8 views
7

Ich habe diese Konfiguration in meiner Webanwendung. 2 Bohnen:JSF - Holen Sie die SessionScoped Bean Instanz

1 ° Bean - Es prüft die Anmeldung;

@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 - Verwalten von Benutzerparameter:

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

Wie Sie sehen können, würde ich gerne wissen, wie die Spitznamen vorher auf meiner login Bohne gefassten bekommen, also kann ich auf die Abfrage tun meine DB.

In der Tat muss ich die Instanz der aktuellen Sitzung Bean-Login erhalten: wie bekomme ich es? Ich soll Somethings wie session.getBean("login") :)

Hoffnung verwende diese Frage klar ist :)

Antwort

10

Verwenden @ManagedProperty, um es zu injizieren und @PostConstruct verwenden, um es nach dem Bau des Bean zugreifen (weil in einem normalen Konstruktor wäre es immer noch null sein).

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

Das heißt, das ist nicht der richtige Ansatz. Du würdest es gerne umgekehrt machen. Injizieren Sie User in Login von @ManagedProperty(value="#{user}") und führen Sie den Auftrag während der Aktionsmethode ein.

Sie möchten auch das Passwort in WHERE Klausel setzen. Es ist absolut nicht notwendig, die gesamte Benutzertabelle in den Speicher von Java zu übertragen und sie einzeln zu bestimmen. Lassen Sie einfach die Datenbank die Aufgabe erledigen und prüfen Sie, ob sie Null oder eine Zeile zurückgibt.

+0

@Gaim: Er hatte den ursprünglichen Code, wo er zugreifen möchte 'Login' Bohne in der Konstruktor der Bohne. Es wäre zu diesem Zeitpunkt immer noch "null". Übrigens muss der Methodenname nicht unbedingt "init()" sein, Sie können wählen, was Sie wollen, solange ein "@ PostConstruct" darauf steht. – BalusC

+0

Ich bin mir nicht sicher, aber ich denke, dass fehlt fehlt Setter für das Login - in meinen Anwendungen ist es erforderlich – Gaim

+0

@Gaim: es ist nichts mehr als offensichtlich, einen Getter/Setter dafür zu brauchen. Es ist eine Bohne. Ich habe das Codebeispiel so bearbeitet, dass es für die Ignoranten klarer ist. – BalusC

8

auch versuchen, den folgenden Code:

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