2016-09-19 4 views
1

Мне нужны некоторые идеи о том, как упростить конфигурацию веб-приложений с Tomcat 7.Упрощая конфигурации web.xml в Tomcat 7

У меня есть веб-приложение, которое использует два ресурсы, определенные в файле конфигурации context.xml Tomcat в: а Mail Session и JDBC Datasource.

<Resource name="mail/MailService" ... 
<Resource name="jdbc/JDBCDatasource" ... 

Для того, чтобы использовать их в веб-приложение, которое я должен объявить две ссылки в дескрипторе развертывания web.xml, указав то же имя:

<resource-ref> 
    <res-ref-name>mail/MailService</res-ref-name> 
    ... 
<resource-ref> 
    <res-ref-name>jdbc/JDBCDatasource</res-ref-name> 
    .... 

Затем в коде приложения, я есть для поиска ресурсов, опять-таки с их именами:

Context ctx = new InitialContext(); 
Session sn = (Session) ctx.lookup("java:comp/env/mail/MailService"); 
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/JDBCDatasource"); 

дело в том, что название ресурсов может быть изменен сисадминов; поэтому я не могу жестко указать имя ресурсов. Я мог бы использовать context-param или что-то подобное, чтобы позволить системным администраторам указать выбранное имя для каждого ресурса, но, учитывая, что я должен использовать часть ref-ref, я бы не хотел указывать одно и то же имя дважды в файле web.xml (один для параметра и другой для ссылки). Дублирование конфигурации напоминает дублирование шансов, которые кто-то допустил ошибку, и я хочу свести к минимуму вероятность неудачных конфигураций.

Я искал в Интернете такие вещи, как переменные в web.xml, но я ничего не нашел .. у кого-то есть идеи об этом?

=== Решение ===

После линий указывал Brett, это то, что я сделал, чтобы избежать дублирования конфигурации:

Во-первых, съехал конфигурацию ресурсов из контекста Tomcat. XML в server.xml Tomcat, в пределах области GlobalNamingResources, с использованием общих имен:

<GlobalNamingResources> 
    ... 
    <Resource name="mail/MailService1" ... 
    <Resource name="jdbc/JDBCDatasource1" ... 
    ... 

Затем я создал два ResourceLink в файле приложения context.xml (обратите внимание не Tomcat один) , Где каждый из ссылок имеет точное название, используемое приложение, и точка, через глобальный атрибут, к ресурсу:

<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/> 
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session" 
    /> 

При том, что ссылки на ресурсы в web.xml в приложения больше не нужны.

Наконец, в исходном коде приложения я изменил поисковую часть, чтобы использовать имена, указанные в context.xml (а не те, которые используются в server.xml):

Context ctx = new InitialContext(); 
Session sn = (Session) ctx.lookup("java:comp/env/mail/MyAppMailService"); 
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyAppJDBCService"); 

С помощью этой установки, администратор отвечает за настройку ресурсов в файле server.xml Tomcat, используя имена, которые он хочет, и разработчику просто нужно сопоставить эти имена с теми, которые используются приложением, просто изменяя контекст приложения context.xml.

Это довольно просто сейчас, но раньше я делал это плохо.

ответ

1

Дело в том, что имя ресурсов может быть изменено системными администраторами; поэтому я не могу жестко указать имя ресурсов

Это неправильно или использует неправильную терминологию. В архитектуре Java EE приложению принадлежит ресурс с ссылкой, а системный администратор должен убедиться, что ссылка на ресурс выполнена. Если для приложения требуется ссылка ресурса с именем mail/MailService, тогда он должен объявить ссылочное имя через <res-ref-name> или @Resource. Затем администратор должен убедиться, что ссылка на ресурс с этим именем удовлетворена, связав его с ресурсом. В Tomcat вы можете либо напрямую declare the resource использовать имя ссылки ресурса, либо вы можете объявить глобальный ресурс с любым именем, а затем link the resource reference для глобального ресурса (на других серверах приложений это «связывание» часто называют «привязкой») ,

+1

Хорошо, я так понимаю. Я попробовал второй вариант. Я сделал следующее: во-первых, я поместил конфигурацию ресурсов в раздел GlobalNamingResources файла server.xml с некоторым «общим» файлом имен и удалил его из контекста Tomcat; то в app.context.xml приложения (в META-INF) я создал два ResourceLink, по одному для каждого ресурса, указав на них, с атрибутом имени, содержащим точное имя, используемое приложением для их захвата, и с глобальным именем содержащий имя ресурса, объявленное в server.xml. Спасибо. –

Смежные вопросы