CDI,有状态会话bean,无状态会话bean,pojo和不同范围之间的关系

时间:2014-10-30 16:07:31

标签: ejb-3.0 cdi ejb-3.1 stateless-session-bean stateful

我正在学习j2ee,请原谅我,如果问题显得很基本。

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

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

  

现在当我在sfb 上使用CDI @SessionScoped时,这意味着只会为该SFB EJB容器返回JSESSIONID (?)将存储另一个   服务器端的sfb副本?   (session.setAttribute(SFB-Another-Reference))

     

现在当我在sfb上使用CDI @RequestScoped 时它是无用的,因为SFB一直待到会话?

     

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

     

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

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

1 个答案:

答案 0 :(得分:1)

  

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

JSESSIONID与http会话相关,而不与任何EJB(Statless或Stateful)相关。当您使用@SessionScoped时,您的sfb将由CDI与您的http会话关联。

  

现在当我在sfb上使用CDI @RequestScoped时它是无用的,因为SFB一直待到会话?

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

  

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

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

  

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

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

  

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

是的,CDI容器可以区分这些并对它们进行不同的处理,例如:类型可见性,允许的范围。例如规范的片段:

  

无状态会话bean必须属于@Dependent伪范围。一个   单例bean必须属于@ApplicationScoped范围或   到@Dependent伪范围。如果会话bean指定非法   范围,容器自动检测问题并对其进行处理   作为定义错误。有状态会话bean可以有任何范围。