web-applications - Web 应用程序中的有状态 EJB?

标签 web-applications jakarta-ee ejb-3.0 stateful

我从未使用过有状态的 EJB。
我知道有状态的 EJB 对 java 客户端很有用。

但我想知道:在哪种情况下在 Web 应用程序上使用它们?如何?
我们是否应该将这些有状态的 bean 放在 Session 中(因为无状态的 http)?

这是一个好习惯吗?
(无需过多讨论有状态与无状态)

最佳答案

有趣的是,这是当天关于 SFSB 和网络应用程序的第二个问题,而这个话题通常并不常见。

in which case to use them on a web application?



SFSB 和 Web 应用程序的传统示例是购物车。但同时,您可以对 HttpSession 执行相同操作。 .

理想情况下,如果状态与业务逻辑有关而不是表示逻辑,它应该放在 SFSB 中。但在实践中,人们通常反对 SFSB(因为它引入了复杂性),除非他们提供了您无法通过 HttpSession 轻松完成的功能。 .大多数时候,您可以调整设计以将信息存储在 HttpSession 中。或数据库并传递它,而无需 SFSB。但它最终是 设计纯度问题 .

And how? Should we put these stateful beans in Session (because of stateless http)?



EJB 模型比HttpSession 更丰富。 ,因为 EJB 是事务性组件,对于 SFSB 的钝化和激活有显式回调。这带有 增加复杂性关于如何正确使用 SFSB,特别是(1)异常处理和(2)并发和(2)SFSB 的删除和超时。有关更多详细信息,请参阅我的答案:
  • Java: Tracking a user login session - Session EJBs vs HTTPSession
  • Correct usage of Stateful Beans with Servlets

  • 如果您想使用它们,您首先需要查找 SFSB 以获取对一个新远程实例的引用。然后,您需要将此引用存储在某处,以便跨请求重用它。这通常是 HttpSession ,这意味着即使使用 SFSB,也无法完全摆脱它。

    使用 EJB2,远程引用(称为句柄)可以被序列化以供以后重用。然后可以将 if 存储在数据库中,即使我从未见过。我不知道 EJB3 是否仍然可行。

    Is it a good practice?



    正如我已经说过的,人们通常反对它除非您确切知道为什么要使用它们而不是 HttpSession并且仅当您对 EJB 模型有很好的掌握时。 (例如,如果可以通过 Web 前端和桌面客户端访问业务服务,SFSB 可能是合理的)许多其他框架没有类似于 SFSB 的东西,人们仍然设法使用它们创建出色的应用程序。

    PS:我在一个网络应用程序中使用过 SFSB,它确实比 HttpSession 更难使用。 ,但它最终奏效了。

    关于web-applications - Web 应用程序中的有状态 EJB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811312/

    相关文章:

    java - 为什么在远程 EJB3 session Bean 上使用 InitialContext

    jpa - UnmarshalException InvalidClassException org.eclipse.persistence.internal.helper.DatabaseTable

    java - Java 小程序的 "Graphics g"中的 "paint()"的值是多少?

    javascript - 当用户尝试离开页面时,有没有办法编写一些 JavaScript 功能?

    java - 在 JSP 中循环访问响应变量

    java - 关于 Java 中的数据库设计方法的问题

    java - java ee 6 中的欢迎页面

    azure - 在代码中获取 Azure Web App 名称

    jakarta-ee - 为什么 GlassFish 4.1 中的 Weld 在调用 invalidateSession 后对已经销毁的 ViewScoped bean 调用 @PreDestroy 方法?

    jakarta-ee - 了解 Glassfish 控制台 JNDI 输出