JSF生命周期 - 请求完成后执行托管bean方法

时间:2011-01-27 09:19:09

标签: jsf jsf-2 lifecycle

使用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变量仍具有旧值。

我的问题是:我是否有办法在请求开始时运行我的加载方法,但在发送请求之后?或者我是以错误的方式处理这个问题?

感谢您的见解,
塞巴斯蒂安

1 个答案:

答案 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>