Do czego służy odwołanie do zasobu w pliku web.xml?

112

Zastanawiam się tylko, kiedy / dlaczego zdefiniowałbyś <resource-ref>element w swoimweb.xml pliku?

Pomyślałbym, że zostałby zdefiniowany na serwerze sieci Web / aplikacji za pomocą JNDI, a następnie poszukać odniesienia JNDI w kodzie Java?

Definicja odniesienia do zasobu wydaje mi się nieco zbędna i nie mogę wymyślić, kiedy może być przydatna. Przykład:

<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
źródło

Odpowiedzi:

156

Zawsze możesz odwoływać się do zasobów w aplikacji bezpośrednio, używając ich nazwy JNDI skonfigurowanej w kontenerze, ale jeśli to zrobisz, zasadniczo połączysz nazwę kontenera z kodem. Ma to pewne wady, na przykład jeśli z jakiegoś powodu zechcesz później zmienić nazwę, musisz zaktualizować wszystkie odwołania we wszystkich aplikacjach, a następnie ponownie je skompilować i wdrożyć.

<resource-ref>wprowadza kolejną warstwę pośrednią: określasz nazwę, której chcesz użyć w pliku web.xml i, w zależności od kontenera, udostępniasz powiązanie w pliku konfiguracyjnym specyficznym dla kontenera .

Więc oto co się dzieje : powiedzmy, że chcesz odnośnika java:comp/env/jdbc/primaryDBnazwę. Kontener znajdzie, że web.xml zawiera <resource-ref>element dla jdbc/primaryDB, więc zajrzy do konfiguracji specyficznej dla kontenera, która zawiera coś podobnego do następującego:

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

Na koniec zwraca obiekt zarejestrowany pod nazwą jdbc/PrimaryDBInTheContainer .

Pomysł polega na tym, że określenie zasobów w pliku web.xml ma tę zaletę, że oddziela rolę programisty od roli wdrażającego . Innymi słowy, jako programista, nie musisz wiedzieć, jakie zasoby są faktycznie wywoływane w produkcji, a jako osoba wdrażająca aplikację będziesz mieć niezłą listę nazw do odwzorowania na rzeczywiste zasoby.

candiru
źródło
6
IMHO, to wykracza poza rozdzielanie ról. Chodzi o to, że nie można założyć, że nazwa jndi jest dostępna na serwerze, więc potrzebny jest sposób odwzorowania nazwy używanej w aplikacji na „prawdziwą” nazwę JNDI wybraną przez wdrażającego.
Pascal Thivent
3
To musi być elementarne, ponieważ nie mogę go znaleźć w Google, ale jeśli chcę wyszukać „java: comp / env / jdbc / primaryDB”, to dlaczego nazwa ref-res to „jdbc / primaryDB”?
Torben
4
Z tego, co wiem, element „jndi-name” NIE jest częścią standardowego pliku web.xml, ale raczej deskryptorów wdrażania określonych dostawców.
Ramon Chiara
2
@RaviParekh, wspomniał o „konfiguracji specyficznej dla kontenera”, może to być jboss-web.xml lub weblogic.xml lub jakikolwiek inny plik deskryptora wdrożenia specyficzny dla dostawcy
abhihello123
1
Czy możemy to odnieść do kocura? Mam na myśli źródło danych zdefiniowane w context.xml w tomcat i zasób-ref w web.xml
Atul