这是我的第一个问题,我希望我做得对。
我需要从事 Java EE 项目,因此,在开始之前,我尝试做一些简单的事情,看看是否能做到。
我被困住了有状态会话 Bean.
这是问题:
我怎样才能使用SFSB跟踪用户的会话?
我看到的所有例子最终都“放入”SFSB into a Http会话属性。
但我不明白为什么!
我的意思是,如果 bean 是有状态的,为什么我必须使用Http会话保留它?
EJB容器的任务不是返回正确的吗SFSB给客户?
我尝试过使用简单的反豆。
在不使用会话的情况下,两个不同的浏览器具有相同的计数器 bean(单击“增量”更改了它们的值)。
使用会话,我有两个不同的值,每个值适用于每个浏览器(在 Firefox 上单击“增量”,仅向 Firefox 的 bean 添加一个值)。
但我的老师告诉我SFSB保持“与客户的对话状态”,那么为什么它不能在不使用Http会话 ?
如果我理解正确的话,没有使用Http会话 with a SFSB与使用 a 做的一样SLSB反而?
我希望我的问题很清楚并且我的英语没那么差!
编辑 :
我正在开发登录系统。
一切顺利,完成登录后,我将进入显示用户数据的个人资料页面。
但是重新加载页面会使我的数据消失!
我尝试过添加Http会话虽然正在记录,但这样做可以使数据即使在注销后仍然保留!
有状态会话 Bean (SFSB) 必须与 Web 环境中的 HTTP 会话结合起来,因为它是一个纯业务 Bean,本身对 Web 层一无所知。
传统上,EJB 甚至强制存在于它们自己的模块(EJB 模块)内,如果它们愿意,甚至无法访问 Web 工件。这是分层系统的一个方面。看使用 JavaEE 6 WAR 与 EAR 封装 EJB https://stackoverflow.com/questions/4441237/packaging-ejb-in-javaee-6-war-vs-ear/4539419#4539419了解更多相关信息。
有状态会话 Bean 的原始客户端包括 Swing 桌面应用程序,它们通过二进制协议与远程 EJB 服务器进行通信。 Swing 应用程序将通过代理/存根对象获得与远程有状态会话 Bean 的连接。该代理中嵌入了某种 ID,服务器可以将其与特定 SFSB 关联。通过保留此代理对象,Swing 客户端可以重复调用它,并且这些调用将转到同一个 bean 实例。这将在客户端和服务器之间创建一个会话。
对于 Web 应用程序,当浏览器向 Java EE Web 应用程序发出初始请求时,它会得到一个JSESSIONID
服务器可以与特定的HTTPSession
实例。通过坚持这一点JSESSIONID
,浏览器可以向它提供每个后续请求,这将激活相同的 http 会话服务器端。
因此,这些概念非常相似,但它们不会自动相互映射。
浏览器只获取JSESSIONID
并且不了解任何 SFSB ID。与 Swing 应用程序不同,浏览器与网页通信,而不是直接与 Java bean 通信。
为了将客户端的请求映射到特定的有状态会话 bean,EJB 容器只关心通过 SFSB 代理提供的 ID。它无法查看调用是否恰好源自 Web 模块中的代码,并且不能/不应该真正访问任何 HTTP 上下文。
作为访问 SFSB 的客户端代码的 Web 层必须“保留”特定的代理引用。保留 Web 层中的某些内容通常意味着将其存储在 HTTP 会话中。
然而,有一种桥接技术称为CDI
可以进行这种自动连接。如果您使用 CDI 注释您的 SFSB@SessionScoped
并通过 CDI 获取对 SFSB 的引用(例如使用@Inject
),您不必手动将 SFSB 放入 http 会话中。然而,无论如何,CDI 在幕后都会这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)