显示有多少用户使用 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?
我尝试运行这个代码
@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?