当前位置: 首页 > 面试题库 >

与JAX-RS的混淆和与JAX-RS的球衣的混淆

邹英悟
2023-03-14
问题内容

我真的很困惑。我已经尝试过使用tomcat的Jax-rs并使用所有能够使用调用我的服务的注释url。因此,没有Jax-
rs,我可以简单地拥有一个servlet并调用我的服务。同样,正如我尝试过的那样,有jax-rs和jersey(我研究了的实现JAX- RS)以及web.xml中的以下内容。

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>OutputUi</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>
            com.sun.jersey.spi.container.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>org.xxx.carbon.servlet</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

然后,我在GET上具有与JAX-RS相同的注释,可以使用正确的URL调用我的服务。

我的问题是,为什么球衣使用servlet?JAX-RS不使用servlet?为什么使用JAX-RS,而我们只能使用Servlet。


问题答案:

JAX-RS指定围绕Servlets [ 1
]的部署模型。为什么,因为在Java世界中,这就是运行Web应用程序的方式。请求进入Servlet容器(例如Tomcat或完整的Java
EE服务器中的容器),该容器将请求移交给Servlet应用程序,应用程序处理该请求并将响应发送回该容器,然后将其发送给客户。Spring
MVC是一个基于Servlet的框架(主要Servlet是DispatcherServlet)。JSF是一个基于Servlet的框架(主要Servlet是FacesServlet)。围绕Servlet构建JAX-
RS的方式相同(主要Servlet特定于实现;对于Jersey而言是ServletContainer)。

请求进入Tomcat,它查找servlet映射,找到ServletContainer与请求URL匹配的内容,将请求包装在中,然后将其发送HttpServletRequest给Jersey
Servlet。现在,Jersey可以随心所欲地进行处理,这需要大量的处理;例如处理与您的方法[ 2
]匹配的请求,反序列化实体主体,以及使其他所有功能变为可能的其他功能。处理完成后,它将响应发送回容器。

为什么球衣使用servlet?

我认为以上已经阐明。

JAX-RS不使用servlet?

不确定我是否真的理解您的要求,但是JAX-
RS指定了其他部署模型,但是Servlet环境是唯一具有任何特定需求详细信息的环境。其他部署选项,例如在SE环境中,将是特定于实现的[ 1 ]。

为什么使用JAX-RS,而我们只能使用Servlet

您基本上是在问:“何时可以实现自己的REST框架,为什么要使用JAX-RS?”。通常,如果有可用的框架,请使用它。如果您觉得自己可以做得更好,那就去做。

[ 1
]-参见2.3出版物
[ 2
]-参见3.7将请求与资源方法匹配

更新

因此,在OP上造成困惑的部分原因是他正在阅读的教程没有在web.xml文件中指定Servlet,这使OP认为“香草JAX-RS”(
(不存在)正在使用,而ant不是实现。

JAX-RS只是一个规范,没有实现就无法运行。是的,有一个javax.ws.rx-api.jar或一个javaee-api.jar具有用于 编译
JAX-RS应用程序的类/接口/注释,但是此jar中没有实际的“引擎”。实际的JAX-RS“引擎”位于特定的实现罐中。

我还没有看完整的教程,但是我假设它使用了上面的jar之一,这使OP相信没有使用JAX-RS实现。但是实际上,使用的Java
EE服务器(即Glassfish)在内部具有实现。如果是Glassfish,则为泽西岛。

另一个困惑点可能是在应用程序配置中。与其在OP的帖子中不使用web.xml,而是使用了一个Application子类。就像是

@ApplicationPath("/rest")
public class AppConfig extends Application {
    ...
}

JAX-
RS规范指出,当带有注释的此类可用时,应使用上述完全限定的类名称作为Servlet名称来创建Servlet,并且将映射到的url为的值@ApplicationPath。因此,无论您使用哪种实现,此行为都应该相同。



 类似资料:
  • 我需要在java上开发简单的web服务。我是java技术新手,根据几篇文章,我决定将JAX-RS(Jersey)与嵌入式http服务器(Grizzly2)结合使用,因为它看起来适合构建REST服务,部署似乎很简单。 在我的开发环境中,所有工作都很完美(使用IntllijIdea)。 但当我尝试在测试服务器上部署时,每个请求都返回“500内部错误”(偶数/application.wadl) 简单资源

  • 我在WAS 8.0上部署了一个JAX-RS WS应用程序,其中包含一个空的2.4web.xml,这个类扩展了'javax.WS.rs.core.application'和2个资源,它工作得很好。 如何在WAS7.0上部署JAX-RS应用程序而不使用Jersey或任何其他与应用程序服务器相关的类? 谢谢

  • 我有一个服务器Weblogic 12.1.3,带有JAX-RS 2。x作为共享库安装(参见。https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297). 该共享库包括例如javax。ws。rs-api-2.0。jar和jersey-media-multipart-2.5.1。jar。 请注意,我不确

  • 问题内容: 我对此并不陌生,请尝试阅读一些文档,但无法正常工作,请耐心等待。 我创建了一个使用这样的: 这是我的服务: 的是一个例外。 我尝试了这个: 但是,当我调用服务时,不会被调用。看来我可能缺少东西。那么如何定义这个异常呢? 请让我知道如何定义。 问题答案: 您需要使用注释您的异常映射器,否则它将永远不会在JAX- RS运行时中注册。

  • 什么是resteasy?RESTEasy和JAX-RS有什么区别?和之间有什么区别?

  • 我想在Grizzly 2上运行JAX-RS 2.0/jer,但我现在不知道如何设置它。我发现了以下Maven依赖项: 我需要什么Java代码才能在灰熊上运行泽西岛?