我试着运行这段代码
@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作用域?