显示使用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。在Login-Form中,将在"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);
}
}

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

    <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操作符在那里手动创建的完全相同,并且正在填充用户。

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

去掉所有的静态字段和方法。他们不属于那里。相反,使用@ManagedProperty让JSF相互注入托管bean。将此代码添加到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注入时,你不再需要那些丑陋的getter/setter了。

@Named
@ApplicationScoped
public class AngemeldeteBenutzer {
}
@Named
@ApplicationScoped
public class Controller {
    @Inject
    private AngemeldeteBenutzer ab;
}

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

相关内容

  • 没有找到相关文章

最新更新