JAX-RS是建立在Servlet API之上的吗?如何



我读到JAX-RS是建立在servlet之上的。这是真的吗,还是仅仅意味着它是一个更高级别的组件?如果是,这是怎么回事?JAX-RS是否创建了一个servlet来解析请求并手动初始化@Path注释的类并将修改后的参数传递给它们?JSR似乎没有具体说明这一点,也没有一本书提到这一点。

注意:我在部署JAX或servlet时没有遇到任何问题,我只是对细节很好奇,因为它可以更好地了解web容器的工作方式。

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

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

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

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

基本上,与JAX-RS相关的一切都由实现来处理。servlet容器除了传递HttpServlet请求和HttpServlet响应之外什么都不做,就像您要实现自己的servlet一样。如果您要制作自己的JAX-RS实现,那么传递HttpServlet请求(Response)的servlet就是请求的入口点,其他一切都由您决定。

编辑

作为"请求"不仅仅意味着正文,例如URL

错误的示例。实际上,JAX-RS实现解析URL,以便获得路径参数和查询参数。虽然Servlet容器将解析URL并将查询参数添加到HttpServlet请求参数映射中,但该映射也有表单POST参数,因此实现还需要自己解析查询参数。

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

但是,例如jersey(引用实现)可以在独立服务器中不使用servlet包装器运行。我们用灰熊作为我们的容器。在我们的应用程序中没有servlet容器,而是使用了grizzy容器。当然,grizzly容器提供了一个非常相似的执行模型,但你不需要一个完整的应用程序服务器来运行它

这是Jboss Resteasy的官方文档。

RESTeasy实现为Servlet上下文侦听器和Servlet,并部署在WAR文件中。

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

最新更新