JSF - 获取SessionScoped Bean实例

9
我有一个网站应用程序的这个配置。2个Bean:

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;
    }
}

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

如您所见,我想知道如何获取之前在我的login bean中设置的昵称,以便我可以在我的数据库中进行查询。
实际上,我需要获取当前会话bean login的实例:我该如何获取它?我应该使用像session.getBean("login")这样的东西 :)
希望这个问题很清楚 :)
2个回答

12
使用@ManagedProperty注入它,在bean构建后使用@PostConstruct访问它(因为在普通构造函数中它仍然为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.
}

话虽如此,这并不是正确的方法。您希望采用另一种方法。通过 @ManagedProperty(value="#{user}")User注入Login,并在提交操作方法中完成任务。

您还想将密码放在WHERE子句中。完全没有必要将整个用户表传输到Java内存中,然后逐个确定。只需让数据库完成工作,并检查其是否返回零行或一行。


@Gaim:他有原始代码,想在bean的构造函数中访问“Login” bean。但此时它仍然为“null”。顺便说一下,方法名不一定需要是“init()”,您可以选择任何您喜欢的名称,只要它上面有“@PostConstruct”。 - BalusC
@BalusC 是的,我注意到了,所以我删除了之前的评论。 - Gaim
嗯...但是是的...在我的例子中(如果我将它放到构造函数中),我也无法更新数据。这可能是一个问题... - markzzz
我真的不理解你对这个问题的困惑。无论如何,我会尽量避免在你未来的问题中评论设计问题。你的“初始”问题是否已经得到了答案/解决?如果您想要更多细节,请发布一个新问题。 - BalusC
是的,我曾经是一名PHP程序员 :) 请不要客气,你这些天帮了我很多,真的非常感谢!也许通过这个例子,你可以理解:我在Chrome上登录。然后我将数据保存在一个bean中(姓名、姓氏等等)。现在我在Firefox上登录。所以我将数据保存在另一个bean中。好的,现在从Chrome中编辑我的个人资料(所以我更改了数据库数据)。如果现在我转到Firefox,我的数据没有更新,因为它们来自我的上一个bean(旧的数据),而不是来自更新的数据库。我的意思清楚吗? :) 是的,也许我会开一个新话题来讨论这个问题... - markzzz
显示剩余7条评论

9

也尝试使用以下代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接