我真的很困惑。我已经尝试了一个带有tomcat的Jax-rs并使用了所有注释,我可以使用url
来调用我的服务。所以没有Jax-rs,我可以简单地拥有一个servlet并调用我的服务。另外,正如我所尝试的,那里有jersey-rs with 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>
然后我有一个与JAX-RS相同的注释,在GET上我可以用正确的URL调用我的服务。
我的问题是,为什么球衣使用servlet? JAX-RS
没有使用servlet?为什么使用JAX-RS
,而我们只能使用Servlet。
答案 0 :(得分:9)
JAX-RS指定Servlets [ 1 ] 周围的部署模型。为什么,因为在Java世界中,这就是Web应用程序的运行方式。请求进入Servlet容器(如Tomcat或完整Java EE服务器中的容器),容器将请求移交给Servlet应用程序,应用程序处理请求并将响应吐出回容器,容器发送它给客户。 Spring MVC是一个基于Servlet的框架(主要的Servlet是DispatcherServlet
)。 JSF是一个基于Servlet的框架(主要的Servlet是FacesServlet
)。同样的方式JAX-RS是围绕Servlet构建的(主要的Servlet是特定于实现的;在Jersey的情况下是ServletContainer
)。
请求进入Tomcat,它查找servlet映射,它发现ServletContainer
匹配请求URL,它将请求包装在HttpServletRequest
中并将其发送到Jersey Servlet。现在泽西岛可以随心所欲,这是一个很大的处理;例如处理请求以匹配您的方法 [ 2 ] ,反序列化实体主体,以及一大堆其他可以实现所有魔法的东西。完成处理后,它会将响应发送回容器。
为什么球衣使用servlet?
我认为上面已经说清楚了。
JAX-RS没有使用servlet?
我不太确定我真的理解你所问的是什么,但是JAX-RS指定了其他部署模型,但Servlet环境是唯一具有任何特定需求细节的环境。其他部署选项(如SE环境中)将是特定于实现的 [ 1 ] 。
为什么使用JAX-RS,而我们只能使用Servlet
你基本上问,“当我可以实现自己的REST框架时,为什么要使用JAX-RS?”。通常,当有可用的框架时,请使用它。如果你觉得你可以做得更好,那就去做吧。
[ 1 ] - 请参阅2.3 Publication
[ 2 ] - 请参阅3.7 Matching Requests to Resource Methods
部分OP的混淆是,他正在经历的教程没有在web.xml文件中指定一个Servlet,这使得OP认为是“vanilla JAX-RS” (不存在)正在使用,而不是实现。
JAX-RS只是一个规范,没有实现就无法运行。是的,有javax.ws.rx-api.jar
或javaee-api.jar
具有编译 JAX-RS应用程序的类/接口/注释,但此jar中没有实际的“引擎” 。实际的JAX-RS“引擎”在特定的实现jar中。
我没有看过完整的教程,但我认为它使用了上述jar中的一个,这使得OP相信没有使用JAX-RS实现。但实际上,所使用的Java EE服务器(也就是Glassfish)在内部都有实现。在Glassfish的情况下,它是泽西岛。
另一个混淆点可能出现在app配置中。不是像在OP的帖子中那样使用web.xml,而是使用了Application
个子类。像
@ApplicationPath("/rest")
public class AppConfig extends Application {
...
}
JAX-RS规范指出,当这个带注释的类可用时,应该使用上面的完全限定类名作为Servlet名创建一个Servlet,并将url映射为@ApplicationPath
中的值。所以无论你使用什么实现,这种行为应该是相同的。
答案 1 :(得分:1)
JAX-RS是创建REST API的标准。即使您可以构建像泽西这样的库来构建标准的实现。 JAX-RS是JEE等JavaEE堆栈的一部分。所以像JBoss这样的应用服务器捆绑了jax-rs和jms。
JAX-RS并没有与tomcat捆绑在一起。 Jersey可以使用像Tomcat,Jetty等servlet容器。这类似于ApacheMQ,可以使容器做JMS。它旨在扩展servlet以创建休息端点。它也是JAX-RS的一个实现。实现该标准使其与为JAX-RS编写的代码保持一致。
有apache-cxf,它实现了JAX-RS并且实现了SOAP&amp;休息两者。我多年来一直在使用运动衫。因为我喜欢和tomcat一起工作。现在我们帮助构建metamug,一个用于REST API的tomcat框架和XML。
答案 2 :(得分:0)
JAX-RS定义了一些标准和规则。通常,Jersey是JAX-RS实现。
但更具体地说,Jersey
框架不仅仅是JAX-RS参考实现。 Jersey提供了自己的API,通过其他功能和实用程序扩展了JAX-RS工具包,以进一步简化RESTful服务和客户端开发。