2010-11-25 89 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");