Java EE规范与实现

4

我最近开始学习Java EE,但是理解起来很困难。我在这里阅读了一些答案,但仍感觉我的理解存在一些漏洞。基本上,Java EE是一个规范,像TOMCAT、Glassfish等应用服务器有具体实现。此外,任何人都可以提供EE的实现。

所以,我从Maven仓库下载了javax.sevlet-api-4.0.1-sources.jar,我可以看到它们只是接口,我假设我们只需使用它们来构建项目?

在Tomcat的lib文件夹中有一个servlet-api.jar。这是Servlet的Tomcat实现吗?如果是的话,那么是否可以将它替换为另一个Servlet版本的实现?

现在,Hibernate是Persistence API的实现。如果我想在Tomcat中使用Hibernate,我只需要将与Hibernate相关的jar添加到我的应用程序中,就可以同时用于构建和运行,而不必实际获取合同类。


2
顺便提一下,Java EE现在被Oracle捐赠给了Eclipse基金会,并更名为Jakarta EE。移交仍在过渡中。但是您可以在http://www.Jakarta.ee/找到各种API的最新Javadoc。 - Basil Bourque
2个回答

4

编译代码时需要servlet-api jar文件,因为其中包含了例如HttpServletRequest这样的内容。不需要将该jar文件与应用程序一起包含,因为它已经由Servlet容器提供,例如Tomcat。

在Tomcat中,各种servlet类的实现在中,至少对于Tomcat 9而言,例如是实现的类。编译代码时不需要这个。


1
谢谢,有没有任何资源可以查看规范API和实现如何一起工作。 - poolD
2
@poolD 这是一个通用的问题,可以简单地解释一下。规范API 由调用API的使用者所使用的类型组成。这些类型通常大多是枚举、接口以及抽象类,但也可以是具体类,例如值类。实现 则由实现API的类组成,调用者不需要直接使用其中任何一个类,而且实际上是不允许使用的。 - Andreas
1
你能提供一个简单的例子来说明内部发生了什么吗?因为有人说,例如:如果在应用程序中使用javax.persistence,则参考实现(如Hibernate、TopLink)可以随时更改而不需要更改任何应用程序代码。它是如何识别实现的?我们需要指定任何配置吗? - poolD
1
@poolD "它如何识别实现方式" 这是一个非常笼统的问题,因为每个API都会以不同的方式解决这个问题。对于Servlet API来说,servlet容器是调用您的代码的对象,因此在调用您的代码之前,它会创建任何实现类的实例,并将该实例作为声明接口传递给您。 - Andreas
例如,当Tomcat调用您的doGet(HttpServletRequest req, HttpServletResponse resp)方法时,它可能会在内部创建一个实现HttpServletRequest接口的TomcatRequest类的实例,然后将其传递给您的代码。@poolD - Andreas

3

准确来说,Tomcat不是一个完整的JavaEE容器,它只处理JavaEE规范的一部分(主要是servlet、jsp、jndi等)。

正如Andreas所写,您需要serlvet-api.jar来编译您的代码(否则HttpSerlvetRequest将缺失),但由于Tomcat已经提供了它(作为接口)以及实际的实现,因此您应该在您的maven文件中添加它作为“provided”依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接