Tomcat Jersey是如何连接到servlet 3容器的

Tomcat Jersey是如何连接到servlet 3容器的,tomcat,jersey,web.xml,servlet-3.0,Tomcat,Jersey,Web.xml,Servlet 3.0,对于Servlet2.5,必须在web.xml中声明Jersey容器servlet,以便将Jersey连接到Tomcat <web-app> <servlet> <servlet-name>MyApplication</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-cla

对于Servlet2.5,必须在
web.xml
中声明Jersey容器servlet,以便将Jersey连接到Tomcat

<web-app>
    <servlet>
        <servlet-name>MyApplication</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            ...
        </init-param>
    </servlet>
</web-app>

我的问题是,在这种情况下,Jersey是如何集成到Tomcat中的?
应用程序
类是否隐式执行某些操作,或者servlet是否在类路径中自动发现jar

我不确定jersey是如何实现它的,但他们可能会使用几种方法:

  • Servlet3.0()中引入了一个名为
    ServletContainerInitializer
    的功能,它允许向库/运行时通知web应用程序的启动阶段,并执行servlets、筛选器和侦听器所需的任何编程注册

  • 您可以将其库创建为
    web片段
    ,它允许您在jar中拥有web-fragment.xml,您可以在其中注册servlet/filter/等。然后在启动过程中,此
    web片段.xml
    web.xml
    合并。因此,在web片段中注册的组件被视为在web.xml中注册的组件



编辑:(来自@peeskillet comment)Jersey使用servlet容器初始值设定项:

第一个->还有另一种选择:不在web.xml中包含
servlet映射
,而是在应用程序子类中添加
@javax.ws.rs.ApplicationPath(“/rest path”)
<web-app>
    <servlet>
        <servlet-name>org.foo.rest.MyApplication</servlet-name>
    </servlet>
    ...
    <servlet-mapping>
        <servlet-name>org.foo.rest.MyApplication</servlet-name>
        <url-pattern>/resources</url-pattern>
    </servlet-mapping>
    ...
</web-app>