Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология Enterprise Java Beans. Часть 2
Пример "Модернизированный интернет магазин"
Общее описание
Предыдущий пример с интернет магазином обладал рядом недостатков. В этом примере мы постараемся их исправить при помощи использования объектных компонент CMP.
Создание проекта
В этом примере создание компонент EJB будет тесно связано со встроенными функциями Eclipse-WTP,поэтому создадим сразу EJB проект с названием, например, ShoppingBasketObjectBeans.
При создании проекта подключаем XDoclet (Рис. 4.9).
Работа с XDoclet
Для того чтобы сделать работу с объектными компонентами CMP легче, следует использовать средство XDoclet. XDoclet разрабатывался для поддержки атрибутно-ориентированной парадигмы программирования в различных технологиях платформы Java.Суть работы с XDoclet сводится к тому, что в код добавляются так называемые атрибуты. А затем встроенный генератор XDoclet по этим атрибутам создает либо автоматически сгенерированный код, либо различные вспомогательные файлы (xml,разнообразные файлы конфигураций и проч.). Атрибуты в XDoclet имеют точно такой же вид, как и javadoc комментарии. К примеру, XDoclet атрибут, описывающий объектный компонент Commodities выглядит следующим образом:
<!-- begin-xdoclet-definition --> * @ejb.bean name="Commodities" * jndi-name="Commodities" * type="CMP" * primkey-field="id" * schema="CommoditiesSCHEMA" * cmp-version="2.x" */
Затем XDoclet по этому атрибуту сгенерирует файл ejb.xml, в котором он сразу пропишет все нужные xml-теги,соответствующие описанным в атрибуте параметрам. Это очень удобно иметь сразу перед глазами все параметры компонента EJB,а не заглядывать каждый раз в файл ejb.xml и синхронизировать его с классом компонента.
Полный список возможностей XDoclet доступен на сайте http://xdoclet. sourceforge.net/. Для примера нам понадобится поддержка EJB и JBoss в XDoclet.
Обычно XDoclet устанавливается по умолчанию с Eclipse-WTP.Но если вам попалась урезанная версия Eclipse,или же вы хотите установить другую версию XDoclet,то следует щелкнуть правой кнопкой на EJB -проекте и выбрать раздел Properties.
В разделе XDoclet следует выбрать версию XDoclet (на данный моент поддерживаются три -1.2.1, 1.2.2 и 1.2.3) и указать путь к библиотекам XDoclet.Сами библиотеки можно скачать с сайта http://xdoclet.sourceforge.net/.
Помимо указания пути к библиотекам XDoclet,нужно настроить XDoclet соответствующим образом, для того, чтобы он корректно генерировал файлы описаний для JBoss.В разделе XDoclet отключаем пункт "Use global xdoclet preferences". Раскрываем раздел XDoclet слева и там будет два подраздела - EJBDoclet и WEBDoclet.Выбираем подраздел EJBDoclet.
И теперь включаем поддержку JBoss для нашего проекта (Рис. 4.11).
Создание таблиц в базе данных
Инфологическая модель базы данных не изменилась по сравнению с предыдущим примером (Рис. 4.12). Только названия таблиц переименованы, чтобы не конфликтовать с названиями таблиц из предыдущего примера. Однако SQL-код,создающий таблицы в базе данных претерпел некоторые изменения -
- Во-первых, все поля, кроме первичного ключа перестали быть read-only. Это делает работу с объектными компонентами CMP гораздо более гибкой.
- Во-вторых, теперь больше не нужно создавать пакеты (Package) для хранения только что созданного первичного ключа. Эту работу берет на себя контейнер EJB (в данном случае JBoss).
- В-третьих, триггеры тоже больше не нужны. Теперь контейнер EJB сам генерирует автоматически первичный ключ по данной последовательности (в случае Oracle,для других баз данных используются другие механизмы).
Поэтому теперь SQL -код выглядит следующим образом
drop table COMMODITY_ORDER_ENTITY; drop table COMMODITIES_LIST_ENTITY; drop table ORDERS_ENTITY; create table COMMODITIES_LIST_ENTITY ( ID integer not null, NAME varchar(20) not null, DESCRIPTION varchar(50) not null, PRICE float not null, IMAGEPATH varchar(30), primary key(ID) ); drop sequence COMMODITIES_ENTITY_SEQ; create sequence COMMODITIES_ENTITY_SEQ start with 1 increment by 1 nomaxvalue; create table ORDERS_ENTITY ID integer not null, DATE_CREATED DATE not null, USERNAME varchar(20) not null, primary key(ID) ); drop sequence ORDERS_ENTITY_SEQ; create sequence ORDERS_ENTITY_SEQ start with 1 increment by 1 nomaxvalue; create table COMMODITY_ORDER_ENTITY ( ID integer not null, ORDER_ID integer, COMMODITY_ID integer, QUANTITY integer not null, primary key(ID) ); alter table COMMODITY_ORDER_ENTITY add constraint FK_ORDER_ENTITY foreign key (ORDER_ID) references ORDERS_ENTITY(ID); alter table COMMODITY_ORDER_ENTITY add constraint FK_COMMODITIES_ENTITY foreign key(COMMODITY_ID) references COMMODITIES_LIST_ENTITY(ID); drop sequence COMMODITY_ORDER_ENTITY_SEQ; create sequence COMMODITY_ORDER_ENTITY_SEQ start with 1 increment by 1 nomaxvalue; insert into COMMODITIES_LIST_ENTITY(ID, NAME, DESCRIPTION, PRICE, IMAGEPATH) values(COMMODITIES_ENTITY_SEQ.nextval, 'Kent 1', 'Light cigarettes', 1.99, 'img/kent1.jpg'); insert into COMMODITIES_LIST_ENTITY(ID, NAME, DESCRIPTION, PRICE, IMAGEPATH) values(COMMODITIES_ENTITY_SEQ.nextval, 'Kent 4', 'Light cigarettes', 1.99, 'img/kent4.jpg'); insert into COMMODITIES_LIST_ENTITY(ID, NAME, DESCRIPTION, PRICE, IMAGEPATH) values(COMMODITIES_ENTITY_SEQ.nextval, 'Kent 8', 'Light cigarettes', 1.99, 'img/kent8.jpg');