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]。本人及時修改。

相關文章
相關標籤/搜索