所以这是我的代码:
<h:form>
<p:dataTable var="customer" value="#{customersTableBackingBean.allCustomers}">
<p:column headerText="First Name">
<h:outputText value="#{customer.contactFirstName}" />
</p:column>
<p:column headerText="City">
<h:outputText value="#{customer.city}" />
</p:column>
</p:dataTable>
</h:form>
BackingBean:
package com.tugay.maythirty.model;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.Serializable;
import java.util.List;
@Named
public class CustomersTableBackingBean implements Serializable {
@Inject
CustomersService customersService;
public List<Customers> getAllCustomers(){
return customersService.getAllCustomers();
}
public String sayHello(){
return "Hello from a managed bean!";
}
}
服务:
import javax.inject.Inject;
import java.io.Serializable;
import java.util.List;
public class CustomersService implements Serializable {
@Inject
private CustomersDao customersDao;
public List<Customers> getAllCustomers(){
boolean userLoggedIn = true;
if(userLoggedIn){
return customersDao.getAllCustomers();
}
else{
return null;
}
}
}
道:
import javax.persistence.*;
import java.util.List;
public class CustomersDao {
@PersistenceContext(unitName = "Persistence")
private EntityManager em;
public List<Customers> getAllCustomers() {
TypedQuery<Customers> query = em.createQuery("SELECT c FROM Customers c", Customers.class);
List<Customers> allCustomers = query.getResultList();
return allCustomers;
}
public void addCustomer(String customerName, String city){
Customers customer = new Customers();
customer.setCustomerName(customerName);
customer.setCity(city);
em.persist(customer);
}
}
实体:
@Entity
public class Customers {
//relevant code here...
所以这在Glassfish服务器上运行,运行得很好..我可以从数据库中获取数据并在index.xhtml上查看..
我的支持意思是@Named bean。因此@Named可以从EL访问它。
但是,它没有任何其他注释,例如Statless或Stateful .. 那么这个支持bean的“状态”是什么?这个bean的生命周期是不是由容器管理的?
另外,正如你所看到的那样,我正在使用@Inject向我的BackingBean注入一个服务,为我的服务注入一个Dao,为我的Dao注入一个实体......这些是EJB吗?如果他们像这样工作得很好,我为什么要制作这些@Stateless或@Stateful?
为什么我应该/应该制作任何这些bean @Stateful或@Statless?
答案 0 :(得分:4)
CustomersService
只是一个POJO。如果使用@Stateful
对其进行注释,那么它将是一个有状态的EJB(带有@Statless
- 无状态EJB)。与POJO(不是EJB)不同,EJB由EJB容器管理,并且可以受益于EJB容器必须提供的工具(例如,容器管理的事务,安全性......)。
但是如果你不需要EJB容器提供的服务,那么我认为制作EJB是没有意义的。
那么这个支持豆的“状态”是什么?
IMO,这没有多大意义。我认为你的意思是bean的范围(例如请求,会话,应用程序......)。如果是这样,既然你没有为它指定任何范围,我认为它不会放在任何范围内。它将在需要时被实例化(例如,在这种情况下,它应该在每次请求页面时被实例化)。但是如果它是作用域,那么只要范围本身存在,bean的实例就会存在。例如为每个新请求实例化一个请求范围的bean。
上面的教程链接适用于Java EE 6.感谢@Luiggi的Java EE 7 tutorial link。
答案 1 :(得分:0)
根据CDI规范(抱歉在我的手机上,无法轻松查找该部分)没有任何上下文/范围注释,bean是DependantScoped,这意味着容器每次访问(或创建并设置)时都会创建一个新实例在包含bean上,类似于自己做new
)。
关于实体的另一个问题,您应该为要在前端直接访问的每个实体创建一个生产者。如果不这样做,可能无法正确保存。