{

public String getFirstName() ;

public void setFirstName(String name);

public String getLastName () ;

public void setLastName (String name);

public OrganizationLocal getOrganization() ;

public void setOrganization(OrganizationLocal org);

public Collection getAccounts() ;

public void setAccounts(Collection accs);

public void addAccount (double initialBalance);

}

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

import javax. ejb. EJBLocalObject;

public interface AccountLocal extends EJBLocalObject

{

public double getBalance() ;

public void setBalance(double balance);

public double getCredit() ;

public void setCredit(double credit) ;

public int getStatus() ;

public void setStatus(int status) ;

public ClientLocal getClient() ;

public void setClient(ClientLocal client);

}

Примеры кода внешних интерфейсов. Удаленные внешние интерфейсы декларированы для клиентов и организаций. Локальные внешние интерфейсы декларированы для клиентов и счетов, они содержат дополнительные методы создания компонентов.

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

import java. rmi. RemoteException;

import javax. ejb. CreateException;

import javax. ejb. EJBHome;

import javax. ejb. FinderException;

public interface OrganizationHomeRemote extends EJBHome

{

public OrganizationRemote create (Integer id)

throws CreateException, RemoteException;

public OrganizationRemote findByPK(Integer id)

throws FinderException, RemoteException;

}

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

import java. rmi. RemoteException;

import javax. ejb. CreateException;

import javax. ejb. EJBHome;

import javax. ejb. FinderException;

public interface ClientHomeRemote extends EJBHome

{

public ClientRemote create (Integer id)

throws CreateException, RemoteException;

public ClientRemote findByPK(Integer id)

throws FinderException, RemoteException;

}

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

import javax. ejb. CreateException;

import javax. ejb. EJBLocalHome;

import javax. ejb. FinderException;

public interface ClientHomeLocal extends EJBLocalHome

{

public ClientLocal create(Integer id)

throws CreateException;

public ClientLocal createClient(String firstName, String lastName)

throws CreateException;

public ClientLocal findByPK(Integer id)

throws FinderException;

}

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

import javax. ejb. CreateException;

import javax. ejb. EJBLocalHome;

public interface AccountHomeLocal extends EJBLocalHome

{

public AccountLocal createAccount(double initialBalance)

throws CreateException;

public AccountLocal findByPK(Integer pk)

throws FinderException;

}

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

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

import java. util. Collection;

import java. util. Iterator;

import javax. ejb. CreateException;

import javax. ejb. EntityBean;

import javax. naming. InitialContext;

import javax. naming. NamingException;

public abstract class OrganizationBean

implements EntityBean

{

public Integer ejbCreate(Integer pk)

{

setId(pk);

return null;

}

public void ejbPostCreate(Integer pk)

{ }

public abstract Integer getId ();

public abstract void setId (Integer pk);

public abstract String getName ();

public abstract void setName (String name);

public abstract Collection getClients ();

public abstract void setClients (Collection clients);

public void addClient(String firstName, String lastName)

{

try

{

InitialContext context = new InitialContext();

ClientHomeLocal clientHome =

(ClientHomeLocal)context. lookup("ClientHomeLocal");

ClientLocal client = clientHome. createClient(firstName, lastName);

Collection clients = getClients();

clients. add(client);

}

catch (NamingException e)

{

e. printStackTrace();

}

catch (CreateException e)

{

e. printStackTrace();

}

}

public void removeClient(String firstName, String lastName)

{

Collection clients = getClients();

Iterator it = clients. iterator();

while(it. hasNext())

{

ClientLocal client = (ClientLocal)it. next();

if( client. getFirstName().equals(firstName)

&& client. getLastName().equals(lastName)

)

{

it. remove();

break;

}

}

}

}

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

import javax. ejb. EntityBean;

public abstract class ClientBean

implements EntityBean

{

public Integer ejbCreate(Integer pk)

{

setId(pk);

return null;

}

public void ejbPostCreate(Integer pk)

{ }

public Integer ejbCreateClient(String firstName, String lastName)

{

setFirstName(firstName);

setLastName(lastName);

return null;

}

public void ejbPostCreateClient(String firstName, String lastName)

{ }

public abstract Integer getId ();

public abstract void setId (Integer pk);

public abstract String getFirstName ();

public abstract void setFirstName (String name);

public abstract String getLastName ();

public abstract void setLastName (String name);

public abstract OrganizationLocal getOrganization ();

public abstract void setOrganization (OrganizationLocal org);

public abstract Collection getAccounts() ;

public abstract void setAccounts(Collection accs);

public void addAccount(double initialBalance)

{

try

{

InitialContext context = new InitialContext();

AccountHomeLocal accountHome =

(AccountHomeLocal)context. lookup("AccountHomeLocal");

AccountLocal account = accountHome. createAccount(initialBalance);

Collection accounts = getAccounts();

accounts. add(account);

}

catch (NamingException e)

{

e. printStackTrace();

}

catch (CreateException e)

{

e. printStackTrace();

}

}

}

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

import javax. ejb. EntityBean;

public abstract class AccountBean implements EntityBean

{

public Integer ejbCreate(Integer pk)

{

setId(pk);

return null;

}

public void ejbPostCreate(Integer pk)

{ }

public Integer ejbCreateAccount(double initialBalance)

{

setBalance(initialBalance);

setCredit(0.0);

setStatus(0);

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

return null;

}

public void ejbPostCreateAccount(double initialBalance)

{ }

public abstract Integer getId ();

public abstract void setId (Integer pk);

public abstract double getBalance ();

public abstract void setBalance (double balance);

public abstract double getCredit ();

public abstract void setCredit (double credit);

public abstract int getStatus ();

public abstract void setStatus (int status);

public abstract ClientLocal getClient ();

public abstract void setClient (ClientLocal client);

}

Компоненты данных могут также самостоятельно, не полагаясь на EJB контейнер упарвлять связью своих внутренних данных с записями в БД.

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

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

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

o Класс компонента (bean class)
Должен быть декларирован.
Этот класс определяет свойства компонента (обычно соответсвующие его данным) и реализацию методов удаленного и локального интерфейсов.
Он должен быть неабстрактным классом, реализующим интерфейс javax.ejb.SessionBean.
Этот класс должен реализовывать методы, декларированные в удаленном и локальном интерфейсах (но недолжен реализовывать сами эти интерфейсы!).
Сеансовые компоненты могут связываться с БД, но эта связь должна быть обеспечена кодом самого класса компонента, например, с использованием JDBC. Она не поддерживается контейнером автоматически.
Кроме того, этот класс может реализовывать служебные методы поддержки жизненного цикла (эти методы вызываются EJB контейнером на определенных фазах жизненного цикла компонента и могут быть использованы для каких-то специфических действий по мониторингу состояния компонента или управления дополнительными ресурсами, которыми контейнер не управляет автоматически).

§ public void ejbCreate(…)
Служит для создания сеансового компонента по набору параметров, является реализацией соответсвующего метода локального или удаленного внешнего интерфейса.
Этот метод вызывается при инициализации экземпляра компонента.

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

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

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

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

Жизненный цикл сеансового компонента существенно зависит от того, имеет ли он состояние или нет. Сеансовый компонент с состоянием используется для отслеживания состояния сеанса, связанного с одним клиентским соединением. Такой компонент не может быть помещен в пул. Сеансовый компонент без состояния может быть помещен в пул — один экземпляр используется для обработки многих запросов.

Рисунок 5. Жизненный цикл сеансового компонента с состоянием.

Рисунок 6. Жизненный цикл сеансового компонента без состояния.

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

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

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

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

import javax. ejb. EJBLocalObject;

public interface TransferLocal extends EJBLocalObject

{

public boolean tranfer(ClientLocal client, double sum,

AccountLocal sender, AccountLocal reciever)

throws IllegalArgumentException, SuspendedAccountException,

TooSmallBalanceException;

}

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

import javax. ejb. CreateException;

import javax. ejb. EJBLocalHome;

public interface TransferHomeLocal extends EJBLocalHome

{

public TransferLocal create() throws CreateException;

}

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

import java. util. Collection;

import javax. ejb. EJBException;

import javax. ejb. SessionBean;

public abstract class TransferBean implements SessionBean

{

public void ejbCreate ()

{ }

public boolean tranfer (ClientLocal client, double sum,

AccountLocal sender, AccountLocal recipient)

throws IllegalArgumentException, SuspendedAccountException,

TooSmallBalanceException

{

if(client == null)

throw new IllegalArgumentException("Argument client is null");

else if(sender == null)

throw new IllegalArgumentException("Argument sender is null");

else if(recipient == null)

throw new IllegalArgumentException("Argument recipient is null");

try

{

Collection accounts = client. getAccounts();

if(!accounts. contains(sender))

throw new IllegalArgumentException

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