受管 Bean 和会话 Bean 之间的区别

2022-09-02 10:03:09

假设我有一个实体类,汽车。

@Entity
public class Car

我的IDE允许我从实体类自动生成会话Bean,所以我最终得到了一个CarFacade。

@Stateless
public class CarFacade

我还可以生成 JSF 托管 Bean

@ManagedBean     
@RequestScoped
public class RegistrationController

我可以理解实体类和其他 Bean 之间有意义的区别,但是无状态会话 Bean 和受管 Bean 之间的区别是什么?我读到无状态会话 Bean 用于实现对实体进行操作的业务逻辑,而托管 Bean 用于与基于 Web 的前端进行交互,方法是在托管 Bean 上具有网页调用方法,并在会话 Bean 上具有托管 Bean 调用业务方法。

因此,在我的示例中,RegistrationController将具有网页将调用的+register(String carRegistration)方法。注册控制器将依次实例化一辆 Car,并在会话 Bean 上调用 +create(Car car),这将持久化它。

这是正确的吗?


答案 1

JSF 受管 Bean 是实体(模型)、JSF 页面(视图)和企业 Bean(业务服务)之间的粘合剂(控制器)。

所以,是的,你基本上正确地理解了JSF页面应该调用托管Bean的操作方法,而该方法又应该将模型和操作进一步委托给业务服务,并最终根据服务调用的结果处理导航结果。

但是,对于模型的使用和传递方式,您并不完全正确。通常,您将模型设置为托管 Bean 的属性,以便可以将其绑定到窗体的输入元素,并最终将其原封不动地传递给业务服务。

例如:

<h:inputText value="#{registrationController.car.make}" />
<h:inputText value="#{registrationController.car.model}" />
<h:inputText value="#{registrationController.car.year}" />
<h:commandButton value="Save" action="#{registrationController.save}" />

private Car car;
private @EJB CarFacade carFacade;

public RegistrationController() {
    this.car = new Car();
}

public String save() {
    carFacade.create(car);
    return "someoutcome";
}

// ...

答案 2

推荐