Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология Enterprise Java Beans. Часть 2
Класс компонента CommoditiesBean
Рассмотрим сгенерированный класс компонента CommoitiesBean.В нем определены атрибуты XDoclet.
/** * <!-- begin-xdoclet-definition --> *@ejb.bean name="CommoditiesList" * jndi-name="CommoditiesList" * type="CMP" * primkey-field="id" * schema="CommoditiesListSCHEMA" * cmp-ersion="2.x" * @ejb.persistence * table-ame="BORIS.COMMODITIES_LIST_ENTITY" * @ejb.finder * query="SELECT OBJECT(a) FROM CommoditiesListSCHEMA as a" * signature="java.util.Collection findAll()" * * @ejb.pk class="java.lang.Integer" * * * <!-- end-xdoclet-definition --> * @generated **/
Первый атрибут - это атрибут @ejb.bean. В нем описываются базовые характеристики объектного компонента:
- Параметр name - имя компонента,
- Параметр jndi-name - jndi -имя, по которому компонент будет доступен,
- Параметр type - тип (CMP),
- Параметр primkey-field - поле, используемое в качестве первичного ключа ( id ),
- Параметр schema - название абстрактной схемы постоянства (необходимо для EJB-QL).
- И параметр cmp-version - версия CMP, в нашем случае это "2.x". С помощью этого параметра можно задать CMP 1.x - для совместимости со старыми EJB -приложениями.
Здесь можно, к примеру, изменить jndi -имя компонента на "SomeStrangeName". После того, как XDoclet отработает (Рис. 4.23), файл jboss.xml примет следующий вид:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss 3 2.dtd"> <jboss> <enterprise-beans> <entity> <ejb-name>Commodities</ejb-name> <jndi-name>SomeStrangeBean</jndi-name> <local-jndi-name>CommoditiesLocal</local-jndi-name> <method-attributes> </method-attributes> </entity> </enterprise-beans> <resource-managers> </resource-managers> </jboss>
Вообще в файле jboss.xml можно задать локальные и удаленные jndi -имена для компонентов. Помимо этого есть раздел <resource-managers>. Его рассмотрение лежит вне пределов данного методического пособия. При помощи него можно расширять возможности JBoss - к примеру, добавить поддержку JavaMail.Клиентское приложение может получить доступ к этому сервису через JNDI и отправлять сообщения по электронной почте. В разделе <method-attributes> можно определить некоторые дополнительные атрибуты для методов данного компонента. Например, такой параметр как <transaction-timeout> - максимальное время выполнения транзакции (по умолчанию все методы компонентов EJB являются транзакциями - подробнее про это в следующем разделе). Следующий атрибут - это атрибут @ejb.persistence. В нем задается имя таблицы, которой соответствует объектный компонент.
Далее идет атрибут @ejb. finder. В этом атрибуте можно задавать параметры поиска одного или нескольких экземпляров компонент при помощи SQL -подобного языка запросов EJB-QL.В данном случае сгенерирован стандартный запрос по выбору всех экземпляров компонента в базе данных (см. аналогичный запрос из предыдущего примера с BMP).Рассмотрим этот запрос - "SELECT OBJECT(a) FROM CommoditiesSCHEMA as a". Он состоит из оператора SELECT, за которым следует выражение OBJECT(a). Это значит, что выбирается непосредственно сам экземпляр компонента (при желании можно выбирать и поля компонента и даже вызывать агрегирующие функции типа суммы, среднего или максимума из наборов полей). Завершается оператор ключевым словом FROM за которым следует имя схемы постоянства (если помните, ей давалось имя при создании компонента).
Абстрактная схема постоянства - это как совокупность всех экземпляров одного компонента. Если приводить аналогию с SQL, то экземпляр компонента - это строка в таблице, а абстрактная схема - вся таблица целиком.
Метод findByPrimaryKey(Object pk) создается для объектного компонента CMP по умолчанию. Его не надо нигде определять.
И последним идет атрибут @ejb.pk. В нем задается класс первичного ключа. Компонент почти готов для работы, однако осталось сделать несколько последних штрихов. Во-первых, в базе данных первичный ключ генерируется автоматически. Это нужно объяснить контейнеру JBoss.Есть несколько способом сделать это, самый простой - это добавить два новых атрибута:
- @jboss.entity-command name = "oracle-sequence". Говорит JBoss о том, что первичный ключ генерируется при помощи последовательности Oracle.
- @jboss.entity-command-attribute name = "sequence" value = "COMMODITIES_ENTITY_SEQ". Тут указываем имя последовательности, при помощи которой генерируется новый первичный ключ.
Ну и напоследок нужно добавить местоположение базы данных, в которой находится таблица. Файл, описывающий доступ к базе данных ( DataSource ) уже был создан и использовался в примере с обменом валют и в примере с BMP.Атрибут @jboss.persistence позволяет указать соответствующий доступ к базе данных для компонента. Полностью атрибут с параметрами выглядит следующим образом:
@jboss.persistence datasource="java:/OracleDS" datasource-mapping="Oracle9i" table-name="BORIS.COMMODITIES_LIST_ENTITY" create-table="false" remove-table="false" alter-table="false"
- Параметр datasource - это jndi -имя источника данных (см. получение DataSource в примере с BMP ).
- Параметр datasource-mapping - это идентификатор типа базы данных. В данном случае - Oracle 9i.В соответствии с этим идентификатором, JBoss,будет формировать запросы к базе данных. Для каждой базы данных эти настройки определены в файле server\default\conf\standardjbosscmp-jdbc.xml установочного каталога JBoss.Менять в этом файле ничего не стоит, а посмотреть можно.
- Параметр table-name - имя таблицы, которой соответствует компонент. JBoss (как и все другие контейнеры EJB) использует свои собственные настройки для описания соответствия компонентов таблицам из базы данных (файл jbosscmp-jdbc.xml ). Формат этого файла таков, что имя таблицы нужно продублировать.
- Параметры create-table, remove-table и alter-table - определяют, может ли компонент создавать, удалять или изменять таблицы. Практической пользы от этих параметров для объектного компонента CMP немного. Скорее всего, он может использоваться при задании аналогичного атрибута для сеансовых компонент.
С заголовком класса компонента Commodities разобрались. Теперь перейдем непосредственно к коду этого класса. Вначале идет create метод без параметров. Для него определен атрибут @ejb.create-method, который должен определяться для всех create методов компонента. У этого атрибута один параметр - view-type. Он определяет, к какому интерфейсу (удаленному или локальному) принадлежит данный метод. Если нам понадобится создать новый экземпляр компонента, то разумно задать для него непосредственно в create методе сразу все необходимые параметры.
/** * @ejb.create-method view-type="remote" */ public Integer ejbCreate() throws CreateException { return null; } public void ejbPostCreate() { }
Модернизируем create метод следующим образом:
/** * @ejb.create-method view-type="remote" */ public Integer ejbCreate(String name, String description, double price, String imagePath) throws CreateException { setName(name); setDescription(description); setPrice(price); setImagepath(imagePath); return null; } public void ejbPostCreate(String name, String description, double price, String imagePath) { }
Теперь для того, чтобы создать компонент Commodities,необходимо передать ему все имя, описание, цену и путь до изображения единицы товара, описываемой этим компонентом. Осталось рассмотреть set и get методы, при помощи которых выполняется получение и изменение полей компонента. Сделаем это на примере поля name. Для этого поля, как и для всех JBoss сгенерировал при создании компонента уже все необходимые атрибуты.
/** * * * <!-- begin-user-doc --> * CMP Field name * * Returns the name * @return the name * * <!-- end-user-doc -- > * * <!-- begin-xdoclet-definition --> * * @ejb.persistent-field * @ejb.persistence * column-name="NAME" * jdbc-type="VARCHAR" * sql-type="VARCHAR2" * read-only="false" * * * @ejb.interface-method * * <!-- end-xdoclet-definition -- > * @generated */ public abstract java.lang.String getName(); /** * <!-- begin-user-doc -- > * Sets the name * * @param java.lang.String the new name value * <!-- end-user-doc -- > * * <!-- begin-xdoclet-definition -- > * @ejb.interface-method * <!-- end-xdoclet-definition -- > * @generated * / public abstract void setName(java.lang.String name);
Как у set метода, так и у get метода определен атрибут @ejb.interface-method.