JAX-RS 2.0 中 REST 的四种服务类型

最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。java

我是跟着 《Java RESTful Web Service 实战》 一书 在学习。书中有些知识点,不太经常使用,可是比较重要,特写下次笔记已备忘。web

概要

以下图:apache

  • 状况一:当不存在 Application 子类,也不存在 Servlet 子类时
  • 状况二:当不存在 Application 子类,可是存在 Servlet 子类时api

  • 状况三:当存在 Application 子类,并且 Application 子类被 ApplicationPath 注解所修饰。app

  • 状况四:当存在 Application 子类,可是没有被ApplicationPath 注解所修饰。

REST4种服务模式
此图来自于《Java RESTful Web Service 实战》框架

描述

  • 状况一maven

    如下xml代码是 servlet 容器的 web.xml 中的 去除 的子元素。ide

    当不存在 Application 子类,也不存在 Servlet 子类时,规范中定义,在这种状况下,为REST服务动态生成一个名为 javax.ws.rs.core.Application 的 Servlet 实例,并自动探测匹配资源。与此同时,须要根据Servlet的不一样版本,在web.xml定义REST请求处理的Servlet为这个动态生成的Servlet.学习

    xml<!-- Servlet 3.x 中的配置 -->
        <servlet>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
        </servlet>
        <servlet-mapping>
            <servlet-name>javax.ws.rs.core.Application</servlet-name>
            <url-pattern>/webapi/*</url-pattern>
        </servlet-mapping>
    xml<!-- Servlet 2.x 中的配置 -->
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
         <init-param>
             <param-name>jersey.config.server.provider.packages</param-name>
             <param-value>com.example</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>

    经过 Servlet2.x 中 web.xml 的配置项,能够看出,jersey-container-servlet-core 不具有自动扫描资源类的功能。url

    其中 org.glassfish.jersey.servlet.ServletContainer 是 jersey 中 Servlet的基类,它继承于 HttpServlet

  • 状况二

    当不存在 Application 子类,可是存在 Servlet 子类时。

    java// Servlet3.x 中 一个 Servlet 定义
    @WebServlet(
        initParam = @WenInitParam(name = "jersey.config.server.provider.packages", value="com.example"),
        urlPatterns="/webapi/*",
        loadOnStratup = 1
        )
    public class AirServlet extends ServletContainer {
    
    }

    以上是 基于 Servlet3.x 的 REST 服务。在 Servlet3.x 的场景下,能够省略 web.xml 文件。可是 Servlet 项目中若是没有 web.xml 的话,在使用 maven 发布war 的时候会报错,因此须要设置 maven-war-plugins

    xml<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
  • 状况三:
    当存在 Application 子类,并且 Application 子类被ApplicationPath注解所修饰。

    java@ApplicationPath("/webapi/*")
    public class AirApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(BookResource.class);
            return classes;
        }
    }

    也可使用,packages 方法 会扫描全部的资源类。

    java@ApplicationPath("/webapi/*")
    public class AirResourceConfig extends ResourceConfig {
        public AirResourceConfig() {
            packages("com.example");
        }
    }

    状况四:
    当存在 Application 子类,可是没有被 ApplicationPath 注解所修饰

    咱们须要先 定义一个 Application 子类,已完成 Servlet 的配置。

    javapublic class AirApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<Class<?>>();
            classes.add(BookResource.class);
            return classes;
        }
    }
    xml<servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.example.AirApplication</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>

    以上配置,能够生效与 Servlet2.x 版本中。咱们能够 利用 Servlet3.x 的特性来简化这些设置。

    xml<servlet>
        <servlet-name>com.example.AirApplication</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.AirApplication</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>

    以上就是 JAR-RS 规范中定义的四种 REST 服务的方式。

以上文字片断以及图片,部分来自于 《Java RESTful Web Service 实战》一书。若有版权侵犯,请联系邮箱[ychangsheng@gmail.com]。本人及时修改。

相关文章
相关标签/搜索