问题描述
我是 Jakarta EE 世界的初学者。 我正在大学学习雅加达 EE 模块,我正在努力寻找能够正确回答我的问题的信息。 我觉得这是其中一件如此简单、直接且期望被理解的事情,但我只是不明白。
我的导师不是很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这毫无意义和无用,因为如果这就是为什么我不能只创建我的自己的班级。
现在我已经阅读了这篇文章 https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm 并获得了基本概述。
我知道以下几点:
- EJB 在 EJB 容器内运行,而 EJB 容器在应用服务器内运行,
- 两种类型的 EJB:会话 Bean、消息驱动 Bean
- 三种类型的会话 Bean:无状态、有状态、单例
- @Stateless 在会话/方法调用之间不保持“对话状态”?而有状态 bean 呢?
- 容器有一个池,这些 EJB(Java 类)基本上被实例化并在@stateless 的情况下随机分配给客户端
- @Stateful bean 被保存在一个池中,并且同一个客户端被分配了同一个 bean?
请随时更正以上任何内容。 根据我目前所知道的,整体架构似乎仍然让我感到困惑,
我有以下 6 个问题(全部都有链接)如果我没有正确组织它们,我很抱歉,我会尝试编辑/改进答案:
- 非 Java(通用客户端)如何访问 EJB?这甚至可能吗?
据我所知,大多数客户是以下其中一种: a) 笔记本电脑/平板电脑/手机中的网络浏览器, b) 原生移动应用程序, c) 某些物联网设备或其他类型的设备(例如送货司机将某些东西保存到独特的手机上)等...
现在!假设上面提到的客户端(主要是 a 和 b),因为它们是访问相同“业务逻辑”的最常见需求, 他们会怎么做呢? 我假设本机移动应用程序也使用 HTTP/s 协议? 这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?
根据官方 Java EE 文档中的图表,Web 浏览器似乎无法直接访问 EJB:
- 如果 (1) 的答案是否定的,Web/移动应用程序等客户端无法直接访问 EJB,那么@Stateful 会话 bean 是否有任何用处? 比如说在一个 web 应用程序中,HTTP 协议是无状态的,可以在 session/cookie 的帮助下维护状态, 这意味着状态由 Web 容器维护?拥有有状态会话 bean 有什么意义?
我已经阅读了有关堆栈溢出的其他问题,这些问题表明在 Servlet 中使用 @stateful 会话 bean 不是一个好主意。
我得到了整个购物车的例子,但这并没有解释如何维护状态,如果我通过浏览器访问我的购物车,cookies 将负责状态,对吗? EJB 是否可以访问浏览器 cookie?
- 如果 EJB 只能由 Java 客户端直接访问:
据我所知,Java 客户端示例: 小服务程序, 另一个运行本地或远程的 EJB, 另一个 Java 类?, 独立 Java 应用?
我假设这些客户端会通过 RMI/JNDI/CDI/Dependency Injection(在 servlet 的情况下)访问 EJB? 可以说 EJB 类似于 Java EE 世界中的 SOAP Web 服务吗?
-
基于以上所有内容,EJB 是否还有很多用例? 特别是由于大多数应用程序是通过网络或移动使用 HTTP/Rest 端点,许多应用程序使用 JWT 来管理状态客户端,除了 Android 应用程序等,我看不到许多独立 Java 应用程序的示例。
-
使用 MVC/Spring/Spring Boot 似乎有更易理解的架构并创建 REST/SOAP Web 服务会更好吗
-
RMI 是否也使用 HTTP? EJB 理解 HTTP 吗?
我认为这些问题中的大多数都围绕着同一点。我无法得到明确的答案,我认为这应该很明显,但我只是不明白。 任何建议将不胜感激
解决方法
Jakarta EE 是一组共存的 API,EJB 只是其中之一。
我们可以说 EJB 是一个带有切面的普通 Java 对象。例如:事务管理、安全、监控、池化等。
@Stateless
仅在方法调用期间维护状态。
@Stateful
确实在会话期间的方法调用之间保持状态。
@Singelton
确实在正在运行的应用程序的整个生命周期中维护状态。
@Stateful bean 被保存在一个池中,并且同一个客户端被分配了 同一个豆子?
不,每个客户端都会创建一个 bean 的新实例,并最终将其删除。如果缓存填满,实例可能会被钝化到磁盘。
“非 Java(通用客户端)如何访问 EJB?这可能吗?”
通过 Rest 将 JAX-RS 与 EJB 技术集成
@Stateless
@Path("/employee/{id}")
public class Employee {
public Employee(@PathParam("id") String id) {...}
}
HTTP/s 协议?这是否意味着它只能通过 小服务程序?哪个有点像 MVC 控制器?
JAX-RS 和 Spring MVC 使用 Servlet。
以 Web 应用程序为例,您可以使用 JSF 或 JSP 与 CDI 和 EJB。
如果 (1) 的答案是否定的,则 Web/移动应用程序等客户端不能 直接访问 EJB,@Stateful 会话 bean 有什么用处吗? 比如说在一个 Web 应用程序中,HTTP 协议是无状态的,状态可以是 在 session/cookie 的帮助下维护,这意味着状态 是由 Web Container 维护的?有什么意义 有状态会话 bean?
举个例子:您的购物车和产品在通话之间会去哪里?
我们需要将状态保存在某处,您可以使用 @SessionScoped
bean 或 @Stateful
bean 或数据库等。任何方式都由您选择
“我已经阅读了有关堆栈溢出的其他问题,这表明它不是
使用 Servlet 使用 @Stateful
会话 bean 的好主意。"
我不知道它们是什么意思,但是如果您想在购物车中保存您的状态,例如 @Stateful
beans 是要走的路。作为替代方案,您可以将 CDI bean 与 @SessionScoped
一起使用,而不是 EJB @Stateful
。
我得到了整个购物车的例子,但这并没有解释如何 状态保持,如果我通过一个访问我的购物车 浏览器,cookies 会负责状态吧?是否 EJB 可以访问浏览器 cookie?
Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。
在 EJB 上,您可以使用 @Resource SessionContext ctx;
进行注释以获取调用者的上下文。
据我所知,Java 客户端示例:Servlet,正在运行的另一个 EJB 本地或远程,另一个 Java 类?,独立的 Java 应用程序?
我假设这些客户端将通过 RMI/JNDI/CDI/Dependency 访问 EJB 注入(在servlet的情况下)?
不仅仅是 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 是否还有很多用例? 特别是因为大多数应用程序都是通过网络或移动使用 HTTP/Rest 端点,许多使用 JWT 来管理状态客户端,以及 我看不到许多独立 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 Framework 的扩展。 Spring Boot 嵌入了 Apache Tomcat 作为运行时。 Apache Tomcat 实现了四个 Jakarta EE 规范 — Jakarta Servlet、Jakarta Standard Tag Library、Jakarta WebSocket 和 Jakarta Authentication。 (Undertow、Jetty 几乎相同)。
RMI 是否也在使用 HTTP?
RMI 协议不再相关,使用 EJB 也不需要 RMI。
EJB 理解 HTTP 吗?
正如我所说,您可以将 JAX-RS 与 EJB 集成。
如果你有兴趣,我推荐一些在线研讨会