В спецификации Servlet 3.0 элементы <injection-target> ссылки на ресурс, определенной в файле web-fragment.xml, добавляются в родительский файл web.xml только в том случае, если одноименное определение ссылки на ресурс из web.xml не имеет элементов <injection-target>. В спецификации Servlet 3.1 указано, что все элементы <injection-target> из файлов описания web-fragment.xml добавляются в список элементов <injection-target> одноименной ссылки на ресурс из родительских файлов описания web.xml. Добавление тех целевых объектов, которые ранее исключались из файла web.xml, при использовании компонента Servlet 3.1 может привести к изменению алгоритма работы приложения.
Это правило отмечает элемент <injection-target> в файле web-fragment.xml, если файл web.xml содержит элемент <injection-target> в элементе <resource-ref>, имеющем то же имя, что и элемент <resource-ref> из файла web-fragment.xml.
Приведенные ниже примеры демонстрируют изменение алгоритма работы при использовании файла web.xml в сочетании с файлом web-fragment.xml:
web.xml:
< span class= "XmlElement"> < resource-ref> < /span> < span class= "XmlElement"> < res-ref-name> < /span>ReferenceName< span class="XmlElement"> < /res-ref-name> < /span> < span class= "XmlElement"> < res-type> < /span>javax.sql.DataSource< span class="XmlElement"> < /res-type> < /span> < span class= "XmlElement"> < res-auth> < /span> Container < span class="XmlElement"> < /res-auth> < /span> < span class= "XmlElement"> < res-sharing-scope> < /span> Shareable < span class="XmlElement"> < /res-sharing-scope> < /span> < span class= "XmlElement"> < injection-target> < /span> < span class= "XmlElement"><injection-target-class>Class1 < /injection-target-class> < /span> < span class= "XmlElement"><injection-target-name>Resource1 < /injection-target-name> < /span> < span class= "XmlElement"> < /injection-target> < /span> < span class="XmlElement"> < /resource-ref> < /span>
web-fragment.xml:
< span class= "XmlElement"> < resource-ref> < /span> < span class= "XmlElement"> < res-ref-name> < /span>ReferenceName< span class="XmlElement"> < /res-ref-name> < /span> < span class= "XmlElement"> < res-type> < /span>javax.sql.DataSource< span class="XmlElement"> < /res-type> < /span> < span class= "XmlElement"> < res-auth> < /span> Container < span class="XmlElement"> < /res-auth> < /span> < span class= "XmlElement"> < res-sharing-scope> < /span> Shareable < span class="XmlElement"> < /res-sharing-scope> < /span> < span class= "XmlElement"> < injection-target> < /span> < span class= "XmlElement"><injection-target-class>Class2 < /injection-target-class> < /span> < span class= "XmlElement"><injection-target-name>Resource2 < /injection-target-name> < /span> < span class= "XmlElement"> < /injection-target> < /span> < span class="XmlElement"> < /resource-ref> < /span>
В Servlet 3.0 результат объединения приводит к тому, что целевой объект внедрения для Class2 игнорируется:
< span class= "XmlElement"> < resource-ref> < /span> < span class= "XmlElement"> < res-ref-name> < /span>ReferenceName< span class="XmlElement"> < /res-ref-name> < /span> < span class= "XmlElement"> < res-type> < /span>javax.sql.DataSource< span class="XmlElement"> < /res-type> < /span> < span class= "XmlElement"> < res-auth> < /span> Container < span class="XmlElement"> < /res-auth> < /span> < span class= "XmlElement"> < res-sharing-scope> < /span> Shareable < span class="XmlElement"> < /res-sharing-scope> < /span> < span class= "XmlElement"> < injection-target> < /span> < span class= "XmlElement"><injection-target-class>Class1 < /injection-target-class> < /span> < span class= "XmlElement"><injection-target-name>Resource1 < /injection-target-name> < /span> < span class= "XmlElement"> < /injection-target> < /span> < span class="XmlElement"> < /resource-ref> < /span>
В 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.