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