Для чого використовується ресурсний ресурс у web.xml?


112

Мені просто цікаво, коли / чому ви б визначили <resource-ref>елемент у своєму web.xmlфайлі?

Я б подумав, що це буде визначено на вашому сервері веб / додатків за допомогою JNDI, а потім шукати посилання JNDI у вашому коді Java?

Визначення ресурсовіддачі мені здається трохи зайвим, і я не можу придумати, коли це може бути корисним. Приклад:

<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>

Відповіді:


156

Ви завжди можете посилатися на ресурси у вашій програмі безпосередньо за своїм ім'ям 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 є перевага відокремлення ролі розробника від ролі розгортальника . Іншими словами, як розробник, ви не повинні знати, які саме необхідні ресурси насправді викликаються у виробництві, і, як хлопець, що розгортає додаток, у вас буде приємний список імен, щоб зіставити реальні ресурси.


6
ІМХО, це виходить за рамки поділу ролей. Ідея полягає в тому, що ви не можете припустити, що ім'я jndi доступне на сервері, тому вам потрібен спосіб зіставити ім'я, яке використовується у вашій програмі, на "справжнє" ім'я JNDI, вибране розгортальником.
Паскаль Тивеннт

3
Це повинно бути елементарним, оскільки я не можу його знайти в Google, але якщо я хочу знайти "java: comp / env / jdbc / PrimaryDB", то чому саме res-ref-ім'я "jdbc / PrimaryDB"?
Торбен

4
Як я знаю, елемент "jndi-name" НЕ є частиною стандартних web.xml, а конкретних дескрипторів розгортання постачальників.
Рамон Кіара

2
@RaviParekh, він згадав "конфігурацію для конкретних контейнерів", це може бути jboss-web.xml або weblogic.xml або будь-який інший файл дескриптора розгортання для конкретного постачальника
abhihello123

1
Чи можемо ми пов’язати це з tomcat? Я маю на увазі джерело даних, визначене у context.xml у tomcat та ресурс-ref у web.xml
Atul
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.