使用JSF 2.0和Spring,我使用@RequestScope
托管bean。此bean存储有关已登录用户的信息。它以@PostConstruct
方法从DB加载用户:
@PostConstruct
public void init() {
String username = login.getUsername();
user = userDao.load(username);
}
然后,登录用户可以触发更新数据库中用户的页面上的操作(使用其他托管bean)。
但是,@RequestScope
bean是在请求开始时构造的,在调用更新操作之前。因此,当重新显示页面时,User
变量仍具有旧值。
我的问题是:我是否有办法在请求开始时运行我的加载方法,但在发送请求之后?或者我是以错误的方式处理这个问题?
感谢您的见解,
塞巴斯蒂安
答案 0 :(得分:1)
然后,登录用户可以触发更新数据库中用户的页面上的操作(使用其他托管bean )。
此时应该更新相同的托管bean。如果由于某种原因无法重用同一个托管bean,那么您应该通过在action方法中访问它并自己调用setter来手动执行它。
更新:根据评论,以下是如何在您的特定要求中声明和注入和使用bean:
@ManagedBean(name="#{login}")
@SessionScoped
public class LoginManager {
private String username;
// ...
}
@ManagedBean(name="#{user}")
@RequestScoped
public class UserManager {
@ManagedProperty(value="#{login}")
private LoginManager login;
private User current;
@PostConstruct
public void init() {
current = userDAO.find(login.getUsername());
}
// ...
}
@ManagedBean(name="#{profile}")
@RequestScoped
public class ProfileManager {
@ManagedProperty(value="#{user}")
private UserManager user;
public void save() {
userDAO.save(user.getCurrent());
}
// ...
}
<h:form>
<h:inputText value="#{user.current.firstname}" />
<h:inputText value="#{user.current.lastname}" />
<h:inputText value="#{user.current.birthdate}" />
...
<h:commandButton value="Save" action="#{profile.save}" />
</h:form>