最近在學習 jersey 框架。他是 目前比較流行的 基於 JAX-RS 2.0 規範實現的 RESTful 框架。java
我是跟着 《Java RESTful Web Service 實戰》 一書 在學習。書中有些知識點,不太經常使用,可是比較重要,特寫下次筆記已備忘。web
以下圖:apache
狀況二:當不存在 Application 子類,可是存在 Servlet 子類時api
狀況三:當存在 Application 子類,並且 Application 子類被 ApplicationPath 註解所修飾。app
此圖來自於《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]。本人及時修改。