了解谁提供 servlet-api.jar,它是 Web 容器还是 Java EE 下载的一部分

2022-09-02 10:21:04

我需要了解 serlvet-api.jar这是编译 servlet 所必需的。

我正在构建一个简单的 servlet,如下所示:

import javax.servlet.*;
import javax.servlet.http.*;

public class FirstServlet extends HttpServlet {
    // Remaining code here
}

我知道我们需要 servlet-api.jar 文件来编译这个简单的 servlet,就像这样:

javac -classpath /path/where/jar/is/servlet-api.jar

现在我的怀疑从这里开始:

  1. 什么是 servlet-api.jar?
  2. 谁提供这个罐子?
  3. 每个网络容器是否都提供此罐子,例如,Tomcat,Jboss,glassfish?每个供应商是否为构建这个简单的Servlet所需的jar提供了“相同的名称”。
  4. 当我们下载 Java EE 时,这个 jar 是下载的一部分吗?或者我们获取此文件作为 Web 容器的一部分?
  5. 请考虑以下情况:

    假设我们使用Tomcat编译/构建简单的servlet(即构建servlet所需的tomcat版本的jar)并创建一个.war文件。然后,我们可以将战争部署在其他供应商容器中吗?


答案 1

这是什么?

servlet-api jar 是一个库,其中包含 Servlet API 规范的接口和类。servlet-api jar 仅包含 Servlet 规范的接口(API),因此您可以使用它来开发 Web 应用程序。

你在哪里可以得到它?

它在下面的链接中提供:

http://download.oracle.com/otndocs/jcp/servlet-3.0-fr-eval-oth-JSpec/

包含/捆绑的位置

Servlet-api.jar是Java EE下载的一部分,因此您可以开发Web应用程序(如果Java EE不包含它,则无法编译您的类)。FirstServlet

Servlet容器(如Tomcat,JBoss,GlassFish等)也包含servlet-api.jar否则它们将无法运行您的Web应用程序,而且它们还包含作为Servlet API一部分的接口的实现。

但是,名称并不总是相同的,它甚至可能不作为单独的jar存在,Servlet API类可能捆绑在另一个jar中。

但是,如果您只想为 Servlet 容器开发 Web 应用程序,或者想要创建/编写自己的 Servlet API 实现,则可以下载仅包含 Servlet API 的单独 jar 文件。看看这里:

http://download.oracle.com/otndocs/jcp/servlet-3.0-fr-eval-oth-JSpec/

可移植性

如果您有 Servlet API,则可以编译 Web 应用程序,无论它来自何处。编译Web应用程序后,您可以选择将其打包到WAR文件(WAR = Web ARchive)中,该文件只是一个包含静态文件,已编译的java类和配置文件等的zip文件。您将能够在任何Servlet容器中运行已编译的Web应用程序(但向前阅读)。web.xml

因此,对您的问题#5的回答是:

Servlet API有多个版本,Java EE平台不仅仅是Servlet API(例如Enterprise Java Beans)。但可以肯定地说,如果您只使用 Servlet API,则所有实现该版本 Servlet API 的 Servlet 容器都将能够运行您的 Web 应用程序。

不同 Web 应用程序的配置文件可能不同(这超出了 Servlet API 的范围),因此您应该始终检查目标 Web 应用程序的文档。


答案 2

什么是 servlet-api.jar?

它是一个提供编写Servlet所需的接口/类的jar。

谁提供这个罐子?

任何 servlet 容器(如 Jetty 或 Tomcat)和任何 Java EE 兼容的应用服务器(如 JBoss/Wildfly、GlassFish、IBM WebSphere、Oracle WebLogic 等)。

每个网络容器是否都提供此罐子,例如,Tomcat,Jboss,glassfish?每个供应商是否为构建这个简单的Servlet所需的jar提供了“相同的名称”。

对于 servlet api 是肯定的,因为它是一组接口,它允许对接口而不是类实现进行编程,因此我们避免编程到特定的应用程序服务器。包含实现的 jar 的名称不得具有此名称的一部分。

当我们下载 Java EE 时,这个 jar 是下载的一部分吗?或者我们获取此文件作为 Web 容器的一部分?

Oracle中可用的Java EE下载只是GlassFish。这在前面已经介绍过了。

假设我们使用Tomcat编译/构建简单的servlet(即构建servlet所需的tomcat版本的jar)并创建一个.war文件。然后,我们可以将战争部署在其他供应商容器中吗?

只要您不使用Tomcat特定的类,库或功能,那么是的,就不会有问题。否则,不可以。


推荐