托管Bean和会话Bean的区别

20

假设我有一个实体类,名为 Car。

@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)方法,网页将调用该方法。 RegistrationController将实例化Car并在会话bean上调用+create(Car car),这将使其持久化。

这是正确的吗?

1个回答

27
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";
}

// ...

不客气。当您想编辑汽车时,通常会在@PostConstruct<f:event type="preRenderView">期间执行类似于this.car = carFacade.find(id);的操作,其中id是传入的请求参数。 - BalusC
那么我应该在哪里进行与JPA相关的工作呢?是在会话Bean中还是在JPA特定的类中? - Astronaut
3
@Adam:在 CarFacade 的实现中。另请参见 https://dev59.com/vWoy5IYBdhLWcg3wUcf_#8627413 等其他相关示例。 - BalusC
@BalusC 如果托管的Bean是模型的子类型,例如如果我有两个托管的Bean car和trunk,并且我有一个通用的模型类vehicle,在这种情况下,car是否可以包含来自vehicle的引用? - Eslam Hamdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接