1

所以这是我的代码:

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

支持豆:

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..那么这个 backing bean 的“状态”是什么?这个bean的生命周期不是由容器管理的吗?

此外,如您所见,我正在使用 @Inject 向我的 BackingBean 注入一个 Service,向我的 Service 注入一个 Dao,向我的 Dao 注入一个实体……这些是 EJB 吗?如果这些 @Stateless 或 @Stateful 像这样工作得很好,我为什么要制作它们?

为什么我会/应该制作@Stateful 或@Statless 这些bean 中的任何一个?

4

2 回答 2

4

CustomersService只是一个 POJO。如果您使用它进行注释,@Stateful那么它将是一个有状态的 EJB(带有@Statless- 一个无状态的 EJB)。与 POJO(不是 EJB)不同,EJB 由 EJB 容器管理,并且可以受益于 EJB 容器必须提供的设施(例如容器管理的事务、安全性……)。

但是,如果您不需要 EJB 容器提供的服务,那么我认为将它们制作成 EJB 是没有意义的。

那么这个backing bean的“状态”是什么?

IMO,这不太合理。我认为您的意思是 bean 的范围(例如请求、会话、应用程序......)。如果是这样,由于您没有为它指定任何范围,我认为它不会放在任何范围内。它将在需要时被实例化(例如,在这种情况下,它应该在每次请求页面时实例化)。但是,如果它是作用域的,那么 bean 的实例将与作用域本身一样存在。例如,为每个新请求实例化一个请求范围的 bean。

这是 EJB 的教程

以上教程链接适用于 Java EE 6。感谢 @Luiggi 提供Java EE 7 教程链接

于 2013-06-13T23:41:45.053 回答
0

根据 CDI 规范(对不起,在我的手机上,无法轻松查找该部分),没有任何上下文/范围注释,bean 是 DependantScoped,这意味着容器每次访问(或在容器上创建和设置)时都会创建一个新实例bean,类似于做new自己)。

关于实体的另一个问题,您应该为要在前端直接访问的每个实体创建一个生产者。如果你不这样做,它可能无法正确保存在持久化上。

于 2013-06-14T16:32:54.410 回答