Изучаем Java EE 7 - [124]

Шрифт
Интервал

Контекст именования среды

При работе с корпоративными приложениями возникают ситуации, в которых параметры вашего приложения изменяются от одного развертывания к другому (в зависимости от страны, в которой вы его развертываете, версии приложения и т. д.). Например, в приложении CD-BookStore ItemEJB (листинг 7.19) преобразует цену элемента в стоимость в валюте страны, в которой развернуто приложение (с применением changeRate на основе курса доллара). Если вы решите произвести развертывание этого EJB-компонента где-то в Европе, то вам потребуется умножить цену элемента на 0,80 и изменить валюту на евро.


Листинг 7.19. Сессионный EJB-компонент без сохранения состояния, преобразующий цены

>@Stateless

>public class ItemEJB {

>··public Item convertPrice(Item item) {

>····item.setPrice(item.getPrice() * 0.80F);

>····item.setCurrency("Euros");

>····return item;

>··}

>}

Как вы можете понять, проблема жесткого кодирования этих параметров заключается в том, что вам придется изменить свой код, перекомпилировать его и заново произвести развертывание компонента для каждой страны, в которой валюта будет уже другой. Иной вариант заключается в доступе к базе данных каждый раз, когда вы вызываете метод convertPrice(). Однако это будет расточительством ресурсов. Что вам действительно нужно сделать, так это сохранить соответствующие параметры где-нибудь, чтобы вы смогли изменить их во время развертывания. Дескриптор развертывания — идеальное место для задания этих параметров.

Может, дескриптор развертывания (ejb-jar.xml) и опционален в EJB 3.2, но его допустимо использовать в случае с записями окружения. Они указываются в дескрипторе развертывания и доступны с помощью внедрения зависимостей (или JNDI). Записи окружения поддерживают следующие Java-типы: String, Character, Byte, Short, Integer, Long, Boolean, Double и Float. В листинге 7.20 приведен файл ejb-jar.xml, связанный с ItemEJB, который определяет две записи: currencyEntry типа String со значением Euros и changeRateEntry типа Float со значением 0.80.


Листинг 7.20. Записи окружения ItemEJB в ejb-jar.xml

>

>·········xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

>·········xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 

>·········http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"

>·········version="3.2">

>··

>····

>······ItemEJB

>······

>········currencyEntry

>········java.lang.String

>········Euros

>······

>······

>········changeRateEntry

>········java.lang.Float

>········0.80

>······

>····

>··

>

Теперь, когда параметры приложения располагаются в дескрипторе развертывания, ItemEJB может использовать внедрение зависимостей, чтобы извлечь значение каждой записи окружения. В листинге 7.21 @Resource(name = "currencyEntry") внедряет значение currencyEntry в атрибут currency. Следует отметить, что типы данных записи окружения и внедряемой переменной должны быть совместимыми; в противном случае контейнер сгенерирует исключение.


Листинг 7.21. ItemEJB, использующий записи окружения

>@Stateless

>public class ItemEJB {

>··@Resource(name = "currencyEntry")

>··private String currency;

>··@Resource(name = "changeRateEntry")

>··private Float changeRate;


>··public Item convertPrice(Item item) {

>····item.setPrice(item.getPrice() * changeRate);

>····item.setCurrency(currency);

>····return item;

>··}

>}

Упаковка

Как и большинство компонентов Java EE (сервлеты, JSF-страницы, веб-службы и т. д.), EJB-компоненты необходимо упаковать, прежде чем развертывать их в контейнере времени выполнения. В том же самом архиве обычно будет присутствовать класс корпоративного EJB-компонента, его интерфейсы, любые необходимые суперклассы или суперинтерфейсы, исключения, вспомогательные классы и необязательный дескриптор развертывания (ejb-jar.xml). Упаковав эти артефакты в файл с расширением. jar, вы сможете произвести их развертывание непосредственно в контейнере. Еще один вариант заключается в том, что вы также можете встроить файл с расширением. jar в файл с расширением. ear, а затем произвести его развертывание.

Файл с расширением. ear используется для того, чтобы упаковать один или несколько модулей (EJB-файлов с расширением. jar или веб-приложений) в один архив, благодаря чему развертывание на сервере приложений будет происходить одновременно и согласованно. Например, как показано на рис. 7.7, если вам потребуется произвести развертывание веб-приложения, то, возможно, вы захотите упаковать свои EJB-компоненты и сущности в отдельные файлы с расширением. jar, свои сервлеты — в файл с расширением. war, а затем все это — в файл с расширением. ear. Произведите развертывание EAR-файла на сервере приложений, и вы сможете манипулировать сущностями из сервлета с использованием соответствующего EJB-компонента.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.