在 Servlet 3.0 规范中,只有具有同一名称的 web.xml 资源引用定义不含 <injection-target> 元素时,web-fragment.xml 文件中定义的资源引用的 <injection-target> 元素才会添加到父 web.xml 文件中。在 Servlet 3.1 规范中规定:对于名称相同的资源引用,web-fragment.xml 描述符中所有的 <injection-target> 元素均会添加到 <injection-target> 元素的父 web.xml 描述符列表中。Servlet 3.1 功能部件可通过激活先前从 web.xml 文件中排除的注入目标来更改现有应用程序行为。
如果 web.xml 文件在 <resource-ref> 元素(使用与 web-fragment.xml 文件中 <resource-ref> 元素相同的名称进行定义)中包含 <injection-target> 元素,那么此规则将标记 web-fragment.xml 文件中的 <injection-target> 元素。
以下示例说明了使用 web.xml 文件和 web-fragment.xml 文件组合时的行为更改:
web.xml:
<resource-ref> <res-ref-name>ReferenceName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>Class1</injection-target-class> <injection-target-name>Resource1</injection-target-name> </injection-target> </resource-ref>
web-fragment.xml:
<resource-ref> <res-ref-name>ReferenceName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>Class2</injection-target-class> <injection-target-name>Resource2</injection-target-name> </injection-target> </resource-ref>
在 Servlet 3.0 中,组合的结果将忽略 Class2 的注入目标:
<resource-ref> <res-ref-name>ReferenceName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>Class1</injection-target-class> <injection-target-name>Resource1</injection-target-name> </injection-target> </resource-ref>
在 Servlet 3.1 中,组合的结果将使用 Class2 的注入目标:
<resource-ref> <res-ref-name>ReferenceName</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>Class1</injection-target-class> <injection-target-name>Resource1</injection-target-name> </injection-target> <injection-target> <injection-target-class>Class2</injection-target-class> <injection-target-name>Resource2</injection-target-name> </injection-target> </resource-ref>
有关 Servlet 3.1 行为更改的更多信息,请参阅以下资源:Servlet 3.1 behavior changes。