2010-11-15 3 views
1

J'ai un problème Je ne comprends pas: Derrière une vue, j'ai un contrôleur ManagedBean qui est RequestScoped et un Data ManagedBean, qui contient les données pour la vue et est SessionScoped. Il y a donc deux vues, qui sont login avec loginData et loginController et une vue d'ensemble avec overviewData et overviewController.JSF2.0: cycle de vie ManagedProperty?

La fonctionnalité devrait être comme ça:

  • Les journaux de l'utilisateur dans l'application (méthode loginController)
  • Si l'authentification est réussie, il y a une redirection vers overview.xhtml (encore une fois dans la méthode loginController)
  • Ensuite, la overviewData obtient ses données par le overviewController, qui les récupère de la couche logique métier
  • le overview.xhtml montre les données retireved

Donc, le point est que je veux remplir overviewData de loginController, juste après la connexion! (??? ou si possible juste befor vue d'ensemble est construit, si possible ???).

Je l'ai essayé avec managedProperties, mais celui que je lance dans loginController est un objet différent de managedProperty dans overviewController, bien qu'ils aient le même nom! Comment est-ce possible.

Oh boy, je doute que vous les gars à comprendre ce que je veux dire, alors je dois poster un code:

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 
    } 
... 

PrésentationData.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; 
    } 
... 

J'espère que aide à montrer mon problème, si vous ne comprenez pas, pls demander dans un commentaire ..

Ce serait bien si vous pouvez me aider :-)

Bravo ...

Répondre

2

Vous créez vous-même des haricots en utilisant new au lieu de laisser JSF faire le travail.

overviewController = new OverviewController(); 

et

overviewData = new OverviewData(); 

Ceci est incorrect. JSF n'utilisera pas les haricots que vous avez créés vous-même de cette façon. Supprimer ces lignes et ajouter un autre @ManagedProperty sur overviewController à l'intérieur LoginController (et faire la propriété private). JSF créera le bean lui-même et le définira comme propriété gérée directement après la construction du bean parent.Il suffit d'y accéder de la façon habituelle Java (sans avoir besoin de nullchecks).

+0

Merci. De plus j'oublie bêtement de faire le set et d'avoir des méthodes -.- – Sven