JAX-RS 是否构建在 Servlet API 之上?如何?

2022-09-04 02:05:47

我一直在阅读JAX-RS是建立在servlet之上的。这从字面上看是正确的,还是仅仅意味着它是一个更高级别的组件?如果是,那是如何工作的?JAX-RS 是否创建了一个 servlet 来解析请求并手动初始化带注释的类并将修改后的参数传递给它们?JSR似乎没有具体说明这一点,也没有一本提到它的书籍会详细说明。@Path

注意:我在部署 JAX 或 servlet 时没有遇到麻烦,我只是对细节感到好奇,因为它可以更好地理解 Web 容器的工作原理。


答案 1

我一直在阅读JAX-RS是建立在servlet之上的。这是真的吗,

简单地说,是的,JAX-RS规范是在Servlets之上构建的,任何其他部署方法(例如@Jilles van Gurp提到的)都是特定于实现的

JAX-RS 是否创建了一个 servlet 来解析请求并手动初始化@Path带注释的类,并将修改后的参数传递给它们?

JAX-RS 不执行任何操作。它是实现(例如 Jersey、RESTEasy、CXF)实现入口点 servlet 的实现。实现是否需要显式解析请求?不,不是全部。大部分内容由 servlet 容器处理。主要是实现只需要解析请求正文(因为“请求”意味着不仅仅是正文,例如URL,标头)。

基本上,与 JAX-RS 相关的所有内容都由实现来处理。servlet 容器除了传递 HttpServletRequest 和 HttpServletResponse 之外,没有任何关系,就像你要实现自己的 servlet 一样。如果您要创建自己的 JAX-RS 实现,那么传递给您的 HttpServletRequest(Response) 的 servlet 就是请求入口点,其他一切都取决于您。

编辑

因为“请求”意味着不仅仅是正文,例如URL

不好的例子。实际上,JAX-RS 实现解析 URL 以获取路径参数和查询参数。尽管 Servlet 容器将解析 URL 并将查询参数添加到 HttpServletRequest 参数映射中,但该映射也具有表单 POST 参数,因此实现还需要对查询参数进行自己的解析。


答案 2

Jax rs并不真正直接使用或依赖于servlets,但它通常由实现它的框架在其上实现。在这种情况下,您的应用程序被一个 servlet 包装,该 servlet 将传入的请求委托给 jax rs 端点,并且整个内容都部署在 servlet 容器(如 tomcat 或 jetty)中。

但是,例如,jersey(参考实现)可以在独立服务器中没有 servlet 包装器的情况下运行。我们用灰熊作为我们的容器。我们的应用程序中没有 servlet 容器,我们使用灰熊容器。当然,灰熊容器提供了一个非常相似的执行模型,但你不需要一个完整的应用程序服务器来运行它。去这里了解灰熊的更多细节


推荐