2011-01-27 149 views
0

使用JSF 2.0和Spring,我使用的托管bean为@RequestScope。这个bean存储关于登录用户的信息。它加载从DB用户在@PostConstruct方法:然后JSF生命周期 - 在请求完成后执行托管bean方法

@PostConstruct 
public void init() { 
    String username = login.getUsername(); 
    user = userDao.load(username); 
} 

的登录用户可以对更新数据库的用户页面上的动作触发(使用另一个托管bean)。

然而,@RequestScope豆在所述请求,该请求是之前呼叫到更新动作的开始构成。因此,当页面重新显示时,User变量仍然具有其旧值。

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

感谢您的洞察力,
塞巴斯蒂安

回答

1

的登录用户可以触发对(使用其他托管bean)更新数据库中的用户页面上的动作。

相同托管bean应该在这一点上进行了更新。如果出于某种原因无法重用相同的托管bean,那么您应该通过在action方法中访问它并自己调用setter来手动执行它。


更新:根据意见,这里的豆应如何申报并注入和您的特定需求使用:

@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> 
+0

实际上,似乎发生的是Request bean已创建,然后调用另一个托管bean并注入_another_ Request bean。然后我修改并设置了我的用户的新值,但它对我的初始请求对象没有任何影响。有没有办法将初始请求对象传递给我的其他管理器bean,或者检索它? – 2011-01-27 19:28:34