EJB基础笔记(一)

coutoperator 2010-07-02

EJB基础笔记(一)

第一章教程提示

第二章EJB技术概述

2.1简介

2.2两层和三层环境

Two-tierComputingEnvironments:Application-----------network-------->DatabaseServer

三层客户机-------》应用程序服务器--------》数据库服务器

第三章EJB规范

3.2EJB容器

容器容纳和管理EnterpriseBean

JavaWeb服务器容纳Servlet

HTML浏览器容纳JavaApplet

EJB容器在运行时管理EnterpriseBean的各个方面,包括远程访问bean、安全性、持续、事务、并行性和资源的访问与合用。

EJBContainer>TransactionManagement

>PersistenceManagement

>SecurityManagement

>EJBContext,JNDIENC

>CallbackMethods

由于客户机应用程序不能直接访问bean--容器位于客户机和bean之间。

EnterpriseBean通过以下三种机制之一与容器交互:

回调方法

每个bean都会实现EnterpriseBean接口的子类型,该接口定义了一些方法,称作回调方法。每个回调方法在bean的生命周期期间向它提示一个不同事件,当容器要合用某个bean、将其状态存储到数据库、结束事务、从内存中除去该bean等操作时,它将调用这些方法来通知该bean。回调方法可以让bean在事件之前或之后立即执行内部调整。

EJBContext接口

每个bean都会得到一个EJBContext对象,它是对容器的直接引用。EJBContext接口提供了用于与容器交互的方法,因此那个bean可以请求关于环境的信息,如其客户机的身份或事务的状态,或者bean可以获取它自身的远程引用。

Java命名和目录接口(JNDI)

JNDI是Java平台的标准扩展,用于访问命名系统,如LDAP、NetWare、文件系统等。每个bean自动拥有对某个特定命名系统(称作环境命名上下文(ENC))的访问权。ENC由容器管理,bean使用JNDI来访问ENC。JNDIENC允许bean访问资源,如JDBC连接、其它EnterpriseBean,以及特定于该bean的属性。

3.5远程和本地接口

远程和本地接口分别扩展javax.ejb.EJBObject和javax.ejb.EJBHome接口。这些EJB接口类型定义了一组标准的实用程序方法,并为所有远程和本地接口提供了常用基本类型。

RemoteInterface:java.rmi.Remote----->javax.ejb.EJBObject------->Customer

HomeInterface:java.rmi.Remote----->javax.ebj.EJBHome-------->CustomerHome

CustomerHomehome=//...obtainareferencethatimplementsthehomeinterface.

//Usethehomeinterfacetocreatea

//newinstanceoftheCustomerbean.

Customercustomer=home.create(customerID);

//usingabusinessmethodontheCustomer.

customer.setName(someName);

Thecustomerinterface:

importjavax.ejb.EJBObject;

importjava.rmi.RemoteException;

publicinterfaceCustomerextendsEJBObject{

publicNamegetName()throwsRemoteException;

publicvoidsetName(Namename)throwsRemoteException;

publicAddressgetAddress()throwsRemoteException;

publicvoidsetAddress(Addressaddress)throwsRemoteException;

}

实体Bean,它表示持久商业对象(数据存储在数据库中的商业对象)。实体Bean表示数据库中的商业数据,并添加特定于该数据的行为。

会话Bean

importjavax.ejb.EJBObject;

importjava.rmi.RemoteException;

publicinterfaceHotelClerkextendsEJBObject{

publicvoidreserveRoom(Customercust,RoomInfori,Datefrom,Dateto)

throwsRemoteException;

publicRoomInfoavailableRooms(Locationloc,Datefrom,Dateto)

throwsRemoteException;

}

HotelClerkbean充当代理程序,因为它代表用户执行任务,但它自己在数据库中并不是持久的。您不需要有关HotelClerk的信息;您需要旅馆店员为您执行任务。这是会话Bean的典型行为。

实体Bean

importjavax.ejb.EntityBean;

publicclassCustomerBeanimplementsEntityBean{

AddressmyAddress;

NamemyName;

CreditCardmyCreditCard;

snipgetterandsetter

...

}

BeanClass:javax.ejb.EnterpriseBean-->javax.ejb.EntityBean-->CustomerBean

3.9生命周期方法

importjavax.ejb.EJBHome;

importjavax.ejb.CreateException;

importjavax.ejb.FinderException;

importjava.rmi.RemoteException;

publicinterfaceCustomerHomeextendsEJBHome{

publicCustomercreate(IntegercustomerNumber)throwsRemoteException,CreateException;

publicCustomerfindByPrimaryKey(IntegercustomerNumber)throwsRemoteException,FinderException;

publicEnumerationfindByZipCode(intzipCode)throwsRemoteException,FinderException;

}

create()方法用于创建新的实体。这将在数据库中产生新的记录。本地接口可能有许多create()方法。每个create()的自变量数量和数据类型由bean开发人员指定,但返回类型必须是远程接口数据类型。这种情况下,在CustomerHome接口上调用create()将返回Customer的实例。

第四章实体Bean

实体Bean:容器管理的持续(CMP)bean管理的持续(BMP)

容器管理的持续

容器管理的字段可以是任何原语数据类型或可串行化类型。本例中使用原语int(customerID)和可串行化对象(Address、Name、CreditCard)。

4.4本地接口

publicinterfaceCustomerHomeextendsjavax.ejb.EJBHome{

publicCustomercreate(IntegercustomerNumber)throwsRemoteException,CreateException;

publicCustomercreate(IntegercustomerNumber,Namename)throwsRemoteException,CreateException;

publicCustomerfindByPrimaryKey(IntegercustomerNumber)throwsRemoteException,FinderException;

publicEnumerationfindByZipCode(intzipCode)throwsRemoteException,FinderException;

}

调用本地接口示例:

CustomerHomehome=//GetareferencetotheCustomerHomeobject

Namename=newName("John","W","Smith");

Customercustomer=home.create(newInteger(33),name);

4.5远程接口

importjavax.ejb.EJBObject;

importjava.rmi.RemoteException;

publicinterfaceCustomerextendsEJBObject{

publicNamegetName()throwsRemoteException;

publicvoidsetName(Namename)throwsRemoteException;

publicAddressgetAddress()throwsRemoteException;

publicvoidsetAddress(Addressaddress)throwsRemoteException;

publicCreditCardgetCreditCard()throwsRemoteException;

publicvoidsetCreditCard(CreditCardcard)throwsRemoteException;

}

远程接口调用示例:

Customercustomer=//...obtainaremotereferencetothebean

//getthecustomer'saddress

Addressaddr=customer.getAddress();

//changethezipcode

addr.zip="56777";

//updatethecustomer'saddress

customer.setAddress(addr);

4.6回调方法

回调方法在javax.ejb.EntityBean接口中定义,此接口由所有实体Bean实现,包括CustomerBean类。

publicinterfacejavax.ejb.EntityBean{

publicvoidsetEntityContext();

publicvoidunsetEntityContext();

publicvoidejbLoad();

publicvoidejbStore();

publicvoidejbActivate();

publicvoidejbPassivate();

publicvoidejbRemove();

}

使用回调方法的CustomerBean:

importjavax.ejb.EntityBean;

publicclassCustomerBeanimplementsEntityBean{

intcustomerID;

AddressmyAddress;

NamemyName;

CreditCardmyCreditCard;

EntityContextejbContext;

//CALLBACKMETHODS

publicvoidsetEntityContext(EntityContextcntx){

ejbContext=cntx

}

//BUSINESSMETHODS

publicvoidsetCreditCard(CreditCardcard){

if(card.type.equals("WorldWide"))

if(ejbContext.isCallerInRole("Manager"))

myCreditCard=card;

else

thrownewSecurityException();

else

myCreditCard=card;

}

...snip...

4.8Bean管理的持续

bean使用数据库API(通常是JDBC)来读取其字段并将字段写入数据库,但容器会告诉它何时执行每个同步操作,并会自动管理bean的事务。bean管理的持续可以让bean开发人员灵活地执行对于容器来说太过于复杂的持续操作,或者使用容器不支持的数据源--例如,定制或旧的数据库。

publicclassCustomerBean_BMPextendsCustomerBean{

publicvoidejbLoad(){

//overrideimplementation

}

publicvoidejbStore(){

//overrideimplementation

}

publicvoidejbCreate(){

//overrideimplementation

}

publicvoidejbRemove(){

//overrideimplementation

}

privateConnectiongetConnection(){

//newhelpermethod

}

}

ejbLoad()和ejbStore()方法必须包括数据库访问逻辑,只有这样,当EJB告诉bean要装入和存储数据时,它才能这么做。容器会在适当时自动执行ejbLoad()和ejbStore()方法。

ejbCreate()方法将新记录插入数据库,而ejbRemove()方法从数据库中删除实体的数据。

获得IDIntegerprimaryKey=(Integer)ejbContext.getPrimaryKey();

相关推荐