我在我的网络应用程序上有这个配置。 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;
}
}
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登录的实例:我该如何获取它?我应该使用像session.getBean("login")
:)
希望这个问题很清楚:)
答案 0 :(得分:11)
使用@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.
}
那就是说,这不是正确的做法。你想反过来这样做。通过User
在Login
中注入@ManagedProperty(value="#{user}")
并在提交操作方法期间完成工作。
您也希望将密码放在WHERE
子句中。绝对没有必要将整个用户表拖入Java的内存并逐个确定。只需让DB完成工作并检查它是否返回零行或一行。
答案 1 :(得分:8)
还可以尝试使用以下代码:
ExternalContext tmpEC;
Map sMap;
tmpEC = FacesContext.getCurrentInstance().getExternalContext();
sMap = tmpEC.getSessionMap();
login loginBean = (login) sMap.get("login");