2014-10-30 127 views
0

我在学习j2ee,如果问题看起来很基本,请原谅我。CDI,有状态会话bean,无状态会话bean,pojo和不同作用域之间的关系

在httpsession中会话ID存储在客户端,与其关联的数据存储在服务器端。

当有状态会话bean与Web客户端交互时,浏览器向Java EE Web应用程序发出初始请求,它将获得服务器可以与特定HTTPSession实例关联的JSESSIONID。通过保留这个JSESSIONID,浏览器可以提供每个后续请求,并且这将激活相同的http会话服务器端。 编号:(?) Using a Stateful Session Bean to track an user's session

现在,当我使用CDI @SessionScoped上SFB意思只是JSESSIONID将为该SFB返回 EJB容器将存储SFB的另一 副本在服务器端? (session.setAttribute(SFB-另一个引用))

现在,当我使用CDI @RequestScoped上SFB是无用的SFB住,直到会议?

现在,当我在slb上使用CDI @SessionScoped时,使用@SessionScoped是无用的,因为slb仅适用于方法调用?

现在,当我使用POJO CDI @SessionScoped这是否意味着EJB容器(?)存储在会话的POJO。 (session.setAttribute(POJO))

CDI可以区分SFB,SLB和POJO吗?

回答

0

现在,当我使用CDI @SessionScoped上SFB意思只是JSESSIONID将为该SFB或EJB容器(?)返回的将存储在服务器端SFB的另一个副本?

JSESSIONID与http会话相关,不涉及任何EJB(无状态或无状态)。当您使用@SessionScoped时,您的sfb将由CDI与您的http会话相关联。

现在,当我使用CDI @RequestScoped上SFB是无用的SFB住,直到会议?

不,这是由其他原因无用的,因为新的状态bean将在每个请求,这实际上打破了状态bean的整体思路,应该存储请求之间的状态被创建。

现在,当我使用CDI @SessionScoped上SLB是没用使用 @SessionScoped因为SLB只能活方法调用?

或多或少是的。一些CDI框架(例如OWB)甚至不允许这样做,并且只允许@Dependent范围。SLB实际上寿命更长,但由于它不存储任何状态,它的实例可以汇集并被许多客户使用。

现在,当我使用CDI @SessionScoped对POJO这是否意味着EJB容器 (?)的POJO存储在会话。 (session.setAttribute(POJO))

POJO由CDI框架与http会话相关联,它不直接存储在会话中作为属性。

CDI可以区分SFB,SLB和POJO吗?

是的,CDI容器可以区分这些并将它们区别对待,例如,类型可见性,允许范围。例如规格片段:

无状态会话bean必须属于@Dependent伪范围。 A 单身bean必须属于@ApplicationScoped范围或 到@Dependent伪范围。如果会话bean指定了非法 作用域,则容器会自动检测到该问题并将其作为定义错误处理为 。有状态会话bean可以有任何范围。