Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 4. Распределенные компненты EJB 231
32.2. EJB JAR архив
Создание jar-архива, содержащего EJB, не отличается от создания
обычного архива, содержащего другие Java EJB. EJB jar-архив может
содержать как один, так и несколько разработанных EJB. Для создания
jar-архива можно воспользоваться утилитой jar.exe, входящей в поставку стандартного JDK, или воспользоваться инструментами разработки.
EJB JAR-файл используется для пакетирования Enterprise beans. Файл
использует стандартный формат Java-архивов.
JAR-архив, содержащий классы Enterprise bean и известный как
EJB JAR-файл, должен иметь следующие EJB:
Классы для каждого EJB EJB.
•
Дополнительные классы и файлы, необходимые при использовании
•
созданных EJB, например, классы пользовательских исключений,
файлы свойств, классы ресурсов.
Дескриптор Enterprise bean.
•
Файл manifest, описывающий содержание EJB JAR-файла. Мани-
•
фест генерируется самостоятельно при архивировании классов Enterprise bean.
32.3. Установка EJB
Установка EJB осуществляется добавлением в контейнер, в среде ко-
торого Enterprise bean и будут выполняться. Помещение в EJB-контейнер сопровождается дополнительными генерациями служебных объектов. На основе созданных классов Entity bean инструмент разработки
создает два класса: EJBHome и EJBObject, основанные на home- и remote-интерфейсах Enterprise bean. Также автоматически генерируются
заглушки (stub) и скелетон классы используемые, RMI. Enterprise bean
взаимодействует с контейнером тремя различными способами: через
вызываемые методы, при помощи объекта, использующего интерфейс
EJBContext, и через указание объекта, доступ к которому осуществляется посредством Java Naming and Directory Interface (JNDI). Каждый
Enteprice bean реализует несколько методов, наследованных из интерфейса EJB. Все методы вызывают различные события либо в самом
контейнере, либо в жизненном цикле EJB, такие, как активация, подключение к базе данных, включение транзакции и подобные. EJBContext — обязательный объект любого Enteprice bean, через даный объект
Enteprice bean получает информацию о системном окружении в контейнере, Java Naming and Directory Interface (JNDI) представляет собой
стандартное расширение Java, обеспечивая доступ к именованным системам подобной LDAP, обычной файловой системе и т. д. Всякий bean
автоматически получает доступ к именованной системе, называемой
Environment Naming Context (ENC). ENC управляется контейнером для
организации доступа к Java Naming and Directory Interface (JNDI).
JNDI ENC организует доступ к другим источникам посредством JDBC
или другим EJB.
При помещении в контейнер создаются дополнительные элементы,
такие, как заглушки и скелетоны, необходимые при работе RMI, а так-

232 Часть 4. Распределенные компненты EJB
же классы EJBObject и EJBHome из существующих интерфейсов созданного EJB, home- и remote-интерфейсов. При помещении Entity bean в контейнер также создаются классы, использующие методы find() и
содержащие переменные для работы с данными, пользующиеся методами find().
Глава 33. Создание EJB приложения
Разработка Enterprise bean включает ряд требований, необходимых
для создания компонентов. Можно, конечно же, создавать EJB вручную,
используя лишь стандартный JDK, классы и интерфейсы пакета javax.ejb.*; инструмент, поставляемый вместе с J2sdkee и текстовым редактором. Значительно удобнее использовать уже готовые инструменты, интегрированные среды разработки (IDE), например, такие, как Visual Age for Java фирмы IBM или Jbuilder, компании INPRISE.
Основные этапы создания EJB:
1. Объявление и написание кода основного класса EJB. Это и есть ре-
ализация бизнес-логики.
2. Написание remote-интерфейса EJB.
3. Написание home-интерфейса EJB.
4. Компиляция и построение EJB и его клиента.
5. Создание Дескриптора Поставки в каталоге META-INF.
6. Задание класса так называемого Primary Key EJB. Этот класс не-
обходим только при создании Entity-bean, и его имя хранится в дескрипторе.
7. Упаковка EJB.
8. Загрузка EJB в JAR-файл.
9. Запуск приложения-клиента.
Между home- и remote-интерфейсами и классом EJB не существует
никаких формальных отношений, подобных отношению наследования.
Тем не менее спецификация определяет правила, которым должны подчиняться, например, имена методов, объявленных в этих двух интерфейсах и классе. Например, если вы объявили некоторый метод класса
EJB, реализующий часть его функциональности (бизнес-логики), то
точно такой же метод — с тем же именем и такой же сигнатурой —
должен быть объявлен в remote-интерфейсе. Реализация EJB имеет
как минимум один метод с именем ejbCreate(). Она может и иметь несколько методов с таким именем, но различными аргументами. Каждому из таких методов должен быть поставлен в соответствие метод с таким же списком аргументов, но с именем create(). Другое отличие состоит в òîì, ÷òî метод ejbCreate() класса возвращает другой тип
результата по сравнению с методом create() home-интерфейса: create()
возвращает тип remote-интерфейса, а ejbCreate() либо void (в случае
использования сохранения, управляемого контейнером, CMP), либо тип
Primary Key EJB (при использовании сохранения, управляемого Компонентом, BMP).

Часть 4. Распределенные компненты EJB 233
Обратите внимание на то, что метод ejbCreate() имеет свои особенно-
сти при работе с Entity-EJBми. Реализация Entity bean может вообще
не реализовывать метод ejbCreate(). Обычно это происходит, если такие
EJB создаются не по запросу клиента, а автоматически, например, при
добавлении новых записей в базу данных, представлением чего являются Entity bean. Типом возвращаемого значения для метода ejbCreate()
является класс Primary Key EJB. Метод ejbCreate() для Entity bean c
CMP должен возвращать void, для Entity bean BMP — класс Primary
Key. Связь между классом EJB и его home- и remote-интерфейсами
обеспечивает контейнер. Контейнер EJB также гарантирует (либо на
этапе компиляции, либо на этапе выполнения) соответствие между
классом EJB и его remote-интерфейсом. Каждый EJB должен иметь remote-интерфейс. Этот интерфейс содержит методы, определяющие бизнес-логику приложения, к которым обращается его клиент. Класс EJB
предназначен главным образом для реализации этих методов. Имейте в
виду, что клиент не может непосредственно обращаться к методам EJB,
доступ возможен только через remote-интерфейс.
Существуют две стратегии создания EJB(entity bean). Первая стро-
ится на использовании Bean Managed Persistence (BMP). В этом случае
логика описывается через доступ к базе данных, весь необходимый код
по работе с базой данных содержится в entity bean. Другая Container
Managed Persistence (CMP), где доступ к базе данных обрабатывается в
EJB-контейнере, который управляет работой взаимодействия entity bean и базой данных. Поэтому разработка entity bean c помошью CMP
значительно легче.
Создание EJB-приложения, Enterprise bean и EJB-клиента — три
основных этапа, после прохождения которых разработчик получает финансовое поощрение, а заказчик — готовое приложение. EJB-приложение может состоять из одного или нескольких классов session bean, одного или более Entity bean или из разных Enterprise bean. Программно
два основных Enterprise bean очень похожи между собой, но первый
(Entity bean), содержит дополнительный класс — primary key о котором будет сказано ниже.
Home interface обоих Enterprise bean описывают методы жизненного
цикла, а remote interface содержит бизнес-методы EJB.
Взаимодействие клиента с методами EJB осуществляется за счет
вызова методов home- и remote-интерфейсов.
33.1. Создание Entity bean при помощи CMP
Использование специальной методики Container Managed Persistence
(CMP) облегчает создание Entity bean. Разработчику нет необходимости
переопределять методы работы bean с источником данных. При использовании данного способа создания Entity bean на плечи разработчика
ложится только описание бизнес-методов, всем остальным занимается
контейнер. Контейнер определяет взаимодействие между Entity bean и
источником данных. Каждый создаваемый Entity bean должен содержать основные EJB:

234 Часть 4. Распределенные компненты EJB
основной класс EJB;
Home-интерфейс;
Remote-интерфейс;
Primary key класс.
основной класс Entity bean.
В основном классе содержатся бизнес-методы, реализуемые Entity
bean, методы создания экземпляра Entity bean в контейнере, а также
методы, используемые контейнером по работе с Entity bean. Клиент никогда не имеет доступа к бизнес-методам напрямую. Для получения доступа к бизнес-методам используются два специальных интерфейса —
remote и home. Каждый основной класс Entity bean должен отвечать
следующим требованиям:
1. Не должен быть абстрактным, должен использовать интерфейс ja-
vax.ejb.EntityBean.
2. Должен содержать переменные. Переменные, описанные в Entity
bean, могут быть временными, а могут храниться в базе данных. Они не
должны быть статичными, иметь уровень доступа public. Переменные
также не могут быть объявлены как финальными (final). Непостоянные
переменные не хранятся в базе данных и не должны использоваться
клиентом. В дескрипторе содержится описание переменных, используемых в Entity bean. Часто используемой переменной в основном классе
Entity bean переменная, определяющая системное окружение Entity bean, объект класса EntityContext.
3. Описывать бизнес-методы для работы с переменными. Бизнес-ме-
тоды определяют, каким способом вызываются данные из источника
данных и как данные обрабатываются. Бизнес-методы не могут вызываться непосредственно EJB-клиентом, для осуществления вызова служит интерфейс основного класса remote. Каждый бизнес-метод, описанный в основном классе, должен иметь близнеца в интерфейсе remote.
4. Содержать хотя бы один метод ejbCreate(), с помощью которого со-
здается экземпляр в контейнере. Также должен быть описан метод ejbPostCreate() точно с такими же параметрами, как и метод ejbCreate().
Для каждого метода создания экземпляра ejbCreate() обязательно должен существовать метод-близнец ejbPostCreate(). Каждый метод создания ejbCreate() и ejbPostCreate() должен иметь соответствующего близнеца метод create() в home-интерфейсе Entity bean. Подобно бизнес-методам, методы создания не могут вызываться непосредственно из
основного класса, для этого опять же используется интерфейс, только
теперь это home. После успешного выполнения методов создания контейнер создает EJBObject, а данные этого объекта помещаются в базу
данных. Все методы создания описываются с уровнем доступа public, и
они должны инициализировать CMP переменные, контейнер выделяет
эти значения для дальнейшего помещения в источник данных. Методы
создания не возвращают никаких значений, т. е. void. По необходимости
каждый метод создания генерирует java.rmi.RemoteException и javax.ejb.CeateException исключения.
Каждый основной класс Entity bean должен переопределять методы
интерфейса EntityBean.

Часть 4. Распределенные компненты EJB 235
import java.rmi.*;import javax.ejb.*;
public class MyFirstEntityBean implements EntityBean {
public void ejbActivate() throws RemoteException {}
public void ejbCreate() throws CreateException, RemoteException {}
public void ejbPostCreate()CreateException, RemoteException {}
public void ejbCreate(int id, String name) throws CreateException, RemoteException {}
public void ejbPostCreate(int id, String name)CreateException, RemoteException {}
public void ejbLoad() throws RemoteException {}
public void ejbPassivate() throws RemoteException {}
public void ejbRemove() throws RemoteException, RemoveException {}
public void ejbStore() throws RemoteException {}
public void setEntityContext(EntityContext arg1) throws RemoteException {}
public void unsetEntityContext() throws RemoteException {}}
Пример, иллюстрирующий использование методов создания, благо-
даря методу create() создается экземпляр Entity bean без параметров,
строка 4. В строке 6 указывается метод с аргументами int id, String name, используя который контейнер создаст экземпляр с двумя параметрами. Нельзя забывать о дублерах — строки 5, 7.
Создание home-интерфейса
Home-интерфейс описывает методы, используемые клиентом для со-
здания нового экземпляра Entity bean, нахождения или удаления существующего экземпляра из контейнера. Также home-интерфейс содержит методы получения метаданных о Entity bean. Каждый home-интерфейс должен расширяться îò интерфейса javax.ejb.EJBHome.
В создаваемом home-интерфейсе должны быть описаны методы create(), точно с такими же аргументами, какими обладают методы ejbCreate() в основном классе. Методов create() в home-интерфейсе должно
быть ровно столько, сколько соответствующих методов в основном классе. Методы create() home имеют дублеров — методы find(), предназначенные для поиска экземпляра. Методы find() имеют те же аргументы,
что и методы create(). Данный интерфейс содержит ряд методов:
public intrface MyFirstEntityBeanHome extends javax.ejb.EJBHome {
public MyFirstEntity create()throws CreateException, RemoteException {}
public MyFirstEntity create(int id, String name) throws CreateException, RemoteException {}
public MyFirstEntity findByPrimaryKey() {}
public javax.ejb. EJBMetaData getEJBMetaData() throws java.rmi.RemoteException {return null;}
public void remove(Object arg1) throws java.rmi.RemoteException, javax.ejb.
RemoveException {}
public void remove(javax.ejb.Handle arg1) throws java.rmi.RemoteException,
javax.ejb. RemoveException {}}

236 Часть 4. Распределенные компненты EJB
Строки 2, 3 совпадают со строками 4, 6 примера, приведенного выше.
В строке 1 указывается родительский интерфейс и то, что создаваемый
объект является home-интерфейсом.
Метод create() должен именоваться только create и иметь идентич-
ные аргументы, количество и тип аргументов, описанных в методах создания ejbCreate() основного класса. Значение, возвращаемое методом
create(), должно быть типом remote-интерфейса. По необходимости
каждый метод создания генерирует java.rmi.RemoteException и javax.ejb.CeateException исключения.
Метод find() используется для поиска существующего экземпляра
Entity bean, одного или нескольких. Метод обязательно должен начинаться с ключевого слова find с дальнейшим описанием искомого элемента. Метод findByPrimaryKey() организует поиск по первичному ключу.
Каждый home-интерфейс должен содержать минимум один метод findByPrimaryKey(), всегда иметь один аргумент класса Primary Key, одного из основных классов Entity bean. Возвращаемое значение этого класса соответствует типу remote-интерфейса. Каждый другой метод
findXXX() должен отвечать следующим требованиям: должен возвращать тип remote-интерфейса или коллекцию java.util.Enumeration, когда возвращается более чем один объект. В случае необходимости должен вызывать исключения java.rmi.RemoteException, и javax.ejb.FinderException. Ничто не запрещает разработчику создать собственные
методы findXXX(). Каждый EJB-контейнер использует собственный механизм использования метода findByPrimaryKey() для поиска данных.
Однако каждый пользовательский метод findXXX() использует логику,
описанную разработчиком.
Методы, наследуемые из интерфейса javax.ejb.EJBHome:
1. Метод remove() удаляет EJB-объект, идентифицированный обра-
ботчиком.
2. Еще один метод remove (java.lang.Object primaryKey) удаляет объ-
ект с указанным первичных ключом (primary key), используется только
в Entity bean.
3. Для получения клиентом метаданных об Enterprise bean использу-
ется метод getEJBMetaData ().
4. Метод getHomeHandle() возвращает значение обработчика, работа-
ющего с объектом.
Создание remote-интерфейса
Интерфейс remote предназначен для организации доступа клиента к
бизнес-методам основного класса Entity bean. В этом интерфейсе описываются также методы для удаления экземпляра объекта, управления
и работы с объектом primary key. Имя remote должно совпадать с именем основного класса. Родителем данного интерфейса является javax.ejb.EJBObjects. Для каждого бизнес-метода основного класса в remote-интерфейсе разработчиком описываются дублеры. Каждый метод
должен генерировать исключительную ситуацию java.rmi.RemoteException.

Часть 4. Распределенные компненты EJB 237
public interface MyFirstEntity extends javax.ejb.EJBObject {
public javax.ejb.EJBHome getEJBHome() throws java.rmi.RemoteException
{return null;}
public javax.ejb.Handle getHandle() throws java.rmi.RemoteException {return
null;}
public Object getPrimaryKey() throws java.rmi.RemoteException {return null;}
public boolean isIdentical(javax.ejb.EJBObject arg1) throws java.rmi.RemoteException {return false;}
public void remove() throws java.rmi.RemoteException, javax.ejb. RemoveException {}
. // Бизнес методы
}
Методы, наследуемые remote-интерфейсом из родительского интер-
фейса:
1. С помощью метода getEJBHome() можно получить объект home-
интерфейса.
2. Метод getPrimaryKey() предназначен для получения первичного
ключа enterprise иуфт.
3. Удаление Enterprise bean обеспечивается методом remove().
4. Получить обработчик EJB можно используя метод getHandle().
5. Логическое значение метода isIdentical() указывает, идентичен ли
данный объект вызываемому EJB.
Создание класса первичного ключа (primary key)
В контейнере каждый Enterprise bean имеет уникальный идентифи-
кационный номер. Если идентификационные номера двух различных
bean совпадают, то эти Enterprise bean идентичны. Класс первичного
ключа именуется как основной класс добавлением в конце имени ключевого слова key. Класс используется для создания управления первичным ключом. Первичным ключом называется колонка в таблице базы
данных, не имеющая ни одного дублированного элемента. Класс первичного ключа должен быть публичным и серилизованным. Переменные
класса должны иметь уровень доступа public, переменные должны именоваться так же, как переменные в основном классе. Как минимум данный класс должен иметь хотя бы один конструктор.
Создание класса primary key
Класс primary key содержит методы по определению первичного
ключа EJB-объекта. В спецификации указывается, что имя класса primary key должно содержать два элемента: NameKey — основное имя
Enterprise bean и постфикс Key. Кроме того, существуют и другие требования, выполнение которых обязательно при создании класса primary
key. Класс должен иметь уровень доступа public и быть сериализованным объектом. В теле класса должен содержаться хотя бы один конструктор.

238 Часть 4. Распределенные компненты EJB
import java. io.*;
public class AccountKey implements Serializable {
public AccountKey(){};
// какой-либо код}
33.2. Разработка EJB с помощью BMP
В отличие от CMP (Container Managed Persistence), использующего
значения контейнера по умолчанию при работе с EJB, Bean Managed
Persistence (BMP) предназначен для полной передачи пользователю
функции по работе с EJB. BMP очень полезен при необходимости использования других источников информации.
В случае использования способа создания EJB при помощи BMP, en-
tity должны содержать все методы, описывающие взаимодействие между Entity bean и источником данных. Enterprise bean, разрабатываемые
при помощи BMP, должны содержать весь код, обеспечивающий взаимодействие между EJB и источником данных. Использование BMP
оправдано в следующих случаях:
1. Если постоянные данные хранятся больше, чем в одной базе дан-
íûõ.
2. Если постоянные данные хранятся в источнике, не поддерживае-
мом EJB-сервером.
3. Если постоянные данные требуется синхронизировать для различ-
ных источников.
Практически создание EJB с помощью BMP идентично созданию
EJB с помощью CMP. Сам создаваемый Enterprise bean содержит те же
классы и методы, но реализация компонентов происходит по другому
сценарию. Любой Entity bean, созданный с помощью BMP, имеет созданный разработчиком класс primary key class или может использоваться существующий класс. Основной класс Entity bean, содержащий
как бизнес-методы, так и методы управления жизненным циклом bean,
определятся разработчиком. На каждом этапе жизненного цикла, разработчик имеет полное право добавлять необходимые приложению дополнительные методы и переменные. Как и основной класс, bean, разработанный с помощью CMP, bean разрабатываемый при помощи BMP,
имеет имя NameBean, где параметр Name указывает имя enterprise bean. Все требования, предъявляемые при создании enterprise bean в
CMP, также должны соблюдаться и в BMP. Кроме основных методов,
должен описываться код получения соединения и взаимодействия с источником данных. Создается добавочный метод ejbFindByPrimaryKey().
Поскольку предполагается использовать другой источник данных, множество операторов импорта расширяется для включения пакета java.sql.*; предназначенного для работы с базами данных. Данные также
могут быть двух типов: временные, не хранящиеся в базе данных, и постоянные, содержимое базы данных, но отличие соcтоит в том, что постоянные переменные могут иметь уровень доступа private. Временные
переменные не используются в транзакциях, и EJB-клиент может изменять их по своему усмотрению. Они могут быть потеряны при поме-

Часть 4. Распределенные компненты EJB 239
щении Entity bean в пул, когда контейнер вызывает ejbPassive(). Создание метода ejbCreate() с помощью BMP требует других подходов.
В основном в методе ejcCreate() используется код, необходимый для работы с источником данных. Определяются драйверы доступа, описывается интерфейс доступа, указывается имя базы данных и рабочая таблица. Кроме того, могут содержаться дополнительные методы и переменные по идентификации пользователя. Каждый метод ejbCreate(), а
их может быть несколько, должен иметь уровень доступа public и возвращаемое значение класса primary key class. Далее, все аргументы
должны соответствовать правилам использования r Java remote method
invocation (RMI). В методе должны быть описаны средства обновления
базы данных. Каждый ejbPostCreate() должен быть public и возвращать
void, иметь те же аргументы и типы аргументов, как и метод ejbCreate(). По необходимости оба метода и ejbCreate() и ejbPostCreate(), должны вызывать java.rmi.RemoteException и javax.ejb.CreateException исключения, а также javax.ejb.DuplicateKeyException и пользовательские
исключения.
Как минимум, должен быть описан хотя бы один метод ejbFindByPri-
maryKey(), содержащий уникальные значения для каждого Enterprise
bean. Можно описать и ряд других поисковых методов findXXX (). Контейнер вызывает метод find(), для поиска уже существующего Enterprise bean во временном пуле. Метод Find() содержит код для доступа к
базе данных, используя JDBC- и SQL-запрос, выполняющий поиск.
Также в теле метода описываются способы освобождения ресурсов. Если SQL-запрос вернул одну и только одну запись вместо таблицы, как
обычно, метод возвращает значение первичного ключа. Если же в
результате запроса получилась таблица, генерируется исключение FinderException. Прежде чем определять возвращаемое значение, метод
обязательно должен освободить занятые ресурсы.
Основными методами по работе с источником данных являются мето-
ды ejbLoad() и ejbStore(). При создании Enterprise bean с помощью BMP
именно эти методы необходимо перегрузить. Методы ejbLoad() и ejbStore() содержат код сохранения и считывания данных из системной базы
данных. Другими словами, в методах описывается доступ к данным.
Контейнер вызывает методы работы с базой данных в момент обращения клиента для инициализации или по необходимости получения постоянных данных. Метод ejbLoad () обычно вызывается контейнером перед началом транзакции и перед началом вызова бизнес-методов. В методе описываются способы получения данных, используя JDBC API. На
настоящий момент, после принятия стандарта SQLJ, в методе можно
использовать и способы, предоставляемые этой технологией.
1. import java.sql.Connection;
2. public class CustomerBean implements EntityBean {
3. public void ejbLoad() {
4. Connection con;
5. try {Integer primaryKey = (Integer)ejbContext.getPrimaryKey();
6. con = this.getConnection();

240 Часть 4. Распределенные компненты EJB
7. Statement sqlStmt = con.createStatement(«SELECT * FROM Customer» +
«WHERE customerID=»+primaryKey.intValue());
8. ResultSet results = sqlStmt.executeQuery();
9. if (results. next()) {
10. String myName. first = results.getString(«FIRST_NAME»);
11. init myID = results.getInt(«ID»); } }
12. catch (SQLException sqle) {
13. throw new EJBException(sqle); }
14. finally { if (con!=null) con.close(); }
Данный пример иллюстрирует только способ использования BMP
при создании Enterprise bean. Первая строка определяет необходимый
пакет, если его предполагается использовать в приложении JDBC. Для
использования SQLJ потребуются другие операторы импорта. Здесь
опущены все остальные методы, реализуемые интерфейсом EntityBean.
В 3-й строке начинается сам метод ejbLoad(). Здесь также опущены
методы вызова драйвера базы данных и не указана сама база данных.
В 5-й строке создается переменная primaryKey, которой присваивается
значение первичного ключа Enterprise bean. В 7-й строке переменой
sqlStmp присваивается значение запроса. Далее временным полям присваиваются значения результата запроса.
Другой метод по работе с базой данных ejbStore() вызывается кон-
тейнером в конце транзакции. Как и в предыдущем примере, здесь описывается только тело метода ejbStore(), без дополнительных параметров и методов.
1. import java.sql.Connection;
2. public class CustomerBean
implements EntityBean {
3. public void ejbStore() {
4. Connection con;
5. try {
6. Integer primaryKey = (Integer)ejbContext.getPrimaryKey();
7. con = this.getConnection();
8. PreparedStatement sqlPrep =
9. con.prepareStatement(«UPDATE customer set» + first_name = ?, «WHERE
id = ?»);
10. sqlPrep.setString(2, myName.first);
11. sqlPrep.setInt(7, myID.Id);
12. sqlPrep.executeUpdate(); }
13. catch (SQLException sqle) {
14. throw new EJBException(sqle); }
15. finally { if (con!=null) con.close();}
За некоторыми маленькими исключениями, приведенный пример по-
добен первому примеру, описывающему метод ejbLoad (). Только здесь
вместо операции считывания данных используется операция их обнов-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
