2010-11-25 88 views
7

我在我的web應用程序上有這個配置。 2豆:JSF - 獲取SessionScoped Bean實例

1°豆 - 它檢查登錄;

@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°豆 - 管理用戶參數:

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

正如你可以看到,我想知道如何得到我的login豆先前設置好的綽號,這樣我就可以做查詢我的數據庫。

事實上,我需要獲取當前會話bean登錄的實例:我怎樣才能得到它?我應該使用像出頭:) session.getBean("login")

希望這個問題是清楚:)

回答

10

使用@ManagedProperty注入並使用@PostConstruct bean的建設後,對其進行訪問(因爲在正常的構造將是仍然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. 
} 

這就是說,這不是正確的做法。你想這樣做。在Login@ManagedProperty(value="#{user}")中注入User,並在提交操作過程中執行此操作。

您還想將密碼放在WHERE子句中。絕對不需要將整個用戶表拖入Java內存並逐個確定它。讓數據庫完成這項工作,並檢查它是否返回零或一行。

+0

@Gaim:他的原代碼,他希望訪問`bean的構造Login`豆。在那一點上它仍然是'空'。順便說一下,方法名不一定需要是`init()`,只要有一個`@ PostConstruct`就可以選擇任何你喜歡的。 – BalusC 2010-11-25 16:10:21

8

也可以嘗試使用下面的代碼:

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