Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 4. Распределенные компненты EJB 241
ления, 9. Здесь также отсутствуют сведения о базе данных и используе­мом драйвере доступа.
Оба метода ejbLoad() и ejbStore() используют другие методы для по-
лучения сведений о базе данных. Сведения об источнике данных хра­нятся в дескрипторе, и сведения из дескриптора можно получить, ис­пользуя InitialContext.
Существует еще один метод, работающий с базой данных ejbRemo-
ve(), удаляющий запись из таблицы. Тело метода практически не отли­чается от тел других методов управления данными, за исключением SQL-оператора. В методе ejbRemove() это будет DELETE FROM tbl WHERE id = «xx»
Кроме основных методов по работе с постоянными данными, сущест-
âóþò пользовательские методы findXXX(). Äëÿ каждого метода findXXX(), описанного в home-интерфейсе, обязательно должен суще­ствовать метод-близнец в основном классе Enterprise bean. В отличие от своих системных коллег, методы find XXX() работают с конкретным SQL-запросом по поиску определенных постоянных данных.
Создание home-интерфейса с использованием BMP. Все, что использовалось для создания home с помощью CMP, пригод-
но и для создания с помощью BMP.
33.3. Создание Session bean
Создание session bean практически ничем не отличается от создания
Entity bean, за исключением некоторых деталей, присущих только ses­sion bean. Во-первых, в session bean не определен класс первичного ключа, во-вторых, в home-интерфейсе отсутствуют любые поисковые методы find(). Каждый session bean состоит из трех основных частей:
основной класс EJB;
Home-интерфейс;
Remote-интерфейс.
Session bean работает с бизнес-методами, описанными в основном
классе EJB. Используя эти классы, контейнер информирует session be­an о различных событиях, создает экземпляр bean.
Создание основного класса отвечает следующим требованиям: реали-
зовывать все бизнес-методы, описанные в основном классе Entity bean; в классе должны существовать методы создания ejbCreate(); класс дол­жен иметь уровень доступа public и не быть абстрактным; родителем класса выступает интерфейс javax.ejb.SessionBean.
Как уже указывалось, session bean может находиться в одном из
двух состояний stateful stateless, в зависимости от того, в каком состоя­нии находится session bean.
Создание основного класса session bean должно отвечать следующим
требованиям:
1. Создаваемый класс должен иметь уровень доступа public и реали-
зовывать интерфейс javax.ejb.SessionBean.
2. Он должен определять и использовать бизнес-методы. Реализация
бизнес-методов в session bean определяет способы, которыми клиент
242 Часть 4. Распределенные компненты EJB
может работать с Enterprise bean. Все бизнес-методы создаются в основном классе EJB и не предоставляют возможности прямого доступа клиента. Клиент обращается к бизнес-методам, используя дублирую­щие методы, описанные в интерфейсе remote, принадлежащего session bean. Каждый-бизнес метод, описанный в основном классе Enterprise bean, описывается в remote интерфейсе.
3. Обязательно создание ejbCreate() метода для каждого вызываемо-
го экземпляра enterprice bean. В состоянии stateless session bean имеет только один метод ejbCreate() без аргументов и ничего не возвращаю­щий. В другом состоянии session bean имеет несколько различных ме­тодов ejbCreate(). В отличие от Entity bean, не имеет в home-интер­фейсе дублирующих методов ejbPostCreate(). Каждый ejbCreate() метод должен быть описан в EJB-классе. Как и бизнес-методы, ejbCreate () метод не может вызываться непосредственно клиентом. Для осуществ­ления вызова, а в дальнейшем и создания экземпляра класса, контей­нером вызывается «брат близнец» из home-интерефейса. После успеш­ного завершения метода ejbCreate() будет создан экземпляр Enterprise bean.
Каждый метод ejbCreate() должен отвечать следующим требованиям: а. Обязательно возвращать пустое значение, быть void. б. Может содержать код и множество значений, необходимых для
EJB-объектов.
В момент создания Enterprise bean определяет системное окружение,
в котором будет выполняться. Для получения системных значений испо­льзуется объект InitialContext. класса javax.naming.Context. После созда­ния объекта методом ejbCreate() объект класса InitialContext добавляет в системное окружение два значения, необходимых для дальнейших пре­образований. Первый параметр javax.naming.Context. PROVIDER _URL описывает константу — определяющий адрес выполнения. Другой пара­метр — javax.naming.Context. INITIAL_CONTEXT_FACTORY также описывает константу, указывающую имя системного свойства. Перемен­ные описываются в дескрипторе, и разработчик должен самостоятельно определить методы получения переменных из дескриптора. В примере, описанном ниже, содержатся основные методы session bean:
1. import java.rmi.*;
2. import java.util.*;
3. import javax.ejb.*;
4. import javax.naming.*;
5. public class testSessionBean implements SessionBean {
6. public java.util.Properties env;
7. private java.lang.String INITIAL_URL = «javax.naming.Context.PROVIDER_ URL»;
8. public java.lang.String INITIAL_SYSPROP = «javax.naming.Context. INITIAL_CONTEXT_FACTORY»;
9. private javax.naming. InitialContext InitialContext;
10. private SessionContext SessionCtx = null;
11. public testSessionBean() { super(); }
12. public void ejbActivate() throws EJBException, RemoteException {}
Часть 4. Распределенные компненты EJB 243
13. public void ejbCreate() throws java.rmi.RemoteException {
14. env=System.getProperties();
15. env.put(INITIAL_URL, getProviderUrl());
16. env.put(INITIAL_SYSPROP, getNamingFactory());
17. InitialContext=new InitialContext(env);}
18. public void ejbPassivate() throws EJBException, RemoteException {}
19. public void ejbRemove() throws EJBException, RemoteException {}
20. public void setSessionContext(SessionContext arg1) throws EJBException, RemoteException {sessionCtx=arg1;}
21. private String getProviderUrl(){String _sc=SessionCtx. getEnvironment(). getProperty(INITIAL_URL); return _sc;}}
Практически приведен готовый session bean без реализации бизнес-
методов. Операторы импорта описывают пакеты, наиболее часто испо­льзуемые при создании ejb session bean, это первые четыре строки — 1, 2, 3, 4. Создаваемый класс наследуется от интерфейса javax.ejb.Session­Bean. Именно в данном интерфейсе описаны все методы представлен­ной программы, за исключением метода ejbCreate() и пары методов по­лучения системных параметров из дескриптора. Именно два поля INITIAL_URL и INITIAL_SYSPROP (строки 7, 8) описывают перемен­ные, содержащиеся в дескрипторе, и являются частью системного окру­жения. Доступ к полям, прописанным в дескрипторе, осуществляется при использовании метода getEvironment() объекта SessionContext. Зна­чение, возвращаемое этим методом, указывает на специальную пере­менную, описанную в системном окружении, дополненном параметром INITIAL_URL. Попробуем еще раз. Итак, в системное окружение до­бавляется пара с именем INITIAL_URL и значением, полученным из дескриптора при помощи метода getEnvironment(). Из полученного объ­екта при помощи метода getProperty() получается необходимое значе­ние. Описание только что сказанного можно пронаблюдать в строке 21, в которой описан сам метод. Строка 15 содержит вызов метода. Все вы­шесказанное относится и к переменной INITIAL_SYSPROP, строка 8. Создание метода getNamingFactory() остается неописанным специально для пытливых. Вызов метода в строке 16 возвращает значение систем­ной переменной INITIAL_SYSPROP. Все остальные методы описаны в родительском интерфейсе SessionBean. Очень интересным здесь явля­ется создание нового объекта класса InitialContext, строка 17, очень ча­сто он забывается или создается с параметрами по умолчанию. Потом возникают трудности. После создания объекта InitialContext метод ejb­Create(), используя специальную технологию JNDI, проводит поиск в дескрипторе значения, имеющего имя EJB, указанное в методе ejbCrea­te(). Объект InitialContext является мостом между приложением и деск­риптором. Используя методы данного объекта, Enterprise bean получает доступ к переменным, описанным в дескрипторе. Все методы, описан­ные в интерфейсе, должны переопределяться в каждом Session bean. Часть методов не имеет тела, поскольку в этом отсутствует явная необ­ходимость.
244 Часть 4. Распределенные компненты EJB
Создание session home-интерфейс
Home-интерфейс содержит методы создания и удаления экземпляра
session bean и получении метаданных о самом Enterprise bean. Доступ к home-интерфейсу осуществляется при помощи технологии JNDI. В спе­цификации рекомендуется именовать создаваемый Home-интерфейс, используя имя основного класса с окончанием Home.
Каждый Session bean home-интерфейс должен отвечать следующим
требованиям:
интерфейс должен расширяется от javax.ejb.EJBHome интерфейса; у каждого метода, описанного в home интерфейсе должен быть кор-
респондирующий метод в Ejb классе;
параметры возвращаемые в каждом методе должны быть верными
при использовании RMI;
обрабатывать исключения java.rmi.RemoteException import javax.ejb.*; public class MyFirsthome implements EJBHome { public EJBMetaData getEJBMetaData() throws java.rmi.RemoteExcep-
tion {return null;}
public HomeHandle getHomeHandle() throws java.rmi.RemoteExcepti-
on {return null;}
public void remove(Object arg1) throws java.rmi.RemoteException, Re-
moveException {}
public void remove(Handle arg1) throws java.rmi.RemoteException, Re-
moveException {}}
Session Bean может находиться в одном из двух состояний, «полный»
может иметь несколько методов ejbCreate(), в то же время «несостояте­льный « описывает только один такой метод.
33.4. Создание EJB клиента
Все для клиента. Но прежде чем клиент сможет воспользоваться
предоставляемыми услугами, ему необходимо совершить ряд последо­вательных действий. Первое, что должно выполнить клиентское прило­жение — это получить доступ к home-интерфейсу для основного клас-
Рис. 4.6. Структура клиентского запроса EJB
Часть 4. Распределенные компненты EJB 245
са. Далее необходимо получить ссылку на remote-интерфейс. Для этого используются методы home-интерфейса. Создать Session bean, либо со­здать или найти Entity bean. И, наконец, вызвать те или иные бизнес­методы EJB. Клиент не может обращаться непосредственно к методам собственно EJB. Вместо этого он вызывает методы его remote-интер­фейса. Последовательно описанные выше действия программно описы­ваются следующим образом.
Обращение к home-интерфейсу. Делается это с помощью вызова ме-
тодов JNDI API. Клиент создает контекст имен JNDI, а затем использу­ет его метод lookup для поиска home-интерфейса для sample (рис. 4.6):
public class SampleClient { ...
1. public static void main(String[] args) throws Exception {
2. javax.naming.Context context = new javax.naming.InitialContext();
3. Object objref = (SampleHome) context.lookup(«sample»);
4. SampleHome home = (SampleHome) javax.rmi.PortableRemoteObject.nar­row(objref, SampleHome.class);
В данном примере клиентом является стандартное приложение, о
чем говорит метод main(), 1-я строка, в теле которого и происходит об­ращение и инициализация home-инерфейса. Для других клиентов иниа­лизация проводилась бы в других методах. Во 2-й строке создается объект context. В начале клиент должен получить базовый контекст службы имен (initial naming context). В программе создается новый объ­ект типа javax.naming.Context, который в примере называется context. После этого клиент вызывает его метод lookup() для получения ссылки на home-интерфейс.
Сейчас, после получения home-интерфейса EJB, можно получить
ссылку на его remote-интерфейс. Именно 4-я строка занимается обра­щением к remote-интерфейсу. Для этого необходимо использовать crea­te- или find-методы home-интерфейса — 5-я строка. Какой именно ме­тод нужно использовать, зависит от вида EJB, session или Entity и того, какие методы для EJB предусмотрел его разработчик.
При работе с session EJB клиент получает ссылку на remote-интер-
фейс session EJB с помощью вызова одного из create-методов их home­интерфейсов. Все Session bean должны определять как минимум один метод create(). Session без состояния (stateless) должен иметь только один метод с таким именем, причем метод не может иметь аргументов. Session bean с состоянием (stateful) может иметь один метод create() и еще несколько таких методов дополнительно, с различными аргумента­ми. Если метод create() получает аргументы, их значения используются для инициализации создаваемого экземпляра EJB. Базовый метод crea­te() не имеет аргументов. Напрашивается один маленький вывод: session bean всегда только создаются заново, в отличие от Entity bean, экземп­ляр которого можно найти в контейнере. Для поиска клиент вызывает предназначенные для этого методы find(), подобно тому, как это проис­ходит с поиском нужной записи в СУБД. Это подразумевает, что find­методы выполняют поиск экземпляров EJB, чьи данные уже помещены
246 Часть 4. Распределенные компненты EJB
в хранилище данных. Эти данные могут быть добавлены как с помощью Entity bean, так и с помощью других инструментов, не имеющих отно­шения к EJB, например, непосредственно средств управления данной базой данных или, в случае унаследованных (legasy) систем, данные уже существуют перед инсталляцией контейнера EJB. Для создания экземп­ляра EJB с помещением его состояния в сопоставленную с ним БД кли­ент вызывает метод create(). Для инициализации внутренних перемен­ных Entity bean используются аргументы метода create(). Этот метод всегда возвращает ссылку на remote-интерфейс, хотя соответствующий ему метод ejbCreate() возвращает ключ (primary key) экземпляра.
Основным методом поиска Entity bean является метод findByPrima-
ryKey(), который выполняет поиск по значению первичного ключа. Ме­тод findByPrimaryKey() должен быть реализован для каждого Entity bean. Тип единственного аргумента — primaryKey — представляет со­бой класс, объявленный в дескрипторе. Этот тип должен соответство­вать ограничениям RMI-IIOP и может являться как стандартным клас­сом Java, так и классом, созданным разработчиком. Entity bean сущест­вует, пока существуют сопоставленные с ним данные в БД. Время жизни такого EJB не ограничено временем сеанса связи с клиентом. Эк­земпляр Entity bean может быть уничтожен с помощью вызова одного из методов remove() — эти методы уничтожают компонент и удаляют сопоставленную с ним информацию из базы данных. Существуют и другие способы удаления Entity bean, например, с помощью средств си­стемы управления базой данных или унаследованной системой.
Все Enterprise bean доступны для следующих типов EJB клиентов:
1. Java servlets.
2. Java Server Pages (JSP).
3. Java-приложений, использующих для взаимодействия RMI.
4. Других Enterprise beans. Доступ и манипуляция над Enterprise bean должны осуществлять
EJB-клиенты, отвечающие некоторым требованиям:
1. Все клиенты должны уметь работать с RMI, в приложение необхо-
димо импортировать пакет по работе с RMI.
2. Для получения информации о EJB-объекте приложение использу-
åò JNDI API.
Обработку неправильных объектов описывают session bean, а не кли-
ентское приложение, как это часто бывает.
Приложение-клиент должно самостоятельно удалять session bean. Чтобы EJB-клиент был состоятельным клиентом, он должен иметь
несколько классов, обеспечивающих плодотворное взаимодействие с Enterprise bean. «Джентельментский» набор EJB-клиента. Здесь можно говорить о динамическом клиенте (servlet, JSP, приложение), если брать Web-клиента, точнее, HTML-страницу, то обращение из страни­цы должно проходить одного из динамических EJB клиентов.
1. Пакет java.rmi — это основной пакет для обеспечения связи.
2. Пакет-дублер javax.rmi с расширенными возможностями содержит
один замечательный объект класса PortableRemoteObject, предназна­ченный для получения свойств EJB.
Часть 4. Распределенные компненты EJB 247
3. Количество утилит в java.util способно удовлетворить любое самое
взыскательное приложение.
4. Пакет javax.ejb совершенно необходим в создании Enterprise bean. Создать приложение хорошо, но его же надо еще и назвать. Для этой
сложной операции используются классы пакета javax.naming. Если с импортом разобрались, остается еще один немаловажный предмет об­суждения — получение ссылки на используемый Enterprise bean. Кли­ент может использовать как методы создания session bean, так и мето­ды findXXX()entity bean. Прежде чем вызвать бизнес-методы Enterpri­se bean, клиент обязан создать новый или найти уже существующий экземпляр EJB. Проделать эту операцию можно в два этапа.
Во-первых, EJB-клиент должен обратиться к EJB-серверу для поис-
ка нужного bean. Обращаясь к методу ejbCreate(), описанному в home­интерфейсе, создается объект с заданными параметрами, а их, т. е. па­раметров, а значит, и методов может быть несколько. JNDI использует­ся для нахождения имени EJB. Свойства, вызываемые EJB-клиентом для инициализации и поиска нужного объекта, отличаются в различных EJB-серверах. Поэтому рекомендуется использовать файлы свойств или классы ресурсов для свободного перемещения EJB между EJB-сер­верами, поставляемыми различными производителями. При инициали­зации используются переменные, описанные в дескрипторе javax.na­ming.Context.PROVIDER_URL, свойство, указывающие имя хоста, но­мер порта, используемого клиентом. Данные указываются в следующем формате:
iiop://hostname:port, где hostname — IP-адрес или имя машины, на
которой установлен Web-сервер с EJB-сервером, port — номер порта, используемый сервером. Если указать iiop:///, клиент будет искать сервер на локальной машине. Другая переменная javax.naming.Con­text.INITIAL_CONTEXT_FACTORY, определяет имя сервиса доступа, используемого клиентом.
Во-вторых, клиент организует доступ к EJB-объекту при помощи
методов класса InitialContext. Клиент получает ссылку на home-интер­фейс с помощью JNDI. Вначале клиент должен получить базовый кон­текст службы имен (initial naming context). В программе создается но­вый объект типа javax.naming.Context, который в примере называется initcontext.
1. private InitialContext InitContext = null;
2. private ResourceBundle bundle = ResourceBundle.getBundle(
3. «com.rrlabs.ejb.sample.ResourceBundle»);
4. private String nameService = null;
5. private String accountName = null;
6. private String providerUrl = null;
7. if (InitContext == null) {
8. try {Properties properties = new Properties();
9. properties.put(javax.naming.Context.PROVIDER_URL,
10. bundle.getString(«providerUrl»));
11. properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
12. bundle.getString(«nameService»));
248 Часть 4. Распределенные компненты EJB
13. InitContext = new InitialContext(properties);}
14. java.lang.Object homeObject = InitContext.lookup(bundle.getString(«trans­ferName»));
15. transferHome = (TransferHome)javax.rmi.PortableRemoteObject.narrow ((org.omg.CORBA.Object) homeObject, TransferHome.class);}
После того как был создан объект InitialContext, обращаться к нему
можно на всем протяжении клиентской сессии. Далее используется стандартная операция поиска необходимого объекта при помощи метода looкup () объекта InitialContext. После этого клиент вызывает его метод lookup() для получения ссылки на home-интерфейс. Метод lookup() кон­текста возвращает объект типа java.lang.Object. Методу lookup() переда­ется имя remote-интерфейса («transferName»). Заметьте, что программа пробует преобразовать результат вызова метода к типу transferHome, т. е. типу home-интерфейса. По окончании успешного поиска приходит операция получения самого объекта при помощи метода javax.rmi. Por­tableRemoteObject.narrow(). После получения ссылки на интерфейс transferHome клиент может вызвать его метод create() для получения ссылки на remote-интерфейс. Получив эту ссылку, клиент может вызы­вать его методы. На самом деле remote-интерфейс перенаправляет вы­зовы клиента собственно EJB.
После всего вышесказанного о EJB-клиенте, можно подвести малень-
кий итог того, что должен сделать клиент для получения данных, нахо­дящихся на EJB-сервере. Независимо от типа клиента, стандартными операциями считаются следующие пять этапов:
1. Поиск home-объекта.
2. Определение home-объекта.
3. Создание SessionBean экземпляра.
4. Вызов методов.
5. Удаление SessionBean экземпляра. В распространенной практике принято первые два этапа прописы-
вать в инициализационных методах приложения, а удаление экземпля­ра описывать в методах освобождения ресурсов destoy() или finally(). Создание экземпляра и вызовы метода распределяются по телу про­граммы в зависимости от типа клиента. Поскольку не все приложения поддерживают многопоточность, и не все servlet работают с потоками, то о создании экземпляра и вызове методов можно говорить достаточно долго, и как это сделать, каждый решает самостоятельно.
ЧАСТЬ 5. РАБОТА С БАЗАМИ ДАННЫХ ПРИ ПОМОЩИ
ЧАСТЬ 5. РАБОТА С БАЗАМИ ДАННЫХ ПРИ ПОМОЩИ
ЯЗЫКА ПРОГРАММИРОВАНИЯ JAVA
Обрабатываемые данные в компьютерном мире хранятся в различ-
ном виде. Самым распространенным видом хранения является файл и файловая система, описывающая работу с файлом. Другой способ хра­нения и обработки информации, — система управления базами данных (СУБД). Информация, хранящаяся в СУБД, так же как и файловая сис­тема строго структурирована и в некоторых случаях использует те же алгоритмы поиска и обработки, что и файловая система. Сама СУБД, просто система, свод правил и набор механизмов, обеспечивающих до­ступ к данным, хранящимся в базе данных. СУБД и база данных в боль­шинстве литературных источников по данной тематике не разделяются. Хотя СУБД описывает данные и механизмы, с чьей помощью обрабаты­ваются данные, база данных — обычный файл, находящийся в файло­вой системе, файл, содержащий данные, с которыми работает механизм СУБД. Прелесть СУБД — в строгой структуризации и типизации дан­ных. Все множества данных СУБД хранит в виде таблиц, хотя на самом деле данные находятся в файле и даже различных файлах, но СУБД умело скрывает местонахождение данных, заставляя пользователя по­верить в таблицы, описывающие данные. Все современные СУБД рабо­тают с реляционными (относительными) таблицами, в двух словах — с таблицами, имеющими отношение друг к другу и использующими для своих отношений специальный набор правил. Набор правил описывает­ся универсальным языком. Для доступа к данным, хранящимся в реля­ционных таблицах СУБД, разработан язык SQL — язык структуриро­ванных запросов (structured query language).
SQL — англоподобный язык, независимый от конкретной СУБД,
имеет встроенные возможности создания клиент/серверных программ, что немаловажно для Web-приложений, обеспечивает программный до­ступ к СУБД. С помощью SQL можно управлять базой данных и выпол­нять прочие функции работы с данными.
Доступ к базе данных может осуществляться двумя способами: вы-
зов SQL-операторов из клиентской программы или вызов осуществля­ется в интерактивном режиме, командная строка или командная утили­та. Интерактивный доступ использует только чистый SQL, используя динамические SQL-операторы. Пользователь базы данных вводит SQL­запрос и очень быстро получает ответ в виде таблицы, так как работает непосредственно с базой. Другой способ — вызов SQL-операторов из клиентского приложения — идентичен интерактивному по SQL-запро-
JAVA
250 Часть 5. Работа с базами данных при помощи Java
сам, но SQL-операторы вводит не пользователь, а программа. Статиче­ский или, как его еще называют встроенный SQL, осуществляет запрос также при помощи SQL, но из приложения, написанного на другом язы­ке программирования — ADA, Java, C++ и т. д.
Главная идея SQLJ состоит в непосредственном объединении опера-
торов разных языков программирования, в данном случае SQL и Java.
Выше уже упоминалось о достоинствах SQL, стоит ли говорить о до-
стоинствах Java? Хотя SQL и является языком программирования, он лишен некоторых особенностей, присущих стандартным языкам про­граммирования. Если количество библиотек классов Java достаточно об­ширно и предназначено для приложения любой сложности, не считая real-time систем, здесь главенствует ADA. Смесь двух столь мощных языков программирования, как SQL и Java, приводит к созданию очень гибких, платформонезависимых, СУБД независимых, программно неза­висимых приложений.
SQLJ не первая попытка слияния Java и SQL. С момента рождения
Java поставляется разработчикам программного обеспечения с набором классов, предназначенных для работы с базами данных. Java database Connectivity (JDBC) — набор API, обеспечивающий доступ к СУБД. API JDBC является частью пакета JDK. JDBC не делает никаких предполо­жений об источнике информации и схеме хранения информации. JDBC используется при создании приложений, генерирующих SQL-запросы в момент исполнения, это так называемая динамическая реализация SQL-запросов.
Программирование с использованием статических операторов требу-
ет значительно меньше затрат, чем создание динамических SQL-опера­торов, поскольку часть работ выполняется в момент компиляции. Коли­чество статических операторов, используемых для создания SQL-за­проса, меньше на òî же количество действий, производимых с помощью динамических операторов. Пользователю нет необходимости вводить данные авторизации для доступа к данным. Выполнения опе­раторов идентификации в SQLJ-приложениях основываются на дан­ных, полученных в момент компиляции приложения. Очень часто в Web приложениях возникает ситуация, требующая обновления табли­цы пользователем, введение или удаление данных. Еще чаще пользова­тель, работающий с таблицей, не является создателем рабочей табли­цы. Практически во всех современных базах данных разграничены ро­ли создателей и пользователей таблиц, у каждой роли имеются свои права, определенные как базой данных, так и системным администра­тором. Кроме того, нельзя учесть всех внешних пользователей, а в Web практически невозможно, да и не нужно, но удаленные пользователи должны обязательно иметь права на совершение ряда действий над данными таблиц СУБД.
В стандарте SQLJ определены встроенные объекты, облегчающие со-
здание прав доступа различным пользователям или группам пользова­телей. Создание специальных SQLJ-объектов позволяет создать раз­личное количество пользовательских профилей соединения с базой дан­ных. Каждому пользовательскому профилю задаются собственные права работы с данными. Комбинирование операторов доступа СУБД