Servlet 3.0之装配来自web.xml,web

您所在的位置:网站首页 web-fragment Servlet 3.0之装配来自web.xml,web

Servlet 3.0之装配来自web.xml,web

#Servlet 3.0之装配来自web.xml,web| 来源: 网络整理| 查看: 265

如果 监听器,servlets,过滤器调用的顺序对于一个应用程序很重要,那么必须使用部署描述符。如果必要,可以使用上述定义的排序元素。如同上述描述的一样,当使用注解定义监听器,servlets和过滤器时,其调用的顺序是没有指定的。下面的是一组规则,用于封装应用程序最终的部署描述符。

1 监听器,过滤器,servlet的排序,必须指定在web-fragment.xml或者web.xml中。

2 排序是基于定义在描述符中的顺序和基于web.xml中的absolute-ordering元素或者web-fragment.xml中的ordering元素,如果有的话。

过滤器链的顺序是在web.xml中声明servlets要不在请求处理时延迟初始化或者在部署期间初始化。在后面的情况下,其按照load-on-startup元素指定的顺序初始化。以前的版本中,上下文监听器以一个随机的顺序调用。在Servlet 3.0中,监听器的调用按照在web.xml中声明的顺序调用;  i. javax.servlet.ServletContextListener的实现类在contextInitialized方法中并以申明的顺序调用,并在contextDestroyed方法中以相反的顺序执行 ii. javax.servlet.ServletRequestListener的实现类在requestInitialized方法中按照已经声明的顺序调用,并在requestDestroyed方法中以相反的顺序调用 iii. javax.servlet.http.HttpSessionListener实现类在sessionCreated方法中按照已经声明的顺序调用,并在sessionDestroyed方法中以相反的顺序调用iv. 其他监听接口的调用顺序没有指定

3 如果一个Servlet在web.xml中使用enabled元素标示为不可用,那么这个Servlet在url-partten指定下是不可用的

4 web应用程序的web.xml在web.xml,web-fragment.xml和注解之间有最高的处理优先权。

5 如果metadata-complete不在描述符中指定,或者在部署描述符中设值为false,那么这个应用程序的实际元数据将来自于注解中的现有元数据和描述符。合并的规则指定如下:

    a.  web fragments中的配置设置用于参数化主要web.xml中指定的设置,在这样的方式下,如果这些设置已经在同样的web.xml中已经指定

    b.  The order in which configuration settings of web fragments are added to those in the main web.xml is as specified above in Section 8.2.2, “Ordering of web.xml and web-fragment.xml” on page 8-66

   c.  在web.xml中的metadata-complete属性设置为true时,被认为完全扫描注解并且碎片不会在部署期间出现。absolute-ordering和ordering元素将会被忽略,如果有的话。当一个片段设置为true时,metadata-complete属性仅作用于指定jar的注解扫描。

   d. web碎片插入到主要的web.xml中,除非metadata-complete设置为true。对应片段上的注解处理后,合并就执行了。

   e. 当参数化web.xml和web片段时,会有配置冲突:

 有相同的但是不同的的重复的元素有相同的但是不同的的重复的元素

    f. 上述的配置冲突通过下面的解决

在主要web.xml和一个web片段之间的配置冲突,以web.xml的配置为主两个web片段之间的冲突,并且冲突的元素在主要的web.xml中没有,将导致一个错误。必须记录提示性消息,并且应用程序必将部署失败。

   g. 上述的冲突解决后,需要用到一下规则:

       元素,可能声明为许多次,在web.xml的web-fragments中是可添加的。例如,有许多不同的的元素时可添加的。       可以声明多次的元素,如果在web.xml中指定了,并重写了在web-fragments内的值,其拥有相同的名字      如果一个元素,with a minimum occurrence of zero, and a maximum occurrence of one,在web fragment中有,但在主要的web.xml中没有,主要的web.xml继承了web fragment的设置。如果这个元素在web fragment和主要的web.xml中都有,主要的web.xml的配置设置优先。例如,如果主要的web.xml和一个web片段都声明了相同的Servlet,并且web片段的的Servlet声明指定了一个元素,然而,主要的web.xml中没有指定这个元素,那么来自web片段中的将合并到web.xml中。如果一个元素在两个web片段中分别指定,同时在主要的web.xml中没有指定,会引发一个错误。例如,如果两个web片段声明了相同的Servlet,但是有两个不同的元素,并且同样的Servlet也在主要的web.xml中声明,但其没有指定,这样将引发错误。声明式可添加的拥有相同的在web片段中是可添加的。web.xml中指定的重写了web片段中有相同的值拥有相同的整个web片段中是可添加的。web.xml中指定的重写了web片段中有相同的值拥有相同的多个元素被当做单一一个声明来自合并后的web.xml仅当它的所有web片段都标记为,才认为是。顶层和其子元素,和一个web片段中的元素是可忽略的jsp-property-group是可添加的。当在一个jar文件中的META-INF/resources的目录中绑定静态资源文件时,相较于拓展映射,推荐jsp-config元素使用url-pattern.对于一个片段中的更多的JSP资源,应该如同片段名称一样,在子目录中,如果存在的话。这有利于防止web片段的jsp-property-group影响应用程序docroot的jsp文件和防止jsp-property-group影响一个片段内的META-INF/resources的目录的jsp文件。

   h. 对于所有的资源依赖元素(env-entry,ejb-ref,ejb-local-ref,service-ref,resource-ref,resource-env-ref,message-destination-ref,persistence-context-ref和persistence-unit-ref),应用下面的规则:

         如果在一个web 片段中有资源依赖元素,并且在主要的web.xml中没有这个元素,主要的web.xml继承web片段的值。如果这个元素在主要的web.xml和web片段中都有,并且有相同的名字,优先使用web.xml中的值。片段的任何子元素不会结合到主要的web.xml中,除非下面指定的injection-target。例如,如果主要的web.xml和web片段中都声明了相同的元素的,将使用主要的web.xml中的额,无需使用web片段中的任何子元素,除了如下描述的        如果在两个片段中都指定了资源依赖元素,而主要的web.xml中没有指定,并且资源依赖元素的所有的属性和子元素,都是完全相同的,那么这个资源依赖将整合到主要的web.xml中。如果一个资源依赖元素在两个片段中有相同的名字,但在主要的web.xml中没有指定,并且属性和子元素在两个片段中不是同一的,这样会引发一个错误。必须报告这个错误并且应用程序必将部署失败。例如,如果两个web片段声明了相同的元素的一个,但是其中一个的类型指定为javax.sql.DataSource,而另一个指定为JavaMail资源,这就是一个错误并会部署失败。对于web片段中相同名的的资源依赖元素,将整合到主要的web.xml中

  i.  除了上述针对web-fragment.xml的整合规则外,当使用资源依赖注解时,应用下面的规则(@Resource, @Resources, @EJB, @EJBs, @WebServiceRef, @WebServiceRefs, @PersistenceContext,@PersistenceContexts,@PersistenceUnit, and@PersistenceUnits)

     如果一个类应用了一个资源依赖注解,等效于定义一个资源,然而其不等效于定义一个injection-target.这种情况下使用injection-target。

    

    如果一个字段应用了资源依赖注解,其等效于在web.xml中定义了injection-target元素。然而,如果在描述符中没有injection-target元素,那么来自片段中的injection-target仍将按照如上定义一样整合到web.xml中。

   另一方面,如果在主要的web.xml中定义了一个injection-target,并且有相同资源名的资源依赖注解,那么可被认为是覆盖了资源依赖注解。在这样的情况下,因为在描述符中指定了一个injection-target,此时就要应用上述定义的规则,除了重写资源依赖注解的值。

 j.  如果两个web片段中都指定了data-source,但在web.xml中没有指定,并且data-source的所有属性和子元素都是同一的,那么data-source将被整合到web.xml中。如果一个data-source在两个片段中指定了相同名,但在主要的web.xml中没有指定,并且两个片段中的那个属性和子元素没有同一,这样会引发一个错误。这种情形下,必须报告错误并且应用程序必将部署失败。

下面的例子显示了不同情况下的结果

code 例子 8-4

web.xml----没有resource-ref定义

片段1

web-fragment.xml ... com.foo.Bar.class baz 实际的元数据是: .... com.foo.Bar.class baz

 code 例子 8-5 web.xml ...  Fragment 1 web-fragment.xml ... com.foo.Bar.class baz Fragment 2 web-fragment.xml ... com.foo.Bar2.class baz2 实际的元数据是: .... com.foo.Bar.class baz com.foo.Bar2.class baz2 code例子 8-6 web.xml com.foo.Bar3.class baz3 ... Fragment 1 web-fragment.xml com.foo.Bar.class baz Fragment 2 web-fragment.xml xml ... com.foo.Bar2.class baz2 实际的元数据是: com.foo.Bar3.class baz3 com.foo.Bar.class baz com.foo.Bar2.class baz2 ... 片段1和片段2中的将被整合到主要的web.xml中。    k.  如果主web.xml没有指定任何元素,并且web-fragments指定了,那么片段中的将被整合到主web.xml中。然而,如果在主web.xml中至少指定了一个元素,那么片段中的将被覆盖。       l.   如果主web.xml中没有指定任何元素,并且web-fragments有指定的,那么片段中的将被整合到主web.xml中。然而,如果在主web.xml中至少指定了一个,那么片段中的元素将不被覆盖。  m.  在处理web-fragment.xml后,在处理下一个片段前,来自对应片段的注解被处理成这个片段的有效元数据。下面的规则用于处理注解:  n.   借助注解指定的元数据,在描述符中不存在,用于参数化有效的描述符。 在主web.xml或一个web片段中的指定配置优先于注解指定的配置 对于一个Servlet,通过@WebServlet注解定义,借助描述符重写值,描述符中的servlet的名字必须匹配注解指定的servlet的名字(显示地指定或者默认的名字,如果没有通过注解指定)。 通过注解定义的servlets和Filters的Init参数,将在描述符中重写,如果init参数的名字确实匹配了注解指定的名字。Init参数在注解和描述符中是可添加的。 url-patterns,当在描述符中指定了一个给定的servlet的名字重写由注解指定的url模式。 对于借助@WebFilter注解定义的过滤器,通过描述符重写了值,描述符中的过滤器名,必须匹配通过注解指定的过滤器的名字(显示指定或默认名,如果没有通过注解指定的话)。   


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3