显示有多少用户使用 JSF 登录

Show how many Users logged in with 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" Class 和 return 中检查用户数据是否正确,如果 successfully.If 成功,则用户将被存储到列表中,如你所见。

@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);

}

}

这是我的另一个Bean,它将成功登录的用户存储到一个列表中。 现在我想将所有用户列出到我的 table 中,但我的 table 仍然是空的。没有错误!

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

错误在这里:

private static Controller instance = new Controller();

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

public static AngemeldeteBenutzer getAb() {
    return ab;
}

您似乎错过了具有依赖注入支持的 bean 管理框架的要点。您似乎期望 JSF 页面中的 #{angemeldeteBenutzer} 指的是与您 手动 使用 new 运算符在那里创建的完全相同的实例,并且正在填充用户。

这是错误的!您有两个 class 实例,一个由 JSF 自动创建并可通过 #{angemeldeteBenutzer} 获得,另一个由您手动创建并仅可通过 getAb() 方法获得。

摆脱所有那些静态字段和方法。他们不属于那里。相反,使用 @ManagedProperty 让 JSF 相互注入托管 bean。将此代码添加到 Controller class.

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

public AngemeldeteBenutzer getAb() {
    return ab;
}

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

并替换为相同的Controller class这一行

AngemeldeteBenutzer.getAb().hinzufuegen(benutzer);

来自

ab.hinzufuegen(benutzer);

注意:如果您已经在使用 Java EE 7,请考虑使用 CDI @Named 而不是 JSF @ManagedBean。当通过 @Inject 而不是 @ManagedProperty 注入时,您不再需要那些丑陋的 getter/setter。

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

    @Inject
    private AngemeldeteBenutzer ab;

}

与具体问题无关Controller 似乎不是合法的应用程序作用域 bean。由于特定于视图的变量和业务逻辑,它看起来太像一个视图范围的 bean。确保您了解范围:How to choose the right bean scope?