JAX-RS应用程序由一个或多个资源(Resource)和零个或多个提供程序(Provider)组成。 组成JAX-RS应用程序的资源和提供程序是通过应用程序提供的Application子类进行配置的。 一个JAX-RS的实现可以提供替代的机制来定位资源类和提供者(例如运行时类扫描),但是使用Application是唯一可移植的配置方式。

根据应用程序是在Java SE环境中运行还是在容器中运行,应用程序以不同的方式发布。这里讨论将JAX-RS打包成Java Web的形式进行部署。建议实现支持Servlet3框架可插入性机制,以实现容器之间的可移植性,并利用容器提供的类扫描功能。

JAX-RS应用程序作为Web应用程序打包在.war文件中。 应用程序类打包在WEB-INF/classs或WEB-INF/lib中,而所需的库打包在WEB-INF/lib中。 有关Web应用程序打包的完整详细信息,请参见Servlet规范。

1,使用Servlet的可插拔机制

使用可插拔机制时,必须满足以下条件

1.1 如果不存在Application的子类

如果不存在Application子类,则需要JAX-RS实现来动态添加servlet并将其名称设置为
javax.ws.rs.core.Application,并自动发现必须与应用程序打包在一起的所有根资源类和提供程序。

另外,应用程序必须与web.xml打包在一起,该web.xml为添加的servlet指定servlet映射。 这样的web.xml文件的示例:

<?xml version="1.0" encoding="UTF-8"?><web-app    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee"         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"         id="WebApp_ID" version="3.0">    <servlet>        <servlet-name>javax.ws.rs.core.Application</servlet-name>    </servlet>    <servlet-mapping>        <servlet-name>javax.ws.rs.core.Application</servlet-name>        <url-pattern>/myresources/*</url-pattern>    </servlet-mapping></web-app>

1.2 如果存在Application的子类

  • 如果已经有一个处理该应用程序的servlet。 即一个具有参数名为javax.ws.rs.Application值为Application子类完全限定名的Servlet,那么JAX-RS实现不需要任何其他配置步骤。

  • 如果没有servlet处理此应用程序,则需要JAX-RS实现来动态添加其完全限定名称必须是Application子类名称的servlet。如果Application子类使用@ApplicationPath注释,则要求实现使用此注释的值附加“ / *”来定义所添加服务器的映射。 否则,必须将应用程序与指定servlet映射的web.xml打包在一起。 例如,如果org.example.MyApplication是应用程序的名称子类,示例web.xml将是:
    <web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><servlet>    <servlet-name>org.example.MyApplication</servlet-name></servlet><servlet-mapping>    <servlet-name>org.example.MyApplication</servlet-name>    <url-pattern>/myresources/*</url-pattern></servlet-mapping></web-app>

当归档中存在Application子类时,如果Application.getClasses和Application.getSingletons方法都返回一个空集合,那么所有被打包在web应用程序中的根资源类(root resource)和提供程序(provider)必须被JAX-RS的实现通过如上所述描述扫描war文件来自动发现它们。如果getClasses或getSingletons中的任何一个返回非空集合,则仅返回的那些类或单例必须包含在已发布的JAX-RS应用程序中。

下表总结了Servlet 3框架可插拔性机制:

条件(Condition)活动(Action)Servlet名称(Servlet Name)web.xml
没有Application子类需要添加Servletjavax.ws.rs.core.Application需要配置servlet的mapping
Application的子类被存在的Servlet处理(已经定义)不需要
Application的子类未被存在的Servlet处理需要添加ServletApplication的子类如果子类没有添加@ApplicationPath注解则需要配置servlet的mapping

如果未使用Servlet 3框架的可插入性机制(例如在Servlet 3.0之前的容器中),则web.xml描述符的servlet-class或filter-class元素应分别命名为JAX-RS实现提供的servlet或filter类。应使用参数名称为javax.ws.rs.Application的init-param标识Application子类。

请注意,上述Servlet 3框架可插入性机制基于Servlet,而不是过滤器。 倾向于使用JAX-RS实现提供的过滤器类的应用程序必须使用Servlet 3.0之前的配置机制。

更多相关文章

  1. Typeahead 0.10.2没有在Rails 4 / Bootstrap 3应用程序中显示建
  2. 在Rails应用程序中结合Scriptaculous和JQuery
  3. Web 应用程序学习笔记
  4. Wordpress网站上的亚马逊链接无法正确打开亚马逊应用程序
  5. 为什么我不用Javascript和Javascript HTML模板构建整个Web应用程
  6. 维护Java应用程序的多种形式的用户指南
  7. HTML5 的应用程序缓存和优势
  8. 如何在应用程序中嵌入图像并在HTML控件中使用它们?
  9. PHP - Content-type未指定假设应用程序/x-www-form-urlencode。

随机推荐

  1. Android studio2.3.3升级3.1.2坑
  2. android studio 已过时
  3. Android 各种自定义进度条Progressbar
  4. Android读取Txt文件
  5. Android软件更新
  6. Android实现网易新闻客户端侧滑菜单(2)
  7. Android应用程序启动过程源代码分析(4)
  8. android中读取联系人和通话记录
  9. Android资源加载过程分析
  10. android收藏