Servlet 3.0 和 JAX-RS
Servlet 3.0 and JAX-RS
我发现这个问题的答案相互矛盾,而且我未能成功 运行 举个例子。
是否可以仅使用带注释的 Servlet 3.0(特别是 Tomcat 7)实现 JAX-RS,而无需实现另一个 Servlet 容器?
如果不是,请解释为什么本书中的以下引用是不正确的,或者我的解释是错误的。
Because this example deploys within a Java EE application server or
standalone Servlet 3.x container, all we need is an empty web.xml
file. The server will detect that an Application class is within your
WAR and automatically deploy it. (RESTful Java with JAX-RS 2.0, Bill Burke)
澄清一下我不需要的帮助...我已经成功地在 Tomcat 7 中使用 Jersey 实现了 JAX-RS a web.xml,所以,我不需要任何关于如何这样做的解释。此外,我完全知道其他 Java EE/Servlet 容器(TomEE、Glassfish、Jersey、Websphere 等)都是开箱即用的 JAX-RS。我只需要知道我是否正在追逐我的尾巴试图让 Tomcat 7 (Servlet 3.0) 与 JAX-RS 一起工作,而不添加 Servlet 容器并且没有 web.xml 条目。
在 Servlet 环境中,Jersey 作为 servlet 或 servlet 过滤器运行。没有办法解决这个问题。那么,如果不在 web.xml 中声明它,它是如何工作的呢?此功能的两个主要组成部分
Servlet 组件(即 servlet 和 fitters)的编程注册。您可以进行 Google 搜索,您应该会找到一些示例。
Servlet 中引入了 Servlet 可插拔性 3.x。它的工作原理是您实现一个 ServletContainerInitializer
,在名为 javax.servlet.ServletContainerInitializer
的文件中列出该实现,并将该文件放在 jar 的 META-INF/services
目录中。 servlet 容器应扫描 jars 以查找此文件。当它找到时,它看到实现,找到实现,实例化它,然后调用它 onStartup
方法。
泽西岛在 JerseyServletContainerInitializer
. This class is located in the jersey-container-servlet
jar. So you need this jar for this to work. If you look at this method 中有这样一个 SevletContainerInitializer
的实现,在这里您将看到 ServletContainer
的程序化注册(与您在web.xml
但这还不是全部。我们仍然需要某种方式来配置我们的应用程序,至少声明 servlet 映射。这就是 Application
class and the @ApplicationPath
注释的用武之地。我们将扩展 Application
class 并注释 @ApplicationPath("/path")
其中 "path"
与中的 servlet 映射相同web.xml
@ApplicationPath("/api")
public class MyApplication extends Application {}
这是标准的 JAX-RS。对于 Jersey,我们通常使用 Application
class 而不是 Application
class(它是 Application
的子 class)
@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("package.to.scan");
}
}
您可以在 Servlet 3.x 环境中查看有关 Jersey 部署选项的更多信息,here。
还应注意,Java EE 服务器具有 JAX-RS 实现,因此我们只需将 javaee-api jar 添加到我们的应用程序作为提供的依赖项。但是在servlet容器中,我们需要提供自己的实现,Jersey就是这样一个实现。
如果您使用的是 Maven,则您需要的主要依赖项是这个
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
这将拉入一堆其他的 jar。你没有使用 Maven,那么你可以下载所有的 jar here (the JAX-RS 2.0 RI bundle),并将所有这些放入你的应用程序中。
另请参阅:
我发现这个问题的答案相互矛盾,而且我未能成功 运行 举个例子。
是否可以仅使用带注释的 Servlet 3.0(特别是 Tomcat 7)实现 JAX-RS,而无需实现另一个 Servlet 容器?
如果不是,请解释为什么本书中的以下引用是不正确的,或者我的解释是错误的。
Because this example deploys within a Java EE application server or standalone Servlet 3.x container, all we need is an empty web.xml file. The server will detect that an Application class is within your WAR and automatically deploy it. (RESTful Java with JAX-RS 2.0, Bill Burke)
澄清一下我不需要的帮助...我已经成功地在 Tomcat 7 中使用 Jersey 实现了 JAX-RS a web.xml,所以,我不需要任何关于如何这样做的解释。此外,我完全知道其他 Java EE/Servlet 容器(TomEE、Glassfish、Jersey、Websphere 等)都是开箱即用的 JAX-RS。我只需要知道我是否正在追逐我的尾巴试图让 Tomcat 7 (Servlet 3.0) 与 JAX-RS 一起工作,而不添加 Servlet 容器并且没有 web.xml 条目。
在 Servlet 环境中,Jersey 作为 servlet 或 servlet 过滤器运行。没有办法解决这个问题。那么,如果不在 web.xml 中声明它,它是如何工作的呢?此功能的两个主要组成部分
Servlet 组件(即 servlet 和 fitters)的编程注册。您可以进行 Google 搜索,您应该会找到一些示例。
Servlet 中引入了 Servlet 可插拔性 3.x。它的工作原理是您实现一个
ServletContainerInitializer
,在名为javax.servlet.ServletContainerInitializer
的文件中列出该实现,并将该文件放在 jar 的META-INF/services
目录中。 servlet 容器应扫描 jars 以查找此文件。当它找到时,它看到实现,找到实现,实例化它,然后调用它onStartup
方法。泽西岛在
JerseyServletContainerInitializer
. This class is located in thejersey-container-servlet
jar. So you need this jar for this to work. If you look at this method 中有这样一个SevletContainerInitializer
的实现,在这里您将看到ServletContainer
的程序化注册(与您在web.xml
但这还不是全部。我们仍然需要某种方式来配置我们的应用程序,至少声明 servlet 映射。这就是 Application
class and the @ApplicationPath
注释的用武之地。我们将扩展 Application
class 并注释 @ApplicationPath("/path")
其中 "path"
与中的 servlet 映射相同web.xml
@ApplicationPath("/api")
public class MyApplication extends Application {}
这是标准的 JAX-RS。对于 Jersey,我们通常使用 Application
class 而不是 Application
class(它是 Application
的子 class)
@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("package.to.scan");
}
}
您可以在 Servlet 3.x 环境中查看有关 Jersey 部署选项的更多信息,here。
还应注意,Java EE 服务器具有 JAX-RS 实现,因此我们只需将 javaee-api jar 添加到我们的应用程序作为提供的依赖项。但是在servlet容器中,我们需要提供自己的实现,Jersey就是这样一个实现。
如果您使用的是 Maven,则您需要的主要依赖项是这个
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
这将拉入一堆其他的 jar。你没有使用 Maven,那么你可以下载所有的 jar here (the JAX-RS 2.0 RI bundle),并将所有这些放入你的应用程序中。
另请参阅: