了解 EJB 体系结构和实现
Understanding EJB Architecture and Implementation
我是 Jakarta EE 世界的初学者。
我正在大学学习 Jakarta EE 模块,我正在努力寻找能够正确回答我的问题的信息。
我觉得这是一件非常简单、直接且希望被理解的事情,但我就是不明白。
我的导师不是很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这是毫无意义和无用的,因为如果仅此而已,那为什么我不能创建我自己的 class.
现在我已经阅读了这篇文章https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm,我得到了基本的概述。
我知道以下内容:
- EJB 在 EJB 容器中运行,EJB 容器在应用程序服务器中运行,
- 两种类型的 EJB:Session Bean,消息驱动 Bean
- 三种Session Bean:Stateless、Stateful、Singleton
- @Stateless 在 session/method 调用之间不保持“会话状态”?而有状态的 bean 呢?
- 容器有这些 EJB(Java classes)的池,基本上在@stateless
的情况下实例化并随机分配给客户端
- @Stateful bean保存在一个pool中,同一个client分配同一个bean?
请随时更正以上任何内容。
据我目前所知,整体架构似乎仍然让我感到困惑,
我有以下6个问题(都已链接)抱歉,如果我没有正确组织它们,我会尝试edit/improve答案:
- 非 Java(通用客户端)如何访问 EJB?这可能吗?
据我所知,大多数客户都是以下之一:
a) laptop/tablet/mobile 中的 Web 浏览器,
b) 本机移动应用程序,
c) 一些物联网设备或其他类型的设备(例如交付 driver 保存一些东西到一个独特的手机)等...
现在!假设上面提到的客户(主要是 a 和 b),因为他们最常需要访问相同的“业务逻辑”,
他们将如何处理这件事?
我假设本机移动应用程序也使用 HTTP/s 协议?
这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?
根据官方 Java EE 文档中的图表,Web 浏览器似乎无法直接访问 EJB:
- 如果 (1) 的答案是否定的,那么 web/mobile 应用程序等客户端不能直接访问 EJB,@Stateful session bean 有什么用吗?
例如在一个网络应用程序中,HTTP 协议是无状态的,可以在 session/cookie 的帮助下维护状态,
这意味着状态由 Web 容器维护?有状态的 session bean 有什么意义?
我已经阅读了有关堆栈溢出的其他问题,这些问题表明将 @stateful session bean 与 Servlet 结合使用并不是一个好主意。
我得到了整个购物车示例,但这并没有解释状态是如何维护的,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗? EJB 是否可以访问浏览器 cookie?
- 如果 EJB 只能被 Java 客户端直接访问:
据我所知 Java 客户示例:
服务小程序,
另一个 EJB 运行 本地或远程,
另一个JavaClass?,
独立 Java 应用程序?
我假设这些客户端会通过 RMI/JNDI/CDI/Dependency 注入访问 EJB(在 servlet 的情况下)?
说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?
基于以上所有内容,EJB 是否还有很多用例?
特别是由于大多数应用程序要么通过 Web 要么移动使用 HTTP/Rest 端点,许多应用程序使用 JWT 来管理状态客户端,我看不到许多独立 Java 应用程序的示例,除了 [=92] =] 应用等..
是否最好使用 MVC/Spring/Spring 引导,它似乎具有更易于理解的体系结构并创建 REST/SOAP Web 服务
RMI 也使用 HTTP 吗? EJB 理解 HTTP 吗?
我认为这些问题大多围绕着同一个问题。我无法得到明确的答案,我认为这应该是显而易见的,但我就是不明白。
任何建议将不胜感激
Jakarta EE 是一堆共存的 API,EJB 只是其中之一。
我们可以说 EJB 是具有方面的普通旧 java 对象。例如:事务管理、安全、监控、池化等
@Stateless
只是在方法调用期间保持状态。
@Stateful
确实在会话期间维护方法调用之间的状态。
@Singelton
确实在 运行 应用程序的整个生命周期中保持状态。
@Stateful beans are kept in a pool and the same client is assigned the
same bean?
不,每个客户端都会创建一个新的 bean 实例,并最终将其删除。如果缓存已满,实例可能会钝化到磁盘。
"How do non Java (generic clients) access EJB? Is this even possible?"
通过 Rest 将 JAX-RS 与 EJB 技术集成
@Stateless
@Path("/employee/{id}")
public class Employee {
public Employee(@PathParam("id") String id) {...}
}
the HTTP/s protocol? Would this mean that it would only be through a
Servlet? Which is sort of like an MVC Controller?
JAX-RS och Spring MVC 使用 Servlet。
以 Web 应用程序为例,您可以使用 JSF 或 JSP 与 CDI 集成和
EJB。
If the answer to (1) is no, that clients such as web/mobile apps cant
directly access an EJB, is there any use for a @Stateful session bean?
Say for example in a web app, HTTP protocol is stateless, state can be
maintained with the help of session/cookie, Which would mean the state
is maintained by the Web Container? Whats the point of having a
stateful session bean?
举个例子:您的购物车和产品在两次通话之间会去哪里?
我们需要将状态保存在某处,您可以使用 @SessionScoped
bean 或 @Stateful
bean 或数据库等。任何方式都是您的选择
"I have read other questions on stack overflow which suggest its not a
good idea to have @Stateful
session bean with Servlet."
我不知道它们是什么意思,但是如果您想在购物车中保存您的状态,例如 @Stateful
beans 是最佳选择。作为替代方案,您可以将 CDI bean 与 @SessionScoped
一起使用,而不是 EJB @Stateful
.
I get the whole shopping cart example, but this does not explain how
state is maintained, if I was accessing my shopping cart through a
browser, the cookies would be responsible for state right? Does EJB
have access to browser cookies?
Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。
在 EJB 上,您可以使用 @Resource SessionContext ctx;
进行注释以获取调用者的上下文。
Example of Java Clients as far as I know: Servlet, Another EJB running
local or remote, Another Java Class?, Standalone Java app?
I assume these clients would access the EJB by RMI/JNDI/CDI/Dependency
Injection (in case of servlet)?
不仅仅是 Servlet API,但正如我所说,大多数 Java Web 技术都建立在 Servlet 技术之上或与 Servlet 技术集成。
Would it be fair to say that an EJB is similar to a SOAP Web Service in the Java EE world?
不,对于 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");
}
}
Based on all of the above is there much of a use case for EJB anymore?
Especially as most apps are either through the web or mobile using
HTTP/Rest end points, many use JWT's to manage state client side, and
I cant see many examples of standalone Java apps except for maybe an
Android app etc..
EJB 只是 Jakarta EE 的一部分或工具,您必须针对具体情况使用正确的工具。
Is it better to use MVC/Spring/Spring Boot which seems to have a more
understandable architecture and create REST/SOAP Web Services
不,你在混合苹果和橙子。 EJB只是一个API,Spring是一个完整的平台。
“虽然有些人认为 Java EE 和 Spring 存在竞争关系,但 Spring 实际上是 Java EE 的补充。”
术语“Spring”在不同的上下文中有不同的含义。它可以用来指代 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 几乎是一样的)。
Is RMI also using HTTP?
RMI 协议不再相关,使用 EJB 不需要 RMI。
Does EJB understand HTTP?
如我所说,您可以将 JAX-RS 与 EJB 集成。
如果你有兴趣,我推荐一些在线研讨会
我是 Jakarta EE 世界的初学者。 我正在大学学习 Jakarta EE 模块,我正在努力寻找能够正确回答我的问题的信息。 我觉得这是一件非常简单、直接且希望被理解的事情,但我就是不明白。
我的导师不是很有帮助,告诉我不要担心其他任何事情,只是接受“它只是封装的业务逻辑”这是毫无意义和无用的,因为如果仅此而已,那为什么我不能创建我自己的 class.
现在我已经阅读了这篇文章https://docs.oracle.com/cd/E16439_01/doc.1013/e13981/undejbs002.htm,我得到了基本的概述。
我知道以下内容:
- EJB 在 EJB 容器中运行,EJB 容器在应用程序服务器中运行,
- 两种类型的 EJB:Session Bean,消息驱动 Bean
- 三种Session Bean:Stateless、Stateful、Singleton
- @Stateless 在 session/method 调用之间不保持“会话状态”?而有状态的 bean 呢?
- 容器有这些 EJB(Java classes)的池,基本上在@stateless 的情况下实例化并随机分配给客户端
- @Stateful bean保存在一个pool中,同一个client分配同一个bean?
请随时更正以上任何内容。 据我目前所知,整体架构似乎仍然让我感到困惑,
我有以下6个问题(都已链接)抱歉,如果我没有正确组织它们,我会尝试edit/improve答案:
- 非 Java(通用客户端)如何访问 EJB?这可能吗?
据我所知,大多数客户都是以下之一: a) laptop/tablet/mobile 中的 Web 浏览器, b) 本机移动应用程序, c) 一些物联网设备或其他类型的设备(例如交付 driver 保存一些东西到一个独特的手机)等...
现在!假设上面提到的客户(主要是 a 和 b),因为他们最常需要访问相同的“业务逻辑”, 他们将如何处理这件事? 我假设本机移动应用程序也使用 HTTP/s 协议? 这是否意味着它只能通过 Servlet?哪个有点像 MVC 控制器?
根据官方 Java EE 文档中的图表,Web 浏览器似乎无法直接访问 EJB:
- 如果 (1) 的答案是否定的,那么 web/mobile 应用程序等客户端不能直接访问 EJB,@Stateful session bean 有什么用吗? 例如在一个网络应用程序中,HTTP 协议是无状态的,可以在 session/cookie 的帮助下维护状态, 这意味着状态由 Web 容器维护?有状态的 session bean 有什么意义?
我已经阅读了有关堆栈溢出的其他问题,这些问题表明将 @stateful session bean 与 Servlet 结合使用并不是一个好主意。
我得到了整个购物车示例,但这并没有解释状态是如何维护的,如果我通过浏览器访问我的购物车,cookie 将负责状态,对吗? EJB 是否可以访问浏览器 cookie?
- 如果 EJB 只能被 Java 客户端直接访问:
据我所知 Java 客户示例: 服务小程序, 另一个 EJB 运行 本地或远程, 另一个JavaClass?, 独立 Java 应用程序?
我假设这些客户端会通过 RMI/JNDI/CDI/Dependency 注入访问 EJB(在 servlet 的情况下)? 说 EJB 类似于 Java EE 世界中的 SOAP Web 服务是否公平?
基于以上所有内容,EJB 是否还有很多用例? 特别是由于大多数应用程序要么通过 Web 要么移动使用 HTTP/Rest 端点,许多应用程序使用 JWT 来管理状态客户端,我看不到许多独立 Java 应用程序的示例,除了 [=92] =] 应用等..
是否最好使用 MVC/Spring/Spring 引导,它似乎具有更易于理解的体系结构并创建 REST/SOAP Web 服务
RMI 也使用 HTTP 吗? EJB 理解 HTTP 吗?
我认为这些问题大多围绕着同一个问题。我无法得到明确的答案,我认为这应该是显而易见的,但我就是不明白。 任何建议将不胜感激
Jakarta EE 是一堆共存的 API,EJB 只是其中之一。
我们可以说 EJB 是具有方面的普通旧 java 对象。例如:事务管理、安全、监控、池化等
@Stateless
只是在方法调用期间保持状态。
@Stateful
确实在会话期间维护方法调用之间的状态。
@Singelton
确实在 运行 应用程序的整个生命周期中保持状态。
@Stateful beans are kept in a pool and the same client is assigned the same bean?
不,每个客户端都会创建一个新的 bean 实例,并最终将其删除。如果缓存已满,实例可能会钝化到磁盘。
"How do non Java (generic clients) access EJB? Is this even possible?"
通过 Rest 将 JAX-RS 与 EJB 技术集成
@Stateless
@Path("/employee/{id}")
public class Employee {
public Employee(@PathParam("id") String id) {...}
}
the HTTP/s protocol? Would this mean that it would only be through a Servlet? Which is sort of like an MVC Controller?
JAX-RS och Spring MVC 使用 Servlet。
以 Web 应用程序为例,您可以使用 JSF 或 JSP 与 CDI 集成和 EJB。
If the answer to (1) is no, that clients such as web/mobile apps cant directly access an EJB, is there any use for a @Stateful session bean? Say for example in a web app, HTTP protocol is stateless, state can be maintained with the help of session/cookie, Which would mean the state is maintained by the Web Container? Whats the point of having a stateful session bean?
举个例子:您的购物车和产品在两次通话之间会去哪里?
我们需要将状态保存在某处,您可以使用 @SessionScoped
bean 或 @Stateful
bean 或数据库等。任何方式都是您的选择
"I have read other questions on stack overflow which suggest its not a good idea to have
@Stateful
session bean with Servlet."
我不知道它们是什么意思,但是如果您想在购物车中保存您的状态,例如 @Stateful
beans 是最佳选择。作为替代方案,您可以将 CDI bean 与 @SessionScoped
一起使用,而不是 EJB @Stateful
.
I get the whole shopping cart example, but this does not explain how state is maintained, if I was accessing my shopping cart through a browser, the cookies would be responsible for state right? Does EJB have access to browser cookies?
Jakarta EE 运行时负责这些细节,但如果需要,您可以访问 SecurityContext、SessionContext。
在 EJB 上,您可以使用 @Resource SessionContext ctx;
进行注释以获取调用者的上下文。
Example of Java Clients as far as I know: Servlet, Another EJB running local or remote, Another Java Class?, Standalone Java app?
I assume these clients would access the EJB by RMI/JNDI/CDI/Dependency Injection (in case of servlet)?
不仅仅是 Servlet API,但正如我所说,大多数 Java Web 技术都建立在 Servlet 技术之上或与 Servlet 技术集成。
Would it be fair to say that an EJB is similar to a SOAP Web Service in the Java EE world?
不,对于 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");
}
}
Based on all of the above is there much of a use case for EJB anymore? Especially as most apps are either through the web or mobile using HTTP/Rest end points, many use JWT's to manage state client side, and I cant see many examples of standalone Java apps except for maybe an Android app etc..
EJB 只是 Jakarta EE 的一部分或工具,您必须针对具体情况使用正确的工具。
Is it better to use MVC/Spring/Spring Boot which seems to have a more understandable architecture and create REST/SOAP Web Services
不,你在混合苹果和橙子。 EJB只是一个API,Spring是一个完整的平台。
“虽然有些人认为 Java EE 和 Spring 存在竞争关系,但 Spring 实际上是 Java EE 的补充。”
术语“Spring”在不同的上下文中有不同的含义。它可以用来指代 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 几乎是一样的)。
Is RMI also using HTTP?
RMI 协议不再相关,使用 EJB 不需要 RMI。
Does EJB understand HTTP?
如我所说,您可以将 JAX-RS 与 EJB 集成。
如果你有兴趣,我推荐一些在线研讨会