我正在学习j2ee,如果问题显得很基本,请原谅。
在httpsession中,客户端存储会话ID,与其关联的数据存储在服务器端。
当有状态会话bean与web客户端交互时,浏览器向Java应用程序发出初始请求时,它将得到一个JSESSIONID,服务器可以将其与一个特定的自愿HTTPSession实例相关联。通过保留此JSESSIONID,浏览器可以为其提供每个后续请求,这将激活相同的http会话服务器端。参考文献:Using a Stateful Session Bean to track an user's session
现在使用sfb上的CDI @SessionScoped,这是否意味着仅返回JSESSIONID,因为SFB 或 EJB容器(?)将在服务器端存储sfb的另一个副本?(session.setAttribute(SFB-另一参考)) 现在当我使用sfb上的CDI @RequestScoped时,它是否没有用,因为SFB一直存在直到会话? 现在当我在slb上使用CDI @SessionScoped时,使用@SessionScoped是否毫无用处,因为slb只用于方法调用? 现在在pojo上使用CDI @SessionScoped是否意味着容器(?)在会话中存储pojo。(session.setAttribute(POJO))
可以区分SFB、SLB和POJO ?
发布于 2014-11-04 00:05:53
现在,当我在sfb上使用CDI @SessionScoped时,这是否意味着仅返回那个SFB或EJB容器的JSESSIONID (?)会在服务器端存储另一份sfb吗?
JSESSIONID与http会话相关,而不是与任何EJB (无状态或状态)相关。当您使用@SessionScoped时,您的sfb将由CDI与您的http会话相关联。
现在,当我在sfb上使用CDI @RequestScoped时,它是否没有用,因为SFB一直活到会话为止?
不,由于其他原因,它是无用的,因为将在每个请求上创建新的有状态bean,这实际上破坏了有状态bean的整个思想,它应该在请求之间存储状态。
现在,当我在slb上使用CDI @SessionScoped时,使用@SessionScoped是否没用,因为slb只用于方法调用?
或多或少是的。一些CDI框架(例如OWB)甚至不允许这样做,并且只允许@依赖范围。SLB实际上寿命更长,但由于它不存储任何状态,它的实例可以由许多客户端池和使用。
现在,当我在POJO上使用CDI @SessionScoped时,这是否意味着EJB容器(?)将pojo存储在会话中。(session.setAttribute(POJO))
CDI框架将POJO与http会话相关联,因此不能将POJO直接作为属性存储在会话中。
CDI能区分SFB、SLB和POJO吗?
是的,CDI容器可以区分它们,并以不同的方式对待它们,例如类型可见性、允许的作用域。例如,规范的片段:
无状态会话bean必须属于@依赖的伪范围。单例bean必须属于@ApplicationScoped作用域或@依赖的伪范围。如果会话bean指定了非法范围,容器将自动检测问题并将其视为定义错误。有状态会话bean可能有任何作用域。
https://stackoverflow.com/questions/26657908
复制相似问题