o java.naming.dns.url (соответствует константе Context.DNS_URL) — URL для определения DNS узла, используемого для получения адреса JNDI URL

o java.naming.applet (соответствует константе Context.APPLET) — объект-апплет, используемый для получения JNDI свойств

o java.naming.language (соответствует константе Context.LANGUAGE) — список, через запятую, предпочтительных языков для использования в данной службе (пример: en-US, fr, ja-JP-kanji). Языки описываются в соответствии с RFC 1766.

Пример использования JNDI для распечатки содержимого директории c:/tmp. Для работы с файловой системой через JNDI используется реализация службы именования на основе файловой системы от Sun (http://java.sun.com/products/jndi/serviceproviders.html).

package ru. msu. cmc. prtech. examples;

import java. util. Properties;

import javax. naming. Binding;

import javax. naming. Context;

import javax. naming. InitialContext;

import javax. naming. NamingEnumeration;

import javax. naming. NamingException;

/**

* @author Victor Kuliamin

*/

public class JNDIExample

{

public static void main (String[] args)

{

Properties env = new Properties();

env. put(Context. INITIAL_CONTEXT_FACTORY, "com. sun. jndi. fscontext. RefFSContextFactory");

env. put(Context. PROVIDER_URL, "file://c:/tmp");

try

{

Context cntx = new InitialContext(env);

NamingEnumeration list = cntx. listBindings("");

while(list. hasMore())

{

Binding bnd = (Binding)list. next();

System. out. println(bnd. getName());

}

}

catch (NamingException e)

{

e. printStackTrace();

}

}

}

Синхронизация

Синхронизация работы потоков, как и само разбиение работ на потоки, выполняется автоматически.

Целостность и непротиворечивость

Целостность и непротиворечивость данных при работе J2EE приложений поддерживается с помощью механизма транзакций. Построение транзакций определяется в декларативном стиле в дескрипторах развертывания EJB компонентов, определяющих действия с данными приложения. Методы работы с EJB компонентами могут иметь различные политики работы с транзакционными контекстами: не поддерживать работу в рамках транзакции, включаться в имеющуюся транзакцию, стартовать новую, вложенную транзакцию, и т. п (см. далее).

НЕ нашли? Не то? Что вы ищете?

Отказоустойчивость

Отказоустойчивость J2EE приложений не обеспечивается дополнительными средствами (такими, как репликация, надежная передача сообщений и пр.).

Защищенность

Защищенность J2EE приложения поддерживается механизмом определения ролей, доступности различных методов для ролей и политик переноса или создания ролей при совместной работе нескольких методов. Роли, политики их переноса и правила доступа различных ролдей к методам описываются в дескрипторах развертывания EJB компонентов (см. далее).

Разработка компонентов Enterprise Java Beans

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

Компонент Enterprise Java Beans представляет собой компонент, который представляет в J2EE приложении элемент данных или внутренней, невидимой для пользователя логики приложения и для которого определен жизненный цикл в рамках рабочего процесса приложения — набор состояний через которые проходит один экземпляр такого компонента.

EJB-контейнер, управляющий жизненным циклом EJB компонентов, несет ответственность за следующее.

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

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

· Он обеспечивает поддержку параллельной обработки запросов

· Он поддерживает связь между EJB компонентами и базой данных приложения и синхронизует их данные

· Он поддерживает целостность данных приложения с помощью механизма транзакций

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

Для разработки компонента EJB нужно сделать следующее.

· Один или несколько классов и интерфейсов Java, обеспечивающих как реализацию самой функциональности компонента, так и реализацию заглушек и каркасов для удаленных обращений к нему

· Дескриптор развертывания — xml файл в специальном формате, описывающий

o Набор EJB компонентов приложения

o Совокупность элементов кода Java, образующих один компонент

o Связь свойств компонента с полями таблиц БД и связями между таблицами

o Набор ролей, привязку их к различным методам, а также набор правил доступа различных ролей к методам компонентов

o Политику компонентов и их методов по отношению к транзакциям

Правила создания EJB компонента, т. е. набор классов и интерфейсов, которые должны или могут быть декларированы как части его описания, зависят от вида самого компонента. Различают три вида компонентов:

· Компоненты данных (сущностные, entity beans)
Они представляют данные приложения и основные методы работы с ними.

· Сеансовые компоненты (session beans)
Они представляют независимую от пользовательского интерфейса и каких-либо конкретных данных логику работы приложения в рамках сеанса, называемую иногда бизнес-логикой

· (введены в EJB 2.0)
Компоненты, управляемые сообщениями (message driven beans).
Это вспомогательный вид компонентов, основное назначение которых — обработка асинхронных сообщений, в отличии от остальных, работающих в синхронном режиме. Клиент, вызывающий метод в компоненте данных или сеансовом компоненте, ждет, пока вызванный компонент не завершит свою работу. Компоненту же, управляемому сообщениями, можно отослать сообщение и продолжать работу сразу после окончания его передачи.

При построении компонентов разрабатываются следующие их составляющие.

· Для компонентов данных
Всегда должны быть декларированы класс компонента и по крайней мере один из интерфейсов — удаленный или локальный.

o Удаленный или дистанционный интерфейс (remote interface)
Этот интерфейс определяет методы компонента, к которым можно обращаться извне его собственного процесса.
Он должен наследовать интерфейс javax.ejb.EJBObject (наследующий java.rmi.Remote). Обычно такой интерфейс определяет набор свойств (свойством типа <type> с именем <name> считается пара методов <type> get<Name>() и void set<Name>(<type>)), связанных с представляемыми компонентом данными. Некоторые из свойств могут быть не связаны непосредственно с каким-то хранимым в БД элементом данных, а вычислимы на основе нескольких таких элементов.

o Удаленный внешний интерфейс (remote home interface)
Этот интерфейс определяет методы для построения и поиска компонентов с определенными свойствами, в том числе и извне процесса, в котором они будут находится.
Он должен наследовать интерфейс javax.ejb.EJBHome (наследующий java.rmi.Remote). Чаще всего такой интерфейс определяет метод создания компонента по значению первичного ключа, метод поиска компонента по значению первичного ключа, и, может быть, дополнительные методы поиска по разным комбинациям свойств.

o Класс компонента (bean class)
Должен быть декларирован.
Этот класс определяет свойства компонента (обычно соответсвующие его данным) и реализацию методов удаленного и локального интерфейсов.
В EJB 2.0 он должен быть абстрактным классом, реализующим интерфейс javax.ejb.EntityBeanEJB 1.1 и ранее — неабстрактным классом).
Этот класс должен реализовывать методы, декларированные в удаленном и локальном интерфейсах (но недолжен реализовывать сами эти интерфейсы!) и некоторые другие, например, методы установки значений свойств, являющихся частями первичного ключа. Свойства, соответствующие хранимым элементам данных должны быть оформлены в виде абстракных методов get<Name> и set<Name> — их взаимодействие с элементами данных автоматически поддерживается EJB контейнером (в EJB 1.1 эти методы неабстрактны и возвращают/изменяют значения соответсвующих полей, также можно поступить и в EJB 2.0, если вы не хотите использовать автоматическое управление синхронизацией с БД). Вычислимые свойства оформляются в виде неабстрактных методов.
Кроме того, этот класс может реализовывать служебные методы поддержки жизненного цикла (эти методы вызываются EJB контейнером на определенных фазах жизненного цикла компонента и могут быть использованы для каких-то специфических действий по мониторингу состояния компонента или управления дополнительными ресурсами, которыми контейнер не управляет автоматически).

§ public <Primary key class> ejbCreate(<Primary key class>)
Должен быть реализован. Устанавливает значения свойств, являющихся частями первичного ключа. Если первичный ключ составной, в качестве параметров этот метод должен использовать набор значений свойств, образующих первичный ключ.
Должен возвращать null.
Вызывается при создании в БД записи, соответсвующей создавемому экземпляру компонента.
Этот метод может быть вызван контейнером на уже созданном экземпляре, находящемся в пуле, для установления его соответсвия новой записи в базе данных.
Дополнительно, для каждого метода внешних интерфейсов с именем create<Suffix>(…) и результатом — локальным или удаленным интерфейсом — должен быть определен соответствующий метод <Primary key class> ejbCreate<Suffix>(…) с теми же параметрами.

§ public void ejbPostCreate(<Primary key class>)
Вызывается сразу после создания соответсвтующей экземпляру компонента записи в БД.

§ public void setEntityContext(javax.ejb.EntityContext)
Вызывается сразу после инициализации экземпляра компонента, перед передачей его в пул.
Может быть использован для чтения каких-то данных из контекста, являющихся общими для всех компонентов данного процесса.

§ public void unsetEntityContext()
Вызвается после удаления экземпляра компонента из пула и перед передачей его сборщику мусора для зачистки.

§ public void ejbActivate()
Вызывается при активизации экземпляра компонента — вытаскивании его из пула построенных, но не готовых к работе компонентов, перед использованием для обработки пришедшего запроса.

§ public void ejbPassivate()
Вызывается при переводе экземпляра компонента из активного состояния в пул.

§ public void ejbLoad()
Вызывается при загрузке данных экземпляра компонента из БД.

§ public void ejbStore()
Вызывается при сохранении данных экземпляра компонента в БД.

§ public void ejbRemove()
Вызывается перед удалением данных экземпляра компонента из БД.

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

Рисунок 3. Жизненный цикл компонента данных.

o Класс первичного ключа (primary key class)
Должен быть декларирован, но в качестве такого класса может использоваться и существующий класс.
Этот класс определяет набор данных, входящих в первичный ключ записи, соответсвующей компоненту EJB.
Должен реализовывать интерфейс java.io.Serializable.
Чаще всего в качестве класса первичного ключа используются библиотечные класы Integer и String.
Необходимость в декларации своего класса возникает, только если первичный ключ составной. При этом поля этого класса должны иметь соответствующие по именам управляемые EJB контейнером свойства в классе компонента. В таком классе также должен быть определен конструктор без параметров. Кроме того, важно правильно определить методы equals() и hashCode(), чтобы контейнер мог автоматически управлять коллекциями компонентов с такими первичными ключами.

o Локальный интерфейс (local interface)
Введен в EJB 2.0.
Определяет набор методов компонента, к которым можно обращаться только из того же процесса, где этот компонент находится.
Соответственно, с одной стороны, при работе через локальный интерфейс обеспечивается большая эффективность, с другой — необходимо быть уверенным, что этот компонент управляется тем же самым EJB контейнером, что и обращающийся к нему.

o Локальный внешний интерфейс (local home interface)
Введен в EJB 2.0.
Определяет набор методов создания и поиска компонентов по свойствам.
Тоже может быть использован только в рамках одного процесса с компонентом, который ищется или строится.

Помимо синхронизации данных комопнентов и соответствующих данных БД, EJB контейнер берет на себя синхронизацию ссылок между EJB компонентами и ссылочных полей в БД.

Для этого декларируются свойства (пары get и set методов), имеющие в качестве типов локальные интерфейсы компонентов, с которыми мы собираемся поддерживать связи, если связь единичная, либо коллекции (java.util.Collection), если связь множественная. Типы удаленных интерфейсов в качестве типов свойств, соответсвующих связям в БД, не поддерживаются. Если нужен доступ по связи в удаленном интерфейсе, приходится делать особый метод, возвращающий набор данных, соответсвующий связанному экземпляру, и реализовывать его в классе компонента.

Пример декларации набора классов и интерфейсов для компонентов, представляющих клиентов некоторой организации, их счета и сами организации. Часть соответствующей схемы БД, включающая таблицу клиентов и связанные с ней, показана на рисунке.

Рисунок 4. Пример схемы БД.

Примеры кода удаленных интерфейсов. Они декларированы для организаций и клиентов.

package ru. msu. cmc. prtech. examples. ejb;

import java. rmi. RemoteException;

import java. util. Collection;

import javax. ejb. EJBObject;

public interface OrganizationRemote extends EJBObject

{

public String getName() throws RemoteException;

public void setName(String name) throws RemoteException;

}

package ru. msu. cmc. prtech. examples. ejb;

import java. rmi. RemoteException;

import javax. ejb. EJBObject;

public interface ClientRemote extends EJBObject

{

public String getFirstName() throws RemoteException;

public void setFirstName(String name) throws RemoteException;

public String getLastName () throws RemoteException;

public void setLastName (String name) throws RemoteException;

}

Примеры кода локальных интерфейсов. Они декларированы для всех компонентов.

package ru. msu. cmc. prtech. examples. ejb;

import java. util. Collection;

import javax. ejb. EJBLocalObject;

public interface OrganizationLocal extends EJBLocalObject

{

public String getName() ;

public void setName(String name);

public Collection getClients() ;

public void setClients(Collection clients);

public void addClient(String firstName, String lastName);

public void removeClient(String firstName, String lastName);

}

package ru. msu. cmc. prtech. examples. ejb;

import java. util. Collection;

import javax. ejb. EJBLocalObject;

public interface ClientLocal extends EJBLocalObject

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6