2010-11-15 31 views
1

我有一個問題,我不明白:在任何視圖後面我有一個控制器ManagedBean是RequestScoped和數據ManagedBean,它包含視圖的數據並且是SessionScoped。JSF2.0:ManagedProperty生命週期?

所以有兩個視圖,它們分別是loginData和loginController,以及overviewData和overviewController。

的功能應該是這樣的:

  • 用戶登錄到應用程序(的LoginController方法)
  • 如果認證是全成,有一個重定向(在的LoginController方法再次)到overview.xhtml
  • 然後overviewData由overviewController,這從商業邏輯層檢索它們獲取其數據
  • 的overview.xhtml顯示retireved數據

所以,重點是我想要登錄後立即從loginController中填充overviewDataData! (如果可能的話,或如果可能的話,構建總覽視圖)。

我試過用managedProperties,但我在loginController中啓動的是與overviewController中的managedProperty不同的對象,雖然它們具有相同的名稱!這怎麼可能。

哦,孩子,我懷疑你們明白我的意思,所以我需要發佈一些代碼:

LoginController.java

...  
    @ManagedBean 
    @RequestScoped 
    public class LoginController { 

    @ManagedProperty(value = "#{overviewData}") 
    private OverviewData overviewData; 
    OverviewController overviewController; 

    public LoginController(){ 
     overviewController = new OverviewController(); 
    } 

    String login() throws Exception { 
     UsernamePasswordToken token = new UsernamePasswordToken(loginData.getName(), loginData.getPw().trim()); 
     try { 
     currentUser.login(token); 
     overviewController.fillProjects(); 
... 

OverviewController.java

...  
    @ManagedBean 
    @RequestScoped 
    public class OverviewController { 

    @ManagedProperty(value = "#{overviewData}") 
    private OverviewData overviewData; 

    public void fillProjects(){ 
     if(overviewData == null){ 
     overviewData = new OverviewData(); 
     } 
     overviewData.setProjects(projectService.getProjects()); //retrieves data from business logic 
    } 
... 

OverviewData.java

... 
    @ManagedBean(name = "overviewData") 
    @SessionScoped 
    public class OverviewData { 

    private List<ProjectDTO> projects; //that's what the view needs to display the overview 

    public void setProjects(List<ProjectDTO> projects) { 
     this.projects = projects; 
    } 
... 

我希望可以幫助顯示我的問題,如果你不明白,請問評論...

將是很好,如果你能幫助我:-)

乾杯...

回答

2

您正在使用new自己創建bean,而不是讓JSF完成這項工作。

overviewController = new OverviewController(); 

overviewData = new OverviewData(); 

這是不對的。 JSF不會利用你以這種方式創建的任何bean。刪除這些行,並在LoginController(並使物業private)內的overviewController上添加另一個@ManagedProperty

@ManagedProperty(value="#{overviewController}") 
private OverviewController overviewController; 

JSF將創建bean本身並在父bean的構造後直接將其設置爲託管屬性。您只需以通常的Java方式訪問它(不需要空檢查)。

+0

謝謝。另外,我愚蠢地忘記了設置和獲取方法-... - – Sven 2010-11-16 07:46:40