0

我是 Jakarta EE 世界的初学者。我正在大学学习 Jakarta EE 模块,我正在努力寻找能够正确回答我问题的信息。我觉得这是一件如此简单、直截了当且被期望被理解的事情,但我只是不明白。

我的导师并没有很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这是没有意义和无用的,因为如果这就是我不能创建自己的课程的原因。

现在我浏览了这篇文章https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm并获得了基本概述。

我知道以下几点:

  1. EJB 在 EJB 容器中运行,该容器在应用程序服务器中运行,
  2. 两种类型的 EJB:会话 Bean、消息驱动 Bean
  3. 三种类型的 Session Bean:Stateless、Stateful、Singleton
  4. @Stateless 在会话/方法调用之间不保持“会话状态”?而有状态的bean呢?
  5. 容器有一个这些 EJB(Java 类)的池,基本上这些 EJB(Java 类)在@stateless 的情况下被实例化并随机分配给客户端
  6. @Stateful bean 保存在一个池中,并且为同一个客户端分配了同一个 bean?

请随时更正上述任何内容。根据我目前所知,整体架构似乎仍然让我感到困惑,

我有以下 6 个问题(所有问题都已链接)如果我没有正确组织它们,我很抱歉,我将尝试编辑/改进答案:

  1. 非 Java(通用客户端)如何访问 EJB?这甚至可能吗?

据我所知,大多数客户端是以下之一:a)笔记本电脑/平板电脑/移动设备中的 Web 浏览器,b)本机移动应用程序,c)某些 IOT 设备或其他类型的设备(例如,送货司机将某些东西保存到独特的手机)等...

现在!假设上面提到的客户(主要是 a 和 b),因为他们是访问相同“业务逻辑”的最常见需求,他们将如何处理?我假设原生移动应用程序也使用 HTTP/s 协议?这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?

根据官方 Java EE 文档中的这张图表,看起来好像 Web 浏览器无法直接访问 EJB:

在此处输入图像描述

  1. 如果 (1) 的答案是否定的,例如 Web/移动应用程序等客户端无法直接访问 EJB,那么 @Stateful 会话 bean 有什么用处吗?比如说在一个 Web 应用中,HTTP 协议是无状态的,可以借助 session/cookie 来维护状态,这意味着状态是由 Web Container 来维护的?有状态会话 bean 有什么意义?

我已经阅读了有关堆栈溢出的其他问题,这表明将 @stateful 会话 bean 与 Servlet 一起使用并不是一个好主意。

我得到了整个购物车示例,但这并没有解释如何维护状态,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗?EJB 是否可以访问浏览器 cookie?

  1. 如果 EJB 只能由 Java 客户端直接访问:

据我所知,Java 客户端的示例:Servlet、另一个运行本地或远程的 EJB、另一个 Java 类?、独立的 Java 应用程序?

我假设这些客户端会通过 RMI/JNDI/CDI/依赖注入(在 servlet 的情况下)访问 EJB?说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?

  1. 基于以上所有内容,EJB 是否还有很多用例?特别是由于大多数应用程序要么通过 Web 或使用 HTTP/Rest 端点的移动设备,因此许多应用程序使用 JWT 来管理状态客户端,除了可能是 Android 应用程序等之外,我看不到许多独立 Java 应用程序的示例。

  2. 使用 MVC/Spring/Spring Boot 是否更好,它似乎具有更易于理解的架构并创建 REST/SOAP Web 服务

  3. RMI 也使用 HTTP 吗?EJB 理解 HTTP 吗?

我认为这些问题中的大多数都围绕着同一点。我无法得到明确的答案,我认为这应该很明显,但我就是不明白。任何建议将不胜感激

4

1 回答 1

3

Jakarta EE 是一组共存的 API,EJB 只是其中之一。

我们可以说 EJB 是一个带有切面的普通 Java 对象。例如:事务管理、安全、监控、池等。

@Stateless确实只在方法调用期间保持状态。 @Stateful确实在会话期间保持方法调用之间的状态。 @Singelton确实在运行的应用程序的整个生命周期内保持状态。

@Stateful bean 保存在一个池中,并且为同一个客户端分配了同一个 bean?

不,每个客户端都会创建一个新的 bean 实例,并最终将其删除。如果缓存填满,实例可能会被钝化到磁盘。

“非 Java(通用客户端)如何访问 EJB?这甚至可能吗?”

Java EE Web 服务

通过 Rest 将 JAX-RS 与 EJB 技术集成

@Stateless
@Path("/employee/{id}")
public class Employee {
    public Employee(@PathParam("id") String id) {...}
}

HTTP/s 协议?这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?

JAX-RS och Spring MVC 使用 Servlet。

对于作为示例的 Web 应用程序,您可以使用与 CDI 和 EJB 集成的 JSF 或 JSP。

如果 (1) 的答案是否定的,例如 Web/移动应用程序等客户端无法直接访问 EJB,那么 @Stateful 会话 bean 有什么用处吗?比如说在一个 Web 应用中,HTTP 协议是无状态的,可以借助 session/cookie 来维护状态,这意味着状态是由 Web Container 来维护的?有状态会话 bean 有什么意义?

举个例子:你的购物车和产品在通话之间会去哪里?我们需要将状态保存在某个地方,您可以使用@SessionScopedbean 或@Statefulbean 或数据库等。任何方式都是您的选择

“我已经阅读了有关堆栈溢出的其他问题,这些问题表明将会@Stateful话 bean 与 Servlet 一起使用并不是一个好主意。”

我不知道他们的意思,但如果你想保持你的状态,例如在购物车中,@Statefulbean 就是要走的路。作为替代方案,您可以使用 CDI bean@SessionScoped而不是 EJB @Stateful

我得到了整个购物车示例,但这并没有解释如何维护状态,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗?EJB 是否可以访问浏览器 cookie?

Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。

在 EJB 上,您可以使用注释@Resource SessionContext ctx;来获取调用者的上下文。

据我所知,Java 客户端的示例:Servlet、另一个运行本地或远程的 EJB、另一个 Java 类?、独立的 Java 应用程序?

我假设这些客户端会通过 RMI/JNDI/CDI/依赖注入(在 servlet 的情况下)访问 EJB?

不仅仅是 Servlet API,但正如我所说的,大多数 Java Web 技术都建立在 Servlet 技术之上或与 Servlet 技术集成。

说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?

不,对于 SOAP Web 服务,我们使用 JAX-WS,是的,您可以将 JAX-WS 与 EJB 集成

@Stateless
@WebService
public class HelloService {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

基于以上所有内容,EJB 是否还有很多用例?特别是由于大多数应用程序要么通过 Web 或使用 HTTP/Rest 端点的移动设备,因此许多应用程序使用 JWT 来管理状态客户端,除了可能是 Android 应用程序等之外,我看不到许多独立 Java 应用程序的示例。

EJB 只是 Jakarta EE 的一部分或工具,您必须针对情况使用正确的工具。

使用 MVC/Spring/Spring Boot 是否更好,它似乎具有更易于理解的架构并创建 REST/SOAP Web 服务

不,你是在混合苹果和橙子。EJB 只是一个 API,而 Spring 是一个完整的平台。

“虽然有些人认为 Java EE 和 Spring 在竞争,但 Spring 实际上是对 Java EE 的补充。”

“春天”一词在不同的上下文中意味着不同的事物。它可以用来指代 Spring Framework 项目本身,这就是一切的开始。

Spring Boot 是 Spring 框架的扩展。Spring Boot 将 Apache Tomcat 作为运行时嵌入。Apache Tomcat 实现了四种 Jakarta EE 规范——Jakarta Servlet、Jakarta 标准标签库、Jakarta WebSocket 和 Jakarta Authentication。(对于 Undertow、Jetty 几乎相同)。

RMI 也使用 HTTP 吗?

RMI 协议不再相关,使用 EJB 不需要 RMI。

EJB 理解 HTTP 吗?

正如我所说,您可以将 JAX-RS 与 EJB 集成。

如果您有兴趣,我推荐一些在线研讨会

Java EE 引导程序

有效的 Java EE

Java EE 测试

Java EE 微服务

带有微配置文件的应用程序

于 2021-04-11T10:12:07.607 回答