托管bean和会话bean之间的区别

Lau*_*ens 20 java jsf ejb java-ee

说我有一个实体课,汽车. 

@Entity
public class Car
Run Code Online (Sandbox Code Playgroud)

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

@Stateless
public class CarFacade
Run Code Online (Sandbox Code Playgroud)

我也可以生成JSF托管bean

@ManagedBean     
@RequestScoped
public class RegistrationController
Run Code Online (Sandbox Code Playgroud)

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

因此,在我的示例中,RegistrationController将具有网页将调用的+ register(String carRegistration)方法.RegistrationController将依次实例化Car并在会话bean上调用+ create(Car car),这会持久化它.

它是否正确?

Bal*_*usC 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}" />
Run Code Online (Sandbox Code Playgroud)

private Car car;
private @EJB CarFacade carFacade;

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

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

// ...
Run Code Online (Sandbox Code Playgroud)

  • @Adam:在`CarFacade`实现中.另见其他示例http://stackoverflow.com/questions/8626291/jsf-managed-bean-ejb-injection/8627413#8627413. (3认同)