【问题标题】:Is JAX-RS built on top of Servlet API? How?JAX-RS 是建立在 Servlet API 之上的吗?如何?
【发布时间】:2016-12-30 13:27:39
【问题描述】:

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

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

【问题讨论】:

    标签: java servlets jax-rs


    【解决方案1】:

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

    但是,例如 jersey(参考实现)可以在没有 servlet 包装器的情况下在独立服务器中运行。我们使用 grizzly 作为我们的容器。我们的应用程序中没有 servlet 容器,而是使用 grizzly 容器。当然,grizzly 容器提供了非常相似的执行模型,但您不需要完整的应用程序服务器来运行它。 go here for more details on grizzly

    【讨论】:

      【解决方案2】:

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

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

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

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

      基本上,与 JAX-RS 相关的所有内容都由实现处理。 servlet 容器除了传递 HttpServletRequest 和 HttpServletResponse 之外与任何其他东西无关,就像您要实现自己的 servlet 一样。如果您要制作自己的 JAX-RS 实现,则向您传递 HttpServletRequest(Response) 的 servlet 是请求入口点,其他一切都由您决定。

      编辑

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

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

      【讨论】:

        【解决方案3】:

        这是 Jboss Resteasy 的official documentation

        RESTeasy 实现为 ServletContextListener 和 Servlet 并部署在 WAR 文件中。

        JAX-RS 实现确实使用 ServletAPI 来路由和解析请求。它是实现细节,不需要在规范中提及。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-05
          • 2015-01-25
          • 2016-01-22
          • 2016-12-02
          • 1970-01-01
          • 1970-01-01
          • 2017-09-25
          • 2016-05-07
          相关资源
          最近更新 更多