JSF2.0: жизненный цикл ManagedProperty? - PullRequest
1 голос
/ 15 ноября 2010

У меня есть проблема, которую я не понимаю: за любым представлением у меня есть контроллер ManagedBean, который является RequestScoped, и data ManagedBean, который содержит данные для представления и является SessionScoped.

Итак, есть дваПредставления, которые входят в систему с loginData и loginController и обзор с OverviewData и OverviewController.

Функциональность должна быть такой:

  • Пользователь входит в приложение (метод loginController)
  • Если проверка подлинности прошла успешно, происходит перенаправление на файл Overview.xhtml (снова в методе loginController)
  • Затем OverviewData получает свои данные с помощью OverviewController, который получает их из уровня бизнес-логики
  • Overview.xhtml показывает удаленные данные

Итак, я хочу заполнить OverviewData вне loginController сразу после входа в систему!(??? или, если возможно, правильно, если построено обзорное представление, если возможно ???).

Я пробовал это с managedProperties, но тот, который я инициирую в loginController, является объектом, отличным от управляемогоProperty в OverviewController,хотя они имеют одинаковое имя!Как это возможно?

О, мальчик, я сомневаюсь, что вы, ребята, понимаете, о чем я, поэтому мне нужно опубликовать некоторый код:

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 Ответ

2 голосов
/ 15 ноября 2010

Вы создаете бины самостоятельно, используя new вместо того, чтобы позволить JSF выполнять работу.

overviewController = new OverviewController ();

и

overviewData = new OverviewData();

Это неправильно.JSF не будет использовать бины, которые вы создали таким образом.Удалите эти строки и добавьте еще @ManagedProperty в overviewController внутри LoginController (и установите свойство private).

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

JSF создаст сам компонент и сразу после него установит его как управляемое свойствоконструкция родительского боба.Вам просто нужно получить к нему доступ обычным способом Java (без необходимости проверок нуля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...