{
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 |


