我正在学习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吗?
答案 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可以有任何范围。