JAX-RS是否构建在Servlet API之上?怎么样?

blu*_*ote 10 java servlets jax-rs

我一直在读,JAX-RS是建立在servlet之上的.这是真的,还是只是意味着它是一个更高级别的组件?如果是,那怎么办?JAX-RS是否创建了一个servlet来解析请求并手动初始化带@Path注释的类并将修改后的参数传递给它们?JSR似乎没有指定这一点,并且提及它的书籍都没有涉及任何细节.

注意:我在部署JAX或servlet方面没有问题,我只是对细节很好奇,因为它可以更好地理解Web容器的工作方式.

Pau*_*tha 8

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

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

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

JAX-RS什么都不做.它是实现入口点servlet的实现(例如Jersey,RESTEasy,CXF).实现是否需要显式解析请求?不,不是全部.大部分内容由servlet容器处理.主要是实现只需要解析请求(因为"请求"意味着不仅仅是正文,例如URL,标题).

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

编辑

因为"请求"不仅仅意味着身体,例如URL

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


Jil*_*urp 5

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

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


Abh*_*jan 3

这是Jboss Resteasy的官方文档。

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

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