2010-11-15 29 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