2015-07-15 7 views
0

я TRIE запустить этот кодПоказать, сколько пользователей вошли в систему с помощью JSF

@ManagedBean 
@ApplicationScoped 
public class Controller implements Serializable { 

private static final long serialVersionUID = 1L; 

private Benutzer benutzer; 

private List<Erfasst> bisherErfasst = new ArrayList<Erfasst>(); 

private EntityManagerFactory emf = Persistence 
     .createEntityManagerFactory("CP Kontrolle"); 
private static Controller instance = new Controller(); 

public Benutzer getBenutzer() { 
    return benutzer; 
} 

public boolean anmelden(String email, int kdnr) { 
    EntityManager em = emf.createEntityManager(); 
    Query query = em 
      .createQuery("SELECT b FROM Benutzer b WHERE b.email = :email AND b.kdnr = :kdnr"); 
    query.setParameter("email", email); 
    query.setParameter("kdnr", kdnr); 
    List<Benutzer> liste = query.getResultList(); 
    em.close(); 
    if (liste.size() == 1) { 
     benutzer = liste.get(0); 
     AngemeldeteBenutzer.getAb().hinzufuegen(benutzer); 

     return true; 
    } else { 
     return false; 
    } 
} 

public static Controller getInstance() { 
    return instance; 
} 
    [....] 
} 

} 

Приведенный выше код мой ControllerBean. Из формы входа пользовательские данные будут проверяться в классе «anmelden» и возвращать true или false, если они были успешно. Если успешно, пользователь будет храниться в списке, как вы можете видеть.

@ManagedBean 
@ApplicationScoped 
public class AngemeldeteBenutzer implements Serializable { 

private static final long serialVersionUID = 1L; 

private List<Benutzer> online = new LinkedList<Benutzer>(); 
private static AngemeldeteBenutzer ab = new AngemeldeteBenutzer(); 

public static AngemeldeteBenutzer getAb() { 
    return ab; 
} 

public List<Benutzer> getOnline() { 
    return online; 
} 

public void hinzufuegen(Benutzer benutzer) { 
    online.add(benutzer); 

} 

} 

Это мой другой компонент, который хранит зарегистрированного пользователя в списке. Теперь я хочу перечислить всех пользователей в таблицу, но мой стол по-прежнему пуст. Нет ошибок!

<h:panelGrid columns="2" id="onlinePanel" > 
     <h:dataTable value="#{angemeldeteBenutzer.online}" var="on"> 
      <h:column> 
       <f:facet name="header">Email</f:facet> 
       <h:outputText value="#{on.email}"></h:outputText> 
      </h:column> 
     </h:dataTable> 
    </h:panelGrid> 

ответ

0

Ошибка здесь:

private static Controller instance = new Controller(); 

public static Controller getInstance() { 
    return instance; 
} 
private static AngemeldeteBenutzer ab = new AngemeldeteBenutzer(); 

public static AngemeldeteBenutzer getAb() { 
    return ab; 
} 

Вы, кажется, пропустил точку рамки управления компонентами с поддержкой инъекции зависимостей. Кажется, вы ожидаете, что #{angemeldeteBenutzer} на странице JSF ссылается точно так же, как и вы вручную, созданный там с оператором new и заполняется пользователями.

Это не так! У вас есть два экземпляра класса, один из которых автоматически создается JSF и доступен через #{angemeldeteBenutzer}, а другой - вручную, созданный самостоятельно и доступный только с помощью этого метода getAb().

Избавьтесь от всех этих статических полей и методов. Они там не принадлежат. Вместо этого используйте @ManagedProperty, чтобы JSF вводил управляемые бобы друг в друга. Добавьте этот код в класс Controller.

@ManagedProperty("#{angemeldeteBenutzer}") 
private AngemeldeteBenutzer ab; 

public AngemeldeteBenutzer getAb() { 
    return ab; 
} 

public void setAb(AngemeldeteBenutzer ab) { 
    this.ab = ab; 
} 

И заменить в том же классе Controller эта линия

AngemeldeteBenutzer.getAb().hinzufuegen(benutzer); 

по

ab.hinzufuegen(benutzer); 

Примечание: если вы уже на Java EE 7, рассмотреть возможность использования CDI @Named вместо JSF @ManagedBean. При инъекции через @Inject вместо @ManagedProperty вам больше не нужен этот уродливый геттер/сеттер.

@Named 
@ApplicationScoped 
public class AngemeldeteBenutzer { 
} 
@Named 
@ApplicationScoped 
public class Controller { 

    @Inject 
    private AngemeldeteBenutzer ab; 

} 

Unrelated к конкретной проблеме, Controller не кажется, законно приложение боба области видимости. Он слишком похож на объект с видимым охватом из-за переменных, зависящих от вида и бизнес-логики. Убедитесь, что вы понимаете области: How to choose the right bean scope?

+0

Большое спасибо. Ваш ответ был моим спасением. – user3533134

+0

Добро пожаловать. Kein Danke :) – BalusC