Dans la spécification Servlet 3.0, les éléments <injection-target> d'une référence de ressource définie dans un fichier web-fragment.xml ne sont ajoutés au fichier web.xml parent que si la définition de référence de la ressource web.xml portant le même nom ne comporte pas d'éléments <injection-target>. La spécification Servlet 3.1 clarifie que pour une référence de ressource portant le même nom, tous les éléments <injection-target> dans les descripteurs web-fragment.xml sont ajoutés à la liste des descripteurs web.xml parents des éléments <injection-target>. La fonction Servlet 3.1 peut modifier le comportement d'une application existante en activant les cibles d'injection exlues précédemment dans le fichier web.xml.
Cette règle marque l'élément <injection-target> dans le fichier web-fragment.xml si le fichier web.xml contient un élément <injection-target> dans un élément <resource-ref> défini avec le même nom que l'élément <resource-ref> dans le fichier web-fragment.xml.
Les exemples ci-dessous démontrent le changement de comportement lorsque vous utilisez une combinaison d'un fichier web.xml et d'un fichier 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> |
Dans Servlet 3.0, le résultat combiné ignore la cible d'injection pour 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> |
Dans Servlet 3.1, le résultat combiné utilise la cible d'injection pour 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> |
Pour plus d'informations sur les changements de comportement dans Servlet 3.1, voir la ressource suivante : Changements de comportement dans Servlet 3.1.