2011-01-27 57 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