JSF托管bean和无状态EJB的最佳模式是什么

JSF托管bean和无状态EJB的最佳模式是什么,jsf,ejb,managed-bean,Jsf,Ejb,Managed Bean,关于会话范围和请求范围,您认为实现JSF托管bean的最佳方法是什么? 在我的例子中,我有一个带有EJB模块和web模块的EAR应用程序。EJB模块提供无状态会话bean。 在Web模块中,我现在在sessionScope中使用ManagedBean。这个bean注入一些无状态会话EJB,并保存一些包含业务数据的值对象,这些数据可以在不同的页面中使用 @Named("workflowController") @SessionScoped public class WorkflowControll

关于会话范围和请求范围,您认为实现JSF托管bean的最佳方法是什么? 在我的例子中,我有一个带有EJB模块和web模块的EAR应用程序。EJB模块提供无状态会话bean。 在Web模块中,我现在在sessionScope中使用ManagedBean。这个bean注入一些无状态会话EJB,并保存一些包含业务数据的值对象,这些数据可以在不同的页面中使用

@Named("workflowController")
@SessionScoped
public class WorkflowController {
    private List<ItemCollection> someList;
    private ItemCollection someBusinessData;
    /* Services */
    @EJB
    private MyService myService;
@Named(“workflowController”)
@会议范围
公共类WorkflowController{
私人名单;
私人项目收集数据;
/*服务*/
@EJB
私人MyService-MyService;
bean为前端提供了许多操作方法,并利用了无状态会话bean。 这是一般的良好做法吗?还是我应该将我的控制器更改为请求范围? 我见过一些项目,其中前端控制器仅在RequestScope中使用,并将所有业务数据对象作为managedProperties注入,这些对象在SessionScope中作为ManagedBeans实现

在我的示例中,SessionScope中只有一个控制器保存所有业务值,并提供在无状态EJB中实现的业务方法。 在另一种情况下,RequestsPDE中使用了一个控制器,并且在SessionScope中有许多BusinessValue对象作为MangedBeans实现,这些对象被注入到控制器bean中


我的问题是:一般来说,将会话EJB注入SessionScope托管bean是一种不好的做法吗?

如果会话范围的托管bean需要访问业务逻辑,那么将无状态EJB注入其中并不是一种不好的做法

过度使用会话范围的bean可能是一种不好的做法

会话范围的bean仅用于HTTP会话真正全局的内容,如有关当前登录用户或购物车的详细信息。请注意,每当用户在浏览器中打开多个窗口或选项卡时,会话范围的bean可能会受到竞争条件的约束

在一个具有数十到数百个页面的典型web应用程序中,最多应该只有少数会话范围的bean

对于支持单个页面的托管bean(称为支持bean),视图作用域通常是JSF中最合适的作用域。根据页面的具体用途,请求作用域也可能是合适的。根据经验,当最初请求页面时加载数据时,回发后也需要该数据,请使用视图作用域。如果没有此类数据,请尝试使用request范围

如果您需要在一种流中跨越多个页面,那么如果数据涉及已经持久化的数据,并且您可以传递这些数据的ID,那么您可以选择通过GET参数传递数据。否则,您可能需要查看对话范围


不幸的是,JSF2.1及之前版本本机不支持CDI托管bean的视图范围,但是像CODI这样的第三方项目提供了一个实现(JSF2.2很可能支持CDI的视图范围).

有些人似乎很快就能用减号/紧握的手,但没有提供解释……这是一个有效的问题。谢谢你的好的详细回答。这对我帮助很大。