JSF2.0:ManagedProperty生命周期?

时间:2010-11-15 14:49:06

标签: jsf jsf-2

我有一个问题我不明白:在任何View后面我有一个RequestScoped控制器ManagedBean和一个数据ManagedBean,它保存视图的数据并且是SessionScoped。

所以有两个视图,分别用loginData和loginController登录,概述用overviewData和overviewController。

功能应该是这样的:

  • 用户登录应用程序(loginController方法)
  • 如果身份验证成功,则会重定向到overview.xhtml(再次在loginController方法中)
  • 然后overviewData通过overviewController获取其数据,后者从业务逻辑层
  • 检索它们
  • overview.xhtml显示已淘汰的数据

所以,重点是我想在登录后立即从loginController中填充overviewData! (如果可能的话,构成概述视图的???或者如果可能的话......)。

我尝试使用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;
    }
...

我希望这有助于显示我的问题,如果你不理解,请在评论中提问..

如果你可以帮助我会很好: - )

干杯...

1 个答案:

答案 0 :(得分:2)

您正在使用new自己创建bean,而不是让JSF完成工作。

overviewController = new OverviewController ();

overviewData = new OverviewData();

这是错误的。 JSF不会使用您自己创建的任何bean。删除这些行,并在@ManagedProperty内的overviewController上添加另一个LoginController(并创建属性private)。

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

JSF将创建bean本身并在父bean构造之后直接将其设置为托管属性。您只需要以通常的Java方式访问它(不需要nullchecks)。