JSF - 获取SessionScoped Bean实例

mar*_*zzz 8 jsf facelets javabeans jsf-2

我在我的Web应用程序上有这个配置.2豆:

1°Bean - 它检查登录;

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

2°Bean - 管理用户参数:

@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...
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我想知道如何在我的loginbean 上设置昵称,所以我可以在我的数据库上进行查询.

实际上我需要获取当前会话bean登录的实例:我怎样才能得到它?我应该使用像session.getBean("login"):) 这样的东西

希望这个问题很清楚:)

Bal*_*usC 11

使用@ManagedProperty注射,并使用@PostConstructBean的建设后,对其进行访问(因为在正常的构造将是仍然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.
}
Run Code Online (Sandbox Code Playgroud)

也就是说,这不是正确的做法.你想反过来这样做.注入UserLogin通过@ManagedProperty(value="#{user}")做提交操作方法的过程中的工作.

你也想把密码放在WHERE子句中.绝对没有必要将整个用户表拖入Java的内存并逐个确定.让DB完成工作并检查它是否返回零行或一行.


小智 8

还可以尝试使用以下代码:

    ExternalContext tmpEC;
    Map sMap;
    tmpEC = FacesContext.getCurrentInstance().getExternalContext();
    sMap = tmpEC.getSessionMap();
    login loginBean = (login) sMap.get("login");
Run Code Online (Sandbox Code Playgroud)