该图不是Java EE stack。
这可能有帮助(或没有帮助:):
Java EE 是一个托管运行时系统。 (LAMP 没有这样的顾虑。)
Java EE 使用组件容器通用架构(LAMP 未定义显式组件容器 API)
JBoss、Glassfish 等应用服务器提供 Java EE 容器。 (Tomcat 不支持完整的 Java EE 堆栈。Tomcat 和 Jetty 仅提供 Web 容器(或符合最新规范的 Web 配置文件。)
请注意,Java EE Web 容器 (Servlet) 比完整的 Java EE 堆栈简单得多,但基于相同的架构方法。
Java EE 的 Web 组件(基本上)是 Servlet 和过滤器。各种高阶框架(例如 Faces)建立在此架构之上。 Java EE Web 容器既相对简单又非常有效。它是最接近 LAMP 的东西。
Java EE 的企业组件(由 GlassFish 等 Java EE 应用服务器支持)是各种无状态、有状态和持久性组件(在 Java 领域称为“Bean”)。
Hibernate 是一个 ORM,在完整的 Java EE(例如 EntityBeans)的上下文中是多余的。通常,JPA 与 Web 容器“Java EE”系统一起使用,以连接到后端 JDBC 兼容 RDMBS。甲骨文、MySQL 等等。
您(和/或某些第 3 方库)提供组件。
托管运行时主要关注处理“正交”“企业”“问题”,例如事务完整性,而您,组件/应用程序编写者,应该专注于“业务逻辑” .
Java EE 管理您的引用、事务边界、连接和生命周期组件。
引用:使用语义引用在运行时通过命名空间机制(即 JNDI 和 RMI)查找;以及通过声明性部署描述符进行依赖注入。
生命周期:您的组件将具有正确的启动、工作和关闭阶段。您可以参与这些 LC 活动并在必要时参与(通常没有必要)。这种形式化的 LC 允许架构的分布和扩展。
连接性:广泛解决传入(客户端)和内部 (EIS) 集成点。对于客户端,您拥有 web/RMI/JMS 等。这为您提供了同步 req/rep 语义和异步触发和忘记。对于后端(通常),JCA 指定到其他系统的连接器。 JPA 是 JCA 的一种专门化(理论上不是实践),它专门使用 JDBC 用户 API 处理数据库 EIS。
事务:声明性意味着将事务语义应用于组件的特定方法。这可以在设计时(通过注释)或部署时(通过 XML)完成。
部署包
Java EE 系统通常打包为 WAR(仅适用于 Web)或 EAR(适用于完整堆栈)。
部署描述符
Java EE 的最新规范支持具有合理默认值(或简单映射)的零配置操作。但重要的是,您必须了解这一切是什么,并且在某些时候,任何严肃的 Java EE 应用程序都需要在某种程度上处理这些工件。 (对于 web.xml 来说要容易得多,所以不要惊慌。)它是架构的一个关键方面。明白这一点,其他一切都非常清楚。
Java EE 使用 indirection 来实现它的魔力。这是这里要解决的问题:
我们有一些第 3 方(前一段时间)编写的组件,我们需要在我们的应用程序中使用它们。部署描述符允许映射您的应用程序特定语义,例如组件的名称或其事务语义到组件的通用语义。例如,您可能希望将“Acme-Logger”公开为“My-Very-Own-Logger”。您可以通过将所需的环境名称映射到组件的类来完成此操作。 (原始组件可能有一个注释,将其通用名称简单地声明为“the-logger”)。
实际上,Spring 的出现是因为创建和维护这些映射描述符的痛苦。同样,Spring 是基于容器的系统的另一种方法。
容器
理论上您应该能够将整个容器插入兼容的服务器,但总体思路是您正在为 universal 容器编写 组件。 Java EE 容器。无论如何,正如您可以想象的那样,Java EE 应用服务器供应商并不太热衷于为堆栈提供可插拔的容器 API,因为这会使他们的产品成为完整的商品。
春天
Spring 实际上是 Java EE 的反论点。它是(或曾经是)用于解决 J2EE 痛点的轻量级容器系统(考虑到复杂的架构和部署仪式,如果没有有效的工具,这是完全不合理的)。实际上,Servlet 前端和 Spring 容器是完整的 Java EE 堆栈的替代。也就是说,它们可以共存。
Maven
Maven 是一个构建工具。还有蚂蚁。或者你可以跳上 Gradle。 Maven archetypes 的存在使您可以毫不费力地开始一个基本的 Java EE 项目。
建议:
从(并坚持使用)Web 容器子集开始。 Jetty 或 Tomcat 是容器/服务器的不错选择。
了解 WEB-INF/ 和 web.xml。编写一个简单的 HTTPServlet 扩展,并使用 web.xml 的功能。尝试设置一个过滤器,或者将一些参数绑定到 web-app 上下文中。掌握这些基础知识。其他一切都建立在这些之上。一切。
在 servlet 中,探索提供的 API。了解应用程序、会话和请求“上下文”之间的区别。网络层的一个关键问题。了解如何重定向请求。获取 http 标头等。其他一切都建立在这些之上。掌握这些基础知识。
假设此时您的 HelloWorld 网络应用程序已启动。下一步,尝试 JPA 并将持久性添加到您的项目中。在这里您可以尝试 Spring/Hibernate/Tomcat 教程示例。 Spring 将为您的业务组件(类)设置非 Java EE 容器。 Hibernate 将负责持久化您的数据。执行此操作时会引入几个新工件。 Spring 相关的 xml 文件和 JPA/Hibernate 映射。了解这些及其全部内容。
你快完成了。最后,让我们转向视图或表示问题。这就是 Java (imo) 糟糕的地方,因为它太冗长了,而且这一层完全是关于在此处放置小部件、在此处放置小部件等的无意识重复。
在最简单的情况下(并且开箱即用),您拥有基本的 HTTPServlet 并能够发送回您喜欢的任何内容。您可以在代码中编写 html(一个非常糟糕的主意),或者使用模板方法(Velocity、FreeMarker),或者升级到用于演示的专用组件:JSP、Faces 等。实际上有几十个框架(和方法)用于表示层。
希望这会有所帮助。