Опубликован: 18.03.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Технология Enterprise Java Beans. Часть 2

Десприптор развертывания

Дескриптор развертывания объектного компонента приведен ниже. В нем определяются, как и в сеансовых компонентах, описание компонента, имя, домашний и удаленный интерфейсы, и класс компонента.

  • В элементе <persistence-type> описывается тип постоянства - значение "Bean" означает, что постоянством управляет компонент, а значение "Container" - то, что пространством управляет контейнер.
  • В элементе <prim-key-class> определен класс первичного ключа. В данном случае это класс Integer. Первичный ключ компонента может состоять из нескольких полей, в этом случае в качестве первичного ключа должен выступать определенный пользователем сериализуемый класс, с полями, соответствующими полям первичного ключа в базе данных.
  • Элемент <reentrant> определяет, разрешены ли повторые вхождения в методы экземпляра компонента. То есть если вдруг пришли два вызова методов компонента на один и тот же экземпляр компонента одновременно. Если значение "true", то они оба одноврменно будут выполнять соответствующие методы компонента, если же значение "false", то тогда одному вызову придется подождать.
<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar id="ejb-jar ID" version="2.1"
xmlns = "http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">

<display-name>SpaceShipBean</display-name>

<enterprise-beans>

<entity>
<description>
The bean demonstrating space ships </description>
<ejb-name>WidgetBean</ejb-name> 
<home>spaceShip.WidgetHome</home> 
<remote>spaceShip.WidgetRemote</remote> 
<ejb-class>spaceShip.WidgetBean</ejb-class> 
<persistence-type>Bean</persistence-type> 
<prim-key-class>java.lang.Integer</prim-key-class> 
<reentrant>false</reentrant> </entity> 
</enterprise-beans> </ejb-jar>
Клиентское приложение

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

Внешний вид приложения

Рис. 4.2. Внешний вид приложения

При запуске в приложение загружаются посредством вызова метода Collection findAll () домашнего интерфейса все имеющиеся в наличии корабли (Рис. 4.2). Получение коллекции из всех элементов, а также операции с удаленными интерфейсами компонента WidgetBean выделены жирным шрифтом.

Collection col = home.findAll();model = new DefaultTableModel();
model.addColumn("ID");
model.addColumn("Description");
model.addColumn("Price");
model.addColumn("Delete");
// Обрабатываем список из всех кораблей в базе данных
for   (Iterator iter = col.iterator();  iter.hasNext();)   {
WidgetRemote remote =  (WidgetRemote)   iter.next();
model.addRow(new Object []{remote.getId(),
remote.getDescription(),
remote.getPrice(),   "Delete?
Добавление нового корабля

Рис. 4.3. Добавление нового корабля

При нажатии кнопки "Add" возникает новый диалог, при помощи которого можно создать новый космический корабль. Вызов метода, создающего новый экземпляр компонента выделен жирным шрифтом.

int result = JOptionPane.showOptionDialog
	(table, new JScrollPane(panel), "Add new widget", 
		JOptionPane.OK_CANCEL_OPTION,   JOptionPane.PLAIN_MESSAGE, null,  null,  null);

if (result == JOptionPane.OK_OPTION) 
{ 
try 
	{
	double price = Double.parseDouble(priceField.getText()); 
	String description = descrField.getText(); 
	home.create(description, price);
	loadElements();
	table.invalidate(); 
	}   
catch   (NumberFormatException ex)   
	{
	ex.printStackTrace(); 
	}   
catch   (RemoteException ex)   
	{
	ex.printStackTrace(); 
	}   
catch   (CreateException ex)   
	{
	ex.printStackTrace();
	}
}
Станция "Мир" появилась на складе

Рис. 4.4. Станция "Мир" появилась на складе

Если пользователь ввел корректную цену на корабль, то после нажатия кнопки "Ok" на диалоге, в программе и в базе данных появится новый корабль.

Новый корабль в базе данных

Рис. 4.5. Новый корабль в базе данных

Посредством запроса через SQL*PLUS,проверим, что корабль появился в базе данных (Рис. 4.5).

Поддержим отечественного производителя! Русские названия тоже работают

Рис. 4.6. Поддержим отечественного производителя! Русские названия тоже работают

Если ввести русское название для корабля, то все тоже должно работать (Рис. 4.6).

Удалим ненужный корабль

Рис. 4.7. Удалим ненужный корабль

При выделении ячейки столбца "Delete" появляется кнопка "Yes". Нажав ее можно удалить корабль. В Удаление производится посредством метода remove (Object primaryKey) домашнего интерфейса компонента.

Integer id =   (Integer)   table.getModel().getValueAt(row,   0);
if   (id.intValue()   > 0)   
{
try 
	{
	home.remove(id);
	loadElements();
	table.invalidate();
	}   
catch   (RemoteException e)   
	{
	e.printStackTrace();
	}   
catch   (RemoveException e)   
	{
	e.printStackTrace();
	}
}
Изменение цены корабля

Рис. 4.8. Изменение цены корабля
Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"

Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург
Ольга Малых
Ольга Малых
Россия, Казань, Университет управления "ТИСБИ"