我是 Jakarta EE 世界的初学者。我正在大学学习 Jakarta EE 模块,我正在努力寻找能够正确回答我问题的信息。我觉得这是一件如此简单、直截了当且被期望被理解的事情,但我只是不明白。
我的导师并没有很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这是没有意义和无用的,因为如果这就是我不能创建自己的课程的原因。
现在我浏览了这篇文章https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm并获得了基本概述。
我知道以下几点:
- EJB 在 EJB 容器中运行,该容器在应用程序服务器中运行,
- 两种类型的 EJB:会话 Bean、消息驱动 Bean
- 三种类型的 Session Bean:Stateless、Stateful、Singleton
- @Stateless 在会话/方法调用之间不保持“会话状态”?而有状态的bean呢?
- 容器有一个这些 EJB(Java 类)的池,基本上这些 EJB(Java 类)在@stateless 的情况下被实例化并随机分配给客户端
- @Stateful bean 保存在一个池中,并且为同一个客户端分配了同一个 bean?
请随时更正上述任何内容。根据我目前所知,整体架构似乎仍然让我感到困惑,
我有以下 6 个问题(所有问题都已链接)如果我没有正确组织它们,我很抱歉,我将尝试编辑/改进答案:
- 非 Java(通用客户端)如何访问 EJB?这甚至可能吗?
据我所知,大多数客户端是以下之一:a)笔记本电脑/平板电脑/移动设备中的 Web 浏览器,b)本机移动应用程序,c)某些 IOT 设备或其他类型的设备(例如,送货司机将某些东西保存到独特的手机)等...
现在!假设上面提到的客户(主要是 a 和 b),因为他们是访问相同“业务逻辑”的最常见需求,他们将如何处理?我假设原生移动应用程序也使用 HTTP/s 协议?这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?
根据官方 Java EE 文档中的这张图表,看起来好像 Web 浏览器无法直接访问 EJB:
- 如果 (1) 的答案是否定的,例如 Web/移动应用程序等客户端无法直接访问 EJB,那么 @Stateful 会话 bean 有什么用处吗?比如说在一个 Web 应用中,HTTP 协议是无状态的,可以借助 session/cookie 来维护状态,这意味着状态是由 Web Container 来维护的?有状态会话 bean 有什么意义?
我已经阅读了有关堆栈溢出的其他问题,这表明将 @stateful 会话 bean 与 Servlet 一起使用并不是一个好主意。
我得到了整个购物车示例,但这并没有解释如何维护状态,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗?EJB 是否可以访问浏览器 cookie?
- 如果 EJB 只能由 Java 客户端直接访问:
据我所知,Java 客户端的示例:Servlet、另一个运行本地或远程的 EJB、另一个 Java 类?、独立的 Java 应用程序?
我假设这些客户端会通过 RMI/JNDI/CDI/依赖注入(在 servlet 的情况下)访问 EJB?说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?
基于以上所有内容,EJB 是否还有很多用例?特别是由于大多数应用程序要么通过 Web 或使用 HTTP/Rest 端点的移动设备,因此许多应用程序使用 JWT 来管理状态客户端,除了可能是 Android 应用程序等之外,我看不到许多独立 Java 应用程序的示例。
使用 MVC/Spring/Spring Boot 是否更好,它似乎具有更易于理解的架构并创建 REST/SOAP Web 服务
RMI 也使用 HTTP 吗?EJB 理解 HTTP 吗?
我认为这些问题中的大多数都围绕着同一点。我无法得到明确的答案,我认为这应该很明显,但我就是不明白。任何建议将不胜感激