Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология 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>
Клиентское приложение
В качестве клиентского приложения создадим оконное приложение, при помощи которого можно добавлять новые корабли, удалять уже существующие, а также изменять параметры созданных кораблей.
При запуске в приложение загружаются посредством вызова метода 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?
При нажатии кнопки "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(); } }
Если пользователь ввел корректную цену на корабль, то после нажатия кнопки "Ok" на диалоге, в программе и в базе данных появится новый корабль.
Посредством запроса через SQL*PLUS,проверим, что корабль появился в базе данных (Рис. 4.5).
Если ввести русское название для корабля, то все тоже должно работать (Рис. 4.6).
При выделении ячейки столбца "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(); } }