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

时间:2016-12-30 13:27:40

标签: java servlets jax-rs

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

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

3 个答案:

答案 0 :(得分:8)

  

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

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

  

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

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

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

修改

  

as" request"意味着不仅仅是身体,例如 URL

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

答案 1 :(得分:3)

这是Jboss Resteasy的official documentation

  

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

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

答案 2 :(得分:3)

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

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