Ви завжди можете посилатися на ресурси у вашій програмі безпосередньо за своїм ім'ям JNDI, як налаштовано в контейнері, але якщо ви це зробите, по суті ви вводите в свій код ім'я, яке стосується конкретного контейнера. Це має деякі недоліки, наприклад, якщо ви хочете колись змінити ім’я з якоїсь причини, вам потрібно буде оновити всі посилання у всіх своїх програмах, а потім перевстановити та повторно розмістити їх.
<resource-ref>
вводиться ще один шар непрямості: ви вказуєте ім'я, яке ви хочете використовувати в web.xml , і, залежно від контейнера, надаєте прив'язку у файлі конфігурації, визначеному для контейнера .
Тож ось що відбувається : скажімо, ви хочете знайти java:comp/env/jdbc/primaryDB
ім'я. Контейнер виявляє, що web.xml має <resource-ref>
елемент для jdbc/primaryDB
, тому він буде розглядати конфігурацію конкретної для контейнера, яка містить щось подібне до наступного:
<resource-ref>
<res-ref-name>jdbc/primaryDB</res-ref-name>
<jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>
Нарешті, він повертає об'єкт, зареєстрований під іменем jdbc/PrimaryDBInTheContainer
.
Ідея полягає в тому, що при визначенні ресурсів у web.xml є перевага відокремлення ролі розробника від ролі розгортальника . Іншими словами, як розробник, ви не повинні знати, які саме необхідні ресурси насправді викликаються у виробництві, і, як хлопець, що розгортає додаток, у вас буде приємний список імен, щоб зіставити реальні ресурси.