JAX-RS 2.0 中 REST 的四种服务类型
来源:互联网 发布:阿里的数据平台 编辑:程序博客网 时间:2024/05/21 18:30
最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。
我是跟着 《Java RESTful Web Service 实战》 一书 在学习。书中有些知识点,不太常用,但是比较重要,特写下次笔记已备忘。
概要
如下图:
- 情况一:当不存在 Application 子类,也不存在 Servlet 子类时
情况二:当不存在 Application 子类,但是存在 Servlet 子类时
情况三:当存在 Application 子类,而且 Application 子类被 ApplicationPath 注解所修饰。
- 情况四:当存在 Application 子类,但是没有被ApplicationPath 注解所修饰。
此图来自于《Java RESTful Web Service 实战》
描述
情况一
以下xml代码是 servlet 容器的
web.xml
中的 去除 的子元素。当不存在 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 不具备自动扫描资源类的功能。
其中
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 的配置。
java
public 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]。本人及时修改。
- JAX-RS 2.0 中 REST 的四种服务类型
- JAX-RS开发(四):ajax跨域访问REST服务时的cors解决方案
- 基于JAX-RS 2.0 REST服务几种类型
- JAX-RS 2.0 REST 客户端
- REST服务学习笔记一、基于JAX-RS 2.0 REST服务几种类型
- JAX-RS 2.0 REST客户端编程实例
- JAX-RS 2.0 REST 请求处理
- 关注REST,JAX-RS
- RESTLET开发实例(一)基于JAX-RS的REST服务
- RESTLET开发实例(一)基于JAX-RS的REST服务
- JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务
- RESTLET开发实例(一)基于JAX-RS的REST服务
- 在spring中构建基于jax-RS(即rest风格)的webservice
- JAX-RS:开发一个简单的服务
- JAX-RS:开发一个简单的服务
- JAX-RS的传参类型
- JAX-RS 简化 REST 学习
- REST:JAX-RS 与 Spring
- Android 上传图片,服务器接收图片实现
- LinkedList源码分析
- UIViewController之间的传值方式二 通知
- JavaScript 笔记 —— 鼠标事件的浏览器差异
- c++ map自定义排序
- JAX-RS 2.0 中 REST 的四种服务类型
- jersey 框架传输格式 (2) xml
- js日期多少小时前、多少分钟前、多少秒前
- Laravel Sublime Text 代码提示插件
- Laravel 上手教程之实现用户注册和登录
- laravel 使用自定义视图分页
- Linode VPS(CentOS) 防火墙配置
- linux 安装字体
- Linux操作系统内核参数优化