Wofür wird die Ressourcenreferenz in web.xml verwendet?

112

Ich frage mich nur, wann / warum Sie ein <resource-ref>Element in Ihrer web.xmlDatei definieren würden .

Ich hätte gedacht, dass es in Ihrem Web- / App-Server mit JNDI definiert wird und dann die JNDI-Referenz in Ihrem Java-Code nachschlagen würde.

Die Definition der Ressourcenreferenz erscheint mir etwas überflüssig und ich kann mir nicht vorstellen, wann sie nützlich sein könnte. Beispiel:

<resource-ref>
  <description>Primary database</description>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>
JMM
quelle

Antworten:

156

Sie können Ressourcen in Ihrer Anwendung jederzeit direkt anhand ihres im Container konfigurierten JNDI-Namens referenzieren. Wenn Sie dies jedoch tun, verdrahten Sie den container-spezifischen Namen im Wesentlichen in Ihren Code. Dies hat einige Nachteile. Wenn Sie beispielsweise den Namen aus irgendeinem Grund später ändern möchten, müssen Sie alle Referenzen in all Ihren Anwendungen aktualisieren und sie dann neu erstellen und erneut bereitstellen.

<resource-ref>führt eine weitere Indirektionsebene ein: Sie geben den Namen an, den Sie in der Datei web.xml verwenden möchten , und stellen je nach Container eine Bindung in einem Container-spezifischen bereit Datei Konfigurationsdatei .

Folgendes passiert also : Nehmen wir an, Sie möchten den java:comp/env/jdbc/primaryDBNamen nachschlagen . Der Container stellt fest, dass web.xml ein <resource-ref>Element für enthält jdbc/primaryDB, und untersucht daher die container-spezifische Konfiguration, die Folgendes enthält:

<resource-ref>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>

Schließlich wird das unter dem Namen von registrierte Objekt zurückgegeben jdbc/PrimaryDBInTheContainer.

Die Idee ist, dass die Angabe von Ressourcen in der Datei web.xml den Vorteil hat, dass die Entwicklerrolle von der Bereitstellungsrolle getrennt wird . Mit anderen Worten, als Entwickler müssen Sie nicht wissen, wie Ihre erforderlichen Ressourcen in der Produktion tatsächlich genannt werden, und als der Typ, der die Anwendung bereitstellt, haben Sie eine schöne Liste von Namen, die Sie realen Ressourcen zuordnen können.

Candiru
quelle
6
IMHO geht es über die Trennung der Rollen hinaus. Die Idee ist, dass Sie nicht davon ausgehen können, dass ein JNDI-Name auf einem Server verfügbar ist. Daher benötigen Sie eine Möglichkeit, den in Ihrer Anwendung verwendeten Namen dem vom Bereitsteller ausgewählten "echten" JNDI-Namen zuzuordnen.
Pascal Thivent
3
Dies muss elementar sein, da ich es bei Google nicht finden kann. Wenn ich jedoch nach "java: comp / env / jdbc / primaryDB" suchen möchte, warum lautet dann der res-ref-Name "jdbc / primaryDB"?
Torben
4
Soweit ich weiß, ist das Element "jndi-name" NICHT Teil der Standard-Datei web.xml, sondern Teil der Deployment-Deskriptoren bestimmter Anbieter.
Ramon Chiara
2
@ RaviParekh, er hat "container-spezifische Konfiguration" erwähnt, es könnte jboss-web.xml oder weblogic.xml oder eine andere herstellerspezifische Deployment-Deskriptor-Datei sein
abhihello123
1
Können wir das mit Kater in Verbindung bringen? Ich meine Datenquelle definiert in context.xml in Tomcat und Ressourcenreferenz in web.xml
Atul